https://lwn.net/Articles/701165/ 

古二

拥塞算法允许网络协(通常指TCP)可以达到任何给定连接的最大吞吐量,同时可以与其他用户共享有效带宽。BBR (Bottleneck Bandwidth and RTT)算法由Google发布,因此吸引了大量的关注。它用一种新的机制取代了传统算法,尝试在无线连接、中间设备干预和缓存膨胀(bufferbloat)中获得更好的结果。

对于给定连接,网络没有任何机制将有效的带宽通知到端,任何拥塞算法都要解决这个问题。所以算法必须通过某种方式得知特定时间内可以发送多少数据。由于有效带宽随着时间一直变化,因此带宽评估需要实时更新。换句话说,拥塞控制算法必须持续的评ä¼°多少数据可以被发送。

这些算法的测量标准是:没有到达对端而不得不重传的包的数目。当网络“平稳运行”,丢包是极少发生的。一旦路由器的缓冲被填满,则会开始将无法容纳的包丢弃。丢包因此成为一个简单可靠的信号,该信号指示连接超过了有效带宽,需要进行降速处理。

这个方法的问题是在现有的网络环境下,端到端的连接中缓冲区非常大。过大的缓冲区是近年来公认的问题,并且已经开始着手解决缓存膨胀问题。但是仍旧大量的路由器处于缓存膨胀状态,并且一些链路层技术(例如WiFi)需要确定缓冲区的总量以便于性能优化。等到端已经发送出足够的数据使得连接的缓冲区溢出,积累下来的数据缓冲区是非常巨大的。丢包信号来的太晚,当获得丢包信号时,连接已经被超负荷工作了很长时间。

基于丢包的算法在遇到包错误的时候会产生问题。算法不必要的降速,使得有效带宽没有被充分利用。

BBR (Bottleneck Bandwidth and RTT)

BBR算法不同于那些关注于包丢弃的算法,相反它主要度量标准是发往远端数据的真实带宽。每次收到一个应答包,BBR都会更新数据发送总量。固定周期内累计发送数据量是一个很好的指标,该指标指示连接可以提供的带宽。

当一个连接开始建立,BBR进入“startup”状态;在这个模式下,它的行为类似于传统拥塞控制算法,接着会不断提升传输速度同时尝试测量有效带宽。大多数算法会持续的增加带宽,直到丢包发生;BRR则是观察上述的带宽变化。尤其是观察最后三次往返的发送带宽是否发生变化。当带宽停止上升,BBR认为它已经发现了连接的有效带宽,同时停止增加数据发送带宽,这比持续增加带宽直到丢包要好得多。测量的带宽被认为是连接的发送速率。

但是在测量速率的时候,BBR有可能在短时间内以较高的速率发送数据包,某些包将要被置入队列中等待发送。为了排空这些被置入缓冲区的包,BBR将要进入一个“drain”状态,在这个阶段,发送速度会低于测量的带宽,直到之前超额的包被发送完成。

一旦排空周期完成,BBR将进入稳定状态,传输速率会在所计算的带宽上下波动。“上下波动”是因为网络连接的特性会随时间变化,所以要持续的监控真实的发送带宽。同时,有效带宽的增加也只能通过尝试以更高的速率发送去检测,所以BBR会在1/8的时间里面增加25%的速率去尝试更高的带宽。如果带宽没有增加,则接下来的1/8时间段会进入“drain”周期,排空之前发送的多余包。

BBR不像大多数其他算法,它不用拥塞窗口作为主要控制组件。拥塞窗口限制了在给定的时间内在传输管道中的数据,窗口的增加会使得突发的包消耗新的有效带宽。BBR 应用tc-fq(Fair Queue)包调度按照适当的速率发送数据。拥塞窗口仍然存在,但已经不再是主要的管理机制,它只是为了保证没有过多的数据存在传输管道中。