聊聊 HTTP/3 与 QUIC 的队头阻塞

2026-06-18 · 网络

HTTP/2 解决了应用层的队头阻塞——一个连接上可以并发多个流。但它跑在 TCP 上,而 TCP 是一条严格有序的字节流:只要中间丢了一个包,后面所有已经到达的包都得在内核缓冲里干等,哪怕它们属于完全不相干的流。这就是所谓的"传输层队头阻塞"。

QUIC 怎么绕开这件事

QUIC 把多路复用下沉到了自己这一层,并且每个流独立管理有序交付。丢包只会阻塞它所在的那个流,别的流照常往上交。在丢包率 1%~2% 的弱网里,这个差别相当明显。

# 用 curl 直接发 HTTP/3 请求(curl 需带 --with-nghttp3 编译)
curl -sI --http3 https://cloudflare-quic.com/ | head -1
# HTTP/3 200

抓包时的几个观察

QUIC 跑在 UDP 上,握手和 TLS 1.3 合并了,首包就能带上应用数据(0-RTT 的情况下更激进)。用 Wireshark 看的时候记得导入密钥日志,否则全是密文:

export SSLKEYLOGFILE=/tmp/quic-keys.log
# 然后在 Wireshark 里 Protocols → TLS → (Pre)-Master-Secret log filename

另外一个容易忽略的点:很多中间设备对 UDP 的 QoS 比 TCP 差,某些网络甚至直接限速 UDP。所以 HTTP/3 快不快,有时候取决于你到对端这一路上有没有人跟 UDP 过不去。

← 返回首页