xjs.xjtu

LearningWebRTC: 拥塞控制

我不是拥塞控制专家,只懂皮毛,以后随着对WebRTC拥塞控制理解的加深,会进一步更新本文。

原理

GCC(Google Congestion Control)算法架构如下图:

gcc_arch

主要分为DBCC(Delay Based Congestion Control)和LBCC(Loss Based Congestion Control)。

DBCC(Delay Based Congestion Control)

gcc_delay_gradient

RTP包网络延迟定义为:t - T

DBCC原理,直观上可以理解为:根据网络延迟变化,判断网络状态:

分成下面几个部分,大致的功能如下:

LBCC(Loss Based Congestion Control)

LBCC就简单很多,在发送端收到RTCP Receive Report后,根据丢包率,更新带宽估计: gcc_lbcc_formula

然后,取DBCC和LBCC带宽估计中较小的值,作为最终结果。

WebRTC实现

WebRTC实现主要牵涉到三个模块:

各自的功能在下面会看到详细的介绍。

DBCC

DBCC的实现在CC(Congestion Controller)模块里,接口类为ReceiveSideCongestionController和SendSideCongestionController。

接收端实现

ReceiveSideCongestionController把包的大小和到达时间转发给RemoteBitrateEstimatorAbsSendTime或者RemoteBitrateEstimatorSingleStream。 gcc_dbcc_rx

接收端实现时,需要知道发送端的时间,有两种方法:

发送端实现

在接收端:ReceiveSideCongestionController则把包的大小和到达时间转发给RemoteBitrateEstimatorProxy,然后以RTCP RTPFB包发给发送端。

在发送端:收到RTCP RTPFB包后,转给SendSideCongestionController并在DelayBasedBwe里完成带宽估计。

gcc_dbcc_tx

如何选择:@Rx or @Tx

注意:这部分工程经验还不够足,只是根据仅有的皮毛知识猜测的。

接收端实现,需要把结果以RTCP REMB的形式发给发送端。 发送端实现,需要把包的到达时间以RTCP RTPFB的形式发给发送端。 因此,两种方式的延迟可以认为是一样的。

但是,RTPFB包的数量比REMB多很多,本身对网络就是一种负担。

因此:

LBCC

BC模块得到丢包率后,根据前面的公式更新带宽,并得到DBCC结果取较小值。很简单,不画图了。

遗留问题

参考