GCC AIMD细节
1、增加带宽
增加带宽的原理是在当前带宽的基础上缓慢增加少量带宽,分为加性增和乘性增,具体见下。增加带宽的上限是,乘放大因子。
加性增和乘性增,哪个增量值更大一些?
加性增是在输入AIMD模块的预估带宽值接近有效的链路带宽时采用的带宽增量算法。它增加带宽的方法是:一个rtt时间内增加一个avgPacket,所以rtt越小,单位时间内的带宽增量越大;加性增有最大值限制,单位时间内最大增加4kbps。
乘性增是当预估带宽值太大使得当前链路带宽失效时的计算方法,它把单位时间内的带宽增量直接放到当前带宽的0~8%,与无关。乘性增有最小值限制,单位时间内最少增加1kbps。
如何计算?该值的含义是当前连接的发送带宽已经快要逼近网络的最大带宽时,如何缓慢增加一个合理的值,使其不要增加太大而发生排队。计算方法是根据当前带宽值计算一个平均大小的RTP包在一个rtt时间内的带宽。
公式:
其中,
,
更进一步,
,
注意:
的单位是,和的单位为bytes,的单位为ms
表示一个视频帧可分为几个RTP包,向上取整。
默认值是。
举例:
帧率30fps,带宽90kbps,rtt=200ms, 如果要缓慢增加带宽,则GetNearMaxIncreaseRateBpsPerSecond返回值是5kbps,表示在1秒内最大增加5kb数据。
帧率30fps,带宽60kbps,rtt=100ms,如果要缓慢增加带宽,则GetNearMaxIncreaseRateBpsPerSecond返回值是5kbps,表示在1秒内最大增加5kb数据。
结论:增加的数据大小取决于当前的带宽和rtt值。(很明显,看公式)
这个公式可以理解为在一个时间只增加一个,根据这个算出单位时间内应增加的数据大小。
乘性增的计算公式 multiplicative
其中,是放大因子,初始值是,的计算公式:
, 单位是秒
所谓的乘性增也是slow start,因为最大取值为1,所以放大因子的取值范围,也就推导出的取值范围为
当带宽下降时,恢复到原先带宽的恢复时间:
当为0,默认返回3秒;
2、降低带宽
在当前估计带宽(sample)的基础上降低:
如果且有估计值,则
最终计算的带宽限制范围为:
如果是增加带宽,则在当前带宽基础上增加。