CentOS 7安装TCP BBR拥塞算法
➡️认识BBR拥塞算法
从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也不例外。
根据实地测试,在部署了最新版内核并开启了 TCP BBR 的机器上,网速甚至可以提升好几个数量级。
TCP BBR拥塞算法
致力于解决两个问题:
- 在有一定丢包率的网络链路上充分利用带宽。
- 降低网络链路上的 buffer 占用率,从而降低延迟。
在标准TCP
通讯的情况下,为了充分利用带宽所采用的方案是:不断增加发送窗口,直到开始丢包,然后较快地减小发送窗口。
这种做法在一般情况下没什么问题,但是在存在传输错误导致的丢包地情况下就没那么好使了。
在有一定的丢包率的延迟高、宽带大的链路上标准的TCP拥塞控制
就会把发送窗口收敛到很小。
同时在网络中也有很多缓存空间用来吸收网络中的流量波动。由于标准的TCP拥塞控制
是通过灌满带宽的方式来估算需要的发送窗口的,在连接的开始阶段,网络中的缓存空间就倾向于被占满。后续缓存空间会被逐渐释放,但并不会消失。客户端估计的水管容积总是略大于网络中除去缓存空间的实际容量。这个问题又被称之为缓存区膨胀
。缓存区膨胀
主要带来了两个问题:
- 增加网络延迟。
- 在连接数较多时容易导致缓存区被填满导致丢包。
TCP BBR
是用以下方法解决这两个问题的:
- 既然分不清拥塞丢包和错误丢包那就不考虑丢包问题。
- 既然管满水管会导致缓存区膨胀那就估计带宽和延迟,不直接估计水管体积。
带宽和延迟本身是没法同时测量的,测量最大带宽就需要把缓存区填满,测量最低延迟就需要把缓存区清空。TCP BBR
所采用的方案是交替测量,用一段时间内的最大带宽和另一段时间内的最低延迟作为估计值。
在连接刚开始建立时,它采用了和标准TCP
类似的慢启动,指数增长发送速率。而标准的TCP拥塞控制
会在遇到任何一个丢包就立刻开始减速,开始拥塞避免。这时,标准TCP拥塞控制
本意是达到带宽的最大值开始进行网络控制,但是在有一定的丢包率的情况下也有可能是单纯的网络丢包,这时网络并没有达到带宽的最大值;如果网络中存在缓存区,它也会一直到把缓存区填满才会放弃。TCP BBR
则是根据收到的确认包,发现有效带宽不再增长时开始拥塞避免。这时,只要链路的丢包率不算特别高,对BBR
就几乎没什么影响;当发送速率增长到开始占用缓存区时(这时可以通过延迟的增加判断出来),BBR
就及时的放弃了(这时占用的是3倍带宽,相当于有2倍在占用缓存区,但BBR
本身还有一个排空阶段,在排空阶段下它会指数降低发送速率),这样就不会把缓存区占满。
排空阶段过后就是稳定运行状态,交替探测带宽和延迟,以此来作为基准进行发包。
➡️安装TCP BBR拥塞算法
1 | cat /etc/redhat-release #查看系统版本,输出的release数值大于7.3即可。 |
- 自动安装,使用一键安装脚本
1 | wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh |
- 手动安装
1 | 使用下面命令安装elrepo并升级内核 |
验证bbr是否已经开启
1 | sysctl net.ipv4.tcp_available_congestion_control #验证当前TCP控制算法的命令 |