如何保证 UDP 的可靠性传输?

一、TCP 和 UDP 的区别

1、TCP基于连接,UDP基于无连接。

2、对系统资源的要求:TCP 较多,UDP 少。

3、UDP 程序结构较简单。

4、TCP基于流模式,UDP基于数据报模式 。

5、TCP 保证数据正确性,UDP 不保证数据准确性,可能丢包。

6、TCP 保证数据顺序,UDP 不保证。

二、TCP 可靠传输原理(滑动窗口)

1.确认和重传
接收方收到报文后会发送确认应答,发送方一段时间没有收到确认应答就会重传。

2.数据分片
数据合理分片与排序,TCP 会对数据进行分片,接收方会缓存按序到达的数据,重新排序后再提交给应用层。

3.流程控制
当接收方来不及接收发送方发来的数据时,则会提示发送方降低发送的速度,防止包丢失。

4.拥塞控制
当网络发生拥塞时,减少数据的发送。

三、实现UDP可靠性传输

UDP传输层是一种无连接的、不可靠的传输协议,无法保证数据的可靠传输,只能通过应用层来实现可靠性传输。实现的方式可以参照 TCP 可靠性传输的方式。

可靠的 UDP 的简单设计如下:

1、应用层序列号和确认号的确认机制

1)添加 seq/ack 应用层确认机制,确保数据发送到对端。若一定时间内未收到确认,则重新发送数据。这类似于TCP的确认应答机制,但是在应用层内实现的。

2)选择性重传
当检测到数据包丢失时,只重传丢失的数据包,而不是重传从丢失的数据包开始之后所有的数据包。

3)数据包序列号
为每个发送的数据包增加序列号标识,接收方可通过序列号来检测数据包是否有丢失或乱序到达,并请求重发丢失的数据包。


2.数据校验和重传
在UDP数据包中添加 校验和 字段,接收方接收数据时计算校验和并与发送方发过来的校验和进行比较。若匹配,则数据正确。若不匹配,则要求重发数据。

3、添加超时重传机制

1)发送方设置一个超时计时器,若在指定时间内未收到确认消息,则认为数据丢失,并让发送方重传数据。

2)添加发送和接收缓冲区,主要是为了用户超时重传。

3)具体过程如下:
发送端发送数据时,生成一个随机序号 seq=x,然后每一片按照数据大小分配 seq。发送的数据到达接收端后被放入缓存,并发送一个 ack=x 的包,表示接收方已经收到了数据。发送端收到了 ack 包后,删除缓冲区对应的数据。
定时的时间到后,检查是否需要重传数据。

4.流量控制和拥塞控制

1)流量控制
通过控制发送数据和接收数据的速率,避免网络拥塞和数据丢失。
可使用滑动窗口等算法实现。

2)拥塞控制
采用慢启动算法、拥塞避免算法等拥塞控制机制,避免在网络拥塞时发送大量数据导致网络瘫痪。

5.数据分片和排序

对数据进行分片,以满足MTU(Maximum Transport Unit,最大传输单元)的要求。
在接收端对分片进行重组,保证数据按照正确的顺序被接收和处理。

四、实现UDP可靠性传输的开源程序或框架

目前有如下开源程序或框架利用 UDP 实现了可靠的数据传输。分别为 RUDP、RTP、UDT、KCP、ENet、RakNet等:

1、RUDP(Reliable User Datagram Protocol)
RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等。

2、RTP(Realtime Transport Protocol)
RTP 为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式音频视频或模拟数据。

3、UDT(UDP-based Data Transfer Protocol)
UDT 的主要目的是支持高速广域网上的海量数据传输。

4.KCP(KCP UDP Reliable Protocol)
它是一种基于UDP实现的可靠传输协议。KCP旨在结合UDP的高效性和TCP的可靠性,特别适合于对实时性要求高的应用场景,如:在线游戏、视频会议等。

5.ENet
它是一个基于UDP网络传输协议的库,通常用于提供可靠的数据传输服务。

6.RakNet
它是一个网络库,基于UDP网络传输协议,为C++程序员提供了高效的网络传输服务。

五、总结

1.TCP适合于高可靠性的应用场景。

2.UDP适合于对实时性要求较高且可容忍一定数据丢失的场景。

3.可靠的UDP协议变种如QUIC(Quick UDP Internet Connections),是一个基于UDP 的传输层协议。不仅提供了类似TCP的可靠性,也提供了类似UDP的低延迟特性。
 


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

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

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

相关文章

滚雪球学MyBatis(03):基本配置

