SRT传输协议为什么可以低延时?

 SRT号称可以低延时地在网路中传输直播流(SRT Streaming Protocol Deliver high-quality, low-latency video across the public internet)。
 SRT是怎样实现视频传输的低时延呢?这个问题就缺乏解释。[1]基本上是对官方白皮书的翻译,其中一个是使用ARQ进行包传递。TCP就不是使用ARQ机制了吗?一个可靠的传输协议,必须有ARQ机制,重传丢失的数据包(数据包的丢失有两种可能,随机丢包,拥塞丢包)。FEC当然很好,可以发送冗余数据包的机制,对丢包进行恢复。然而FEC也有缺点,比如在链路状况良好的情况下,网络链路中没有丢包,在拥塞控制的约束下,发送FEC包会引入额外的时延。然而FEC机制在SRT的协议中并未实现。
 那么SRT协议,究竟有什么特性可以保证低时延呢?
 [2]中的白皮书提到了latency window。就是超过一定时延窗口,接收缓冲区中缺失的数据包,可以不用继续等待其达到,而将收到的数据包提交给上层解码。就是一种不完全可靠传输的机制,这个机制算是一种可以达到低时延的方法。
 而真正决定数据包发送快慢的还是拥塞控制算法。那么SRT中有很美妙的拥塞控制算法吗?UDT中是有拥塞控制算法的[3],基本上属于AIMD的一个变种。看了下SRT的拥塞控制代码(srt/srtcore/congctl.cpp),基本延续了UDT的拥塞控制算法。代码中,在稳定状态是根据ack的返回速率,计算窗口值的,收到丢包报告,就增大数据包之间的发送间隔(slowdownSndPeriod),降低发送速率。与拥塞窗口控制相关的接口:

virtual double cgWindowSize() { return m_dCWndSize; }
virtual void updateBandwidth(int64_t, int64_t)
// When a lossreport has been received, it might be due to having
// reached the available bandwidth limit. Slowdown to avoid further losses.
void slowdownSndPeriod(ETransmissionEvent, EventVariant arg)

 关于这个拥塞控制是否比TCP中的cubic要好,就需要仿真测试了。

[1] SRT: 开源的视频传输协议
[2] https://github.com/Haivision/srt/issues/479
[3] UDT: UDP-based Data Transfer for High-Speed Wide Area Networks
[4] udp 拥塞控制性能评测 https://www.mcs.anl.gov/~kettimut/talks/pfldnet04.pdf
[5] UDT协议实现分析——发送窗口大小及发送速率的调整

你可能感兴趣的:(拥塞控制)