如何实现一个可靠的 UDP

news2025/1/19 14:37:18

QUIC是如何实现可靠传输的?

市面上的基于UDP协议实现的可靠传输协议的成熟方案,应用在HTTP/3上。
UDP报文头部和TCP报文头部夹着三层头部
在这里插入图片描述

Packet Header

Packet Header细分这两种:

  • Long Packet Header 用于首次建立连接
  • Short Packet Header 用于日常传输数据
    在这里插入图片描述
    QUIC也是需要三次握手来建立连接,主要目的是为了协商连接ID,协商出连接ID后,后续传输时,双方只需要固定住连接ID,从而实现连接迁移功能。
    Short Packet Header 中的 Packet Number 是每个报文独一无二的编号,它是严格递增的,也就是说就算 Packet N 丢失了,重传的 Packet N 的 Packet Number 已经不是 N,而是一个比 N 大的值。
    在这里插入图片描述
    TCP重传报文时的序列号和原始报文的序列号一样的话:
  • 如果算成原始请求的响应,但实际上是重传请求的响应(上图左),会导致采样 RTT 变大。
  • 如果算成重传请求的响应,但实际上是原始请求的响应(上图右),又很容易导致采样 RTT 过小。

在这里插入图片描述
RTO (超时时间)是基于 RTT 来计算的,那么如果 RTT 计算不精准,那么 RTO (超时时间)也会不精确,这样可能导致重传的概率事件增大。
QUIC 报文中的 Pakcet Number 是严格递增的, 即使是重传报文,它的 Pakcet Number 也是递增的,这样就能更加精确计算出报文的 RTT。
QUIC 使用的 Packet Number 单调递增的设计,可以让数据包不再像 TCP 那样必须有序确认,QUIC 支持乱序确认,当数据包Packet N 丢失后,只要有新的已接收数据包确认,当前窗口就会继续向右滑动
Packet Number 单调递增的两个好处:

  • 可以更加精确计算 RTT,没有 TCP 重传的歧义性问题;
  • 可以支持乱序确认,因为丢包重传将当前窗口阻塞在原地,而 TCP 必须是顺序确认的,丢包时会导致窗口不滑动;

QUIC Frame Header

一个Packet报文中可以存放多个QUIC Frame
在这里插入图片描述
每个Frame都有明确的类型,针对类型的不同,功能也不桶,自然格式也不同。
比如Stream类型的Frame格式,Stream可以认为就是一条HTTP请求,它长的样子如下:
在这里插入图片描述
Stream ID 作用:多个并发传输的 HTTP 消息,通过不同的 Stream ID 加以区别,类似于 HTTP2 的 Stream ID;
Offset 作用:类似于 TCP 协议中的 Seq 序号,保证数据的顺序性和可靠性;
Length 作用:指明了 Frame 数据的长度。
引入 Frame Header 这一层,通过 Stream ID + Offset 字段信息实现数据的有序性,通过比较两个数据包的 Stream ID 与 Stream Offset ,如果都是一致,就说明这两个数据包的内容一致。
下图中,数据包 Packet N 丢失了,后面重传该数据包的编号为 Packet N+2,丢失的数据包和重传的数据包 Stream ID 与 Offset 都一致,说明这两个数据包的内容一致。这些数据包传输到接收端后,接收端能根据 Stream ID 与 Offset 字段信息将 Stream x 和 Stream x+y 按照顺序组织起来,然后交给应用程序处理。
在这里插入图片描述
QUIC 通过单向递增的 Packet Number,配合 Stream ID 与 Offset 字段信息,可以支持乱序确认而不影响数据包的正确组装。

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

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

相关文章

深元ai智慧工地视频分析盒子提高建筑施工现场安全效率

随着社会的快速发展,建筑行业安全问题日益受到重视。为了解决传统人工巡查的诸多问题,AI智慧工地视频分析盒子应运而生,通过人工智能技术,全面提高建筑施工现场的安全工作效率。 一、AI智慧工地视频分析盒子解决传统巡查的痛点 …

【产品设计】Android 和 IOS 的交互设计对垒

在手机操作系统百花齐放的年代,也是产品经理最头疼的年代,因为需要根据不同的操作系统做出不同的设计。而如今,手机操作系统基本只剩下安卓和IOS两大阵营,只需处理好安卓和IOS交互上的差异部分就可以做好产品设计了。 手机操作系统…

不良事件上报系统源码 有演示,已在多家医院运营多年

不良事件上报系统源码,医院安全不良事件管理系统源码 技术架构:前后端分离,仓储模式,BS架构,有演示,已在多家医院完美运营。 相关技术:PHPvscodevue2elementlaravel8mysql5.7 文末获取联系&am…

【每日一练】基础题目练习

1、打印1-100之间所有的素数 素数:(也说质数) 数学上指在大于1的整数中只能被1和它本身整除的数。如2、3、5、7、11、43、109。过去。 方法一: 如果数据i能够被[2 ,qsrt(i)]之间的数整除,则表示这个数不是素数。 当一个数na*b时&a…

CVE漏洞复现-CVE-2022-22947-Spring Cloud Gateway RCE

CVE-2022-22947-Spring Cloud Gateway RCE 基本介绍 微服务架构与Spring Cloud 最开始时,我们开发java项目时,所有的代码都在一个工程里,我们把它称为单体架构。当我们的项目的代码量越来越大时,开发的成员越来越多时&#xff…

