CentOS 开启 Google BBR 拥塞控制算法
(部分图片、文字来源于网络)
什么是 TCP 拥塞控制
拥塞控制 是面向 TCP 连接的避免网络拥塞的算法,是互联网上主要的一个拥塞控制措施。在互联网上应用中有相当多的具体实现算法。
拥塞窗口(CWND) 就是发送方一次性发送报文段的个数,它是一个装在 TCP 发送端的可变数值。
拥塞控制的主要运作方式为:
- 慢开始(Slow Start) 根据网络情况设置CWND初始值(1 ~ 4),并设置慢开始门限(ssthresh),防止CWND增长过大,引起网络堵塞。首先由发送方发送第一轮次报文,如果没有问题,接收方会确认报文(返回含有 ACK 标志位的报文),每完成一轮次,CWND都会加倍。当 CWND > ssthresh 时,启动拥塞避免算法。
- 拥塞避免 在此阶段,每成功发送接收一轮次,即一次 往返时间(RTT),CWND 便加 1 ,使得 CWND 缓慢增长。当 重传定时器超时 时,网络很大可能性发生堵塞。 ssthresh 变为当前 CWND 的一半,CWND 变为初始值,重新经历 慢开始阶段。 当发送端接收到 三个重复(相同)的确认报文(ACK) 时,可能个别报文段在网络中丢失,应立刻执行快重传与快恢复算法。
- 快重传 在发送方接收到三个重复的确认报文后,接收方立即发出确认报文,即使收到了无序的报文,也要发送重复的确认。这样发送方就不会发生超时。
- 快恢复 在发送方接收到三个重复的确认报文后,将 ssthresh 设置为当前 CWND 的一半,CWND 变为当前自身的一半。
常见的拥塞控制算法有:TCP Tahoe 、TCP Reno、TCP New Reno、TCP Vegas、TCP Hybla、TCP BIC、 TCP CUBIC、TCP Westwood、TCP PRR、TCP BBR
Google BBR 算法
TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google设计,于2016年发布的拥塞算法。以往大部分拥塞算法是基于丢包来作为降低传输速率的信号,而BBR则基于主动探测。该算法使用网络最近出站数据当时的最大带宽和往返时间来创建网络的模型。该算法认为随着网络逐渐进入千兆速度时,与缓冲膨胀相关的延迟(因数据包过度缓冲而引起的数据包交换网络高延迟)相比丢包更应该被认为是识别拥塞的主要决定因素,所以基于延迟模型的拥塞控制算法(如BBR)会有更高的吞吐量和更低的延迟。Google在YouTube上应用该算法,将全球平均的YouTube网络吞吐量提高了4%,在一些国家超过了14%。
BBR之后移植入 Linux内核4.9以后 的版本,并且对于 QUIC(快速UDP网路连接) 可用。
开启 Google BBR 算法
一、更新内核
由于 CentOS 自带的内核均为 4.9 版本以前,其中并不含有 BBR 算法,因此需要将内核更新到最新版:
请参阅:CentOS 内核的更换
二、修改系统选项
/etc/sysctl.conf
文件是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。这里推荐Linux内核文档官方网站:Documentation for /proc/sys 可以查看 sysctl.conf 文件的配置参数的解释。
设置网络设备的默认排队规则并开启 BBR 拥塞控制算法
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
三、验证
输入以下命令:
lsmod | grep bbr