SRT是Secure Reliable Transport的简称,由 Haivision 和 Wowza 共同开发,是一个时下非常受欢迎的开源流媒体传输协议。本文分享SRT协议工作原理。
1 UDT/UDP传输
SRT协议是基于UDP基础上的UDT协议,继承了UDP开销低、速度快的优点。它不需要像RTMP那样每次连接都要进行至少9次握手,也不需要每次发送接收都需要ACK确认才能发送下一个数据。相比TCP的报文结构,UDP报文结构也比较简单,UDP头仅仅占8个字节,而TCP少则20个字节,多则可能60个字节,所以在相同有效负载实际数据的条件下,UDP头大小占比也会比较小,继而UDP 对计算性能、对网络占用都是比 TCP 少。这就是为什么说SRT协议进行数据传输具有低延迟的特性。
2 SRT丢包恢复与拥塞控制
UDT的出现主要是为了支持高速广域网上的海量数据传输,并引入新的拥塞控制和数据可靠性控制机制。SRT保留了UDT的核心思想和机制,即抗丢包与拥塞控制。
丢包恢复机制
通信中常用纠错机制来恢复网络传输中的数据往往有2种策略:即FEC和 ARQ 。
前期SRT选择了ARQ的方式来实现丢包恢复机制。
SRT协议基于现有AQR的基础上做了一些改进,在接收和发送端分别设有receive buffer与send buffer,接收端会定时向发送端发送ACK信息,默认定期器为10ms,之后会接收到发送端的ACKACK确认消息,从接收端ACK发送开始计时到接收到ACKACK消息这个周期称之为RTT,RTT值高则表示当前当前网络延迟大,RTT值低则表明当前网络延迟低。接收端的发送的ACK消息包含了网络RTT、接收端缓存、接收端数据比特流等等信息。
如果接收方接收到发送方的数据后,发现数据顺序不对,例如当前收到seq number 为10的后面数据是13,此时接收端会添加将一个该序号的NAK添加到一个压缩列表(NAK周期报告)中,再按平缓的速度定时发送给发送方。
SRT 1.4版本后,又添加了FEC前向纠错机制,会在传输的数据流中加入一定比例的前向纠错数据,当发生丢包时,接收端就可以根据前向纠错数据,恢复丢掉的数据包。这个纠错数据一般是占比20~30%,这个带来的后果是增加了数据传输的带宽,并且超过前向纠错数据能够恢复的阈值时,FEC将无法恢复丢失的数据包。在实验中,这个阈值可能不是很固定,目前本人实验的阈值是25%,即丢包率超过25%时花屏卡顿太厉害,我个人是不接受这种体验方式的。
拥塞控制
当SRT检测到网络不好,延迟比较大,产生丢包时会通过ACK或者NAK机制来恢复丢包,但是这个恢复过程中无论是ARQ还是FEC来修复丢失的数据包,它们都会增加网络带宽,理论上ARQ占用带宽会比FEC少点。只靠这个丢包恢复机制并不能达到减缓或者消除拥塞问题。那么SRT中拥塞控制是什么样的呢?
SRT中新的拥塞控制算法不同于基于窗口的TCP拥塞控制算法(慢启动和拥塞避免),是混合的基于窗口的、基于速率的拥塞控制算法。可扩展的拥塞控制框架开源的代码和拥塞控制的C++类架构,可支持开发者派生专用的拥塞控制算法。
SRT拥塞机制从源码上看,live模式下只有Pacing控制,其实就是控制发送数据的速度和带宽,该控制方式实现有如下3种:
(1)手动配置最大发送带宽max_bw;
(2)根据输入码率和overhead,计算max_bw = input_bw * (1 + overhead);
(3)配置overhead,自动估计输入带宽,max_bw = input_bw_estimate * (1+ overhead)。
我个人认为,既然SRT ACK中提供了网络RTT、接收端缓存、接收端数据比特流等信息,编码端可以根据这个判断网络的好坏,动态改变编码参数来控制数据的流量,比如降低视频分辨率、视频码率等,当接收到的ACK消息能表明当前网络比较健康时,编码再恢复原有的高质量视频,提高体验效果。
3 安全性
SRT数据传输安全主要体现在2方面,一个是数据自身的加密,一个是结合防火墙的网络安全策略
数据加密
SRT支持使用 AES-CTR 模式128或者256对传输的数据进行加密,以此实现端到端的数据安全性。
网络安全策略
针对有些公司或组织运用防火墙保护私有网络安全的策略,SRT使用的握手过程支持出站连接,而不需要在防火墙中打开危险的永久外部端口,从而维护了公司的安全策略。
4 SRT连接与传输流程
SRT传输的数据有2种包,一种是数据包,另一个是控制包。
数据包只有一个固定的包结构。控制包有很多,包含握手包、保活包、ACK包、NAK包、拥塞告警包、关闭包、ACKACK确认包、消息抛弃请求包等等。由于篇幅所限,这里不再详述包的具体结构。读者可以自行在havision/srt 官方网站查看。
SRT 连接模式有三种,分别是Caller、Listener、Rendezvous,通常情况下使用Call-Listener模式够了,Rendezvous模式需要2端共同协商建立连接,比较复杂。
这里我们用Caller-Listener模式下以推流为例来了解下它的流程:
(1) Caller 向listener 发起握手请求。
(2) Listener 响应请求,为Caller返回基于主机、端口和时间的Cookie。
(3) Caller 发起 conclusion 配置请求。
(4) Listener 响应请求,通常约定Peer Latency 和 Latency值。
(5) Caller 传输音视频或者其他媒体。
(6) Listener 定时发送ACK消息给Caller。ACK包含了RTT 和Listener网络信息。
(7) Caller 将ACKACK消息回复给Listener,Listener根据来回时间来更新RTT。
(8) 当Caller 需要断开时,Caller会向Listener发起shutdown,即使Listener 断开,也是Caller发起shutdown,并且没有回复响应。
SRT连接与传输流程图如下:
抓包示例如下:
作者:孙永建 | 来源:公众号——青榴实验室
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。