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

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

你可能感兴趣的:(编程语言,udp,网络协议,网络,tcp,quic,c,c++)