Quic如何实现udp可靠传输

QUIC(Quick UDP Internet Connections)是由 Google 设计并被 IETF 标准化的传输层协议,它基于 UDP 实现,但提供了类似 TCP 的可靠性和更高级的功能(如多路复用、0-RTT 握手、TLS 加密等)。

尽管 UDP 是不可靠的,QUIC 实现了自己的机制来提供:

可靠传输、顺序保证、流控、拥塞控制、加密通信


🚀 一句话理解:

QUIC 在 UDP 之上自己造了一个“更好的 TCP”,通过用户态实现可靠传输。


🧩 QUIC 如何在 UDP 上实现可靠传输?

下面是 QUIC 提供可靠性的核心机制:


✅ 1. 数据分片与多路复用(Streams)

  • QUIC 使用 Stream 概念将数据拆分成多个逻辑流,每个流有自己的 ID 和顺序控制。

  • 每个数据包中可能包含多个流的数据片段。

  • 每个 Stream 保持自己的有序性和重传机制,互不影响,解决了 TCP 的“队头阻塞(Head-of-line blocking)”问题。


✅ 2. ACK 机制与重传

  • 每个 QUIC 包都有一个唯一的包序号(Packet Number)。

  • 接收方会通过 ACK frame 显式告诉发送方收到了哪些包(可能是一个范围段,例如 ACK [5,6,7,9])。

  • 发送方根据 ACK 结果进行 选择性重传(Selective Retransmission),而不是像 TCP 那样使用窗口回退(Go-Back-N)。


✅ 3. 流控(Flow Control)

QUIC 实现了两级流控:

类型控制内容
连接级流控控制整个连接中所有数据的大小
流级流控控制单个 Stream 可发送的字节量

避免发送方淹没接收方,防止内存爆炸。

QUIC 实现流控(Flow Control)是为了防止发送方发送太多数据而压垮接收方的内存,确保 发送速度与接收能力匹配

QUIC 的流控机制比 TCP 更灵活,它支持:

连接级流控(Connection-level) + 流级流控(Stream-level)


✅ 一句话总结:

QUIC 使用 MAX_DATAMAX_STREAM_DATA 帧,让接收方“显式告诉”发送方它还能接受多少数据,从而实现精细的流控。


🔍 QUIC 的两个流控层次

类型控制范围控制方式
连接级流控控制整个连接总共能发多少数据使用 MAX_DATA 帧通知
流级(单条流)流控控制某条 stream 能发多少数据使用 MAX_STREAM_DATA 帧通知

🧩 工作机制详解

1. 🚦 初始窗口(Initial Flow Control Window)

  • 每当连接或某个 stream 建立时,接收方通过 Transport Parameters 告诉发送方:

    initial_max_data = 65536       # 整个连接最多能发 64KB
    initial_max_stream_data = 32768 # 每个 stream 最多能发 32KB
    

2. 📤 发送方:按窗口大小发数据

  • 每个 packet 中的数据都有位置偏移(offset)

  • 发送方不能发送超过 offset > max_data 的内容

  • 如果快达到限制,就暂停发送,等接收方“放行”


3. 📥 接收方:接收 + 消费数据后,发送 MAX_*

当接收方:

  • 消费了部分数据(应用层读取了),或者

  • 有更多缓冲空间

就会发以下帧通知发送方放宽限制:

帧类型作用
MAX_DATA提高连接级可发送总量
MAX_STREAM_DATA提高某个 stream 的可发送数据量

📝 例子:

MAX_STREAM_DATA(StreamID=5, MaximumData=64000)
MAX_DATA(MaximumData=128000)

4. 🚧 如果发送方超过限制会怎样?

  • 接收方会直接 丢弃该数据包

  • 并可能发送 FLOW_CONTROL_ERROR 帧,强制断开连接


🔁 动态调整窗口(流控窗口增长)

QUIC 支持动态调整窗口大小,类似 TCP 的“滑动窗口”机制,但更灵活:

  • 接收方可以基于自身处理速度、缓冲区情况等策略动态调整

  • 应用层可参与窗口策略调整(QUIC 是用户态协议)


