服务器开了 HTTP/3,日志里可能一行 h3 都没有——QUIC v2 进 Firefox 155,协商这一步补齐了

你在 nginx 上开过 HTTP/3 吗?开完打开网站,感觉快了点,然后就没然后了。但如果去翻访问日志,大概率会发现一件尴尬的事:绝大多数请求的 $server_protocol 还是 HTTP/2,HTTP/3 一个字节都没跑上去。

一个设计得极其「宽容」的协议,翻车的时候不会报错。

HTTP/3 会静默降级。 UDP 443 被公司防火墙挡了、证书没覆盖当前域名、服务器没发 Alt-Svc 头、DNS 里没有 HTTPS(SVCB)记录——这些都只意味着一件事:浏览器悄悄回到 HTTP/2,页面照常打开,用户没感觉,你的监控也没有。几个月后你问「我们不是上了 HTTP/3 吗」,手里没有任何数据能回答。

这件事在 2026 年 9 月有了新进展。Firefox 155(2026-09-01 发布)正式支持 QUIC v2 的兼容版本协商(Compatible Version Negotiation,CVN),把「版本号对不上就要多走一个 RTT」这个历史包袱去掉了。

QUIC v2 到底改了啥

先泼一盆冷水:QUIC v2(RFC 9369)没有任何新功能。规格里写得很直白——v2 相比 v1,应用层能用的能力一个都没变。

它改变的是线缆上的常量:版本号、Initial salt、HKDF 标签、长包头里的包类型编码、Retry Integrity Tag 的密钥和 nonce。就这么多。目的是反「协议僵化」(ossification)——逼着中间盒、内核、库实现真正去跑版本协商,而不是把 v1 的字节模式硬编码进去。

v1 版本号: 0x00000001
v2 版本号: 0x6b3343cf   ← 规则外的随机值,不是 "2"

所以「升级到 QUIC v2 会不会更快」这个问法本身就是错的。它的目的不是吞吐,是健康度。真正省时间的是它配套的 RFC 9368 兼容版本协商:

  • 没有 CVN:客户端拿 v1 去连只支持 v2 的服务器,服务器回一个 Version Negotiation 包,多付出一个 RTT。
  • 有 CVN:两端在握手里通过 version_information 传输参数把各自支持的版本全集亮出来,服务器直接切到互通版本,零额外 RTT。

v1 和 v2 按定义就是互通的,所以支持 CVN 的部署可以「免费」同时提供两个版本。Firefox 155 做的就是这样——当服务器通过协商选中 QUIC v2 时,直接切过去,不做多余的往返。

为什么性能工程师该关心这个

因为 HTTP/3 的性能收益,大部分不是在协议本身,而是在它到底有没有真的被用上。

衡量方式只有一种:把协议版本写进日志。nginx 里最省事的做法:

log_format h3 '$remote_addr $status $server_protocol '
              '$request_time "$http_user_agent"';
access_log /var/log/nginx/access.log h3;

然后按 $server_protocol 分组统计。如果 HTTP/3 的占比长期接近 0,问题几乎一定出在这三处:

  1. 没发 Alt-Svc 头。nginx 不会自动发,要自己加 add_header Alt-Svc 'h3=":443"; ma=86400';。少了这行,HTTP/3 技术上能用,但浏览器永远不知道它存在。
  2. 服务器防火墙没放行 UDP 443,或者上游 CDN/负载均衡吞掉了 QUIC 包。QUIC 要求路径上至少能过 1200 字节的报文,隧道、VPN、激进的 MTU 设置一旦把上限压到阈值以下,握手会静默失败。
  3. DNS 侧没做 HTTPS(SVCB)记录。RFC 9460 允许 DNS 直接广告支持的 ALPN:
example.com. 300 IN HTTPS 1 . alpn="h3,h2"

这比 Alt-Svc 更快,因为它省掉了那一次 TCP 往返。但注意:在 DNS 里广告 h3 并不会让服务器启用 QUIC——边缘是否真支持、证书是否覆盖该主机名、UDP 443 是否可达,得自己逐项确认。

对运营方的可落地顺序:先确认边缘配置,再抓实际返回的 DNS 记录,然后在冷/热缓存、IPv6 通与不通、UDP 放行与封禁这几种条件下对比浏览器 trace。

一个别踩的坑

QUIC v2 也不是没有成本。DNS 记录、Alt-Svc 缓存、TLS 会话票据和 NEW_TOKEN 令牌都是版本绑定的:v1 发出来的票据不能拿去开 v2 连接,反过来也一样,服务器必须校验来源版本,否则只能回退到完整 TLS 握手,0-RTT 也就没了。

另外 nginx 的 HTTP/3 模块到 2026 年 8 月(1.31.4)官方文档里那句话依然是「experimental, caveat emptor」。这不是过时的免责声明——近三个月它的 changelog 里还有 HTTP/3 的 use-after-free(CVE-2026-42530)和 IPv6 分片相关修复。用可以,但补丁别拖。

结论

QUIC v2 进 Firefox 155 的意义,不是「网站变快」,而是版本协商那一步终于不用额外付 RTT 了。而你上一个季度的 HTTP/3 优化有没有生效,答案不在 Lighthouse 里,在你自己的访问日志里。

先加一行 $server_protocol,按协议分组跑一周。数据出来之前,所有「我们上了 HTTP/3」都是猜测。

评论区

0 条评论

登录后可评论。

阿速·性能优化 1291 阅读