QUIC 协议是什么?相比 TCP 有哪些性能优势?
简化版
QUIC(Quick UDP Internet Connections)是跑在 UDP 之上、自己实现可靠传输 + 拥塞控制 + 加密的传输层协议,是 HTTP/3 的底座。它用 UDP 只是为了「绕开僵化的 TCP」,可靠性一点不差。相比 TCP,它有四大优势:① 无 TCP 层队头阻塞——每个流独立重传,一个流丢包不拖累其他流;② 连接建立更快——把传输握手和 TLS 握手合并,1-RTT 甚至 0-RTT 就能开始传数据(TCP+TLS 要 2~3 个 RTT);③ 连接迁移——用 Connection ID 标识连接,手机从 WiFi 切 4G、IP 变了连接也不断;④ 协议在用户态、可快速演进——不像 TCP 深埋内核和中间设备里难以升级。
详细版
一、QUIC 是什么
QUIC 把原本 TCP + TLS + HTTP/2 三层干的事,重新整合到 UDP 之上:
HTTP/2 over TCP HTTP/3 over QUIC
┌───────────────────┐ ┌───────────────────┐
│ HTTP/2 │ │ HTTP/3 │
├───────────────────┤ ├───────────────────┤
│ TLS │ │ QUIC(流+可靠+ │
├───────────────────┤ │ 拥塞控制+TLS1.3) │
│ TCP │ ├───────────────────┤
├───────────────────┤ │ UDP │
│ IP │ ├───────────────────┤
└───────────────────┘ │ IP │
└───────────────────┘
UDP 本身不可靠、不保证顺序,QUIC 在应用层(用户态)自己实现了序号、确认、重传、拥塞控制、流量控制,并内建 TLS 1.3 加密(QUIC 天然全程加密,没有明文版本)。
二、四大核心优势
| 优势 | 说明 |
|---|---|
| 消除 TCP 队头阻塞 | 每个流独立管理丢包/重传,一个流丢包不影响其他流 |
| 更快建连 | 传输握手 + TLS 握手合并,1-RTT;重连可 0-RTT |
| 连接迁移 | 用 Connection ID 标识连接,IP/端口变了也不断连 |
| 易演进 | 协议在用户态实现,升级不依赖操作系统内核和中间设备 |
完整版教学
一、QUIC 的诞生动机:TCP 「僵化」了
TCP 用了几十年,问题不是它不够好,而是它改不动了:
- TCP 实现在操作系统内核里:想给 TCP 加个新特性,要等操作系统升级,用户设备的内核更新极慢,新特性可能十年才普及。
- 中间设备(网络里的路由器、防火墙、NAT)会「检查」TCP:它们对 TCP 报文有各种假设和干预,稍微改动 TCP 的行为就可能被中间设备拦截、破坏(这叫「协议僵化 / ossification」)。
结论:在 TCP 上很难再创新了。于是设计者退而求其次——用 UDP 打底(中间设备对 UDP 干预少),然后在 UDP 之上的用户态重新实现一套更现代的传输协议,这就是 QUIC。用户态实现意味着协议随浏览器/App 升级即可迭代,不必等内核。
二、优势一:消除传输层队头阻塞(最核心)
这是 QUIC 相对 TCP 最重要的价值。
TCP 把一条连接的数据看成一条必须严格按序交付的字节流,它不知道上层有「多个流」。HTTP/2 的多个流共用一条 TCP 连接,只要其中一个流的包丢了,TCP 就卡住整条连接——后面的包哪怕属于别的流、已经到达,也得在内核缓冲区排队等重传。这就是 TCP 层队头阻塞。
QUIC 在协议内部就理解「流」,每个流有独立的序号空间和重传逻辑:
QUIC:
流A:[a1][×a2×][a3] ← a2 丢失,只有流A等重传
流B:[b1][b2][b3] ← 照常交付,不受流A影响
流 A 丢包只重传流 A,流 B、流 C 该交付照样交付。一个流的丢包不再冻结所有流——在弱网、高丢包环境下,QUIC 的体验优势尤其明显。
三、优势二:更快的连接建立(0-RTT / 1-RTT)
传统 HTTPS 建连要分两步握手:
TCP 三次握手(1 RTT) → TLS 握手(TLS1.3 需 1 RTT / TLS1.2 需 2 RTT)
= 首次建连要 2~3 个 RTT 才能开始发第一个 HTTP 请求
QUIC 把传输握手和 TLS 握手合并成一次:
- 首次连接:1-RTT 就能开始发数据(握手时顺便完成密钥协商)。
- 重连同一服务器:0-RTT——客户端缓存了上次的密钥信息,可以在第一个包里就带上加密的应用数据,几乎「零等待」开始传输。
在高 RTT 网络(移动、跨国)上,省下 1~2 个 RTT 对首屏速度是实打实的提升。
注意:0-RTT 的早期数据有重放攻击风险,通常只用于幂等的、不改变服务器状态的请求(如 GET)。
四、优势三:连接迁移(Connection Migration)
TCP 连接用四元组(源 IP、源端口、目的 IP、目的端口) 唯一标识。手机从 WiFi 切到 4G,源 IP 变了,四元组变了,TCP 连接直接断开,要重新建连(重新握手、重新慢启动),正在下载的视频会卡一下。
QUIC 用一个独立的 Connection ID 来标识连接,而不是依赖 IP/端口。所以即使客户端 IP 变了,只要 Connection ID 不变,连接可以无缝迁移、继续传输,不用重连。这对移动场景(地铁里 WiFi/蜂窝网络频繁切换)体验提升很大。
五、优势四:内建加密、协议可快速演进
- 默认全程加密:QUIC 直接内建 TLS 1.3,没有明文版本,连大部分传输头都加密。这既提升安全性,也减少中间设备的窥探和干预(间接缓解协议僵化)。
- 用户态实现、快速迭代:QUIC 通常实现在浏览器/服务器的用户态库里,改进拥塞控制算法、修 bug、加新特性,随软件升级就能生效,不必等操作系统内核更新。TCP 的改进往往要好多年才能铺开,QUIC 可以「月级」迭代。
六、代价与权衡(别只说优点)
QUIC 不是没有成本,面试答全面才加分:
- UDP 常被限速或拦截:部分企业网、运营商对 UDP 流量限速或封锁,此时 QUIC 需要回落到 TCP(HTTP/2)。
- CPU 开销更高:可靠性和加密在用户态实现,且 UDP 收发包的内核优化不如 TCP 成熟,早期 QUIC 的 CPU 消耗明显高于 TCP(现在在改善)。
- 生态与运维成熟度:TCP 的抓包、调优、中间件生态极其成熟;QUIC 全程加密也让传统抓包排障更难。
七、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 传输基础 | 基于 UDP,在用户态实现可靠传输 |
| 核心能力 | 0/1-RTT 握手、多路复用、连接迁移、内置 TLS 1.3 |
| 收益 | 减少握手延迟,降低 TCP 队头阻塞影响 |
TCP+TLS:
TCP handshake -> TLS handshake -> HTTP
QUIC:
UDP datagrams + TLS 1.3 integrated
stream A loss does not block stream B
QUIC 不是“UDP 不可靠所以快”,而是在 UDP 上重新实现可靠、安全、可多路复用的传输。
- 误区:QUIC 牺牲可靠性换速度。 QUIC 仍提供可靠传输、拥塞控制和重传,只是实现位置从内核 TCP 移到用户态协议。
- 误区:QUIC 和 HTTP/3 是同一个东西。 QUIC 是传输协议,HTTP/3 是运行在 QUIC 之上的 HTTP 语义映射。
- 误区:QUIC 完全没有队头阻塞。 单个 stream 内仍要有序交付,但不同 stream 之间不再被同一个 TCP 序号缺口卡住。
- 追问:连接迁移怎么实现? QUIC 用 Connection ID 标识连接,客户端 IP/端口变化时仍可关联原连接。
- 追问:为什么 QUIC 集成 TLS 1.3? 减少握手往返并强制加密更多传输控制信息。
- 追问:部署 QUIC 有什么难点? UDP 被限速或阻断、中间设备兼容、观测排障和用户态实现成本都要考虑。
八、加强记忆
QUIC 是跑在 UDP 之上、用户态自己实现可靠传输 + 拥塞控制 + TLS1.3 加密的传输协议,是 HTTP/3 的底座。相比 TCP 记四大优势:流独立重传(无 TCP 队头阻塞)、握手合并(1-RTT/0-RTT 建连)、Connection ID 支持连接迁移(切网不断连)、用户态实现可快速演进。诞生动机是 TCP 深埋内核和中间设备、改不动了,所以退到 UDP 上重造。代价是 UDP 可能被限速、CPU 开销更高,此时回落 TCP。把握住这个本质:QUIC = 在 UDP 上重新发明了一个更灵活、更快、无队头阻塞的 TCP+TLS。