📊 示例图:QUIC 流控流程简图

       [Sender]                           [Receiver]│                                   ││───── Data (offset: 0~32767) ─────▶│   ✅ 在窗口范围内│───── Data (offset: 32768~65535) ─▶│   ❌ 超出流窗口限制│                                   ││◀───── MAX_STREAM_DATA (64000) ────│   ✅ 允许再发更多

✅ 总结:QUIC 的流控机制比 TCP 更灵活的地方

特性TCPQUIC
支持多路复用下的流控❌ 需应用层实现✅ 原生支持 per-stream 流控
流控信息粒度每个连接一组窗口每个流都有单独窗口
流控窗口通告方式被动通告(ACK + 窗口值)主动通告(MAX_* 帧)
动态扩展有,但实现不易简洁灵活,用户态易扩展

✅ 4. 拥塞控制(Congestion Control)

  • QUIC 可复用 TCP 的拥塞控制算法(如 Reno、CUBIC、BBR 等)。

  • 因为 QUIC 完全在用户态,所以可以快速升级/切换拥塞算法,而不需要内核修改。


✅ 5. 加密与握手(TLS 1.3)


🧵 四、多路复用避免队头阻塞,加速整体数据流

TCP 中多个逻辑流复用一个连接时,某个小包丢失可能导致整个流被阻塞(队头阻塞)。

QUIC 的解决方式:


📶 五、QUIC 支持连接迁移,减少断线重连时间


🔚 小结一句话:

QUIC + UDP 快的根本原因在于它跳过了 TCP 的繁琐握手、内核开销和流阻塞,通过用户态协议 + 0-RTT 加密通信让“发第一个字节”变得更快。


✅ 总结对比表

项目TCP + TLSQUIC + UDP
握手延迟至少 1~2 RTT最快 0-RTT,首次仅需 1 RTT
加密TLS 分层内建 TLS 1.3,第一包就加密
队头阻塞存在消除(Stream 级别传输)
连接状态内核态管理用户态管理,效率高
多路复用需要上层协议实现协议原生支持
连接迁移不支持原生支持 Connection ID 迁移
适合移动网络一般非常适合(连接迁移 + 0-RTT)
  • 所有 QUIC 数据包(除了第一个)都是 强加密 的。

  • 基于 TLS 1.3 实现握手和密钥协商,合并传输和加密握手,支持 0-RTT 和 1-RTT 连接建立

  • 避免了 TCP + TLS 的多轮握手,提高首次连接速度。

  • 🔍 详细原因分析(按阶段分解)


    🟡 一、TCP + TLS 的握手流程 = 至少 3 次往返

    传统的 TCP 连接建立 + TLS 加密握手如下:

    1. TCP 三次握手(1.5 RTT):Client → SYNServer → SYN-ACKClient → ACK2. TLS 1.2(或 1.3)握手(再来 1~2 RTT)3. 才能发送加密数据
    

    即:首次连接至少耗时 1~2 RTT(往返时间)


    🟢 二、QUIC 将 握手和加密合并在一次往返中

    QUIC 的握手流程使用 TLS 1.3 直接集成在传输协议中:

  • 首次连接(1-RTT):

  • Client → Initial Packet(携带 TLS Client Hello)   ← 第一次发包就带加密握手← Server Hello + 加密信息(+ 证书等)
    Client → Finished(+ 应用数据)
    
  • 重连(0-RTT):

  • Client → 数据 + 加密握手(直接发数据!)   ← ★ 零延迟
    

    👉 QUIC 可以实现 “0-RTT 数据传输”,几乎是立即发送第一条消息。


    🔧 三、UDP 不需要内核状态建立连接,QUIC 在用户态实现更灵活

  • TCP 是 面向连接的:需要在内核里维护连接状态(socket 状态机)。

  • UDP 是无连接协议,QUIC 在用户态自己管理连接状态,避免了内核/用户态频繁切换。

  • 用户态连接管理允许更快的上下文切换、更容易多路复用。

  • 每个 stream 有独立的传输/重传机制

  • 某一 stream 丢包不会阻塞其他流,数据能更快抵达

  • QUIC 连接绑定在 Connection ID,而不是 IP + Port

  • 移动设备换网(如从 Wi-Fi 切 4G)时无需重新建立连接,延迟更小


