TCP 拥塞控制算法
传统 TCP 拥塞控制算法,基于丢包反馈的协议。
基于「丢包反馈」的协议是一种 被动式 的拥塞控制机制,其依据网络中的丢包事件来做网络拥塞判断。即便网络中的负载很高时,只要没有产生拥塞丢包,协议就不会主动降低自己的发送速度。
这种协议可以最大程度的利用网络剩余带宽,提高吞吐量。然而,由于基于丢包反馈协议在网络近饱和状态下所表现出来的侵略性,一方面大大提高了网络的带宽利用率;但另一方面,对于基于丢包反馈的拥塞控制协议来说,大大提高网络利用率同时意味着下一次拥塞丢包事件为期不远了,所以这些协议在提高网络带宽利用率的同时也间接加大了网络的丢包率,造成整个网络的抖动性加剧。
还有谁导致了丢包?
丢包并不总是拥塞导致,丢包可能原因是多方面,比如:
- 全球最牛的防火墙 GWF 的随机丢包策略
- 网路中由于多路径衰落(multi-path fading)所造成的信号衰减(signal degradation)
- 通道阻塞造成的丢包(packet drop),再者损坏的封包(corrupted packets)被拒绝通过
- 有缺陷的网路硬件、网路驱动软件发生故障
- 信号的信噪比(SNR)的影响
Google BBR 的出现
我们自然不喜欢 GWF 这种人为的随机丢包策略,当路过 GWF 时,数据被丢包,我们在此时应该立刻重新发包,增大发送的频率,而不希望降低速度,也就是不希望传统的 TCP 拥塞算法去控制。
由此,就出现了基于不丢包的拥塞控制算法 CDG, 以 延迟 作为判断依据,延迟增大说明拥塞, 数据开始在路由器的缓冲中积累. 降低发送 窗口。然而 CDG 算法与基于丢包的算法不兼容, 只有全球的设备都换上 CDG,但这是不可能的,目前市面上的设备不可能一下子都切换到 CDG,因此 Google 就不开心了,Google 的科学家们开发了一种过渡算法来解决这个问题,这个算法的名字就是 BBR(Bottleneck Bandwidth and RTT),它是一种全新的 拥塞控制算法,BBR 同 CDG 一致的思想是不以丢包作为拥塞控制信号,但是和 CDG 不同的是,BBR 能和 cubic 和 reno 共存。
Google云端平台博客提供, 使用BBR前后网络吞吐量对比图 / By Google
CentOS 8 开启 TCP_BBR
centos 8
支持 BBR
和 NV
拥塞算法, 但默认 未启动
- 查看当前启动 拥塞算法
[root@aikaiyuan ~]# sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = cubic
[root@aikaiyuan ~]# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic
- 加载 tcp_bbr.ko 模块
[root@aikaiyuan ~]# modprobe tcp_bbr
[root@aikaiyuan ~]# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic bbr
- 自动加载 tcp_bbr.ko 模块
[root@aikaiyuan ~]# echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf
[root@aikaiyuan ~]# cat /etc/modules-load.d/bbr.conf
tcp_bbr
- 修改 sysctl
[root@aikaiyuan ~]# echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
[root@aikaiyuan ~]# echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
[root@aikaiyuan ~]# sysctl -p
[root@aikaiyuan ~]# sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
CentOS 7 开启 TCP_BBR
[root@usa ~]# yum install curl wget vim net-tools iproute2 openssh-server openssh python3 python3-pip -y
- 升级内核
[root@usa ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@usa ~]# yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
[root@usa ~]# yum --enablerepo=elrepo-kernel install kernel-ml
[root@usa ~]# rpm -qa | grep kernel-ml
kernel-ml-5.5.3-1.el7.elrepo.x86_64
[root@usa ~]# /sbin/reboot
CentOS 8.x 和 RHEL 8.x 更改默认启动项
CentOS 7内核升级后内核启动顺序的更改
- 自动加载 tcp_bbr.ko 模块
[root@usa ~]# echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf
[root@usa ~]# cat /etc/modules-load.d/bbr.conf
tcp_bbr
- 修改 sysctl
[root@usa ~]# echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
[root@usa ~]# echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
[root@usa ~]# sysctl -p
[root@usa ~]# sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
[root@usa ~]# /sbin/reboot
- 检查
[root@usa ~]# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic bbr
[root@usa ~]# sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
[root@usa ~]# lsmod | grep tcp
tcp_bbr 20480 1
https://access.redhat.com/solutions/3713681
转载请注明:爱开源 » CentOS 8 开启 TCP BBR