Nacos-6--Naco的QUIC协议实现高可用的工作原理
QUIC(Quick UDP Internet Connections)是一种基于UDP的传输层协议,旨在减少网络延迟、提升安全性并优化多路复用能力。它由Google开发,后被IETF标准化为HTTP/3的底层协议。
1、QUIC是什么?
QUIC(Quick UDP Internet Connections)(发音同“quick”)是由Google发起、IETF标准化的基于UDP的新一代传输层协议,旨在替代传统的TCP + TLS组合,解决其性能瓶颈。
目标:
降低连接延迟、提升传输性能、支持多路复用、避免队头阻塞。
2、传统HTTP/TCP/TLS的问题
在理解QUIC之前,先看传统方案的痛点:
总延迟:2~3RTT才能开始传输数据,移动端或高延迟网络下体验差。
3、QUIC的核心优势(一句话总结)
QUIC = UDP + TLS 1.3 + HTTP/3 + 多路复用 + 连接迁移,在0-RTT或1-RTT内完成安全连接并传输数据。
4、QUIC的架构与分层
注意:QUIC运行在用户空间(不是内核TCP),可快速迭代,无需操作系统支持。
5、QUIC的核心工作机制
1、基于UDP,避免内核TCP拥塞控制限制
- 使用UDP作为底层传输,绕过操作系统内核的TCP协议栈。
- QUIC自己实现可靠传输、重传、拥塞控制等逻辑(在应用层)。
优势:可快速升级、定制拥塞算法(如BBR)、支持0-RTT。
2、加密与传输一体化(TLS 1.3内嵌)
QUIC将加密(TLS 1.3)直接集成在协议中:
- 加密握手与连接建立合并,减少RTT。
- 所有QUIC包(包括握手包)都加密,提升安全性。
- 支持0-RTT快速重连(类似会话恢复)。
对比:
- TCP + TLS 1.3:1-RTT(或0-RTT)
- QUIC + TLS 1.3:首次1-RTT,重连可0-RTT
3、多路复用(Multiplexing)彻底解决队头阻塞
在HTTP/2中,多个请求复用一个TCP连接,但一旦某个数据包丢失,所有流都阻塞(TCP层队头阻塞)。
QUIC的解决方案:
- 每个“流”(Stream)独立传输。
- 一个流的数据包丢失,不影响其他流。
- 实现真正的“无队头阻塞”多路复用。
示例:
- 流1:图片加载(丢包)→ 重传,不影响流2:JS文件加载
4、连接迁移(Connection Migration)
**传统TCP基于四元组(源IP:端口, 目的IP:端口)**标识连接。
手机从Wi-Fi切换到4G,IP改变 → TCP连接中断。
QUIC使用连接ID(Connection ID)唯一标识连接:
- 即使IP或端口变化,只要Connection ID不变,连接可继续。
- 实现“无缝切换网络”。
适用于移动设备、弱网环境。
5、可插拔的拥塞控制
QUIC在用户空间实现拥塞控制,支持动态更换算法:
- 支持:Cubic、BBR、Reno等
- 可根据网络状况动态调整
传统TCP拥塞控制在内核中,难以修改。
6、QUIC的通信流程
1、连接建立阶段
QUIC的连接建立分为两种模式:首次连接(1-RTT)和重连(0-RTT)。
1、首次连接(1-RTT)
交互示例图:
说明:
- CH: Client Hello
- SH: Server Hello
- SC: Server Certificate
- SE: Server Encrypted Extensions
- 所有包都加密(AEAD)
- 客户端在第一个包就发送应用数据(1-RTT完成)
具体解释:
(1)、客户端发送Initial Packet
数据包含:
- ClientHello(TLS 1.3握手消息)。
- 客户端支持的QUIC版本号。
- 初始加密密钥(TLS 1.3的Key Share扩展)。
示例:
客户端生成临时密钥对(如X25519曲线),在Key Share中发送公钥。
(2)、服务器响应Initial和Handshake Packet
服务器验证客户端的ClientHello,生成自己的密钥对,并发送:
- ServerHello(包含服务器公钥)。
- 证书(CERT)和完成消息(FIN)。
- ACK确认收到客户端的Initial Packet。
(3)、客户端完成密钥协商
- 客户端计算共享密钥,发送Finished消息确认握手完成。
- 此时,客户端可发送应用数据(如HTTP请求)。
(4)、服务器确认连接
- 服务器收到Finished后,发送ACK和HANDSHAKE_DONE,连接建立完成。
2、重连(0-RTT)
前提:客户端和服务端之前已建立过连接,有共享密钥。
关键:0-RTT数据可被重放(Replay Attack),因此只能用于幂等操作(如GET请求)。
交互示例图:
具体步骤:
(1)、客户端复用旧会话参数
- 客户端使用之前连接的加密参数(如PSK,预共享密钥)直接发送Initial Packet和应用数据。
- 示例:客户端在Initial Packet中携带缓存的Session Ticket(TLS 1.3的PSK扩展)。
(2)、服务器验证并响应
- 服务器验证PSK后,直接接受数据并发送ACK,无需等待客户端确认。
- 数据传输立即开始,实现0-RTT连接。
2、数据传输阶段
1、多路复用流管理
- 每个HTTP请求/响应分配唯一的流ID(Stream ID)。
- 流类型:
- 双向流(Bidirectional Stream):客户端与服务器双向通信(如HTTP请求/响应)。
- 单向流(Unidirectional Stream):单向传输(如服务器推送)。
2、流量控制
- 滑动窗口(Flow Control):通过WINDOW_UPDATE帧动态调整接收窗口大小,防止缓冲区溢出。
- 连接级与流级控制:每个流和整个连接独立控制流量。
3、拥塞控制
- 默认使用BBR(Bottleneck Bandwidth and RTT)或Cubic算法。
- 动态调整发送速率,避免网络拥塞。
4、丢包恢复
- ACK帧:接收方定期发送ACK确认收到的数据包。
- 重传机制:未收到ACK的数据包在超时后重传。
- 前向纠错(FEC):弱网环境下发送冗余数据包,减少重传次数。
3、连接终止阶段
1、优雅关闭(Graceful Shutdown)
- 任一端发送CONNECTION_CLOSE帧,通知对方终止连接。
- 包含错误码和可选调试信息。
2、立即关闭(Immediate Close)
- 发送PUBLIC_RESET包强制终止连接(如检测到错误)。
7、QUIC 的数据包结构(简要)
每个QUIC包包含:
特点:
- 包头加密(除部分必要字段)
- 支持乱序到达、独立确认(ACK)
- 每个STREAM Frame携带一个流的数据
8、QUIC与传统协议的对比
9、QUIC的应用场景
1、HTTP/3
- QUIC是HTTP/3的传输层协议,显著提升网页加载速度(如减少TLS握手延迟)。
2、实时音视频传输
- 多路复用和FEC特性适用于低延迟、高丢包场景(如直播、视频会议)。
3、物联网(IoT)
- 弱网环境下(如移动网络),QUIC的丢包恢复和连接迁移能力保障稳定性。
4、云服务与CDN
- 阿里云、华为云等CDN厂商已支持QUIC,优化内容分发效率(如首屏加载时间减少30%)。
10、QUIC的实现挑战
1、NAT和防火墙兼容性
- 传统网络设备可能丢弃UDP流量,需通过协议设计(如连接ID)绕过限制。
2、部署成本
- 需要客户端和服务端均支持QUIC(如浏览器集成、App集成quiche库)。
3、调试复杂性
- QUIC的加密和多路复用增加了抓包分析难度,需专用工具(如Wireshark)。
11、总结
QUIC核心要点:
QUIC协议通过基于UDP的多路复用、0-RTT连接、内置加密和智能拥塞控制,解决了传统TCP+TLS的性能瓶颈。
其工作流程分为连接建立、数据传输和终止三个阶段,核心**优势在于低延迟、高安全性和强抗丢包能力。**随着HTTP/3的普及,QUIC将成为下一代互联网传输协议的主流选择。
向阳前行,Dare To Be!!!