✅ 6. 包编号与重排重组

  • QUIC 的包编号是严格递增的,不可重用。

  • 即使包乱序到达,也可通过包号重排序。

  • QUIC 自己实现了类似 TCP 的 SACK(Selective ACK) 功能。 


✅ 7. 头部校验和加密保护

  • 包头也经过加密处理,防止中间人攻击(如修改流量控制字段等)。


📦 总结:QUIC 如何在 UDP 上“可靠传输”

技术点实现作用
Stream(多路复用)消除队头阻塞、实现数据隔离
Packet Number + ACK保证数据到达与丢包检测
重传机制实现可靠交付
流控 + 拥塞控制限制数据发送速度,防止拥堵
TLS1.3 加密确保安全性和身份验证
用户态实现更灵活,可快速迭代


📌 简图:QUIC vs TCP(在可靠性层面)

         ┌──────────────┐         ┌──────────────┐│   应用层     │         │   应用层     │└────┬──────▲──┘         └────┬──────▲──┘▼      │                  ▼      │┌──────────────┐         ┌──────────────┐│   QUIC 协议  │         │   TCP 协议   │└────┬──────▲──┘         └────┬──────▲──┘▼      │                  ▼      │┌──────────────┐         ┌──────────────┐│   UDP/IP     │         │   IP层       │└──────────────┘         └──────────────┘

QUIC + UDP 连接更快,是因为它在 连接建立阶段(握手)和数据传输机制方面做了大量优化,特别针对 TCP 的延迟瓶颈进行了设计改进。


✅ 简要结论:

QUIC 比 TCP 快,主要因为它省掉了握手轮次 + 消除了 TCP+TLS 分层带来的延迟 + 更高效的连接复用。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81190.shtml

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

相关文章

uniapp-商城-59-后台 新增商品(属性的选中,进行过滤展示,filter,some,every和map)

前面讲了属性的添加,添加完成后,数据库中已经存在数据了,这时再继续商品的添加时,就可以进行属性的选择了。 在商品添加过程中,属性选择是一个关键步骤。首先,界面需要展示嵌套的属性数据,用户通…

负载均衡 ELB 在 zkmall开源商城高流量场景下的算法优化

在电商大促、直播带货等高频交易场景下,流量突发增长对系统稳定性提出严峻挑战。ZKmll 开源商城通过对负载均衡 ELB(Elastic Load Balancer)算法的深度优化,结合业务场景特性设计动态加权轮询 地域感知 热点分流的混合策略&…

Linux干货(三)

前言 从B站黑马程序员Linux课程摘选的学习干货,新手友好!若有侵权,会第一时间处理。 目录 前言 1.which find命令 1.which命令 2.find命令 2.grep wc 管道符 1.grep命令 2.wc命令 3.管道符 3.echo tail 重定向符 1.echo命令 2.反…

Sigmoid与Softmax:从二分类到多分类的深度解析

Sigmoid与Softmax:从二分类到多分类的深度解析 联系 函数性质:二者都是非线性函数 ,也都是指数归一化函数,可将输入值映射为0到1之间的实数 ,都能把输出转化成概率分布的形式,在神经网络中常作为激活函数使用。Softmax是Sigmoid的推广:从功能角度看,Softmax函数可视为…

文件系统交互实现

关于之前的搭建看QT控件文件系统的实现-CSDN博客,接下来是对本程序的功能完善,我想着是这样设计的,打开一个目录以后,鼠标选中一个项可以是目录,也可以是文件,右键可以出现一个菜单选择操作,比如…

[ctfshow web入门] web75

信息收集 启用了open_basedir,所以之前的方法又不能用了 解题 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false …

Vulfocus靶场-文件上传-3

WSO2 文件上传 (CVE-2022-29464) WSO2是一家成立于 2005 年的开源技术提供商。它提供了一个企业平台,用于在本地和整个 Internet 上 集成应用程序编程接口(API)、应用程序和 Web 服务。 某些 WSO2 产品允许无限制的文件上传和远程代码执行。…

基于MCP的桥梁设计规范智能解析与校审系统构建实践

