目录
前言
WebRTC在运行过程中经常会遇到网络拥塞问题,网络拥塞(congestion)是指在分组交换网络中传送分组的数目太多时,由于存储转发节点的资源有限而造成网络传输性能下降的情况。当网络发生拥塞时,一般会出现数据丢失,时延增加,吞吐量下降,严重的时候甚至会导致“拥塞崩溃”(congestion collapse)。WebRTC处理网络拥塞问题时需要非常准确的带宽估计算法,本文重点将讲述WebRTC的两种带宽估计算法。
正文
WebRTC有基于丢包的带宽估计和基于延时的带宽估计的两种带宽估计算法。其中,基于丢包的带宽估计算法是当网络发生拥塞时,路由器缓冲区被填满,后续的数据包会被丢弃;基于网络延时的带宽估计算法是当网络开始出现拥塞时,路由器缓冲区数据逐渐增加,数据包之间的延迟变化加剧。
编辑
基于丢包的带宽估计算法
基于丢包的带宽估计算法是通过RTCP-RR报文来检测丢包率,然后根据丢包率来调整对应的带宽。
带宽估计可能是WebRTC视频引擎中最重要的部分之一。带宽估计(BWE)模块的任务是决定你可以发送多大的视频流和音频流而不会造成网络拥塞,以此来保证不会降低视频质量。
较早的带宽估计算法还是十分基础的,主要是基于丢包而设计的。通常我们在开始慢慢的增加视频的比特率,直到我们能够检测到丢包为止,保持当前带宽状态,发送数据包。检测丢包的机制就是根据标准的RTCP包的反馈信息,这就需要接收端使用RTCP数据周期性的报告丢包情况。但是这种模式已经逐步被基于延时的带宽估计算法取代了。
基于延时的带宽估计算法
基于延时的带宽估计算法通过分析数据包之间的延时来预测拥塞情况,在路由器丢弃数据包之前尝试降低带宽。因此能够更早的发现网络的拥塞状况,进而提前调整码率,防止拥塞加重。
编辑
REMB
REMB侧重于在接收端起作用,在接收端计算预估码率的结果,并通过RTCP-FB反馈给发送端。这个过程需要发送端发送数据包的绝对时间,这个信息可以存储在RTP报头的扩展中。相关的SDP协商信息:
a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
相关代码:webrtc\api\rtp_parameters.cc
const char RtpExtension::kTransportSequenceNumberUri[] = "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
除此之外,还需要接收端通过RTCP-REMB反馈预估的码率