10. HTTP/1.1 → HTTP/2 → HTTP/3 的演进(热度 297 / 284 · 进阶)
Q: HTTP/2 相比 1.1 有哪些改进?HTTP/3 为什么改用 UDP?
A:
HTTP/1.1 的限制
持久连接(keep-alive 默认)+ 管线化(实践中少用);同一连接上请求/响应串行,存在应用层队头阻塞;浏览器对同域名开多条 TCP(如 6 条)缓解;头部冗余。雪碧图、域名分片等优化本质是在绕协议限制。
HTTP/2(基于 TCP)
① 二进制分帧;② 多路复用(一条连接并发 stream,流 ID 区分);③ 头部压缩 HPACK;④ 服务器推送(实践支持度下降)。
仍存在 TCP 层队头阻塞: 任一 TCP 段丢失,后续字节必须重传等待,所有 HTTP/2 流一起被阻塞。
HTTP/3(基于 QUIC/UDP)
可靠性与流控下移到 QUIC,按流独立,彻底解决传输层队头阻塞;0-RTT/1-RTT 建连(与 TLS1.3 融合);连接迁移(CID 标识连接,换网不断);用户态协议栈迭代更快。
层次差异:HTTP/2 解决应用层队头阻塞;HTTP/3 才解决传输层队头阻塞。
为何在 UDP 上自研: TCP 在内核、中间设备干扰多、OS 更新慢;UDP 443 已广泛放行,部署可行。HTTP 语义(方法/状态码/头部)保持不变以降低迁移成本。
常见追问
追问 1:HTTP/2 解决了队头阻塞,为什么还不够?
- 答题要点: HTTP/2 多路复用只在应用层把请求交织到一条 TCP;TCP 仍保证单一有序字节流,底层丢包时所有流共命运。要按流独立重传/交付,需要 QUIC 那样的流层可靠性。
追问 2:HTTP/3 为什么用 UDP,而不是向 IP 层申请一个新的协议号?
- 答题要点: 新 IP 协议号中间设备兼容性差、防火墙/NAT 易丢弃;更关键的是 QUIC 在用户态把可靠传输与 TLS 1.3 加密合为一体、可随应用快速迭代,本就不依赖 IP 协议号来定义自己——UDP 只是它穿透中间设备的载体,包头显式声明 QUIC 版本与 Connection ID。加上 UDP 443 早已广泛放行,部署可行。
追问 3:如何知道服务器是否支持 HTTP/2 或 HTTP/3?
- 答题要点:
curl -I --http2 https://example.com或看响应头alt-svc: h3=":443"; ma=...;Wireshark 看 TLS ALPN 协商(TCP 上只会是h2/http/1.1;h3走 QUIC,抓包看alt-svc与 QUIC Initial);Chrome 开发者工具 Protocol 列。
易错点
| 易错说法 | 纠正 |
|---|---|
| 「HTTP/2 底层是 UDP」 | HTTP/2 基于 TCP;TLS 非协议层面强制(h2c 与明文 prior-knowledge 允许明文模式),但浏览器与主流服务器只实现 TLS 之上的 h2,实际部署恒为 TLS |
| 「HTTP/2 已无队头阻塞」 | 应用层队头阻塞解决,TCP 层仍在 |
| 「HTTP/3 只是 HTTP/2 换端口」 | 传输层变成 QUIC/UDP,多路与握手模型都变了 |
| 「keep-alive 是 HTTP/2 多路复用」 | keep-alive 只是复用连接;多路复用是并发交错的流 |
| 「HPACK 可有可无」 | 头部压缩是 HTTP/2 正式特性,对性能很重要 |
与选择题对照
- 主库 150: 第 92 题(1.1/2/3 正确叙述)、第 84 题(HTTP 特点)、第 145 题(keep-alive)、第 91 题(HTTPS/端口)、第 65 题(HTTP/3 相关 UDP 应用思路)。
- 补题 16: 补-13(UDP 相关,支撑 HTTP/3 底层)。
- 口述联动: 选择题可能考「谁基于 UDP/谁有多路复用」;面试必须能分层讲「应用层队头阻塞 vs 传输层队头阻塞」。
工程 / 抓包背景
- curl:
curl --http2 -I、curl --http3 -I(构建支持时)。 - Nginx: HTTP/2 在 Nginx ≤1.24 写
listen 443 ssl http2;,1.25.1 起该参数被标记 deprecated(官方文档至今只说"已废弃、应改用http2指令",并未声明在任何版本移除,旧写法仍可解析),新配置应写成listen 443 ssl;+http2 on;;HTTP/3 需 quic 指令与Alt-Svc头。 - Wireshark: ALPN 显示 h2;HTTP/3 是 QUIC 加密,可用密钥日志(
SSLKEYLOGFILE)解密部分信息。 - 浏览器: Network → Protocol 列显示 h2/h3。
- 运维注意: 升级 HTTP/2 后单连接放大,需调
worker_connections、关注 TCP 缓冲与队头阻塞相关时延。