如何保证 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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容