webrtc的gcc算法(Google Congestion Control),貌似国内很多文章都没有细讲,原理是怎么样的,具体怎么进行计算的。这里详解一下gcc。
gcc算法,主要涉及到:
-
拥塞控制的关键信息和公式
-
卡曼滤波算法
-
gcc如何使用卡曼滤波算法
因为知识点有点多,文章有点长,如果感兴趣但不能一次读完,可以先收藏后,有空慢慢看。
1. 前言
对于拥塞控制,webrtc的方案之一是gcc(Google Congestion Control)。具体做法是,接收端监控两个数据,并反馈给发送端。
-
丢包率: 接收端计算出丢包率,定期发送rtcp rr报文(内有丢包率)给发送端,发送端通过丢包率的大小来决定是否降低编码的bitrate;
-
基于卡曼滤波的带宽预测: 接收端预测出当前发送端到接收端的带宽,接收端再发送rtcp remb报文(内带有预测带宽)给发送端,发送端根据该预测带宽调整编码的bitrate;
基于丢包率来调整动态编码,是比较简单,很多厂家经常在sfu服务的进行调整,如:如果不是长肥型网络,在丢包率<30%的情况下,rtcp rr中的丢包率和丢包总数欺骗性的填写0,这样发送端(尤其是web端)就不会轻易的降低bitrate,到达测试的良好效果。
但是基于卡曼滤波的带宽预测,就比较复杂,本文主要讲解这部分的原理和实现。
2. 拥塞基础信息与公式
延时是如何测量出来的: 定义报文到达的时间为t(i),报文中的时间戳为T(i)。
那么定义延时:
d(i) = t(i)-t(i-1)-(T(i)-T(i-1))
在带宽容量C的链路上,传输frame size为L的数据,需要的时间是: ts = L/C
我们对到达时间的间隔进行建模:
L(i)-L(i-1)
d(i) = -------------- + w(i) = dL(i)/C+w(i)
C
上面的公式,i为某个时刻,i-1为上一个时刻。
L(i): 是i时刻接收到的报文长度(这里一般是指某个固定时段接收到的报文size总和)
L(i-1): 是对于i的上一个时刻的报文长度(上一个固定时段收到的报文size总和)
C: 为链路容量带宽;
W(i): 作为一个高斯白噪声,这个参数非常重要。
d(i):是i时刻的延时
划重点:
如果链路使用超载,w(i)增加;
如果链路比较空,w(i)减小;
也就是说,上面两个公式就是预测和估计w(i)是增加了,还是减小了。
总结,关键公式就是这两个:
公式1(测量):d(i) = t(i)-t(i-1)-(T(i)-T(i-1))
公式2(估计):
L(i)-L(i-1)
d_est(i) = ------------ + w(i) = dL(i)/C+w(i)
C
公式1: 两个时刻的接收报文的本地时间差值,再减去两个时刻的rtp报文中携带的时间戳的差值,结果等于延时(本地时间与rtp报文中时间戳的单位不一致,需要自己转换一致后再计算)。也就是说d(i)是个测量值,每次收到新的一批报文都能测算得出来对应的延时d(i),所以这里强调d(i)是个测量值。
公式2: 在公式2中,dL(i)是两个时刻收到报文长度的差值,这个也是每收到一批报文后能测算出来的,dL(i)也是个测量值。1/C是个估计值,C是估计的带宽容量,w(i)也是一个估计值。注意,公式左边的d_est(i)也是表示i时刻的延时,不过这个延时是通过右边的估计值计算出来的,也就是这个计算出来的d_est(i)是一个估计值。
最后,我们得到,每个i时刻的测量值d(i),和测量值dL(i),要预测出1/C(i)和w(i),这就是我们的目标。
强调: w(i)增加,表示链路超载;w(i)减小,表示链路轻负荷。
卡曼滤波就是要预测出1/C(i)和w(i),并根据根据w(i)是增加或减小,来决定预测带宽是增加还是减小。
小白部分: 既然有了公式1和2,为啥不每次直接计算出延时和带宽的关系,为啥还要引入卡曼滤波算法,弄这么复杂。原因主要是,凡是测试的数据,都会出现测不准,或者有偶尔发生的错误数据(术语叫作噪声),比如某时刻发生抖动,仅仅一批数据产生巨大的延时,但是其实网络是好的,滤波的作用就是过滤出一些无效,错误数据的影响。
先记住这两个公式,后面先打断一下,简单介绍一下卡曼滤波算法。
3. 卡曼滤波算法和示例
针对测试数据,有测试不准确的情况,所以需要在测试数据和估计数据之间进行权衡,卡曼滤波算法就是一个线性的滤波估计算法。
卡曼滤波的5个公式如下(如果看公式有不理解的地方,后面会有个经典的例子,让你理解如何使用这5个公式):
一共5个方程,如上图,左边两个是时间更新方程(预测),右边是测量更新方程(更新/纠正)。
如果第一次接触卡曼滤波算法,可以先熟悉算法,先不研究这5个公式的由来(数学推导),可以作为使用者,只要知道每个变量代表什么意思,如何代入方程,就能满足基础的需求。
头两个预测方程中的参数含义:
A: 状态转移矩阵,就是上一个状态的x变量如何能推导出下一个状态的值。
B:是将输入转换为状态的矩阵;
Q:过程激励噪声协方差(系统过程的协方差)。
后三个测量更新方程的参数含义:
R: 测量噪声协方差。滤波器实际实现时,测量噪声协方差 R一般可以观测得到,是滤波器的已知条件,用户可以根据自己的情况自己设定。
因为公式较多,参数也较多,不容易让人理解,下面举个经典的例子,让你熟悉这些公式和参数。
3.1 卡曼滤波例子(自由落体运动)
假设一个实心球从高空落下,正常来说,我们是能通过速度,加速度g(自由落体加速度9.8米/s),能计算出某个时