三者都提供相同的 HTTP 语义(method、header、status code),但在如何在线路上传输字节这一点上不同——每个版本都修复了前一个版本的一个瓶颈。贯穿始终的主题是消除 head-of-line (HOL) blocking,即一个卡住的请求拖住了其他请求。
HTTP/1.1 over TCP one request at a time per connection
conn ──[req A]──[req B]──[req C]──▶ B waits for A (HOL blocking at HTTP layer)
HTTP/2 over TCP many streams multiplexed on ONE connection
conn ══[A|B|C interleaved]══▶ but a lost TCP packet stalls ALL streams
(HOL blocking moves down to TCP)
HTTP/3 over QUIC (UDP) independent streams, per-stream delivery
conn ══[A][B][C]══▶ a lost packet stalls only its own stream
每条连接一次只发送一个请求;浏览器通过为每个 host 打开约 6 条并行连接来绕开这一点,且文本头部未经压缩地发送。 增加了 ——在单条连接上并发多个 ——外加二进制分帧、头部压缩(HPACK)和 server push。但因为它仍然运行在 TCP 上,单个丢失的数据包会阻塞 stream,直到它被重传:HOL blocking 只是从 HTTP 层下移到了 TCP。
