QUIC
QUIC 的定位、核心机制与其相对 TCP TLS 的改进说明
[!info] related notes
QUIC
QUIC 可以理解成:
“把 TCP + TLS + 更聪明的多路复用,重新放到 UDP 之上做一遍。”
它是一个现代传输层协议,IETF 标准版主要由 RFC 9000(传输)、RFC 9001(TLS 集成)、RFC 9002(丢包恢复与拥塞控制) 定义;HTTP/3 则定义在 RFC 9114 上,并把 QUIC 作为底层传输。QUIC 的目标不是“替代所有 UDP”,而是解决传统 TCP + TLS + HTTP/2 组合在高延迟、丢包、移动网络切换等场景里的问题。(IETF)
1. 先说本质:QUIC 到底是什么
QUIC 是一个面向连接、默认加密、基于 UDP 承载的通用传输协议。
注意这里最容易误解的一点:
- QUIC 不是“UDP 的增强包格式”
- QUIC 也不是“HTTP/3 的别名”
- HTTP/3 是跑在 QUIC 上的应用层协议
- QUIC 本身是传输层协议
也就是说,关系大致是:
应用层:HTTP/3、WebTransport、MoQ 等
传输层:QUIC
网络层:IP
链路层:以太网 / Wi-Fi / 5G
QUIC 之所以跑在 UDP 上,不是因为 UDP 更“高级”,而是因为 UDP 足够简单,方便 QUIC 在用户态自己实现连接建立、可靠传输、拥塞控制、加密协商和多路复用这些机制。(IETF)
2. QUIC 为什么会出现
QUIC 的诞生,核心是为了解决传统 Web 传输栈的几个老问题。
第一类问题:连接建立太慢
传统 HTTPS 通常是:
- 先 TCP 三次握手
- 再 TLS 握手
- 然后才能传 HTTP 数据
这会带来明显的首包时延。QUIC 把 传输握手和 TLS 1.3 握手整合起来,首次连接可以做到更少的往返,恢复会话时还支持 0-RTT,所以能更快开始传业务数据。(IETF)
第二类问题:TCP 队头阻塞
HTTP/2 已经能多路复用,但它仍然跑在一条 TCP 连接上。
TCP 一旦某个包丢失,后续字节要按序交付,结果会让整条连接上所有流一起被卡住。这就是传输层的队头阻塞。
QUIC 则把可靠性和重传管理放到每个流的逻辑层面。某个流丢了包,主要影响那个流,不会像 TCP 那样把整条连接里的所有流都一起拖住。HTTP/3 因此在弱网、丢包网络里往往比 HTTP/2 更稳。(Cloudflare Docs)
第三类问题:网络切换不友好
TCP 连接很依赖四元组:
源 IP + 源端口 + 目的 IP + 目的端口
手机从 Wi-Fi 切到 5G,IP 一变,TCP 往往就得重建。
QUIC 引入 Connection ID,让连接标识不完全绑定底层四元组,因此更容易做连接迁移。RFC 9000 也把 path migration 作为核心能力之一。(IETF)
3. QUIC 的核心设计思想
3.1 跑在 UDP 上,但自己实现“可靠传输”
UDP 本身是不可靠的,不保证送达、不保证顺序。
QUIC 则在 UDP 之上自己补上:
- 包编号
- ACK 确认
- 丢包检测
- 重传
- 拥塞控制
- 流量控制
所以从能力上看,QUIC 很像“现代化的 TCP”;但从实现方式上,它更灵活,因为很多逻辑不再被内核 TCP 栈固定死。RFC 9002 专门定义了 QUIC 的丢包恢复和拥塞控制。(RFC Editor)
3.2 默认强制加密
QUIC 不是“可选 TLS”,而是把 TLS 1.3 直接集成进协议。
也就是说,标准 QUIC 连接的建立过程,本身就包含密钥协商、加密级别切换、握手保护等机制。实践里你可以把它理解成:
QUIC 基本等于“传输层和安全层捆在一起设计”。 (IETF)
3.3 天然多路复用
QUIC 连接内部可以有很多 stream(流):
- 每个流有自己的偏移和状态
- 可单向,也可双向
- 流之间彼此独立
这意味着,一个连接上可以同时跑很多请求/响应,而不会因为一个流的丢包把别的流全部阻塞。HTTP/3 就是利用这个能力,把多个 HTTP 请求并行塞进一条 QUIC 连接。(IETF)
4. QUIC 的连接建立:为什么它更快
4.1 1-RTT 建连
第一次连一个服务端时,QUIC 通常需要一次往返来完成握手并建立 1-RTT 密钥,之后就能正常收发加密数据。因为 TLS 和传输参数协商被合并了,所以整体比“TCP 握手 + TLS 握手”更紧凑。(IETF)
4.2 0-RTT 恢复
如果客户端以前连过这个服务端,保存了恢复信息,那么重连时可以直接带上 0-RTT 数据,实现“还没完全握完手,就先发业务数据”。
但 0-RTT 不是白送的,它有重放风险,所以只适合幂等请求,比如某些 GET;不适合会产生副作用的请求,比如扣款、下单。这个点在工程上非常关键。(IETF)
5. QUIC 里的几个重要概念
5.1 Packet Number(包号)
TCP 用字节序号;QUIC 更强调数据包级别的编号。
而且 QUIC 在不同加密阶段还会使用不同的 packet number space,这样不同密钥阶段的确认和丢包判断不会相互干扰。RFC 9002 明确说明了这一点。(RFC Editor)
5.2 Stream(流)
QUIC 把连接拆成很多逻辑流。
每个流都有自己的数据偏移、结束标志、控制状态。HTTP/3 中,通常一个请求/响应对应一个或几个相关流。(IETF)
5.3 Connection ID
这是 QUIC 非常有代表性的设计。
它让连接不再完全依赖底层 4 元组,使得 NAT 变化、网络切换、迁移路径时,连接仍可能继续存活。移动设备从 Wi-Fi 切换到蜂窝网络时,这一点特别有价值。(IETF)
5.4 Flow Control(流量控制)
QUIC 同时有:
- 连接级流控
- 流级流控
这是为了防止发送方把接收方缓冲区打爆。虽然 QUIC 很灵活,但它不是“想发多少就发多少”。(IETF)
5.5 Congestion Control(拥塞控制)
QUIC 不只是“快发”,它也做拥塞控制。
RFC 9002 提供了 QUIC 的恢复和拥塞控制框架,整体思路和现代 TCP 有相似处,但因为 QUIC 的包号空间、ACK 机制、加密阶段等不同,算法细节也不同。(RFC Editor)
6. QUIC 如何解决 HTTP/2 的队头阻塞
这是 QUIC 最值得抓住的一点。
在 HTTP/2 + TCP 里
虽然 HTTP/2 已经把很多请求复用到一条连接上,但底层仍是单条 TCP 字节流。
如果 TCP 某个分段丢了,后续字节即使已经到了,接收方也不能越过缺口把后面的内容交上去,于是所有流都被这个缺口卡住。
在 HTTP/3 + QUIC 里
QUIC 把连接拆成多个独立流。
一个流里的丢包,主要影响该流自己的重组和交付;别的流只要对应数据齐全,就能继续推进。
所以常说:
HTTP/3 并不是“HTTP 更快一点”,而是它借助 QUIC,摆脱了 TCP 传输层队头阻塞。 (Cloudflare Docs)
7. QUIC 和 TCP 的本质区别
可以这样对比着看:
| 项目 | TCP | QUIC |
|---|---|---|
| 承载方式 | 直接跑在 IP 上 | 跑在 UDP 上 |
| 加密 | 依赖 TLS,通常是外挂 | 默认与 TLS 集成 |
| 建连 | TCP 握手,再 TLS 握手 | 握手更紧凑,可 0-RTT |
| 多路复用 | 没有原生流概念 | 原生 stream |
| 队头阻塞 | TCP 丢包会卡整条连接 | 丢包主要影响对应流 |
| 迁移能力 | IP/端口变化通常重建 | 支持 Connection ID 与迁移 |
| 部署迭代 | 依赖内核升级 | 用户态更容易迭代 |
这张表里最关键的不是“谁更先进”,而是:
TCP 是稳定成熟的通用传输;QUIC 是为现代互联网场景重新设计的一套更灵活、更安全、对弱网更友好的传输层。
8. QUIC 的包和帧,大概长什么样
QUIC 不像 TCP 那样只有固定连接语义,它把协议元素设计得更模块化。一个 QUIC packet 里可以携带多个 frame,常见 frame 包括:
- ACK
- STREAM
- CRYPTO
- CONNECTION_CLOSE
- PADDING
- MAX_DATA / MAX_STREAM_DATA 等流控相关帧
你可以把它理解成:
- packet 是“运输箱”
- frame 是“箱子里的不同指令和数据块”
比如一个包里可能同时带:
- 某个流的数据
- 对前面若干包的 ACK
- 一点流控更新信息
这让协议很灵活,也更适合细粒度控制。RFC 9000 和 RFC 9002 都明确描述了不同 frame 对确认、在途字节、恢复逻辑的影响。(IETF)
9. QUIC 的安全设计为什么很重要
QUIC 的另一个革命性特点,是它不是先明文握手、后加密补上,而是把安全设计放进了传输协议骨架里。RFC 9000 明确把 confidentiality、integrity、availability 作为设计目标的一部分。(IETF)
这带来几个结果:
9.1 中间盒更难乱改
传统互联网里,很多设备会“猜 TCP/HTTP 行为”,做深度干预。
QUIC 大量元数据和载荷都是加密的,这让中间盒更难随意篡改上层行为,也减少了因为网络设备僵化而拖慢协议演进的问题。这个好处更多是架构层面的。
9.2 但运维调试更复杂
因为很多内容被加密了,抓包后不像明文协议那样一眼能看透。
这对排障、可观测性、网络审计提出了新要求。工程里经常要依赖专门日志、qlog、密钥导出或端侧指标,而不是只看中间网络抓包。
10. QUIC 的连接迁移:为什么手机场景特别合适
这点非常适合移动互联网。
假设你在手机上看网页或直播:
- 一开始走 Wi-Fi
- 走到电梯口切到 5G
- IP 地址变了
传统 TCP 往往得断开重连。
QUIC 因为用 Connection ID 标识连接,并支持 path validation / migration,可以在很多情况下继续沿用原连接状态,而不是全部推倒重来。RFC 9000 把 address validation 和 path migration 都列为核心内容。(IETF)
11. QUIC 的优点
11.1 建连更快
尤其是 TLS 1.3 集成和 0-RTT 恢复,能显著减少首包延迟。(IETF)
11.2 弱网下体验更好
在丢包、乱序、移动网络切换环境里,QUIC/HTTP/3 往往比 TCP/HTTP/2 更稳,因为它减少了传输层队头阻塞。(Cloudflare Docs)
11.3 原生多路复用
不用再像 HTTP/2 那样“应用层想并行,但传输层仍是一根绳”。(IETF)
11.4 更容易演进
TCP 是内核协议栈的一部分,改动慢、部署周期长。
QUIC 建立在 UDP 之上,很多实现可以放在用户态,更方便快速升级和 A/B 测试。这也是它被大型互联网服务采用的重要原因。这个结论带有工程推断色彩,但与 QUIC 的设计定位一致。(IETF)
12. QUIC 的代价和难点
QUIC 不是没有成本。
12.1 实现复杂
虽然“概念上像 TCP+TLS”,但真正实现 QUIC 并不轻:
- 多加密阶段
- 包号空间
- ACK 生成策略
- 丢包恢复
- 流控与拥塞控制
- 连接迁移
- 地址验证
- token 机制
这些都让协议栈实现和调优变得更复杂。(IETF)
12.2 CPU 开销可能更高
因为默认全程强加密、很多实现跑用户态,所以某些场景下 CPU 成本可能高于传统 TCP。实际效果很依赖实现质量、硬件加速和业务负载。
12.3 UDP 受限网络会带来部署问题
有些老旧网络、企业防火墙、运营商环境会对 UDP 更保守,甚至限速或拦截。
这也是很多站点仍然保留 TCP/TLS/HTTP/2 回退路径的原因。这个属于部署层面的现实考量。
12.4 0-RTT 不能乱用
0-RTT 虽快,但有重放语义问题,不适合所有请求。工程上必须仔细区分可重放与不可重放操作。(IETF)
13. QUIC 和 HTTP/3 的关系
这个点很容易混淆,我单独说清楚。
QUIC
是传输层协议。
它解决的是:
- 怎么建连接
- 怎么加密
- 怎么传流
- 怎么 ACK / 重传 / 拥塞控制
- 怎么迁移
HTTP/3
是应用层协议。
它规定的是:
- 请求怎么表示
- 响应头和数据怎么映射到 QUIC 流
- 控制流怎么管理
- HTTP 语义怎么保留
所以更准确的话应该是:
HTTP/3 = HTTP 语义 + QUIC 传输。
MDN 和 Cloudflare 的资料都明确说明了 HTTP/3 使用 QUIC over UDP,而不是 TCP。(Cloudflare Docs)
14. QUIC 现在主要用在哪
最成熟、最广泛的场景还是:
- HTTP/3
- 浏览器到 CDN / Web 服务器
- 移动网络下的网页与 API 访问
此外,QUIC 也在向更多实时和交互协议扩展,例如:
- WebTransport:基于 HTTP/3,支持流和 datagram,适合低延迟交互应用。(MDN Web Docs)
- MoQ(Media over QUIC):面向低延迟媒体分发。(Cloudflare Docs)
这说明 QUIC 不只是“网页加载加速协议”,它正在成为更通用的现代互联网传输底座。(Cloudflare Docs)
15. 一句话类比:QUIC 像什么
可以这样比喻:
TCP 像一条“单轨高铁”
- 很稳
- 规则成熟
- 但前面有一节车厢出问题,后面的都得等
QUIC 像“多车道智能高速”
- 也有秩序管理
- 也有限速和调度
- 但每条车道更独立
- 还能在入口就把安检和通行证一起办掉
- 路线切换更灵活
这个比喻不严谨,但很适合抓住直觉。
16. 你最该记住的 8 个关键词
如果你想先建立整体框架,只记这几个词就够了:
- UDP 承载
- 面向连接
- 默认加密
- TLS 1.3 集成
- 多路复用
- 减少队头阻塞
- 0-RTT
- 连接迁移
17. 用最短的话总结 QUIC
QUIC 是一种基于 UDP 的现代传输协议,把可靠传输、TLS 加密、多路复用、拥塞控制和连接迁移整合到一起,核心价值是更低建连时延、更好的弱网表现,以及为 HTTP/3 等新协议提供更灵活的底层能力。 (IETF)
你要的话,我下一步可以继续接着讲这两个方向里的一个:
1)从抓包角度讲 QUIC 握手过程,或者 2)从源码/实现角度讲 QUIC 的 stream、ACK、丢包恢复是怎么工作的。