QUIC(Quick UDP Internet Connections)是 Google 开发的一种基于 UDP 的低延迟传输协议,后来被 IETF 标准化为 HTTP/3 的底层传输协议。下面是 QUIC 的通信原理分析:
1. QUIC 主要特点
✅ 基于 UDP
- 传统 TCP 需要三次握手建立连接,而 QUIC 直接使用 UDP 进行数据传输,减少了握手延迟。
✅ 0-RTT 连接建立
- QUIC 支持 0-RTT(Zero Round Trip Time),允许客户端在之前连接的基础上立即发送数据,提高了首包到达的速度。
✅ 多路复用(Multiplexing)
- TCP + HTTP/2 在同一个 TCP 连接上可以并行请求多个 HTTP 资源,但如果 TCP 发生丢包,整个连接都会受影响(队头阻塞)。
- QUIC 通过在 UDP 层之上实现自己的可靠传输协议,每个 HTTP 请求有自己的流 ID,即使某个流丢包也不会影响其他流的数据传输。
✅ 内置加密(TLS 1.3)
- QUIC 协议的握手过程中,TLS 1.3 加密是默认开启的,比 TLS over TCP 更安全,且减少了额外的握手开销。
2. QUIC 通信流程
2.1 连接建立
QUIC 连接建立时,客户端会发送 Initial Packet,其中包含:
- 客户端的 初始加密密钥
- TLS 1.3 ClientHello
- 请求的 QUIC 版本信息
服务器响应 Initial Packet 并完成 TLS 握手,同时确认 QUIC 连接:
-
首次连接(Cold Start,1-RTT)
- 客户端发送
Initial
包(包括 ClientHello) - 服务器返回
Initial
和Handshake
包(包括 ServerHello) - 客户端完成密钥协商并发送
Finished
,连接建立 - 共 1-RTT(一次往返时间)完成握手
- 客户端发送
-
已有会话(Session Resume,0-RTT)
- 客户端使用之前的加密参数,直接发送数据
- 服务器确认后,数据直接传输
- 可以实现 0-RTT 建立连接
2.2 数据传输
-
QUIC 通过 流(Stream)ID 实现多路复用,每个流都有独立的可靠性保证:
- 流量控制:类似 TCP 的
window_size
- 拥塞控制:基于 BBR 或 Cubic 控制流量
- 丢包重传:基于 QUIC 级别的
ACK
机制
- 流量控制:类似 TCP 的
-
与 TCP 不同
- TCP:丢一个包后,所有流都会被阻塞(队头阻塞)
- QUIC:丢一个包只影响该流,其他流继续传输
2.3 连接保持 & 迁移
- QUIC 通过 Connection ID(连接 ID) 维护会话,不依赖 IP + 端口
- 无缝切换网络:
- 移动设备从 Wi-Fi 切换到 4G/5G,TCP 连接会断开,而 QUIC 连接不会丢失
- 服务器只需要在新的 IP 发送 相同的 Connection ID 即可恢复传输
3. QUIC vs TCP+TLS
特性 | QUIC (UDP) | TCP+TLS (HTTP/2) |
---|---|---|
连接建立时间 | 0-RTT 或 1-RTT | 1-RTT 或 2-RTT |
多路复用 | ✅ 无队头阻塞 | ❌ 受 TCP 队头阻塞影响 |
拥塞控制 | ✅ 自带 | ✅ TCP 拥塞控制 |
加密 | 默认 TLS 1.3 | 需要额外 TLS 处理 |
连接迁移 | ✅ Connection ID 支持 | ❌ 依赖 IP 可能断开 |
4. 适用场景
- HTTP/3(浏览器):Chrome、Firefox、Edge 现代浏览器都支持 QUIC
- 移动端网络优化:减少 Wi-Fi ↔ 4G 切换导致的重连问题
- 视频流、游戏、CDN:如 YouTube、Google Drive、Cloudflare
5. 总结
- QUIC 减少握手延迟(0-RTT)
- 解决 TCP 队头阻塞,提高 HTTP/3 传输效率
- 更安全(默认 TLS 1.3),不易被中间人攻击
- 连接迁移能力 强,适合移动设备
QUIC 未来可能逐步取代 TCP + TLS,成为互联网新一代主流传输协议。
下面是 QUIC 连接建立和数据传输的时序图,使用 Mermaid 语法表示:
说明:
- 初次连接 需要完整的 TLS 1.3 握手(1-RTT)。
- 会话恢复(Session Resume) 时可使用 0-RTT 发送数据。
- 数据传输 采用流(Stream)ID 进行多路复用,避免 TCP 队头阻塞问题。
- 丢包重传 依赖 QUIC 级别的 ACK 反馈,而非 TCP 的滑动窗口机制。
- 连接迁移 通过 Connection ID 允许客户端更换网络而不断开连接。
- 连接关闭 通过
CONNECTION_CLOSE
消息通知对方终止会话。
这个时序图展示了 QUIC 主要的通信过程,适用于 HTTP/3 及其他基于 QUIC 的协议应用。🚀