GCC AIMD细节

2019-05-29  本文已影响0人  ClaireYuan_e78c

1、增加带宽

增加带宽的原理是在当前带宽的基础上缓慢增加少量带宽,分为加性增和乘性增,具体见下。增加带宽的上限是deltaTime,乘放大因子。

加性增additiveBps和乘性增multiplicativeBps,哪个增量值更大一些?

加性增是在输入AIMD模块的预估带宽值estimatedThroughput接近有效的链路带宽linkedCapacity时采用的带宽增量算法。它增加带宽的方法是:一个rtt时间内增加一个avgPacket,所以rtt越小,单位时间内的带宽增量越大;加性增有最大值限制,单位时间内最大增加4kbps。

乘性增是当预估带宽值estimatedThroughput太大使得当前链路带宽linkedCapacity失效时的计算方法,它把单位时间内的带宽增量直接放到当前带宽的0~8%,与rtt无关。乘性增有最小值限制,单位时间内最少增加1kbps。


additiveBps如何计算?该值的含义是当前连接的发送带宽已经快要逼近网络的最大带宽时,如何缓慢增加一个合理的值,使其不要增加太大而发生排队。计算方法是根据当前带宽值计算一个平均大小的RTP包在一个rtt时间内的带宽。

公式:nearMaxBpsPerSecond=max(\frac{avgPktSize*8}{responseTime}*1000 , 4000)

其中,

avgPktSize=\frac{avgPerFrameSize}{packetsPerFrame}, responseTime = (rtt+100)*2

更进一步,

 avgPerFrameSize = \frac{currentBitrate}{frameRate*8}, packetsPerFrame= \lceil \frac{avgPerFrameSize}{1200}\rceil

注意:

nearMaxBpsPerSecond的单位是bpsavgPktSizeavgPerFrameSize的单位为bytes,responseTime的单位为ms

packetsPerFrame表示一个视频帧可分为几个RTP包,向上取整。

rtt默认值是200ms

举例:

帧率30fps,带宽90kbps,rtt=200ms, 如果要缓慢增加带宽,则GetNearMaxIncreaseRateBpsPerSecond返回值是5kbps,表示在1秒内最大增加5kb数据。

帧率30fps,带宽60kbps,rtt=100ms,如果要缓慢增加带宽,则GetNearMaxIncreaseRateBpsPerSecond返回值是5kbps,表示在1秒内最大增加5kb数据。

结论:增加的数据大小取决于当前的带宽和rtt值。(很明显,看公式)

这个公式可以理解为在一个responseTime时间只增加一个avgPktSize,根据这个算出单位时间内应增加的数据大小。 


乘性增的计算公式 multiplicative

multiplicativeIncreaseBps =min( currentBitrate*(alpha-1.0),       1000)

其中,alpha是放大因子,初始值是1.08alpha的计算公式:

alpha = alpha^{timeSinceLastUpadate}

timeScienceLastUpdate = min( \frac{nowMs-lastMs}{1000} , 1.0), 单位是秒

所谓的乘性增也是slow start,因为timeScienceLastUpdate最大取值为1,所以alpha放大因子的取值范围[1, 1.08],也就推导出multiplicativeIncreaseBps的取值范围为[1000, 1.08*currentBitrate]


当带宽下降时,恢复到原先带宽的恢复时间:

timeToRecoverDecreaseSeconds=\frac{lastDecrease}{increaseRateBpsPerSecond}

lastDecrease为0,timeToRecoverDecreaseSeconds默认返回3秒;

2、降低带宽

在当前估计带宽(sample)的基础上降低:

newBitrate=estimatedBitrate*beta

beat=0.85

如果newBitrate > currentBitratelinkCapacity有估计值,则newBitrate=linkCapacity*beta


最终计算的带宽限制范围为:

如果是增加带宽,则在当前带宽currentBitrate基础上增加。

上一篇下一篇

猜你喜欢

热点阅读