# QUIC（RFC 9000 传输协议）是什么？

> QUIC 是基于 UDP、始终加密的传输协议，把 TLS 1.3 握手内置在传输层中，HTTP/3 就运行在它之上。

Source: https://ssl.sh/zh/glossary/quic/
Last updated: 2026-11-10

QUIC 由 [RFC 9000](https://www.rfc-editor.org/rfc/rfc9000) 标准化，RFC 9001 规定了它如何使用 [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/)。QUIC 不在 TCP 上跑 TLS 记录层，而是把 TLS 握手消息放进自己的 CRYPTO 帧里，用握手得到的密钥保护 QUIC 数据包。HTTP/3（RFC 9114）就是映射到 QUIC 上的 HTTP。

## 为什么重要
传输握手和加密握手合二为一，新建 QUIC 连接通常一个往返后就能发送应用数据，恢复的连接还能用 [0-RTT](https://ssl.sh/zh/glossary/0-rtt/)。各个流相互独立，丢一个包不会像 TCP 上的 HTTP/2 那样拖慢所有请求。证书方面不需要任何改动：QUIC 使用的 X.509 证书和私钥与 TCP 上的 HTTPS 完全相同。客户端一般通过 `Alt-Svc` 响应头或 DNS HTTPS 记录发现 HTTP/3，再用 [ALPN](https://ssl.sh/zh/glossary/alpn/) 值 `h3` 协商。运维上要放通 UDP 443 端口，云服务器的安全组也要单独加 UDP 规则；被防火墙拦住时，浏览器会退回 TCP。

## 例子
编译了 HTTP/3 支持的 Nginx 可以用同一张证书同时提供 TCP 和 QUIC：

```nginx
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，两个监听都要保留。

## 相关术语

- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
- [ALPN](https://ssl.sh/zh/glossary/alpn/): ALPN 是一个 TLS 扩展，让客户端和服务器在握手过程中直接商定上层协议，例如 h2 或 http/1.1，不需要额外往返。
- [0-RTT](https://ssl.sh/zh/glossary/0-rtt/): 0-RTT 是 TLS 1.3 和 QUIC 的特性，允许回访的客户端用上一次会话留下的密钥，在第一个数据包里就发送应用数据。
- [TLS 握手](https://ssl.sh/zh/glossary/tls-handshake/): TLS 握手是 TLS 连接开始时的一组消息交换，客户端与服务器在其中协商协议版本和密码套件、验证服务器身份并派生会话密钥。
- [TLS 终止](https://ssl.sh/zh/glossary/tls-termination/): TLS 终止是指网络路径上客户端 TLS 连接结束并被解密的位置，可以是 CDN 边缘、负载均衡、反向代理，也可以是应用服务器本身。
- [SNI](https://ssl.sh/zh/glossary/sni/): SNI 是 TLS 的一个扩展，客户端在 ClientHello 中写明要访问的域名，使同一个 IP 能为多个 HTTPS 站点分别返回各自的证书。
