一、引言
从流媒体的业务特征和TCP,UDP各种特点,UDP在媒体传输方面具有很大优越性,但UDP可靠性需要业务开发这投入大量的人力;相反 tcp 技术成熟,可以复用已稳定的http 服务器技术,不需要投入人力和技术解决可靠性问题,成熟,开发简单,拿来即用。故TCP在传统的流媒体协议还是广泛存在。但实际的网络拥塞,带宽不足,信号衰减会造成tcp 传输的音视频体验很糟糕。对稳定性,实时性,抗弱网抖动性的要求高的场景,UDP媒体传输技术正在崛起。
二、UDP传输常见使用场景:
1)视频监控
在视频监控场景,无论是RTSP,还是gb28181,媒体都是UDP承载(也存在通过TCP承载RTSP封装RTP媒体流,但这种用法不多,不符合国标用法和通用做法)
2)IPTV电视
在IPTV中,无法是点播还是直播,都是UDP承载电视节目码流。
3)会议电视
在传统的会议电视,信令协议从h323过度到主流的sip,但媒体承载还是UDP封装的RTP流
4)音视频通话
无论是传统的VoIP还是目前互联网上流行的webrtc,也都是UDP承载的RTP码流
三、可靠性的UDP传输方案
既然udp是音视频传输的理想方案,但udp可靠性工作需要投入大量工作,技术门槛高,小团队几乎望而却步。那有没有一种可用的开源技术即具备tcp的可靠性,又具备udp的低延迟性?答案是肯定的。类似的sctp,quic,kcp的可靠UDP传输方法某些大厂开始引入媒体传输中,下面介绍几种目前比较流行的可靠UDP技术。
1)UDT(UDP-based Data Transfer Protocol)
UDT的主要目的是支持高速广域网上的海量数据传输,所以除了在UDP之上实现类似TCP的协议和算法之外,UDT还对TCP的拥塞算法做了一些细节上的调整,包括Negative-ACK(NAK)、ACK to ACK(ACK2)、基于对数的动态AIMD等。不过UDT的重传效率较低,无效报文,实际效果并不理想。
参考实现:https://git.dorkbox.com/dorkbox/UDT/src/branch/master/src
2)KCP
KCP是一个很简单的ARQ的实现,包括选择重传和快重传等机制,对上层提供一个可靠的字节流。应用层可以使用多流复用的框架来实现对多个流的支持。另外,KCP增加了可配置启用的加密和FEC选项,FEC用的是Reed-Solomon纠删码,例如可以配置发送10%的冗余数据,来减少丢包时需要的重传,从而降低数据传输的延时。
参考实现:https://github.com/skywind3000/kcp
3)QUIC
QUIC是Google实现的一种可靠UDP传输协议,并且已经被选择作为HTTP/3的基础。它的特点有:
a)内建安全性,集成TLS
b)连接建立过程和TLS协商过程合并,减少往返请求次数,提高连接速度
c)集成多种拥塞算法,包括最新的BBR
d)多流支持,每个流有独立的拥塞控制,避免单个流中的丢包阻塞其它所有流(Head-of-line Blocking问题),更好的支持类似HTTP/2中的乱序请求
e)连接迁移:QUIC可以通过连接ID来唯一标识一个连接,当用户在有线、无线、移动网络之间切换时,可以保持上层连接的有效性,不需要再进行重连。
另外,早期的QUIC还使用了一种基于异或的FEC算法,不过在新版本中已经去掉。该协议已经在chromium中实现,参考获取方法:https://www.chromium.org/quic/playing-with-quic
4)uTP
uTP是BitTorrent中新增加的一种UDP传输协议,主要特点是使用了LEDBAT(Low Extra Delay Background Transport)拥塞算法。这种算法基于延时来检测网络拥塞,可以更早的探测到拥塞和更早的以及更大幅度的进行避让,从而避免影响用户上网操作的进行,保持后台下载跟前台操作的和平共处。
参考实现:https://github.com/bittorrent/libutp
5)SCTP(Stream Control Transmission Protocol,流控制传输协议)
准确的说,SCTP不是一种可靠UDP协议,而是一种跟TCP/UDP平级的传输层协议,是IETF在2000年指定的标准协议。目前Linux和部分UNIX已经集成,Windows和Mac需要使用第三方包来实现。SCTP最初主要用于电信系统,它的特点有:
a)跟TCP一样面向连接,提供可靠传输
b)跟UDP一样面向消息
c)多流支持
d)每个流可以配置成接受有序或无序的消息
e)Multi-Homing:可以配置多个地址,利用多条网络传输通道
f)更好的安全性:要求四次握手,避免TCP的SYN Flooding攻击
注意webrtc的sctp不是跟tcp和UDP平级的传输层协议,它是基于UDP的开发实现,详见webrtc代码或https://github.com/sctplab/usrsctp
参考:https://zhuanlan.zhihu.com/p/68466363
四、总结
以上基于UDP的可靠性传输技术在某些领域已经有成功的应用案例。在音视频传输领域可以根据业务需求,移植过来替换已有协议底层的TCP或UDP接口,改善传输性能。