Vivdao FFT IP核调试记录

最近一时兴起,看了下Vivado版本下的FFT IP核,发现和ISE版本下的FFT IP核有一些差别,貌似还不小。做了个简单的仿真,Vivado仿真结果竟然和Matlab仿真结果对不上,废了九牛二虎之力研究datasheet、做仿真,终于…

SpringBoot JSON全局日期格式转换器

参考资料 SpringBoot日期格式转换,SpringBoot配置全局日期格式转换器在Spring Boot中定制Jackson ObjectMapper详解SpringBoot中jackson日期格式化问题(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS not turning off timestamps) 目录需求分析一. 前期准备1.1 …

ARM简单程序设计【嵌入式系统】

ARM简单程序设计【嵌入式系统】前言推荐ARM简单程序设计创建项目注意事项顺序结构程序两数之和分支结构程序符号函数循环结构程序已知循环次数未知循环次数两重循环冒泡排序子程序设计①寄存器传递参数方式②存储区域传递参数方式③ 堆栈传递参数方式最后前言 2023-4-6 20:26:…

一文看懂多模态大型语言模型GPT-4

文章目录前言什么是GPT-4GPT-4 VS GPT-3.5GPT-4与其他模型对比GPT-4视觉输入GPT-4局限性写在最后前言 近日,OpenAI发布了最新版的生成预训练模型GPT-4。据官方介绍,最新一代的模型是一个大模型,性能比CPT-3.5强悍很多,不仅仅是接…

泛微数字化安全管理,实现标准化、智能化管理,数据可视化分析

企业安全管理需求提升: 随着国家政策与技术的双重驱动,企业当前的安全管理需求,从标准化管理,逐步发展到智能、可视、可分析的全程数字化安全管理,落地风险分级管控、隐患排查治理的双重预防机制。 国家发布的《企业…

腾讯云轻量级云服务器Centos7防火墙开放8080端口

腾讯云轻量级云服务器Centos7防火墙开放8080端口 一、centos7防火墙打开端口 因为Centos7以上用firewalld代替了iptables,也就是说firewalld开通了8080端口应该就行了 1.查看8080是否已经放开 sudo firewall-cmd --permanent --zonepublic --list-ports2.查看防火墙状态 s…

电子标准院、中信银行、优云牵头!《数据中心服务能力成熟度模型》国标修订研讨会成功举办

4月11日,GB/T 33136 -2016《数据中心服务能力成熟度模型》国标修订第五次研讨会议在广州顺利召开。本次会议由中国电子技术标准化研究院、中信银行、广通优云牵头发起,广州赛宝认证中心承办,云下科技协办。 来自政府、金融、电信、能源、交通…

SQL Server 连接查询和子查询

提示: 利用单表简单查询和多表高级查询技能,并且根据查询要求灵活使用内连接查询、外连接查询或子查询等。同时还利用内连接查询的两种格式、三种外连接查询语法格式和子查询的语法格式。 文章目录前言1.查询所有学生的学号、姓名、选修课程号和成绩方法…

Python零基础自学

很多零基础想做程序员的同学,最开始接触的基本上都是 Python 作为常年霸榜的 “最好上手的编程语言” ——Python,深受互联网大厂的喜爱。 而很多小伙伴反应,在刚开始学Python时遇到不少问题: 比如找不到学习资源,不…

多态--遗失的子类析构函数(重要)

通过阅读下面的代码以及将其置于编译器上编译运行: #include<iostream> using namespace std;class Father { public:Father(const char* addr"中国") {cout << "执行Father类构造函数" << endl;int len strlen(addr) 1;this->add…

.Net Forms Resize V12.0 Crack

.Net Forms Resize V12.0 添加对 .NET 7 的支持并改进调整大小引擎。2023 年 4 月 14 日 - 10:27新版本特征 添加了对 Microsoft Visual Studio 2022 (v17.5.3) 及更高版本的支持。添加了对 Microsoft Windows Server 2019 和 2022 的支持。改进和调整引擎大小&#xff08;快约…

认识JVM

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录JVM 内存区域划分栈程序计数器堆元数据区JVM 类加载机制加载验证准备解析初始化双亲委派模型JVM 垃圾回收机制GC 实际工作过程…

Java基础之哈希表与红黑树

文章目录一、哈希表1.1 JDK1.7版本之前哈希表&#xff08;数组链表&#xff0c;头插法&#xff09;1.2 JDK1.8版本之后哈希表&#xff08;数组链表红黑树&#xff0c;尾插法&#xff09;二、红黑树2.1 使红黑树再次满足红黑规则2.1.1 使红黑树满足红黑规则方法一2.1.2 使红黑树…

JavaSE学习进阶day03_01 多态

第一章 多态 1.1 多态的形式 直接说什么是多态性太抽象了&#xff0c;我们先引入一个例子&#xff1a; 现在我定义了一个feed方法&#xff0c;在不同的类的对象调用这个方法时&#xff0c;都要改变形参&#xff0c;即每当我的对象不同时&#xff0c;都要重载该方法&#xff0…

【Java基础】day13

day13 一、Spring Bean 生命周期是怎样的&#xff1f; 详细过程分为以下几个步骤&#xff1a; ① 初始化 Bean 容器通过获取 BeanDefinition 中的信息进行实例化&#xff0c;这一步仅仅是简单的实例化&#xff0c;并没有进行依赖注入。 实例化的对象被包装在 BeanWrapper 对…