HTTP / 2中的复用是什么意思


Answers:


214

简而言之,多路复用允许您的浏览器一次触发同一连接上的多个请求,并以任何顺序接收回请求。

现在,对于更复杂的答案...

当您加载网页时,它会下载HTML页面,并看到它需要一些CSS,一些JavaScript,一些图像等等。

在HTTP / 1.1下,您一次只能通过HTTP / 1.1连接下载其中之一。因此,您的浏览器会下载HTML,然后要求提供CSS文件。返回时,它会要求提供JavaScript文件。当返回时,它要求第一个图像文件...等等。HTTP/ 1.1基本上是同步的-发送请求后,您就被卡住了,直到获得响应为止。这意味着浏览器大多数时候并没有做太多事情,因为它已经触发了一个请求,正在等待响应,然后触发另一个请求,然后正在等待响应……等等。许多JavaScript确实需要浏览器进行大量处理,但这取决于所下载的JavaScript,因此至少在开始时,继承到HTTP / 1.1的延迟确实会引起问题。通常,服务器不是

因此,当今网络上的主要问题之一是在浏览器和服务器之间发送请求的网络延迟。可能只有几十毫秒或几百毫秒,这似乎并不多,但是它们加起来通常是Web浏览中最慢的部分-尤其是当网站变得越来越复杂并且需要额外的资源(随着访问)和Internet访问时越来越多地通过移动设备(延迟比宽带慢)。

举例来说,假设HTML本身加载后,您的网页需要加载10种资源(按当今的标准,这是一个很小的网站,因为100多种资源是常见的,但是我们将使其保持简单并继续进行此操作例)。假设每个请求花费100毫秒的时间才能通过Internet到达Web服务器并往返,并且两端的处理时间都可以忽略不计(为简单起见,本例中为0)。由于您必须发送每种资源并一次等待一个响应,因此下载整个站点将需要10 * 100ms = 1,000ms或1秒。

为了解决这个问题,浏览器通常会打开与Web服务器的多个连接(通常为6个)。这意味着浏览器可以同时触发多个请求,这要好得多,但是代价是必须设置和管理多个连接(同时影响浏览器和服务器)的复杂性。让我们继续前面的示例,并说有4个连接,为简单起见,假设所有请求都相等。在这种情况下,您可以将请求拆分为所有四个连接,因此两个将拥有3个资源,而两个将拥有2个资源以总共获得十个资源(3 + 3 + 2 + 2 = 10)。在这种情况下,最坏的情况是3次舍入或300ms = 0.3秒-很好的改善,但是这个简单的示例并不包括建立多个连接的成本,

HTTP / 2允许您在同一请求上发送多个请求连接-因此您无需按照上述方式打开多个连接。因此,您的浏览器可以说“给这个CSS文件给我。给那个JavaScript文件给我。给我image1.jpg。给我image2.jpg ...等等。” 充分利用单个连接。这具有明显的性能优势,即不会延迟等待空闲连接的那些请求的发送。所有这些请求(几乎)并行地通过Internet到达服务器。服务器响应每个响应,然后它们开始返回。实际上,它比Web服务器更强大,因为Web服务器可以按感觉中的任何顺序响应它们并以不同的顺序发送回文件,甚至可以将每个请求的文件分解成多个部分并将它们混合在一起。行头阻塞问题)。然后,Web浏览器的任务是将所有部分放回原处。在最佳情况下(假设没有带宽限制-参见下文),如果同时并行触发所有10个请求,并立即由服务器响应,则意味着您基本上有一个往返行程或100ms或0.1秒,下载所有10个资源。这没有HTTP / 1.1的多个连接所具有的缺点!随着每个网站上资源的增加,这也具有更大的可伸缩性(当前浏览器在HTTP / 1.1下最多可以打开6个并行连接,但是随着网站变得越来越复杂,它应该增长吗?)。

此图显示了差异,并且也有动画版本

注意:HTTP / 1.1确实具有流水线的概念,它还允许一次发送多个请求。但是,仍然必须按顺序返回它们,以完整地请求它们,因此即使在概念上相似,也远未达到HTTP / 2的水平。更不用说事实是,浏览器和服务器对它的支持都很差,因此很少使用。

以下评论中强调的一件事是带宽如何影响我们。当然,您的Internet连接受到可下载数量的限制,而HTTP / 2不能解决该问题。因此,如果以上示例中讨论的那10个资源都是高质量的打印质量图像,则下载速度仍然很慢。但是,对于大多数Web浏览器而言,带宽要比延迟少的问题。因此,如果这十种资源是小物品(尤其是CSS和JavaScript之类的文本资源,可以压缩成很小的大小),如网站上常见的那样,那么带宽并不是真正的问题-大量的资源通常是问题,HTTP / 2可以解决这个问题。这也是为什么在HTTP / 1.1中使用级联作为另一种解决方法的原因,因此,例如,所有CSS经常被合并在一起成为一个文件:HTTP / 2下的反模式 -尽管也有人反对完全取消它)。

