将近两年以前因为想选择一个兼顾TCP协议的可靠性和UDP协议的高效性来进行我们某种数据的传输曾经选择过UDT协议,也进行了一段时间的学习、实践。但最终由于不适合我们的业务场景放弃了它,但它的实现原理、代码实现、拓展使用的优秀给我留下了很深刻的印象,今天翻出自己曾经的一篇总结笔记来和大家一起回顾下UDT协议。
-
UDT协议是什么?是一种基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)。
-
UDT协议的主要作用是什么?UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。
-
那么UDT与UDP的区别又是什么?UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。
-
UDT的使用场景是什么?由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。
(以上问题的答案均摘自wikipedia)当然我今天也不是来当知识搬运工的,而是结合以上UDT协议的基本定义来深入到UDT协议内部去解析它。
UDT协议的主要特性有哪些?
-
基于UDP的应用层协议: 有基本网络知识的朋友都知道TCP和UDP的区别和使用场景,但是有没有一种协议能同时兼顾TCP协议的安全可靠和UDP协议的高效,那么UDT就是一种。
-
面向连接的协议:面向连接意味着两个使用协议的应用在彼此交换数据之前必须先建立一个连接,当然UDT是逻辑上存在的连接通道。这种连接的维护是基于握手、Keep-alive(保活)以及关闭连接。
-
可靠的协议:依靠包序号机制、接收者的ACK响应和丢包报告、ACK序号机制、重传机制(基于丢包报告和超时处理)来实现数据传输的可靠性。
-
双工的协议:每个UDT实例包含发送端和接收端的信息。
-
单播的数据流。
-
新的拥塞算法,并且具有可扩展的拥塞控制框架:新的拥塞控制算法不同于基于窗口的TCP拥塞控制算法(慢启动和拥塞避免),是混合的基于窗口的、基于速率的拥塞控制算法。可扩展的拥塞控制框架开源的代码和拥塞控制的C++类架构,可支持开发者派生专用的拥塞控制算法。
-
带宽估计:UDT使用对包(PP -- Packet pair)的机制来估计带宽值。即每16个包为一组,最后一个是对包,即发送方不用等到下一个发送周期内再发送。接收方接收到对包后对其到达时间进行记录,可结合上次记录的值计算出链路的带宽(计算的方法称为中值过滤法), 并在下次ACK中进行反馈。
UDT一些主要特性的实现
UDT包确认机制是基于时间的定时器实现的。原理:
uses timer-based selective acknowledgement, which generates an acknowledgement at a fixed interval. This means that the faster the transfer speed, the smaller the ratio of bandwidth consumed by control traffic. Meanwhile, at very low bandwidth, UDT acts like protocols using cumulative acknowledgement.
The ACK interval of UDT is the same as the rate control interval (SYN).
To support this scheme, nega tive acknowledgement (NAK) is used to explicitly feed back packet loss. NAK is generated once a loss is detected so that the sender can react to congestion as quickly as possible. The loss information (sequence numbers of lost packets) will be resent after an increasing interval if there are timeouts indicating that the retr ansmission or NAK itself has been lost.
UDT流量控制是基于以下三个机制实现的。
-
new congestion control
-
DAIMD rate control
-
dynamic window control
详细说明在这:http://www.jenkinssoftware.com/raknet/manual/congestioncontrol.html
UDT支持哪些数据传输类型
-
基于流的send, recv。
-
基于数据报sendmsg,recvmsg。
-
文件传输sendfile,recvfile。
下面我们结合UDT version 4版本来给大家分析下这个版本的UDT所拥有的一些新的特性。
-
使用了UDP multiplexer(UDP多路复用)机制,这样做的好处是:
therefore it is possible (and by default) all UDT sockets in one process will share one UDP port. This scheme makes it easier for firewall traversing.
UDT流控采用可配置的拥塞控制算法,你可以关闭它、配置它,改良它来实现自己需要的流控策略。
采用新的资源管理(内存管理)和共享的拥塞控制方法来支持更多并发的UDT连接。有关内存管理的介绍如下:
UDT4 has a new buffer management module that enables all UDT sockets in one process can share protocol buffer. The goodness it brings is the much less memory usage for multiple UDT connections compared to previous versions.
UDT4 can automatically resize its buffer in order to reduce memory usage while providing maximum throughput.
Because of the new memory management scheme, overlapped IO has been removed from UDT4. If your existing code uses overlapped IO, you need to modify it to use regular IO. This is the only change needed for exiting code to move from UDT3 to UDT4.
其他的特点:
不和原生socket api冲突;
线程安全;
进程间不共享句柄;
错误处理;
防火墙穿透;
安全性好;
建立连接快速;
以上就是我依据自己的记忆以及笔记对UDT协议进行的分析总结,笔记在此UDT协议研究.mmap 欢迎大家下载。非常感谢谷云洪博士为我们提供了这么一个优秀的协议。
本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/1530969如需转载请自行联系原作者
yaocoder