Skip to content

参考

基于 RFC 9113(HTTP/2)/ RFC 9114(HTTP/3)/ RFC 9000(QUIC)/ RFC 7541(HPACK)/ RFC 9204(QPACK)/ RFC 9218(Priority)/ RFC 8297(103 Early Hints)官方文档编写

速查

  • HTTP/2 = RFC 9113(2022-06,取代 RFC 7540);HPACK = RFC 7541;HTTP/3 = RFC 9114 + QUIC(RFC 9000);QPACK = RFC 9204
  • HTTP/2 关键机制:单 TCP 多 stream 二进制分帧、HPACK 头部压缩、Server Push(已弃用)、RFC 9218 Priority 头
  • HTTP/3 关键机制:QUIC(UDP)独立 stream HOL 消除、0-RTT 重连、Connection ID 连接迁移、QPACK、PRIORITY_UPDATE 帧
  • Server Push 弃用时间线:Chrome 106(2022-09)默认禁用、采用率 1.25% → 0.7%、HTTP/3 多数未实现
  • Alt-Svc 头Alt-Svc: h3=":443"; ma=86400 协商 HTTP/3,UDP/443 必须放通
  • 新优先级头Priority: u=0..7; i=?0|1(u=0 最高)
  • Fetch Priority API:HTML 层 fetchpriority="high|low|auto"
  • 0-RTT 重放风险:仅放幂等 GET/HEAD,POST / 支付必须等 1-RTT
  • 完整说明见 入门 / 核心机制详解

HTTP/1.1 vs HTTP/2 vs HTTP/3 对比表

