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.pswp.cn/news/919275.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现pdfs合并

灵感来源于博主正在学408,在搞到视频课对应的ppt.pdf后发现pdf是按小节的,以至于每章有5-10甚至更多,这可太繁琐了,我想要一章一个pdf就可以了,于是浅浅查了几个CSDN发现使用python的要么收费要么要vip,不用…

51单片机-驱动74HC595芯片实现IO口扩展模块教程

本章概述思维导图: 51单片机驱动74HC595芯片实现IO口扩展 74HC595芯片简介 74HC595是一款8位串行输入、并行输出的移位寄存器,属于硅结构的CMOS器件。它能将串行输入数据转换为并行输出,其中并行输出为三态输出(即高电平、低电平…

录音转文字,如何做到“快、准、狠“多格式通吃?

MP3、FLAC、M4A、OGG、WAV、MP4等多种常见音频格式,一键精准转成文字,让办公效率翻倍提升!🔥 真实痛点场景:告别低效,迎接智能办公紧急会议纪要,争分夺秒!上午10点刚结束一场跨部门脑…

【秋招】2025.08.16京东秋招机考真题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 京东 题目一:魔法水晶阵列能量优化 1️⃣:理解逆序对的变化规律,分析区间操作对逆序对的影响 2️⃣:选择后缀区间避免产生新的逆序对,只最大化消除的逆序对…

RocksDB 解密可逆哈希:BijectiveHash的设计奥秘

BijectiveHash(双射哈希,即可逆哈希)的设计精髓在于它借鉴了现代密码学和高性能哈希函数中的核心思想,但目标并非加密,而是实现一种无冲突、可逆的置换(Permutation)。可逆哈希是什么&#xff0…

05.用户和组管理命令

用户和组管理命令用户和组管理命令1. getent2. useradd3. usermod4. userdel5. id6. su7. passwd8. chage9. groupadd10. groupmod11. groupdel12. gpasswd13. groupmems用户和组管理命令 用户和组的主要配置文件 /etc/passwd:用户及其属性信息(名称、UID、主组ID…

go 多版本共存【goup + alias方案】

一、需求背景 以go1.21为主,临时可以快速切换到go1.23,且只有当前窗口生效 二、安装 安装 goup go install github.com/owenthereal/goup/cmd/gouplatest安装 go1.23 # 注意这里是安装新的sdk,如果你本地存在相同版本的话,应该保持统一用goup安装的 goup…

DR200差速移动机器人的多功能感知系统与多场景应用

DR200差速移动机器人平台是一款基于室内平地的差速转向移动机器人底盘,主要针对教育教学、超市移动促销、无人配送、室内仓储、室内巡检、物流搬运等行业。整套底盘采用了4个万向轮和双驱动轮差速驱动结构,间驱动轮带直流无刷伺服电机。整套结构采用了摆…

基于ZLMediaKit的大疆上云视频流服务集成方案

引言 随着无人机技术的快速发展,大疆(DJI)设备产生的高清视频流需要高效、低延迟的云端处理方案。传统基于SRS的视频流服务在多协议支持和并发性能上存在局限,而ZLMediaKit作为一款高性能流媒体服务框架,凭借其多协议支…

用 Python 实现一个“小型 ReAct 智能体”:思维链 + 工具调用 + 环境交互

在大语言模型(LLM)的应用开发中,如何让模型具备调用外部工具的能力是一个关键问题。我们不希望模型只是“生成答案”,而是能像一个智能体(Agent)一样,按照推理链条自主决定调用搜索、计算、或数…

集成电路学习:什么是SIFT尺度不变特征变换

SIFT:尺度不变特征变换 SIFT(尺度不变特征变换,Scale Invariant Feature Transform)是一种在图像处理和计算机视觉领域广泛应用的算法,由David Lowe在1999年提出。该算法能够在图像的不同尺度、旋转和光照条件下保持特征不变性,从而提取出独特的特征点,并用于图像…

短视频流量|基于Java+vue的短视频流量数据分析系统(源码+数据库+文档)

短视频流量数据分析系统 基于SprinBootvue的短视频流量数据分析系统 一、前言 二、系统设计 三、系统功能设计 系统功能模块 管理员功能模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#xff…

【无标题】卷轴屏手机前瞻:三星/京东方柔性屏耐久性测试进展

卷轴屏手机前瞻:三星/京东方柔性屏耐久性测试进展卷轴屏手机的产业化突破临近2025年全球柔性屏市场规模预计突破186亿美元,其中卷轴屏技术正从概念走向量产。三星显示近期宣布新一代柔性OLED面板通过50万次折叠认证,日均折叠200次可使用6年以…

Git 入门指南:核心概念与常用命令全解析

Git 入门指南:核心概念与常用命令全解析前言一、Git相关概念1.1 工作目录1.2 暂存区1.3 本地仓库1.3 远程仓库1.3.1 首次提交到远程仓库提示输入用户名密码1.3.2 解决方法二、Git常用命令2.1 配置命令2.1.1 查看当前 Git 配置的所有信息2.1.2 查看系统全局配置2.1.3…

悬赏任务网站源码多平台兼职赚钱搭建图解

功能详细说明 (一)登录与注册 1、登录:打开系统用户端,输入已注册的手机号和密码进行登录。 若为忘记密码,可通过 “找回密码” 功能,按提示验证身份后重置密码登录。 2、注册:点击 “注册” 按…

Node.js简介及安装

一、Nodejs简介 1、核心定义 Node.js 是一个基于 Chrome V8 引擎的开源、跨平台 JavaScript 运行时环境(Runtime),用于在服务器端或本地运行 JavaScript 代码。它并非编程语言、库或框架,而是扩展了 JavaScript 的能力&#xff0…

KINGBASE集群日常维护管理命令总结

查看集群的状态 [kingbasenode1 bin]$ repmgr cluster show查看守护集群状态 [kingbasenode1 bin]$ repmgr service status查看集群的事件 [kingbasenode1 etc]$ repmgr cluster event查看集群流复制状态 esrep#select usename,application_name,client_addr,sync_state,state,…

GoLand 调参高手都在用的配置!续集:WebStorm 飞升后,Go 开发 IDE 性能炸裂的秘密

“为什么别人的 GoLand 运行 Go 项目丝滑流畅,而你的却频繁卡顿、编译转圈?秘密就藏在这个 goland64.exe.vmoptions文件里!作为 IDEA/PyCharm/WebStorm 调优系列的续集,我把我压箱底的 ​GoLand 性能调优参数表​ 分享出来—>&…

48Days-Day19 | ISBN号,kotori和迷宫,矩阵最长递增路径

ISBN号 ISBN号码_牛客题霸_牛客网 算法原理 模拟,根据题意模拟就可以了,注意一下余数为10的时候要特别判断一下是不是X就行了 代码 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stat…

Java 泛型类型擦除

📖 概述 本文档详细解释了 Flink 中 TypeInformation 的作用、原理和使用方法,帮助理解为什么 Flink 需要显式的类型信息。 🎯 核心问题:Java 泛型类型擦除 什么是类型擦除? Java 在编译时会将泛型信息擦除&#xff0c…