UDT(一):概览
1. 参考链接
- 官网
- 谷博士对UDT的简单介绍
- 获取UDT源码
- UDT讨论贴
- KCP项目,作者提到了关于KCP/TCP/UDT的对比测试
2. UDT简介
2.1 UDT是什么
-
UDT(UDP-based Data Transfer Protocol)
是一种用于高性能数据传输的网络协议,适用于需要高带宽和低延迟的应用场景 -
设计初衷是克服TCP在高延迟和高丢包率网络环境中的不足
2.2 为什么需要UDT
(1) 首先来看一下TCP的缺陷
- TCP虽然保证了数据可靠性,但是在高带宽/高延迟环境下,TCP的表现不佳
- 带宽利用率低:
- TCP的慢启动机制:导致TCP的传输带宽是逐步增加的,造成TCP连接的初始阶段带宽利用率低
- 当网络rtt非常大时:TCP的慢启动过程将会非常耗时,需要花费更长的时间才能达到TCP的峰值带宽
- TCP的拥塞控制机制:导致在发生丢包时,拥塞窗口会大幅降低,实际利用的带宽可能远低于实际可用的带宽,导致带宽闲置;并且在之后会再次进入慢启动阶段,无法有效利用带宽
- 面对高带宽延迟产品时表现不佳
- 典型的如卫星网络,国外有马斯克的星链计划,国内的千帆星链计划等
- 卫星链路的特点就是延时较高,丢包率较高
- 实测中国卫通的某一款产品,rtt基本在500~600ms之间,测试时的丢包率甚至能达到50%,在这样的网络环境下,TCP慢启动阶段耗时长,丢包后恢复慢,拥塞窗口调整滞后...等等问题,导致TCP几乎处于不可用的状态
(2) 再来看一下UDP的缺陷
- 没啥好说的,当然就是无连接,不可靠了
(3) 因此需要一种新的传输协议,既能够保证数据可靠性,也能够充分利用网络带宽,在发生拥塞或丢包时能够快速恢复
(4) 当然也有其它的方案可以实现上述要求,如谷歌的quic、林伟大神的KCP...等。之所以先来研究UDT,是因为音视频传输领域广泛使用的SRT
协议,就是基于UDT来实现的,我司的项目又深度使用了SRT
协议,先为以后研究SRT协议打个基础吧
3. 源码编译
-
获取源码,最新的是
4.11
版本 -
在Ubuntu中完整构建源码,包含libudt.so和示例程序
$ make -e
-
单独构建示例程序
udt4$ cd app && make
4. 运行示例程序appclient/appserver
- 示例程序路径
udt/app
server
端,默认使用9000
端口app$ ./appserver
client
端,连接9000
端口,(注意:可以同时启动多个client进行测试)$ ./appclient 127.0.0.1 9000
- 使用默认的
9000
端口
- 使用其它端口