引言 今天本文准备盘一个大活,聊一聊偏特定行业一点的AI技术深入应用思考及实践。 一、传统设计行业项目背景与行业痛点 在桥梁设计领域,标准规范是设计的基础,直接关系到桥梁结构的安全性、耐久性和经济性。然而,传统的规范应…

远程连接电脑的方法?异地远程桌面连接和三方软件实现

远程连接电脑,是指通过网络技术,在一台设备上操控另一台设备的电脑桌面,实现跨地域的操作和管理。在日常工作、技术支持、远程办公等场景中,远程连接电脑都发挥着重要作用。实现远程连接电脑主要有系统自带工具和第三方软件两种方…

win11 安装 wsl ubuntu 18.04后换源失败!

记录几个问题是如何解决的。 一 下载wsl后,有报错: Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Error: 0x8007019e ??????? Linux ? Windows ???? Press any key to continue... …

PY32系列单片机离线烧录器,可配置选项字节和上机台批量烧录

PY32离线烧录器采用 MINI-USB 接口,提供稳定的物理连接。设备与电脑采用串口方式通讯,波特率固定为 1M。需配合我们的上位机使用。PY32离线烧录器现支持芯片型号在PY32F002A/002B/002/003/030/071/072/040/403/303各封装和XL32F001/003。烧录器仅提供 3.…

深入理解 this 指向与作用域解析

引言 JavaScript 中的 this 关键字的灵活性既是强大特性也是常见困惑源。理解 this 的行为对于编写可维护的代码至关重要,但其动态特性也会让我们感到困惑。 与大多数编程语言不同,JavaScript 的 this 不指向函数本身,也不指向函数的词法作…

# IntelliJ IDEA企业版开发入门:包、类与项目结构详解

--- ## 一、项目结构与包的概念 ### 1. 标准项目目录解析 在IntelliJ IDEA中,一个Java项目通常包含以下核心目录: - **src**:源代码根目录。 - **main**:主代码目录,存放业务逻辑代码。 - **java**:Java…

NGINX 开源与社区动态:从基石到浪潮,持续演进的生态力量

NGINX 之所以能够成为全球应用最为广泛的 Web 服务器和反向代理软件之一,其成功的核心驱动力无疑是开源。开放的源代码、活跃的社区参与以及透明的开发过程,共同铸就了 NGINX 的辉煌。然而,正如所有大型开源项目一样,NGINX 的开源之路也并非一帆风顺,其社区动态也时常涌现…

Electron(一)

前言: 参考尚硅谷视频记录:b站尚硅谷视频-1小时上手electron 一、什么是electron? 是一款应用广泛的、跨平台的、桌面应用开发框架。 应用广泛:很多桌面应用都是这个框架写的,例如腾讯qq、百度云跨平台:跨window、…

AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(上)

开篇 我们之前花了将近10个篇章讲Dify的一些基础应用,包括在讲Dify之前我们讲到了几十个AI Agent的开发例子,我不知道大家发觉了没有,在AI Agent开发过程中我们经常会伴随着这样的一些问题: 需要经常改猫娘;需要经常改调用LLM的参数,甚至在一个流程中有3个节点,每个节点…

ssti刷刷刷

[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字,但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码,这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…

google-Chrome常用插件

google-Chrome常用插件 1. json格式化展示插件 github下载jsonview-for-chrome插件 通过离线安装方式 拓展程序-》管理拓展程序-》打开开发者模式-》加载已解压的拓展程序-》选择拓展程序解压的位置 2. 翻译插件 插件下载地址:Immersive Translate - Bilingual …

基于redis实现分布式锁方案实战

分布式锁的进阶实现与优化方案 作为Java高级开发工程师,我将为您提供更完善的Redis分布式锁实现方案,包含更多生产级考量。 1. 生产级Redis分布式锁实现 1.1 完整实现类(支持可重入、自动续约) import redis.clients.jedis.Je…

XML简要介绍

实际上现在的Java Web项目中更多的是基于springboot开发的,所以很少再使用xml去配置项目。所以我们的目的就是尽可能快速的去了解如何读懂和使用xml文件,对于DTD,XMLSchema这类约束的学习可以放松,主要是确保自己知道这里面的大致…