从不同的角度去理解 BBR 拥塞控制算法(基于linux5.2内核)
产用pacing rate机制,根据最大可发送带宽(BDP)来平缓发送数据
术语
你可能需要关心的地方
- 还没有 rtt 采样时,bdp 为 TCP_INIT_CWND = 10
- 根据即时带宽和增益系数来算 pacing rate 和 cwnd
- inflight 其实就是要发送的 cwnd
- pacing rate 对应的 interval_us 其实就是发送和接收ACK的时间差(作为一个窗口的单独管道阶段)
状态机
BBR有哪些可以优化的地方?
- BBR 在 PROBE_BW 状态下每次固定增加2个cwnd不够激进,根据业务不同可以适当增加
- 通过调整 PROBE_RTT 的幅度来降低尾部延迟, cwnd = 0.75*BDP 代替 cwnd=4
- 在丢包率达到 10% 以上的时候,BBR的拐点就出现了,丢包率达到 15%的时候就和 CUBIC 没啥区别了,这时可以执行较激进的拥塞控制策略来保证吞吐量
谈一谈 RENO/CUBIC、BBR、KCP
RENO/CUBIC,一个自我牺牲的拥塞控制算法
- 一个数据包的丢失带来的窗口缩小需要很长时间来恢复,这样,带宽利率用率不可能很高,且随着网络的链路带宽不断提升,这种弊端越来越明显,适用于没有丢包和rtt较低的场景
BBR,一个理想化通用拥塞控制算法
- 产用pacing rate机制,根据最大可发送带宽(BDP)来平缓发送数据,适用于TCP/IP协议栈和通用设备,适用于有少量丢包的场景,丢包率 < 10%,并不适用于弱网的环境
KCP,一个过于激进的拥塞控制算法
- 以牺牲少量带宽换取更低的延时和更高的吞吐量,完全取决于接收端的接收能力,如果丢包率很高,接收端窗口设的过大可能引起重传风暴,适用于海外和弱网环境
BBR拥塞控制代码并不多,大概1000行左右
https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git/tree/net/ipv4/tcp_bbr.c