如何实现可靠性的UDP协议
今天面试了一家搞路由器的公司,嵌入式软件工程师职位。
其中提到了一个如何实现可靠性的UDP传输,当时他问的有两点吧,①如何发现丢包,②怎么确定包是对的。
当时我也少了解这方面,主要回答了给每个包编号可以解决丢包问题,给每个包后面一个字段(包的编号和包的大小信息)来确认包是否正确。
回来后自己上网调查:
TCP如何实现可靠性传输?
①重传机制:针对数据包丢失或者出现定时器超时
②确认应答:停止等待协议,发送之后等待收到应答。
③序列号:针对数据包到达接收端主机顺序乱掉
④流量控制:针对避免网络拥堵时候;针对高效传输数据包的流动窗口的控制
⑤拥塞控制:针对刚开始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制。
⑥校验和:发送方和接收方计算校验和并进行对比确认未出错
⑦连接管理:三次握手与四次挥手
⑧数据的合理分片和排序
UDP如何实现可靠性传输?
①超时重传(定时器)
②有序接受 (添加包序号)将数据包进行编号,按照包的顺序接收并存储。
③应答确认 (Seq/Ack应答机制)
④滑动窗口流量控制等机制 (滑动窗口协议)
目前有如下的开源程序实现利用UDP实现了可靠的数据传输。分别为RUDP、RTP、UDT。
RUDP
TCP属于是通过增大延迟和传输成本来保证质量的通信方式,UDP是通过牺牲质量来保证时延和成本的通信方式,RUDP就是在这两者中找到一个平衡点。
RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等,从而在包丢失和网络拥塞的情况下, RTP 客户机(实时位置)面前呈现的就是一个高质量的 RTP 流。在不干扰协议的实时特性的同时,可靠 UDP 的拥塞控制机制允许 TCP 方式下的流控制行为。
RTP
实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。
RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于底层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。 RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。
UDT
基于UDP的数据传输协议(UDP-basedData Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。
每天学一点,每天都要进步。