为什么HTTP/2的多路复用比HTTP/1.1更好?

4
在HTTP/1.1情况下,一个网页有多个资源,每个文件都会创建一个连接到服务器端检索数据、js、css等。我认为工作方式类似于多进程或多线程,并行工作。
但是在HTTP/2情况下,每个域名只有一个连接,在一个网页中,即使可以处理来自客户端浏览器的多个请求,也可能类似于单线程。
我不知道为什么HTTP/2的性能比HTTP/1.1好?

1
一辆公交车比30辆小汽车更好。 - ceejayoz
2个回答

10
HTTP/2多路复用比HTTP/1.1更有效的原因与开启TCP连接的成本几乎无关。
在HTTP/1.1中,浏览器通常最多为每个域名打开6个连接。这些连接一旦打开,就会被保持打开并重复使用,直至变为空闲状态。
然而,在这些连接已经打开后,HTTP/2仍比HTTP/1.1更快,因此其中显然没有TCP连接开启的成本问题。
一个典型的网页可能需要从源服务器下载多达100个资源。让我们简化一下,并想象客户端和服务器之间有200毫秒的往返延迟。为了在HTTP/1.1中下载页面,浏览器必须下载主HTML页(1个往返),然后解析HTML页并安排下载100个资源 - 但它只有6个连接。因此,浏览器发送前6个请求,然后等待它们返回(1个往返);然后是另外6个请求,再等待它们返回(1个往返);以此类推。在这个简单的模型中,为了下载100个资源,浏览器需要1 + 17个往返,每个往返需要200毫秒,这意味着需要3.6秒的时间。
在HTTP/2中,浏览器请求HTML页面后,由于HTTP/2是多路复用的,它可以自由地发出100个资源的所有请求,无需等待。在这个简单的模型中,要下载100个资源,浏览器需要1 + 1次往返,即400毫秒,下载时间快了10倍。
现在,事情并不像上面描述的那么简单,但多路复用仍然有相当大的影响。
您可以通过在线示例(此处此处)来查看这种影响,并且您可以查看我的HTTP/2演示文稿以及其他HTTP/2的好处(您可以在此处观看解释多路复用效果的演示)。

虽然如此,我要补充一点,在HTTP/1.1中,一个假设的浏览器为每个资源打开一个TCP连接会比在HTTP/2中每个资源都有一个流的单个TCP连接产生一些额外的开销和延迟。基本上,出于同样的原因 - 往返时间,因为每个资源的TCP连接会为握手添加额外的往返时间。因此,在另一个假设的例子中,一个普通浏览器和一个只有6个资源需要下载的页面之间的差异将仅在TCP设置成本和总体上非常小。 - Erikest

3
创建TCP连接是一项昂贵的操作,类似于复制一个大文件和成千上万个小文件,或者移动一个大箱子和许多小箱子。

每次打开连接时,您都必须完成握手,这是其高成本的原因之一。 - Nikolay 'Alagunto' Tkachenko
多核CPU能否在多线程模式下处理它?我认为如果不能同时进行握手,就无法处理。 - scott1028
@scott1028,这更多是关于你的网络连接,即使你的CPU可以同时处理多个任务,你仍然需要通过网络接收数据,这是一个相当关键的部分。你必须在网络上进行大量握手操作,而使用http2协议,你只需要进行一次握手。 - Nikolay 'Alagunto' Tkachenko
@scott1028 当然,如果您有多个连接可用,可以利用它,但这并不是每天都会发生的事情。 - Nikolay 'Alagunto' Tkachenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接