前言 欢迎回到我们的MyBatis系列教程。在上一期中,我们详细讲解了MyBatis的环境搭建,包括JDK、Maven/Gradle的安装和配置,以及MySQL数据库的准备工作。现在,我们已经搭建好了开发环境,是时候开始配置MyBatis了。本期内…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能,掌握重要标签(a标签,form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情,后端做什么…

视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线

随着科技的飞速发展,视频监控系统已成为现代社会安全防范的重要组成部分,广泛应用于公共场所、企业园区、住宅小区等各个领域。一个科学合理的视频监控系统布局与选型策略,不仅能够显著提升安全监控的效率和效果,还能在关键时刻提…

Pytest-@pytest.fixture夹具篇(一)

一、定义 在Python的pytest测试框架中,pytest.fixture是一个(不是唯一)装饰器,用于定义一个测试夹具。 二、简单实例 使用参数autouserTrue pytest.fixture(autouseTrue) def my_fixture():print("Setup: 准备测试环境&q…

计算机毕业设计 | SpringBoot+vue 游戏商城 steam网站管理系统(附源码)

1,项目背景 国家大力推进信息化建设的大背景下,城市网络基础设施和信息化应用水平得到了极大的提高和提高。特别是在经济发达的沿海地区,商业和服务业也比较发达,公众接受新事物的能力和消费水平也比较高。开展商贸流通产业的信息…

使用PHP和MQTT构建高效的物联网数据转发服务器流程

一、项目概述 项目目标和用途 本项目旨在搭建一个基于PHP的物联网服务器,能够接收来自各种传感器的数据,并通过MQTT协议将数据转发到其他设备或服务。该系统适用于智能家居、环境监测等场景,能够实现实时数据监控和远程控制。 技术栈关键词…

应用层协议HTTP

应用层协议中的 HTTP(超文本传输协议)。在互联网中,HTTP 协议是一个至关重要的一个协议,它定义了客户端与服务器之间如何进行通信,以交换或传输超文本。 本篇介绍了有关 URL 的相关知识,http 的报文格式&am…

能量项链,洛谷

解释&#xff1a; 环形dp问题还是考虑将环拉直&#xff0c;可以参考我上一篇文章&#xff1a;环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直&#xff0c;[]内是一个有效的区间&#xff0c;可以模拟吸收珠子的过程&#xff0c; 如[2 3 5] <>(2,3)(3,5) 2是头&#xff0c;…

Apache Pig

目录 一、配置说明1.本地模式2.集群模式 二、pig的数据模型三、pig的数据类型四、惰性执行五、pig的基本语法5.1语法说明5.2案例操作 六、pig的自定义函数 一、配置说明 1.本地模式 操作的是Linux系统文件 pig -x local关键日志 当前处于root目录下 2.集群模式 连接的是…

CentOS7单机环境安装k8s集群

目录 1、环境准备 2、安装依赖工具 3、配置 Kubernetes 的国内 Yum 源 4. 安装 Kubernetes 组件 5、初始化 Kubernetes 集群 1. 容器运行时没有正常运行 1.1. 可能的原因 1.2. 解决办法 2. 初始化拉取镜像卡住 2.1. 使用国内的镜像源&#xff08;无法解决问题&#x…

0.ffmpeg面向对象oopc

因为查rtsp相关问题&#xff0c;接触了下ffmpeg源码&#xff0c;发现它和linux内核一样&#xff0c;虽然都是c写的&#xff0c;但是都是面向对象的思想&#xff0c;c的面向对象称之为oopc。 这让我想起来一件好玩的事&#xff0c;有些搞linux内核驱动的只会c的开发人员不知道l…

AI绘画工具排行榜:探索最受欢迎的AI绘图软件特点与选择指南

AI绘画工具各有优势&#xff0c;从开放性到对特定语言和文化的支持&#xff0c;以及对图像细节和艺术性的不同关注点&#xff0c;根据具体需求选择合适的工具 MidJourney 图片品质卓越&#xff0c;充满独特创意&#xff0c;初期能够免费获取数十账高质量图片&#xff0c;整个生…

Java后端微服务架构下的服务网关设计:Spring Cloud Zuul

Java后端微服务架构下的服务网关设计&#xff1a;Spring Cloud Zuul 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在微服务架构中&#xff0c;服务网关是微服务系统与外部世界的入口点&#…

ImportError: cannot import name ‘print_log‘ from ‘logging‘

mmcv升级到2.后删除了很多 解决 查FAQ文档&#xff0c;找到 添加到mmcv.utils下即可

海事行政执法证照片要求及尺寸格式修改方法

在海事行政执法领域&#xff0c;证件照片不仅是个人形象的展示&#xff0c;更是专业严谨态度的体现。一张符合规范的照片&#xff0c;不仅能够提升执法人员的权威性&#xff0c;还能在执行任务时获得更多的尊重和信任。本文将为您详细介绍海事行政执法证照片的要求&#xff0c;…

Windows系统安装node.js环境并创建本地服务使用内网穿透发布至公网

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Windows系统安装node.js环…

k8s Helm

Helm工具介绍 了解Helm Helm是kubernetes中查找、分享、构建应用的最佳方式。 Helm是一个Kubernetes应用的包管理工具&#xff0c;用来管理chart(一种预先配置好的安装包资源)&#xff0c;有点类似于Ubuntu 的APT和CentOS/Rocky中的YUM。因此&#xff0c;helm的出现解决了k8s应…

网络安全知识科普:什么是网络准入控制系统?有哪些?

在当今数字化时代&#xff0c;网络安全已成为企业和组织不可忽视的重要议题。随着远程工作模式的普及和物联网设备的增加&#xff0c;网络边界越来越模糊&#xff0c;传统防火墙已经不足以应对日益复杂的威胁环境。在这种背景下&#xff0c;网络准入控制系统(Network Access Co…

Redis持久化机制—RDB与AOF

Redis持久化机制 RDB&#xff08;默认&#xff09; **思想&#xff1a;**保存整个数据库的快照&#xff0c;也就是RDB文件&#xff0c;有两种保存方式&#xff0c;前台保存save和后台保存bgsave&#xff0c;前者会阻塞主进程程&#xff0c;后者则是fork一个子进程去完成备份操…

C++入门9——list的使用

目录 1.什么是list&#xff1f; 2.list的构造 3.list迭代器的使用&#xff08;list iterator&#xff09; 4.list capacity 5.list modifiers 6.list的其他操作 1.什么是list&#xff1f; 在官网中&#xff0c;对list有这样的介绍&#xff1a; Lists are sequence co…