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

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 分层带来的延迟 + 更高效的连接复用。


相关文章:

Quic如何实现udp可靠传输

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

利用腾讯云MCP提升跨平台协作效率的实践与探索

一、场景痛点 在当今这个数字化快速发展的时代,跨平台协作成为了许多企业和团队面临的一个重大挑战。随着企业业务的不断拓展,团队成员往往需要利用多种工具和平台进行沟通、协作和管理。这些平台包括但不限于电子邮件、即时通讯工具、项目管理软件、文…...

【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应

目录 引言 一、watch侦听器(监视器) 1.作用: 2.语法: 3.侦听器代码准备 4. 配置项 5.总结 二、翻译案例-代码实现 1.需求 2.代码实现 三、综合案例——购物车案例 1. 需求 2. 代码 引言 💬 欢迎讨论&#…...

Python高级特性深度解析:从熟练到精通的跃迁之路

Python高级特性深度解析:从熟练到精通的跃迁之路 引言 对于已经掌握Python基础语法的开发者而言,如何突破瓶颈进入高手行列?本文将从Python的高级特性入手,深入剖析那些能让代码更优雅、效率更高的技术点,助你完成从…...

OGGMA 21c 微服务 (MySQL) 安装避坑指南

前言 这两天在写 100 天实战课程 的 OGG 微服务课程: 在 Oracle Linux 8.10 上安装 OGGMA 21c MySQL 遇到了一点问题,分享给大家一起避坑! 环境信息 环境信息: 主机版本主机名实例名MySQL 版本IP 地址数据库字符集Goldengate …...

Linux面试题集合(4)

现有压缩文件:a.tar.gz存在于etc目录,如何解压到data目录 tar -zxvf /etc/a.tar.gz -C /data 给admin.txt创建一个软链接 ln -s admin.txt adminl 查找etc目录下以vilinux开头的文件 find /etc -name vilinux* 查找admin目录下以test开头的文件 find admin -name te…...

iOS Safari调试教程

iOS Safari调试 本教程将指导您如何使用WebDebugX调试iOS设备上的Safari浏览器。通过本教程,您将学习如何连接iOS设备、调试Safari中的网页、分析性能问题以及解决常见的调试挑战。 准备工作 在开始调试iOS Safari之前,请确保您已经: 安装…...

基于互联网和LabVIEW的多通道数据采集系统仿真设计

标题:基于互联网和LabVIEW的多通道数据采集系统仿真设计 内容:1.摘要 在当今科技飞速发展的背景下,多通道数据采集在众多领域有着广泛需求。本研究的目的是设计一个基于互联网和LabVIEW的多通道数据采集系统仿真方案。采用互联网技术实现数据的远程传输与共享&…...

ffmpeg -vf subtitles添加字幕绝对路径问题的解决方法

今天遇到奇怪的问题,老是报 Unable to parse option value Error applying option original_size to filter subtitles: Invalid argument 踩坑很长时间,记录下 因subtitles需要指定绝对路径, 注意点: 外面要用单引号 不能…...

Android Studio 安装与配置完全指南

文章目录 第一部分:Android Studio 简介与安装准备1.1 Android Studio 概述1.2 系统要求Windows 系统:macOS 系统:Linux 系统: 1.3 下载 Android Studio 第二部分:安装 Android Studio2.1 Windows 系统安装步骤2.2 mac…...

级联与端到端对话系统架构解析:以Moshi为例

一、对话系统架构对比 1.1 级联对话系统(Cascaded Dialogue Systems) 传统级联系统采用多阶段处理流程: 语音识别(ASR):将24kHz音频信号通过卷积神经网络(CNN)和Transformer转换为…...

基于 Zookeeper 部署 Kafka 集群

文章目录 1、前期准备2、安装 JDK 83、搭建 Zookeeper 集群3.1、下载3.2、调整配置3.3、标记节点3.4、启动集群 4、搭建 Kafka 集群4.1、下载4.2、调整配置4.3、启动集群 1、前期准备 本次集群搭建使用:3 Zookeeper 3 Kafka,所以我在阿里云租了3台ECS用…...

经典卷积神经网络

目录 经典卷积神经网络 一、卷积神经网络基础回顾 二、LeNet:开启 CNN 先河 三、AlexNet:突破性进展 四、ZFNet:继承与优化 五、GoogLeNet:引入 Inception 模块 六、VggNet:深度与简单结构的融合 七、ResNet&a…...

IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 LiteOS Studio + GCC + JLink

文章目录 概述LiteOS Studio不推荐?安装和使用手册呢?HCIP实验的源码呢? 软件和依赖安装软件下载软件安装插件安装依赖工具-方案2依赖工具-方案1 工程配置打开或新建工程板卡配置组件配置编译器配置-gcc工具链编译器配置-Makefile脚本其他配置编译完成 …...

算法加训之最短路 上(dijkstra算法)

目录 P4779 【模板】单源最短路径(标准版)(洛谷) 思路 743. 网络延迟时间(力扣) 思路 1514.概率最大路径(力扣) 思路 1631.最小体力消耗路径 思路 1976. 到达目的地的方案数 …...

java连数据库

一、准备工作 ​​安装MySQL数据库​​ 确保已安装MySQL服务器并启动服务 ​​下载JDBC驱动​​ 官方驱动&#xff1a;MySQL Connector/JMaven依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactI…...

