TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是Google推出的一种拥塞控制算法,旨在优化TCP连接的带宽利用率和减小网络延迟。BBR的设计目标是通过更智能的方式监测网络状况,从而更有效地调整数据包的发送速率,提高网络吞吐量,减小传输时延。

以下是对TCP BBR的详细解释:

1. 背景

在传统的TCP拥塞控制算法中,例如TCP Reno,拥塞窗口的调整主要依赖于丢包的事件。当网络发生拥塞时,出现丢包,TCP Reno会将拥塞窗口减半,然后通过慢启动和拥塞避免逐步增大窗口。然而,当网络丢包率较低时,这种方式可能过于保守,无法充分利用网络带宽。

TCP BBR的出现就是为了解决这一问题,它通过更精准的拥塞信号来动态调整拥塞窗口,使得TCP连接能够更加高效地利用可用带宽。

2. 工作原理

TCP BBR的工作原理基于两个主要的观察:

2.1 带宽(Bandwidth)的观察

BBR通过主动测量网络路径上的带宽,即实时测量数据包在发送端到接收端的传输速率。这与传统算法依赖于丢包事件不同。通过这种方式,BBR能够更准确地了解网络的状况,从而更精确地调整发送速率。

2.2 时延(Round-trip Time)的观察

BBR还观察了网络的往返时延(RTT),即数据包从发送端发送到接收端再返回发送端的时间。BBR通过根据时延的变化来判断网络的拥塞程度,并相应地调整拥塞窗口。

3. BBR的关键机制

3.1 BBR的四个主要阶段

3.1.1 启动(Startup)

在启动阶段,BBR会通过不断增大发送速率来快速填充网络路径。这个阶段持续时间较短,旨在尽快达到网络的容量。

3.1.2 拥塞避免(Drain)

一旦带宽接近容量,BBR会切换到拥塞避免阶段,通过逐渐增加发送速率,使之与网络的带宽保持匹配。

3.1.3 搜索拥塞(ProbeBW)

在拥塞避免阶段,BBR会定期切换到搜索拥塞阶段,主动探测网络的带宽。这是为了适应网络状况的变化,以及更快地发现带宽的变化。

3.1.4 恢复(Recovery)

当发生数据包丢失时,BBR会进入恢复阶段,采用类似于TCP Cubic的方式来减小拥塞窗口,并且在减小窗口后迅速进入搜索拥塞阶段以快速适应新的网络容量。

3.2 BBR的参数

BBR算法中有一些重要的参数:

3.2.1 Pacing Gain

Pacing Gain控制数据包的发送速率。通过调整Pacing Gain,BBR可以更好地适应网络的变化,减小发送速率以适应网络状况的波动。

3.2.2 Cwnd Gain

Cwnd Gain控制拥塞窗口的增长速率。与Pacing Gain一样,调整Cwnd Gain有助于适应网络容量的变化,更快地找到适应网络的拥塞窗口。

4. BBR的优势

4.1 更高的带宽利用率

由于BBR能够更精确地测量网络的带宽,相对于传统的基于丢包的拥塞控制算法,BBR能够更高效地利用可用的带宽。

4.2 更低的时延

通过实时观察网络的时延变化,BBR可以更快速地响应网络状况的变化,从而减小传输时延。

4.3 更好的稳定性

BBR通过不断地适应网络的容量,具有更好的网络稳定性。在网络条件波动较大的情况下,BBR能够更快地调整发送速率,避免数据包的丢失。

5. 使用BBR的方法

5.1 Linux内核支持

BBR已经被合并到Linux内核中,因此在使用Linux系统的服务器上,可以直接启用BBR。

5.2 启用BBR

在Linux系统中,可以通过修改内核参数来启用BBR。以下是一些关键参数:

bash
sysctl net.core.default_qdisc=fq
sysctl net.ipv4.tcp_congestion_control=bbr

通过上述命令,可以设置默认的队列规则为fq,并启用TCP拥塞控制算法为bbr

结论

TCP BBR作为一种先进的拥塞控制算法,通过对网络带宽和时延进行更为细致的观察,实现了更高的带宽利用率、更低的时延和更好的稳定性。在需要优化TCP连接性能的场景下,启用BBR可以提供更好的用户体验和网络效果。