HTTP的前世今生详解( 三 )


我们可以看到,HTTP/2 在性能上对 HTTP 有质的提高,所以,HTTP/2 被采用的也很快,所以,如果你在你的公司内负责架构的话,HTTP/2 是你一个非常重要的需要推动的一个事,除了因为性能上的问题,推动标准落地也是架构师的主要职责,因为,你企业内部的架构越标准,你可以使用到开源软件,或是开发方式就会越有效率,跟随着工业界的标准的发展,你的企业会非常自然的享受到标准所带来的红利 。
HTTP/3然而,这个世界没有完美的解决方案,HTTP/2 也不例外,其主要的问题是:若干个 HTTP 的请求在复用一个 TCP 的连接,底层的 TCP 协议是不知道上层有多少个 HTTP 的请求的,所以,一旦发生丢包,造成的问题就是所有的 HTTP 请求都必需等待这个丢了的包被重传回来,哪怕丢的那个包不是我这个 HTTP 请求的 。因为 TCP 底层是没有这个知识了 。
这个问题又叫 Head-of-Line Blocking 问题,这也是一个比较经典的流量调度的问题 。这个问题最早主要的发生的交换机上 。下图来自 Wikipedia 。

HTTP的前世今生详解


图中,左边的是输入队列,其中的 1,2,3,4 表示四个队列,四个队列中的 1,2,3,4 要去的右边的 output 的端口号 。此时,第一个队列和第三个队列都要写右边的第四个端口,然后,一个时刻只能处理一个包,所以,一个队列只能在那等另一个队列写完后 。然后,其此时的 3 号或 1 号端口是空闲的,而队列中的要去 1 和 3 号端号的数据,被第四号端口给 block 住了 。这就是所谓的 HOL blocking 问题 。
HTTP/1.1 中的 pipeline 中如果有一个请求 block 了,那么队列后请求也统统被 block 住了;HTTP/2 多请求复用一个 TCP 连接,一旦发生丢包,就会 block 住所有的 HTTP 请求 。这样的问题很讨厌 。好像基本无解了 。
是的 TCP 是无解了,但是 UDP 是有解的 !于是 HTTP/3 破天荒地把 HTTP 底层的 TCP 协议改成了 UDP!
然后又是 Google 家的协议进入了标准 – QUIC (Quick UDP Internet Connections) 。接下来是 QUIC 协议的几个重要的特性,为了讲清楚这些特性,我需要带着问题来讲(注:下面的网络知识,如果你看不懂的话,你需要学习一下《TCP/IP 详解》一书(在我写 blog 的这 15 年里,这本书推荐了无数次了),或是看一下本站的《TCP 的那些事》 。):