HTTP/2 与 HTTP/3 协议详解
二进制分帧、HPACK/QPACK、多路复用与 QUIC——逐项拆解 HTTP/2 与 HTTP/3 相对 1.1 改了什么。
作者 David更新于
本专栏只回答一个问题:HTTP/2 与 HTTP/3 相对 HTTP/1.1 具体改了什么,怎么改的,代价是什么。
前提:《HTTP/1.1 协议详解》。本专栏默认你已知道 1.1 的报文语法与字段语义,不再重复。
一句话概括
- HTTP/2 换掉了 1.1 的报文成帧层——文本行改二进制帧,一条连接上多路复用多个请求,头部用 HPACK 压缩。语义完全不变。
- HTTP/3 换掉了 HTTP/2 的传输层——TCP 改 QUIC(跑在 UDP 上),消除 TCP 层的队头阻塞,握手从 2–3 RTT 降到 1 RTT(复访 0 RTT)。
三个版本的语义是同一套:方法、状态码、字段含义、条件请求、缓存、认证全部沿用 RFC 9110。变的只有「字节怎么排」与「跑在什么之上」。
规范基准
| 规范 | RFC | 年份 |
|---|---|---|
| HTTP 语义(三版共用) | 9110 | 2022 |
| HTTP/2 | 9113(废止 7540) | 2022 |
| HPACK(h2 头压缩) | 7541 | 2015 |
| HTTP/3 | 9114 | 2022 |
| QPACK(h3 头压缩) | 9204 | 2022 |
| QUIC 传输 / TLS / 恢复 | 9000 / 9001 / 9002 | 2021 |
| 可扩展优先级 | 9218 | 2022 |
1.1 的四个瓶颈
后面每一章都在解决其中之一:
| 瓶颈 | 1.1 的表现 | 解法 |
|---|---|---|
| 队头阻塞(应用层) | 流水线中一个慢响应堵住其后全部 | h2 多路复用 |
| 队头阻塞(传输层) | 一个 TCP 包丢失,其后所有数据等重传 | h3 QUIC 流 |
| 头部冗余 | 每请求重发全部字段,明文数百字节 | h2 HPACK / h3 QPACK |
| 连接数爆炸 | 浏览器每域开 6 条连接绕开阻塞 | 单连接多路复用 |
阅读顺序
第 1 部分 · HTTP/2——总览、二进制分帧、流与多路复用、HPACK、伪头字段、流量控制、SETTINGS 与优先级、连接管理、服务端推送。
第 2 部分 · HTTP/3 与 QUIC——总览、QUIC 传输层、帧格式、QPACK、连接与发现。
第 3 部分 · 对照与迁移——三版全面对照、迁移注意事项。
从 HTTP/2 总览 开始。