这篇文章主要了描述BBR和CUBIC竞争时会出现的状况的仿真情况,以及会出现这种状况的原因。
首先这里看到仿真的结论:当缓冲区很小时,bbr能够占据优势;而当缓冲区很大时,cubic能占据优势。也就是说,当bbr与cubic发生竞争,能够决定哪一种拥塞控制能够占据优势的因素是缓冲区的大小。
深究为什么会出现这种情况,应该从BBR和CUBIC的原理讲起。
先看到CUBIC。
CUBIC的核心思想是对对窗口可能的最大值进行二分查找。当前链路在网络上因为排队而发生丢包时,链路的当前最佳拥塞窗口肯定是小于丢包时的拥塞窗口的,我们称丢包时的拥塞窗口大小为Wmax,同样,CUBIC也采用乘法减小的方式减小窗口,将减小后的窗口为Wmin。每收到一个ACK的时候,便将窗口设置到Wmax和Wmin的中点,一直持续到接近Wmax。之后函数会进入探测带宽阶段,按照逼近Wmax的路径倒回去,即采用与之对称的方案。(这里其实是BIC算法的核心思想,CUBIC是基于BIC进行改进的,所以最终呈现的曲线结果来看差别不大)
最终CUBIC稳定状态之后呈现出来的结果就如图所示:
但是这里首先要明确的是,cubic是基于TCP拥塞控制算法做出的改进算法。TCP拥塞控制算法的基本逻辑就是首先慢启动阶段,丢包触发拥塞避免。在这之后就是探测剩余带宽,拥塞避免这两个阶段循环。这个时候就认为这个算法已经收敛了。在现在这种定性的分析中,具体这几个阶段是如何实现的反而没有那么重要。
很明显,CUBIC是遵循TCP拥塞控制算法这几大步骤的,是事件驱动型的拥塞控制算法。也就是说只有当缓冲区被填满,丢包事件出现时,CUBIC才能被动地降低发送窗口。
然后这里看到BBR。BBR是反馈驱动型的拥塞控制机制。它一共包括有如图所示的四个阶段。
第一阶段STARTUP类似于TCP的慢启动。通过指数增加的方式增加发送速率,希望能够快速探测瓶颈带宽。当判断连续三个往返时间带宽的提升不足25%时,表示已经达到了瓶颈带宽,状态切换至DRAIN。
DRAIN阶段存在的意义,是为了排空STARTUP阶段造成的网络缓存,使飞行包的大小等于BDP。
第三个阶段是BBR的稳定阶段,BBR的大部分时间都在该状态。当bbr测量到瓶颈带宽和最小rtt,并且inflight等于BDP后,便开始以一个稳定的匀速维护着网络状态,偶尔小幅提速探测是否有更大带宽,然后再小幅降速公平的让出部分带宽。
最后一个阶段PROBE_RTT。当10s内没有发现最小RTTProp时,就会进入这个阶段。在这个阶段内BBR的发送窗口会被固定为4个包,从而排空链路上的数据包,测量真实的RTT。
BBR的核心机制如这个图所示。在不断的探测带宽与探测RTT中间达到收敛。BBR的大部分时间也就处于这两个阶段之间。
那么,当BBR和CUBIC发生竞争时动态过程分析应该是这样的:首先CUBIC与BBR共存于共享链路,在瓶颈带宽被占满之后,CUBIC会继续发包填充队列,造成BBR被动排队。由于BBR的被动排队,所以rtt也会显著上升。但是这在短时间内不会影响BBR的发包,因为BBR的测量RTT的是10秒内的最小RTT。也就是说,只要BBR能够坚持10s不划走,CUBIC一旦丢包就会出现乘性减窗。BBR在回复到干净状态的同时也可以迅速占据空闲的带宽,从而达到压制CUBIC的效果。
而相反在另一种情况,如果队列足够深,rtt足够长,足以让CUBIC填充10s还不满时,CUBIC丢包前BBR就退到4个包发送速度了,这反而说CUBIC压制了BBR。
所以这里可以顺理成章地得出结论结论是,浅队列时,CUBIC受BBR的影响比较小,深队列时,BBR会受到CUBIC的影响。
另外,通过仿真,有论文得出了结论:当缓冲区长度为1.5倍的BDP时,CUBIC和BBR可以达到公平的状态。