万字详文:TCP 拥塞控制详解( 十 )

PROBE_BW:该状态下会照常计算当前的 bw,即瞬时带宽 。然而在计算 pacing rate 以及 cwnd 时,并不会像在 STARTUP 状态时那样用一个很大的增益系数去扩张 pacing rate 和 cwnd,而是顺序的在[5/4,3/4,1,1,1,1,1,1]中选一个,感官上 bw 就在其停止增长的地方上下徘徊了 。
/* The gain for deriving steady-state cwnd tolerates delayed/stretched ACKs: */static const int bbr_cwnd_gain= BBR_UNIT * 2;/* The pacing_gain values for the PROBE_BW gain cycle, to discover/share bw: */static const int bbr_pacing_gain[] = {BBR_UNIT * 5 / 4,/* probe for more available bw */BBR_UNIT * 3 / 4,/* drain queue and/or yield bw to other flows */BBR_UNIT, BBR_UNIT, BBR_UNIT,/* cruise at 1.0*bw to utilize pipe, */BBR_UNIT, BBR_UNIT, BBR_UNIT/* without creating excess queue... */};PROBE_RTT:当 PROBE_BW 检测到连续 10s 没有更新 min rtt 时就会进入该状态 。该状态的目标是保持 BBR 的公平性并定期排空瓶颈队列,以收敛到真实的 min_rtt 。进入该模式时,BBR 会将 cwnd 的上限设置为 4 个数据包 。在 flight pkg <= 4 后开始进行 rtt 探测,探测时间为 200ms,探测结束后 BBR 便会记录 min rtt,并离开 PROBE_RTT 进入相应的模式 。代码见bbr_update_min_rtt函数 。
Q:为什么 PROBE_BW 阶段 bbr_cwnd_gain 为 2? 保证极端情况下,按照 pacing_rate 发送的数据包全部丢包时也有数据继续发送,不会产生空窗期 。
Q:为什么在探测最小 RTT 的时候最少要保持 4 个数据包4 个包的窗口是合理的,infilght 分别是:刚发出的包,已经到达接收端等待延迟应答的包,马上到达的应答了 2 个包的 ACK 。一共 4 个,只有 1 个在链路上,另外 1 个在对端主机里,另外 2 个在 ACK 里 。路上只有 1 个包 。
6.3.4 BBR 算法表现BBR 将它的大部分时间的在外发送数据都保持为一个 BDP 大小,并且发送速率保持在估计得 BtlBw 值,这将会最小化时延 。但是这会把网络中的瓶颈链路移动到 BBR 发送方本身,所以 BBR 无法察觉 BtlBw 是否上升了 。所以,BBR 周期性的在一个 RTprop 时间内将 pacing_gain 设为一个大于 1 的值,这将会增加发送速率和在外报文 。如果 BtlBw 没有改变,那么这意味着 BBR 在网络中制造了队列,增大了 RTT,而 deliveryRate 仍然没有改变 。(这个队列将会在下个 RTprop 周期被 BBR 使用小于 1 的 pacing_gain 来消除) 。如果 BtlBw 增大了,那么 deliveryRate 增大了,并且 BBR 会立即更新 BtlBw 的估计值,从而增大了发送速率 。通过这种机制,BBR 可以以指数速度非常快地收敛到瓶颈链路 。
如下图所示,在 1 条 10Mbps,40ms 的流在 20s 稳定运行之后将 BtlBw 提高了 1 倍(20Mbps),然后在第 40s 又将 BtlBw 恢复至 20Mbps 。

万字详文:TCP 拥塞控制详解

文章插图
bbr 带宽变化
下图展示了 1 个 10Mbps,40ms 的 BBR 流在一开始的 1 秒内,发送方(绿线)和接收方(蓝线)的过程 。红线表示的是同样条件下的 CUBIC 发送 。垂直的灰线表示了 BBR 状态的转换 。下方图片展示了两种连接的 RTT 在这段时间的变化 。注意,只有收到了 ACK(蓝线)之后才能确定出 RTT,所以在时间上有点偏移 。图中标注了 BBR 何时学习到 RTT 和如何反应 。
万字详文:TCP 拥塞控制详解

文章插图
10Mbps、40ms链路上BBR流的第一秒
下图展示了在上图中展示的 BBR 和 CUBIC 流在开始 8 秒的行为 。CUBIC(红线)填满了缓存之后,周期性地在 70%~100%的带宽范围内波动 。然而 BBR(绿线)在启动过程结束后,就非常稳定地运行,并且不会产生任何队列 。
万字详文:TCP 拥塞控制详解

文章插图
在10Mbps、40ms链路上的BBR流和CUBIC流的前8秒对比
下图展示了在一条 100Mbps,100ms 的链路上,BBR 和 CUBIC 在 60 秒内的吞吐量与随机丢包率(从 0.001%~50%)的关系 。在丢包率只有 0.1%的时候,CUBIC 的吞吐量就已经下降了 10 倍,并且在丢包率为 1%的时候就几乎炸了 。而理论上的最大吞吐量是链路速率乘以(1-丢包率) 。BBR 在丢包率为 5%以下时还能基本维持在最大吞吐量附近,在 15%丢包率的时候虽然有所下降但还是不错 。
万字详文:TCP 拥塞控制详解

文章插图
BBC和CUBIC的吞吐量与丢包率的关系
6.4 Westwood 算法TCP Westwood 算法简称 TCPW,和 bbr 算法类似是基于带宽估计的一种拥塞控制算法 。TCPW 采用和 Reno 相同的慢启动算法、拥塞避免算法 。区别在于当检测到丢包时,根据带宽值来设置拥塞窗口、慢启动阈值 。


推荐阅读