QUIC (RFC 9000 传输协议)
定义
QUIC 是基于 UDP、始终加密的传输协议,把 TLS 1.3 握手内置在传输层中,HTTP/3 就运行在它之上。
QUIC 由 RFC 9000 标准化,RFC 9001 规定了它如何使用 TLS 1.3。QUIC 不在 TCP 上跑 TLS 记录层,而是把 TLS 握手消息放进自己的 CRYPTO 帧里,用握手得到的密钥保护 QUIC 数据包。HTTP/3(RFC 9114)就是映射到 QUIC 上的 HTTP。
为什么重要
传输握手和加密握手合二为一,新建 QUIC 连接通常一个往返后就能发送应用数据,恢复的连接还能用 0-RTT。各个流相互独立,丢一个包不会像 TCP 上的 HTTP/2 那样拖慢所有请求。证书方面不需要任何改动:QUIC 使用的 X.509 证书和私钥与 TCP 上的 HTTPS 完全相同。客户端一般通过 Alt-Svc 响应头或 DNS HTTPS 记录发现 HTTP/3,再用 ALPN 值 h3 协商。运维上要放通 UDP 443 端口,云服务器的安全组也要单独加 UDP 规则;被防火墙拦住时,浏览器会退回 TCP。
例子
编译了 HTTP/3 支持的 Nginx 可以用同一张证书同时提供 TCP 和 QUIC:
server {
listen 443 ssl;
listen 443 quic reuseport;
http2 on;
server_name example.com;
ssl_certificate /etc/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/ssl/example.com/privkey.pem;
add_header Alt-Svc 'h3=":443"; ma=86400';
}
常见误区
- QUIC 要用专门的证书。 能用于 HTTPS 的证书都能用于 QUIC。
- QUIC 是不加密的 UDP,或者用的是 DTLS。 QUIC 始终加密,直接使用 TLS 1.3 握手而不是 DTLS,没有明文模式,也不支持更老的 TLS 版本。
- 上了 HTTP/3 就可以关掉 TCP 监听。 浏览器通常先走 TCP,发现 HTTP/3 后才切换到 QUIC,两个监听都要保留。