HTTP/3 是把 QUIC 用作传输层的 HTTP 版本,2022 年作为 RFC 9114 完成标准化。主要的浏览器与 CDN 已经支持,实际传输的请求中有一定比例通过 HTTP/3 进行。短链接的重定向体验会随 HTTP 版本不同而在体感速度上产生差别,因此对 HTTP/3 的支持也是短链接服务需要考虑的对象。
HTTP/3 在短链接上见效的地方是首次连接的握手时间。HTTP/2 及之前,TCP 的连接建立与 TLS 握手分别进行,开始发送数据前需要多次往返;而 HTTP/3 由 QUIC 把传输与加密握手合为一体,首次连接 1 次往返即可,向连接过的对象重新连接时可以用 0-RTT 开始发送数据。点击短链接时会发生 DNS 解析、TLS 握手、HTTP 请求、重定向响应的往返、向重定向目标的再次连接等多次往返。采用 HTTP/3 后握手的往返次数减少,首次连接的延迟下降,在延迟和丢包较大的移动网络上,有时能感受到差别。
3xx 响应的处理在 HTTP/3 中基本没有变化。301 (永久移动)、302 (临时移动)、307 (临时,保持方法)、308 (永久,保持方法) 的语义与 HTTP/2 相同。不过,首次连接时服务器通过 HTTP 的 Alt-Svc 头或 DNS 的 HTTPS 记录告知,就可以把后续连接切换到 HTTP/3。
也有把 HTTP/3 与 CDN 组合起来使用的构成。CloudFront (自 2022 年 8 月起)、Cloudflare、Fastly 都已支持 HTTP/3,如果在边缘节点上就把重定向处理闭环完成,就能不经过回源往返直接响应。把短链接的重定向数据放在可以在边缘节点读取的 Cloudflare Workers KV 等数据存储中,就构成了不向源站查询、由边缘直接响应的结构。
使用 0-RTT 有注意点。0-RTT 对减少重连时的往返有效,但存在重放攻击风险,因此只限用于 GET 这类安全方法的请求。POST 请求以及会改变状态的操作,标准做法是不予适用。短链接的重定向属于 GET 请求,有时可以适用 0-RTT,但即使是安全的方法也可能产生副作用,因此前提是点击记录等不会重复的设计。
HTTP/3 在运维层面容易被忽视的是 UDP 的过滤问题。部分企业局域网和老式防火墙会封锁 UDP 443,在这类环境下 HTTP/3 连接无法建立,会回退到基于 TCP 的 HTTP/2。回退的判定需要时间时,首次连接反而可能变慢。如果采用 Alt-Svc 的 「persist=1」 或 DNS 的 HTTPS 记录,事先把支持 HTTP/3 的信息告知客户端,就能抑制回退时的延迟。
HTTP/3 与短链接的组合,关系到移动端用户体验、SEO 的页面速度评价以及与 CDN 的亲和性。缩短 1 段重定向的总耗时,用户的等待时间就会减少。