举一个真实的例子:假设您必须从商店订购10件商品才能送货上门:

  • 具有一个连接的HTTP / 1.1意味着您必须一次订购一个,并且您不能订购下一个,直到最后一个订购。您可以理解,完成所有步骤需要数周的时间。

  • 具有多个连接的HTTP / 1.1意味着您可以同时具有(有限)数量的独立订单。

  • 带有流水线的HTTP / 1.1意味着您可以一个接一个地要求所有10个项目,而无需等待,但是所有项目都按照您要求的特定顺序到达。而且,如果一件物品缺货,那么您必须等待该物品,然后再下达订购的物品-即使这些后来的物品确实有库存!这样会更好一些,但仍然会有所延迟,可以说大多数商店都不支持这种订购方式。

  • HTTP / 2意味着您可以按任何特定顺序订购商品-不会有任何延迟(类似于以上内容)。商店将在准备就绪时分派它们,因此它们可能以与您要求的顺序不同的顺序到达,并且它们甚至可能拆分物品,因此该顺序的某些部分首先到达(比上面更好)。最终,这应该意味着您1)总体上更快地完成所有工作,以及2)可以在到达每个项目时就开始对其进行处理(“哦,这不如我想的那么好,所以我可能还想订购其他东西,或者代替订购”) )。

当然,您仍然受到邮递员的货车大小(带宽)的限制,因此,如果当天装满,他们可能不得不将一些包裹留在分拣办公室,直到第二天为止,但是相比之下,这几乎没有问题延迟实际发送和发送订单的延迟。大多数Web浏览都涉及来回发送小写字母,而不是发送大包裹。

希望能有所帮助。


8
很棒的解释。我需要的例子就是这个。因此,在HTTP / 1.1中,在等待响应到发送下一个请求之间浪费时间。HTTP / 2解决了这个问题。谢谢。
user3448600 '16

1
但是我认为这很苛刻。可能只是要求我在带宽上添加一个部分,我很乐意做,并且在我们完成讨论之后会做。但是,恕我直言,带宽对于网络浏览而言并不是一个大问题(至少在西方国家如此)-延迟是。HTTP / 2改善了延迟。大多数网站都是由许多小资源组成的,即使您有足够的带宽下载它们(通常人们也会这样做),由于网络延迟,它也会很慢。对于大型资源,带宽成为一个更大的问题。我同意那些包含大量图片和其他资源的网站仍可能会达到带宽限制。
巴里·波拉德

1
HTTP不应用于强制排序-因为它不提供此类保证。使用HTTP / 2,您可以建议交货的优先级,而不是订单的优先级。同样,如果您的一个JavaScript资产被缓存,而另一个则没有,那么HTTP甚至都不会影响优先级。相反,您应该在HTML中使用排序,并适当使用async或defer(growwiththeweb.com/2014/02/async-vs-defer-attributes.html)或诸如require.js之类的库。
巴里·波拉德

1
很好的解释。谢谢!
hmacias

2
这是因为HTTP / 1.1是文本流,而HTTP / 2是基于数据包的-在HTTP / 2中,它们被称为帧而不是数据包。因此,在HTTP / 2中,每个帧都可以标记为允许交织帧的流。在HTTP / 1.1中,没有这样的概念,因为它只是标题和正文的一系列文本行。此处有更多详细信息:stackoverflow.com/questions/58498116/…–
巴里·波拉德

5

请求多路复用

HTTP / 2可以通过单个TCP连接并行发送多个数据请求。这是HTTP / 2协议的最高级功能,因为它允许您从一台服务器异步下载Web文件。大多数现代浏览器将TCP连接限制为一台服务器。这样可以减少额外的往返时间(RTT),使您的网站加载速度更快,而无需进行任何优化,并且不需要域分片。

在此处输入图片说明


4

简单答案(来源):

复用意味着您的浏览器可以发送多个请求并接收“捆绑”到单个TCP连接中的多个响应。因此,与DNS查找和握手相关的工作负载将保存到来自同一服务器的文件中。

复杂/详细的答案:

找出@BazzaDP提供的答案。


1
这也可以在http 1.1中使用流水线实现。
HTTP2

3

HTTP 2.0中的复用是浏览器和服务器之间的关系类型,浏览器和服务器使用单个连接并行传递多个请求和响应,从而在此过程中创建了许多单独的框架。

复用脱离了严格的请求-响应语义,并实现了一对多或多对多关系。

HTTP1 VS HTTP2交换过程


您的HTTP / 2多路复用示例并未真正显示多路复用。图中的场景显示了HTTP / 1.1中引入的HTTP流水线。
ich5003

@ ich5003这是多路传输,因为它使用单个连接。但是,也确实没有在这里只代表每个请求发送多个响应的情况。
Juanma Menendez,

1
我想说的是,仅使用HTTP流水线也可以实现上述场景。
ich5003

我相信这里的混乱根源是右图中的请求/响应顺序-它们显示了HTTP / 2中复用的一种特殊情况,也可以通过在HTTP / 1.1中进行流水线处理来实现。如果图中的响应顺序与请求顺序不同,则不会造成混乱。
raiks

1

由于@Juanma Menendez的答案在图表令人困惑时是正确的,因此我决定对其进行改进,以澄清多路复用和流水线处理之间的区别,即经常混淆的概念。

流水线(HTTP / 1.1)

多个请求通过同一 HTTP连接发送。响应的接收顺序相同。如果第一个响应花费大量时间,则其他响应必须排队等候。与CPU流水线类似,在CPU流水线中,一条指令在解码的同时被提取。多个指令可以同时执行,但它们的顺序得以保留。

多路传输(HTTP / 2)

多个请求通过同一 HTTP连接发送。响应以任意顺序接收。无需等待阻止其他人的缓慢响应。类似于现代CPU中的乱序指令执行。

希望改进后的图像可以澄清差异:

标准HTTP / 1.1流/管道/多路复用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.