QT+Opencv 卡尺工具找直线

QTOpencv 卡尺工具找直线 自己将别的项目中&#xff0c;单独整理出来的。实现了一个找直线的工具类。 功能如下&#xff1a;1.添加图片 2.添加卡尺工具 3.鼠标可任意拖动图片和卡尺工具 4.可调整卡尺参数和直线拟合参数 5.程序中包含了接口函数&#xff0c;其他cpp文件传入相…...

GraphPad Prism简介、安装与工作界面

《2025GraphPad Prism操作教程书籍 GraphPad Prism图表可视化与统计数据分析视频教学版GraphPad Prism科技绘图与数据分析学术图表 GraphPadPrism图表》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 1.1 GraphPad Prism简介 GraphP…...

当AI自我纠错:一个简单的“Wait“提示如何让模型思考更深、推理更强

原论文&#xff1a;s1: Simple test-time scaling 作者&#xff1a;Niklas Muennighoff, Zitong Yang, Weijia Shi等&#xff08;斯坦福大学、华盛顿大学、Allen AI研究所、Contextual AI&#xff09; 论文链接&#xff1a;arXiv:2501.19393 代码仓库&#xff1a;GitHub - simp…...

esp32课设记录(一)按键的短按、长按与双击

课程用的esp32的板子上只有一个按键&#xff0c;引脚几乎都被我用光了&#xff0c;很难再外置按键。怎么控制屏幕的gui呢&#xff1f;这就得充分利用按键了&#xff0c;比如说短按、长按与双击&#xff0c;实现不同的功能。 咱们先从短按入手讲起。 通过查看原理图&#xff0c;…...

使用AI 生成PPT 最佳实践方案对比

文章大纲 一、专业AI生成工具(推荐新手)**1. 推荐工具详解****2. 操作流程优化****3. 优势与局限**二、代码生成方案(开发者推荐)**1. Python-pptx进阶用法****2. GitHub推荐**三、混合工作流(平衡效率与定制)**1. 工具链升级****2. 示例Markdown结构**四、网页转换方案(…...

React19源码系列之 API(react-dom)

API之 preconnect preconnect – React 中文文档 preconnect 函数向浏览器提供一个提示&#xff0c;告诉它应该打开到给定服务器的连接。如果浏览器选择这样做&#xff0c;则可以加快从该服务器加载资源的速度。 preconnect(href) 一、使用例子 import { preconnect } fro…...

supervisorctl守护进程

supervisorctl守护进程 1 安装 # ubuntu安装&#xff1a; sudo apt-get install supervisor 完成后可以在/etc/supervisor文件夹&#xff0c;找到supervisor.conf。 如果没有的话可以用如下命令创建配置文件&#xff08;注意必须存在/etc/supervisor这个文件夹&#xff09; s…...

下载的旧版的jenkins,为什么没有旧版的插件

下载的旧版的jenkins&#xff0c;为什么没有旧版的插件&#xff0c;别急 我的jenkins版本&#xff1a; 然后我去找对应的插件 https://updates.jenkins.io/download/plugins/ 1、Maven Integration plugin&#xff1a; Maven 集成管理插件。 然后点击及下载成功 然后 注意&…...

【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计

本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与使用。为了让文章更易阅读&#xff0c;我们在原文的基础上作了一些灵活的调整。原文链接已贴在文章底部&#xff0c;欢迎大家在评论区友好互动。 在上篇…...

出现 Uncaught ReferenceError: process is not defined 错误

在浏览器环境中&#xff0c;process 对象是 Node.js 环境特有的&#xff0c;因此当你在浏览器中运行代码时&#xff0c;会出现 Uncaught ReferenceError: process is not defined 错误。这个错误是因为代码里使用了 process.env.BASE_URL&#xff0c;而浏览器环境下并没有 proc…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-A. PostgreSQL常用函数速查表

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL常用函数速查表:从数据清洗到分析的全场景工具集引言一、字符串处理函数1.1 基础操作函数1.2 模式匹配函数(正则表达式)二、数值计算函数2.1 基础运算函数2.2 统计相关函数三、日期与时间函…...

【时空图神经网络 交通】相关模型2:STSGCN | 时空同步图卷积网络 | 空间相关性,时间相关性,空间-时间异质性

注:仅学习使用~ 前情提要: 【时空图神经网络 & 交通】相关模型1:STGCN | 完全卷积结构,高效的图卷积近似,瓶颈策略 | 时间门控卷积层:GLU(Gated Linear Unit),一种特殊的非线性门控单元目录 STSGCN-2020年1.1 背景1.2 模型1.2.1 问题背景:现有模型存在的问题1.2…...

零基础学Java——第十一章:实战项目 - 微服务入门

第十一章&#xff1a;实战项目 - 微服务入门 随着互联网应用的复杂性不断增加&#xff0c;单体应用&#xff08;Monolithic Application&#xff09;在可扩展性、可维护性、技术栈灵活性等方面逐渐暴露出一些问题。微服务架构&#xff08;Microservices Architecture&#xff…...

docker 学习记录

docker pull nginx docker 将本地nginx快照保存到当前文件夹下 docker save -o nginx.tar nginx:latestdocker 将本地nginx 加载 docker load -i nginx.tar docker运行nginx在80端口 docker run --name dnginx -p 80:80 -d nginxredis启动 docker run --name mr -p 6379:6379 -…...