HTTP/3 与 Alt-Svc
HTTP/3 运行在 QUIC 之上(使用 UDP),服务端必须通过 Alt-Svc 响应头或 HTTPS DNS 记录告知客户端「这个域名也支持 h3」。客户端缓存该信息后,后续连接才会尝试 QUIC;没有通告时,即使服务端已经支持 QUIC,客户端通常也不会主动尝试。因此遇到「服务端配了 h3、访问却仍是 h2」的情况,第一个检查点就是 Alt-Svc 是否下发、UDP 是否通畅。
基本信息
| 响应头示例 | Alt-Svc: h3=":443"; ma=86400(ma 为缓存秒数) |
|---|---|
| DNS 方式 | HTTPS 记录(SVCB / HTTPS RR)可在连接前告知 h3 支持 |
| nginx 支持 | 1.25.0 起提供实验性 http_v3 模块,需要 TLS 1.3 与 UDP 监听 |
| 网络前提 | 沿途设备与安全组都要放行 UDP 443 |
| 验证工具 | curl --http3、浏览器开发者工具中的协议列 |
典型使用场景
- 弱网与高丢包环境下的首包与建连优化:QUIC 的 0/1-RTT 建连优势明显
- 移动端多网络切换场景:连接迁移可减少切网后的重建开销
- 灰度上线 h3:先小流量验证 UDP 通路与 CDN 行为
- 排查「通告了 h3 但访问反而变慢」:多为 UDP 被拦导致先失败再回退
- 多 CDN 场景核对通告端点,避免后端与 CDN 下发冲突信息
查看与配置
查看与配置
curl -sI https://example.com | grep -i alt-svc # 查看是否通告 h3
curl -sI --http3 https://example.com | head -3 # 强制用 h3 请求
curl -so /dev/null -w 'http_version=%{http_version}\n' https://example.com/
# nginx(实验性)关键片段:
# listen 443 quic reuseport;
# add_header Alt-Svc 'h3=":443"; ma=86400';HTTP/3 通路检查项
| 检查项 | 命令或位置 | 预期结果 |
|---|---|---|
| 客户端协商 | curl --http3 -w '%{http_version}' | 输出 3 或 3.0 |
| 服务端通告 | curl -sI | grep -i alt-svc | 含 h3= 与 ma 值 |
| UDP 可达 | 从客户端探测 443/udp | 无拒绝、无明显丢包 |
| DNS 记录 | dig +short HTTPS example.com | 返回含 alpn 信息的记录 |
Alt-Svc 会被客户端按 ma 指定的秒数缓存:切网、回退或灰度期间出现短暂异常属于预期行为,排查时先清缓存或用无痕窗口复测。CDN 场景下通告通常由 CDN 生成,后端不要再下发不一致的端点。
迁移节奏建议:先在测试域名确认 UDP 通路与 CDN 行为,再用小流量灰度;监控上除了成功率,还要盯「首次访问耗时」,因为 QUIC 被拦时最先恶化的是首包体验,而不是可用性。