QUIC

QUIC 的定位、核心机制与其相对 TCP TLS 的改进说明

#status / growing #type / concept

[!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 通常是:

  1. 先 TCP 三次握手
  2. 再 TLS 握手
  3. 然后才能传 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 的本质区别

可以这样对比着看:

项目TCPQUIC
承载方式直接跑在 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、丢包恢复是怎么工作的

创建于 2026/3/14 更新于 2026/5/27