爱收集资源网

传输层为什么要可靠,为什么不直接用TCP?(下)

网络整理 2022-05-07 20:02

1 UDP实现可靠传输-方法概述

(??????)

主要是在应用层实现可靠传输:

UDP不是连接型协议,所以具有资源消耗低、处理速度快的优点,所以通常音频、视频和普通数据在传输的时候多使用UDP,因为即使偶尔丢一两个数据包,不会对收到的结果产生太大影响。

传输层不能保证数据的可靠传输本地连接收不到数据包,只能通过应用层来实现。实现方法可以参考tcp可靠传输的方法,但是实现不在传输层,而是交给应用层实现。

实现确认机制、重传机制、窗口确认机制。

(没有排序好像是因为UDP是和整个用户数据报一起发送的,没有分段,所以没有乱序的情况)

如果不使用Linux协议栈和上层socket机制通过抓包和发送包实现可靠传输本地连接收不到数据包,则必须实现以下功能:

发送:数据包分片、数据包确认、数据包重传

接收:包序调整,包序号确认

目前,以下开源程序使用udp来实现可靠的数据传输。它们分别是 RUDP、RTP 和 UDT。

2 可靠的要求

在实时通信过程中,不同的需求场景对可靠性有不同的要求。我们在这里一般将它们概括为三种类型的定义:

l 尽力而为的可靠性:通信的接收方要求发送方的数据尽可能完整地到达,但允许服务本身的数据丢失。例如:音视频数据,幂等状态数据。

l 无序可靠:通信的接收方要求发送方的数据必须完整到达,但到达顺序可以忽略。例如:文件传输、白板书写、图形实时绘图数据、日志型附加数据等。

l 有序可靠:通信接收方要求发送方的数据必须按顺序、完整地到达。

RUDP根据这三类需求和图1中的三角约束关系确定自己的通信模型和机制,即找到通信的平衡点。

3 为什么 UDP 是可靠的

为什么UDP可靠,为什么不直接使用TCP?

TCP是一种基于公平的可靠通信协议。在一些恶劣的网络条件下,TCP要么不能提供正常的通信质量保证,要么成本太高。

为什么要通过 UDP 进行可靠保证?原因是在保证通信时延和质量的情况下尽可能降低成本

4 RUDP主要解决以下相关问题:

l 端到端的连通性问题:终端与终端之间的直接通信一般都会涉及到NAT穿越。TCP NAT 穿越很难实现,而 NAT 的 UDP 穿越相对简单。如果是端到端的可靠通信,一般使用RUDP。解决的场景包括:端到端的文件传输、音视频传输、交互命令传输等。

l 弱网络环境传输问题:在部分WIFI或3G/4G移动网络中,需要低延迟、可靠的通信。如果使用TCP通信,延迟可能会很大,影响用户体验。例如:实时操作的网游通讯、语音对话、多方白板书写等。这些场景可以使用特殊的RUDP方法来解决此类问题。

l 带宽竞争:有时客户端数据上传需要突破自身TCP公平性的限制,以实现高速、低延迟和稳定。也就是说,使用特殊的流控算法来挤压客户端上传带宽,例如:直播音视频推送流,使用RUDP来实现这种场景,不仅可以挤压带宽,还可以更好的增加通信的稳定性并避免类似于 TCP 的频繁断开和重新连接。

l 传输路径优化问题:在一些时延要求较高的场景下,采用应用层中继的方式来优化传输路径,即动态智能路由。此时双方使用RUDP进行传输,中间的delay进行relay路由优化delay。还有一类基于传输吞吐量的场景,比如服务之间的数据分发、数据备份等。在这类场景中,一般采用多点并行中继来提高传输速度,也是基于RUDP(两点后述)。

l 资源优化问题:在某些场景下,为了避免TCP的三次握手和四次挥手过程,会使用RUDP优化资源占用率和响应时间,提高系统的并发性能,如:QUIC。

5 RUDP(可靠的 UDP)

可靠的用户数据报协议

依托UDP,在应用层实现重传机制、响应机制、窗口确认机制

RUDP的重传是发送方通过接收方ACK的丢包信息反馈来重传数据。发送方会根据场景设计自己的重传方式。

因为在应用层面是可靠的,所以可以根据不同的应用场景有选择地使用不同的重传方式。

-> 可以通过减少RTO时间来减少延迟(虽然误判会增加成本和增加) 请求重传:缓解方法:拥塞控制模块适用于大带宽的传输场景(减少网络拥塞的可能性):视频,文件传输,数据同步 FEC(Forward Error Correction)选择重传:

窗口和拥塞控制

6 UDT 7 RTP

传输层 通信 tcp