Answers:
简而言之,多路复用允许您的浏览器一次触发同一连接上的多个请求,并以任何顺序接收回请求。
现在,对于更复杂的答案...
当您加载网页时,它会下载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浏览都涉及来回发送小写字母,而不是发送大包裹。
希望能有所帮助。
HTTP 2.0中的复用是浏览器和服务器之间的关系类型,浏览器和服务器使用单个连接并行传递多个请求和响应,从而在此过程中创建了许多单独的框架。
复用脱离了严格的请求-响应语义,并实现了一对多或多对多关系。
由于@Juanma Menendez的答案在图表令人困惑时是正确的,因此我决定对其进行改进,以澄清多路复用和流水线处理之间的区别,即经常混淆的概念。
流水线(HTTP / 1.1)
多个请求通过同一 HTTP连接发送。响应的接收顺序相同。如果第一个响应花费大量时间,则其他响应必须排队等候。与CPU流水线类似,在CPU流水线中,一条指令在解码的同时被提取。多个指令可以同时执行,但它们的顺序得以保留。
多路传输(HTTP / 2)
多个请求通过同一 HTTP连接发送。响应以任意顺序接收。无需等待阻止其他人的缓慢响应。类似于现代CPU中的乱序指令执行。
希望改进后的图像可以澄清差异: