Skip to content
Go back

HTTP/2 vs HTTP/3——从TCP队头阻塞到QUIC的彻底解决

HTTP/2 → HTTP/3:QUIC 如何根除队头阻塞

一句话结论(30s)

HTTP/2 用单条 TCP 上的多路复用解决了 HTTP 层的队头阻塞,但因为所有 Stream 仍跑在同一条 TCP 线上、只要一个包丢失就全都要等重传,所以 TCP 层的队头阻塞依然存在;HTTP/3 改用基于 UDP 的 QUIC、让每个 Stream 拥有独立的可靠传输与重传,丢包只影响本流,这才彻底根除队头阻塞。

核心原理(2min)

底层深入(5-10min)

HTTP/1.1 的问题

每个 TCP 连接同一时间只能处理一个请求(串行)。即使用了 6 个并行连接,队头阻塞——第一个请求慢、后面所有请求都等——仍然存在。

HTTP/2 的改进与问题

多路复用:一条 TCP 连接上并行传输多个 HTTP 请求/响应(通过 Stream ID 区分)。解决了 HTTP/1.1 的应用层队头阻塞。

但引入了新问题——TCP 层的队头阻塞

TCP 一端的发送顺序: [Stream1: Pkt1] [Stream2: Pkt1] [Stream1: Pkt2]
如果 Pkt1 丢失 → 后面的 Pkt1(Stream2) 和 Pkt2(Stream1) 都无法交付应用层
→ TCP 必须等 Pkt1 重传 → 所有 Stream 全部被这一个包阻塞

思考:HTTP/2 都已经多路复用了,为什么还有队头阻塞?因为多路复用只解决了「应用层」的排队问题,可所有 Stream 的数据仍塞在同一条 TCP 字节流里。TCP 要求字节流严格有序、不允许空洞,一个包丢了,它后面的包即使到了也只能憋在内核里等重传——所有 Stream 一起陪葬。换句话说,HTTP/2 把多个请求「并」进了一条会整体卡顿的管道。

HTTP/3 + QUIC:每个流独立可靠

QUIC 基于 UDP,但每个 Stream 有独立的可靠传输和重传机制:

QUIC 发送:
  Stream1: [Pkt1(id=1, offset=0)] [Pkt2(id=1, offset=1024)]
  Stream2: [Pkt1(id=2, offset=0)] [Pkt2(id=2, offset=1024)]

如果 Stream1 的 Pkt1 丢失 → 只有 Stream1 等待重传 → Stream2 继续交付不受影响

HTTP/2 的 Stream 都在同一条 TCP 线上 → 一个包丢全部等。HTTP/3 的 Stream 各自独立 → 丢包只影响本流。

思考:QUIC 凭什么丢包只阻塞本流?因为它把「可靠传输」从 TCP 这一条大管,拆成了每个 Stream 一条独立的小管。每个 Stream 有自己的序号和重传机制,Stream1 丢包只重传 Stream1 的包,Stream2 的数据不依赖 Stream1 的序号就能继续向上交付——根子上的区别是「有没有跨流的顺序依赖」。

QUIC 的其他改进

  1. 0-RTT 握手:之前连过的服务器可以直接发加密数据(PSK),无需握手
  2. 连接迁移:QUIC 连接不依赖四元组(IP+Port),WiFi 切 4G 保持连接不中断
  3. 内置 TLS 1.3:加密是 QUIC 的必选项,不再是可选层

总结

HTTP/1.1HTTP/2HTTP/3
传输层TCPTCPQUIC (UDP)
多路复用
TCP 队头阻塞❌(有)✅(无)
连接建立3-way + TLS3-way + TLS0-RTT / 1-RTT

章末提问

Q1:HTTP/2 解决了队头阻塞吗?为什么?

结论先行:只解决了应用层队头阻塞,TCP 层的队头阻塞依然存在。因为 HTTP/2 用一条 TCP 上的 Stream 多路复用解决了「请求串行排队」,但所有 Stream 共享同一条 TCP 字节流,TCP 严格有序,一个包丢失会导致后续所有包无法交付,所有 Stream 一起被卡。

Q2:HTTP/3 靠什么彻底根除队头阻塞?

结论先行:靠基于 UDP 的 QUIC,让每个 Stream 拥有独立的可靠传输与重传。因为 QUIC 内部每个 Stream 有独立序号和重传机制,丢包只影响本流,其他流的数据不依赖这个包的序号就能继续交付,彻底切断了「跨流的顺序依赖」。

Q3:QUIC 相比 TCP 还有哪些额外优势?

结论先行:0-RTT 握手、连接迁移、内置 TLS 1.3。因为 QUIC 把加密与传输握手合并(PSK 可 0-RTT),连接用 Connection ID 标识而非四元组(切网不断),加密是必选项而非可选项,这三者都直击 TCP 在移动端和高延迟场景的痛点。


Share this post on:

Previous Post
HTTPS握手过程——TLS是怎么保护通信安全的
Next Post
HTTP vs RPC:两种服务间通信协议的全面对比