1.网络拥塞简述
IP层是基于块状的Packet报文来分片发送的,因此,TCP协议需要将应用交付给它的字符流拆分成多个Packet(在TCP传输层被称为Segment)发送,由于网速有变化且接收主机的处理性能有限,TCP还要决定何时发送这些Segment。TCP滑动窗口解决了Client、Server这两台主机的问题,但没有去管连接中大量路由器、交换机转发IP报文的问题,因此当瓶颈路由器的输入流大于其输出流时,便会发生拥塞。如果发送方不管不顾,那么瓶颈路由器的缓冲队列填满后便会发生大量丢包,且此时RTT(报文往返时间)由于存在长队列而极高。
如上图,最好的状态是没有队列,此时RTT最低,而State2中RTT升高,但没有丢包,到State 3队列满时开始发生丢包
2.BBR技术简述
TCP的拥塞控制便用于解决上述问题。在BBR出现前,拥塞控制分为四个部分:慢启动、拥塞避免、快速重传、快速恢复。它的意义是在不知道连接的瓶颈带宽时,以起始较低的发送速率,以每RTT两倍的速度快速增加发送速率,直到到达一个阈值,到该阈值后,进入线性提高发送速率的阶段,该阶段叫做拥塞避免,直到发生丢包,。丢包后,发速速率大幅下降,针对丢包使用快速重传算法重送发送,同时也使用快速恢复算法把发送速率尽量平滑的升上来。如果瓶颈路由器的缓存特别大,那么这种以丢包作为探测依据的拥塞算法将会导致严重问题:TCP链路上长时间RTT变大,但吞吐量维持不变。
如CUBIC这样基于丢包的拥塞控制算法在图2中的第2条灰色竖线发生作用,这已经太晚了,因为此时瓶颈路由器已经达到上限,缓冲队列已经满载。更好的作用点是BDP上限开始发挥作用时,也就是第1条灰色竖线,是瓶颈路由器的缓冲队列刚刚开始积压时的节点。BBR通过检测RTprop和BtlBw来实现拥塞控制。
RTprop:光信号从A端到B端的最小时延(其实是2倍时延,因为是一个来回),这取决于物理距离。
BtlBw:在A到B的链路中,它的带宽取决于最慢的那段链路的带宽,称为瓶颈带宽。
BDP:整条物理链路(不含路由器缓存)所能储藏的比特数据之和,BDP = BtlBw * RTprop
TCP BBR协议定义的带宽(delivery rate)= 数据量/从发送出去至收到ACK的时长
这里注意,RTporp和RTT是不一样的,RTT里含有报文在路由器队列里的排队时间、ACK的延迟确认时间等。TCP每个报文必须被确认,确认动作是通过接收端发送ACK报文实现的,但由于TCP和IP头部有40个字节,如果不携带数据只为发送ACK网络效率过低,所以会让独立的ACK报文等一等,看看有没有数据发的时候顺便带给对方,或者等等看多个ACK一起发,叫做延迟确认。所以,可以用下列公式表示RTT与RTprop的差别:
RTT我们可以测量得出,我们只需要找到瓶颈路由器队列为空时多次RTT测量的最小值即为RTporo
当RTprop升高时我们便得到了BtlBw,这便找到第1条灰色竖线最好的拥塞控制点,也有了后续发送速率的依据。基于BBR算法,由于瓶颈路由器的队列为空,最直接的影响就是RTT大幅下降,而因为没有丢包,BBR传输速率也会有大幅提升。
除此之外,BBR会尝试周期性的探测新的瓶颈带宽,这个周期值为1.25、0.75、1、1、1、1,以此来应对链路发生了切换,新的瓶颈带宽变大或者变小的情况。1.25会使得BBR尝试发送更多的报文,而如果产生了队列积压,0.75则会释放队列。
3.BBR算法与Cubic算法数据对比
下图是10Mbps、40ms网络的慢启动阶段,该网络中未确认的字节数应为10Mbps*0.04s=0.05MB。棕色线条是CUBIC算法下已发送字节数,而蓝色是ACK已确认字节数,绿色则是BBR算法下的已发送字节数。显然,最初CUBIC与BBR算法相同,在0.25秒时飞行字节数显然远超过了0.05MB字节数,大约在 0.1MB字节数也就是2倍BDP。大约在0.3秒时,CUBIC开始线性增加拥塞窗口,而到了0.5秒后BBR开始降低发送速率,即排空瓶颈路由器的拥塞队列,到0.75秒时飞行字节数调整到了BDP大小,这是最合适的发送速率。
当繁忙的网络出现大幅丢包时,BBR的表现也远好于CUBIC算法。下图中,丢包率从0.001%到50%时,可以看到绿色的BBR远好于红色的CUBIC。大约当丢包率到0.1%时,CUBIC由于不停的触发拥塞算法,所以吞吐量极速降到10Mbps只有原先的1/10,而BBR直到5%丢包率才出现明显的吞吐量下降。CUBIC造成瓶颈路由器的缓冲队列越来越满,RTT时延就会越来越大,而操作系统对三次握手的建立是有最大时间限制的,这导致建CUBIC下的网络极端拥塞时,新连接很难建立成功。
4.总结
BBR算法的优势:
- 在有一定丢包率的网络链路上充分利用带宽。
- 降低网络链路上的 buffer 占用率,从而降低延迟。
BBR算法的不足:
设备队列缓存较大时,BBR可能会竞争不过Cubic等比较激进算法。
BBR算法适用范围:
高带宽、高时延、有一定丢包率的长肥网络,可以有效降低传输时延,并保证较高的吞吐量。