当前位置: 首页 > news >正文

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!!!

http://www.dtcms.com/a/337037.html

相关文章:

  • cesium中实时获取鼠标精确坐标和高度
  • IB数学课程知识点有哪些?IB数学课程辅导机构怎么选?
  • GitLab 安全漏洞 CVE-2025-7739 解决方案
  • GitLab 安全漏洞 CVE-2025-6186 解决方案
  • AI全链路赋能:smardaten2.0实现软件开发全流程智能化突破
  • Leetcode 3651. Minimum Cost Path with Teleportations
  • 嵌入式 C++ 语言编程规范文档个人学习版(参考《Google C++ 编码规范中文版》)
  • USB基础 -- 字符串描述符 (String Descriptor) 系统整理文档
  • 2025年8月更新!Windows 7 旗舰版 (32位+64位 轻度优化+离线驱动)
  • hla mHAg
  • cortex-m中断技巧
  • 数组学习2
  • 十年回望:Vue 与 React 的设计哲学、演进轨迹与生态博弈
  • idea部署到docker
  • 静配中心配药智能化:基于高并发架构的Go语言实现
  • MySQL 函数大赏:聚合、日期、字符串等函数剖析
  • Ps切片后无法导出原因(存储为web所用格式)为灰色,及解决文案
  • Day119 持续集成docker+jenkins
  • Dockerfile优化指南:利用多阶段构建将Docker镜像体积减小90%
  • 【音频信号发生器】基本应用
  • LAMP 架构部署:Linux+Apache+MariaDB+PHP
  • C# 使用注册表开机自启
  • [C#] WPF - 自定义控件(行列间距UniformGrid)
  • docker compose再阿里云上无法使用的问题
  • 矿物分类系统开发笔记(一):数据预处理
  • 楼宇自控系统深化设计需关注哪些核心要点?技术与应用解析
  • Casadi库C++运行速度比python版本慢解决方法
  • 从第一性原理理解Embedding:独立模型vs大模型内嵌层的本质区别
  • linux应用软件编程:线程
  • 使用Idea安装JDK