TCP拥塞控制算法——BBR

1. BBR产生的背景

  1. 拥塞控制始于20世纪80年代,当时TCP是滑动窗口的算法,拥塞窗口固定,需要通过不断地响应报文推动滑动窗口前进。但在1986年TCP导致了拥塞崩溃,比如现在多端采用TCP发起报文,实际带宽达不到所能提供的最大带宽时网络出现拥堵,此时会有越来越多的TCP发起重试,进而加剧拥堵情况。
  2. 2000年之后伴随着互联网大爆发,各类应用特别是音视频应用数量大幅增加,TCP拥塞控制算法无法满足当前互联网应用对网络传输高实时性、高带宽利用率、高吞吐量的需求,在这种背景下BBR应运而生。

2. TCP算法存在的问题

  1. 在互联网发展的过程当中,TCP算法也做出了一定改变,先后演进了Reno、NewReno、Cubic和Vegas,这些改进算法大体可以分为基于丢包和基于延时的拥塞控制算法
  2. 基于丢包的拥塞控制算法以Reno、NewReno为代表,它的主要问题有Buffer bloat和长肥管道两种,基于丢包的协议拥塞控制机制是被动式的,其依据网络中的丢包事件来做网络拥塞判断。即使网络中的负载很高,只要没有产生拥塞丢包,协议就不会主动降低自己的发送速度。最初路由器转发出口的Buffer 是比较小的,TCP在利用时容易造成全局同步,降低带宽利用率,随后路由器厂家由于硬件成本下降不断地增加Buffer,基于丢包反馈的协议在不丢包的情况下持续占用路由器buffer,虽然提高了网络带宽的利用率,但同时也意味着发生拥塞丢包后,网络抖动性加大。另外对于带宽和RTT都很高的长肥管道问题来说,管道中随机丢包的可能性很大,TCP的默认buffer设置比较小加上随机丢包造成的cwnd经常下折,导致带宽利用率依旧很低。
  3. 基于延时的拥塞控制算法以vegas为代表,但当vegas出现时,基于丢包的拥塞控制算法在市面已经占据主流,vegas抢不到带宽出现"饿死"现象,因此也没办法与之抗争。
  4. 在BBR出现之前,TCP的拥塞控制一直逃脱不了这两个方向,另外优化TCP的拥塞控制难免涉及到内核的修改,这也是限制TCP继续优化的一大问题。

3. BBR算法的特点及核心

  1. **BBR(Bottleneck Bandwidth:瓶颈带宽 and Round-trip propagation time:往返传播时间)是一种基于带宽和延迟反馈的拥塞控制算法。**目前已经演化到第二版,是一个典型的封闭反馈系统,发送多少报文和用多快的速度发送这些报文都是在每次反馈中不断调节 。在BBR提出之前,拥塞控制都是基于事件的算法,需要通过丢包或延时事件驱动;BBR提出之后,拥塞控制是基于反馈的自主自动控制算法,对于速率的控制是由算法决定,而不由网络事件决定,算法核心是"不排队"。
  2. BBR算法的核心是找到最大带宽(Max BW)和最小延时(Min RTT)这两个参数,最大带宽和最小延时的乘积可以得到BDP(Bandwidth Delay Product), 而BDP就是网络链路中可以存放数据的最大容量。BDP驱动Probing State Machine(探测状态机)得到Rate quantum和cwnd,分别设置到发送引擎中就可以解决发送速度和数据量(窗口大小)的问题。

4. BBR算法优缺点

  1. 优点:BBR相对TCP的优点包括抗丢包能力强、延迟低、抢占能力强和平稳发送。在BBR算法之前的TCP Cubic,拥塞控制算法并没有平稳发送的说法,而只是判断发送与否的问题,BBR算法出现之后,会平稳的发送数据,不会突发流量冲击。BBR相对TCP Cubic的优点包括抗丢包能力强、延迟低、抢占能力强和平稳发送。
  2. 缺点:
    1. 收敛速度慢/高于一定丢包率吞吐量下跌;
    2. 深队列竞争不过Cubic;
    3. 在算法公平性方面,BBR在与Reno竞争时可以占用90%以上的带宽,但在与多个BBR流竞争时,RTT高的流占用带宽更高,其中也暴露的漏洞是如果想占用更高带宽,可以人为调高RTT的值,这些并不是BBR算法的设计初衷。在抗抖动能力方面,RTT的抖动使BBR无法得到准确的BDP,探测带宽很有可能低于可用带宽。

5.总结

总结来看,BBR算法有很多优点的同时也有很多缺点,目前没有一个算法能够适用所有的网络状态,针对不同的网络状态选择不同的拥塞算法似乎是一个可行的办法,但基于当前拥塞算法,融合其他算法的优点也是可以实现的,在此希望能够涌现出更多有兴趣的人为实时音视频领域的拥塞算法出力。

知乎:https://zhuanlan.zhihu.com/p/522223642

相关推荐
JosieBook7 小时前
【网络工程】查看自己电脑网络IP,检查网络是否连通
服务器·网络·tcp/ip
inter_peng8 小时前
[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
tcp/ip·docker·eureka
Lws9 小时前
CS144 lab0(个人理解)
网络协议
九州ip动态11 小时前
模拟器多开限制ip,如何设置单窗口单ip,每个窗口ip不同
tcp/ip·游戏·媒体
MapleLea1f12 小时前
26届JAVA 学习日记——Day14
java·开发语言·学习·tcp/ip·程序人生·学习方法
C++忠实粉丝13 小时前
计算机网络socket编程(2)_UDP网络编程实现网络字典
linux·网络·c++·网络协议·计算机网络·udp
添砖java_85713 小时前
UDP数据报套接字编程
网络·网络协议·udp
hgdlip14 小时前
电脑的ip地址怎么换掉:全面指南
tcp/ip·智能路由器·电脑
VVVVWeiYee15 小时前
Mesh路由组网
运维·网络·智能路由器·信息与通信
lxkj_202415 小时前
修改ffmpeg实现https-flv内容加密
网络协议·https·ffmpeg