维度HTTP/1.1HTTP/2HTTP/3
制定年代1997 / 2014 重写2015(RFC 7540)/ 2022(RFC 9113)2022(RFC 9114)
传输层TCPTCPQUIC(UDP)
加密可选必须 TLS(事实标准)TLS 1.3 内嵌
帧格式ASCII 文本二进制分帧二进制分帧(QUIC frame)
多路复用无(每连接一请求)单 TCP 多 stream单 QUIC 多 stream
应用层 HOL解决解决
传输层 HOL仍存在(TCP HOL)解决(stream 独立)
头部格式原样 ASCIIHPACKQPACK
连接上限每 origin ~6单连接足够单连接足够
域名分片需要失效失效
握手往返1 RTT (TCP) + 1-2 RTT (TLS)同左1-RTT 首次 / 0-RTT 重连
连接迁移不支持不支持支持(Connection ID)
Server Push有(已弃用多数未实现
优先级RFC 9218 Priority 头Priority 头 + PRIORITY_UPDATE 帧
流量控制TCP 级连接级 + stream 级连接级 + stream 级
典型端口80 / 443443443 / UDP
状态现行现行现行

HTTP/2 帧类型完整表

Type名称用途
0x0DATA请求 / 响应 body
0x1HEADERS头部(HPACK 压缩)
0x2PRIORITY流优先级(RFC 9113 已弃用
0x3RST_STREAM终止流
0x4SETTINGS连接参数协商
0x5PUSH_PROMISEServer Push(已弃用
0x6PING心跳 / RTT 测量
0x7GOAWAY优雅关闭
0x8WINDOW_UPDATE流 / 连接级流量控制
0x9CONTINUATIONHEADERS 续帧

帧头格式(9 字节):Length(24bit) + Type(8bit) + Flags(8bit) + Reserved(1bit) + Stream ID(31bit)。

SETTINGS 协商项

参数ID含义默认值
SETTINGS_HEADER_TABLE_SIZE0x1HPACK 动态表上限4096 字节
SETTINGS_ENABLE_PUSH0x2是否允许 Push(RFC 9113 建议设 01
SETTINGS_MAX_CONCURRENT_STREAMS0x3并发流上限无(实现限制)
SETTINGS_INITIAL_WINDOW_SIZE0x4流级流量控制初始窗口65535
SETTINGS_MAX_FRAME_SIZE0x5单帧 payload 上限16384(上限 16777215)
SETTINGS_MAX_HEADER_LIST_SIZE0x6头部列表上限(防 DoS)无限

HPACK vs QPACK 对比

维度HPACK(h2)QPACK(h3)
RFC75419204
静态表条目数6199
动态表FIFO,受 SETTINGS_HEADER_TABLE_SIZE 控制同左
Huffman静态静态
ACK 机制共享 TCP,天然有序独立 Encoder/Decoder 单向流
压缩层 HOL受 TCP HOL 影响Insert Count 阈值避免(超过则退化为字面量)
Stream type(h2 无)Encoder 0x02 / Decoder 0x03

优先级方案演进

方案载体字段状态
RFC 7540 PRIORITY 帧PRIORITY 帧weight 1-256 + dependency treeRFC 9113 弃用
RFC 9218(HTTP/2)Priority 头`u=0..7; i=?01`
RFC 9218(HTTP/3)PRIORITY_UPDATE 帧(0x24 / 0x25)同上现行
HTML 层<img fetchpriority="...">high / low / auto现行(Fetch Priority API)

字段语义

  • u=0..7:urgency,0 最高 / 7 最低
  • i=?1:incremental,可增量交付(流式)
  • i=?0:non-incremental,一次性交付

QUIC Connection ID

维度TCP 4 元组QUIC Connection ID
标识源 IP + 源端口 + 目的 IP + 目的端口8 字节可变 CID
网络切换IP 变 → 连接断IP 变 → 连接不断
复用不可服务端按 CID 复用连接状态
预发NEW_CONNECTION_ID 帧
多路径不支持支持(迁移 + 路径验证)

Alt-Svc 协商流程

text
[首次访问 example.com]
浏览器  →  GET /  (HTTP/2 over TCP/443)
服务器  →  200 OK
         Alt-Svc: h3=":443"; ma=86400
浏览器  ← 缓存 Alt-Svc(86400 秒)

[后续访问]
浏览器  →  GET /  (尝试 HTTP/3 over UDP/443)
         若 UDP/443 不通 → 回退 HTTP/2
         若通 → 持续走 h3

关键字段

  • h3=":443":协议 + 端口
  • ma=86400:max-age,缓存有效期(秒)
  • h3-29=":443":可指定 draft 版本
  • persist=1:跨浏览器会话保留

103 Early Hints vs Server Push

维度Server Push(已弃用)103 Early Hints
RFCRFC 7540 / 9113RFC 8297
决策方服务端(推什么、推多少)浏览器(是否加载)
缓存撞车经常推已缓存资源浏览器命中缓存即跳过
HTTP/3 支持多数未实现已广泛支持
浏览器禁用Chrome 106 默认禁用全部支持
推荐度不要再使用推荐替代方案

103 响应示例

text
HTTP/1.1 103 Early Hints
Link: </style.css>; rel="preload"; as="style"
Link: </app.js>; rel="preload"; as="script"

HTTP/1.1 200 OK
Content-Type: text/html

0-RTT 安全注意

维度1-RTT 数据0-RTT early data
前向保密
重放风险
推荐请求所有仅幂等 GET / HEAD
禁用场景——POST / 支付 / 写操作
来源TLS 1.3 握手后上次会话密钥派生

RFC 9001 E.5、Cloudflare / ETH 调研均强调:0-RTT early data 不能用于非幂等操作,否则攻击者重放会导致重复执行事务。

浏览器与服务器支持矩阵

浏览器(HTTP/2)

浏览器起始版本
Chrome41+(2015)
Firefox36+
Safari9+
Edge12+

浏览器(HTTP/3)

浏览器起始版本
Chrome87+(2020-11)
Firefox88+
Safari14+
Edge87+

服务器

服务器HTTP/2HTTP/3
nginx1.9.5+(默认开)1.25.0+(实验)
Apache2.4.17+(mod_http2)仍在路上(实验模块)
Cloudflare默认默认
Fastly默认默认
Akamai默认默认
Caddy默认2.6+
Node.js内置(http2)实验模块
h2o默认默认

RFC 与版本状态

RFC标题年代状态
7540HTTP/22015-05被 RFC 9113 取代
7541HPACK2015-05现行
8297103 Early Hints2017-12现行
9000QUIC 传输2021-05现行
9001QUIC + TLS 集成2021-05现行
9002QUIC 丢包与拥塞2021-05现行
9113HTTP/22022-06现行
9114HTTP/32022-06现行
9204QPACK2022-06现行
9218Extensible Prioritization2022-06现行

官方资源