TCP拥塞控制及BBR加速
这边先提一嘴TCP的重传机制,总共分四种:
- 超时重传
- 快速重传(三次ACK)
- SACK
- D-SACK(Selective Acknowledgment)
再提一嘴流量控制,流量控制这个概念是忽略掉网络拥塞,单纯讨论系统层面处理的能力。
服务器繁忙时操作系统的缓冲区可能会缩小,亦或者窗口关闭。
窗口关闭时,接收方会对发送方回复接收窗口为零的报文。
糊涂窗口综合症是指接收方腾出了很小的接收窗口,然后就发送给了发送方剩余窗口大小,发送方随机发送了一个很小的包。
接收方得满足「不通告小窗口给发送方」+ 发送方开启 Nagle 算法,才能避免糊涂窗口综合症
1.拥塞控制
Cwnd 拥塞窗口,Swnd发送窗口,ssthresh满启动门限。
拥塞控制主要是四个算法:
- 慢启动
- 当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会乘以2。指数增长。
- 拥塞避免
- 当拥塞窗口增长到了,慢启动门限时就会变成线性增长每当收到一个 ACK 时,cwnd 增加 1/cwnd。
- 拥塞发生
- 当拥塞发生时会有两种情况:超时重传,快速重传。
- 超时重传:cwnd
重置为
初始值假设为1,ssthresh设为
cwnd/2。也就是要重新慢启动并且慢启动门线变成超时重传时拥塞窗口的二分一。- 可以使用
ss -nli | grep cwnd
查看初始值,我看了一眼都是10(环境树莓派)。
- 可以使用
- 快速恢复
- 快速重传:在恢复之前设置
cwnd = cwnd/2 ssthresh = cwnd
,随后开始快速恢复cwnd = ssthresh + 3
,随后每收到一次ACK,swnd都加一,收到新数据的ACK后cwnd 设置为第一步中的 ssthresh。至此在此回到拥塞避免状态。 - 如此慢启动门限会下降,并且也快速重传了丢失的包。
- 快速重传:在恢复之前设置
2.BBR
有点难以理解,先挖个坑在这,过两天再研究。
控制时机提前,不再等到丢包时再进行暴力限制,而是控制稳定的发包速度,尽量榨干带宽,却又不让报文在中间设备的缓存队列上累积。
为了得到稳定的发包速度,BBR 使用 TCP Pacing 进行发包控制,因此 BBR 的实现也需要底层支持 TCP Pacing; 为了榨干带宽,BBR 会周期性地去探测是否链路条件变好了,如果是,则加大发送速率; 为了不让报文在中间设备的缓存队列上累积,BBR 会周期性地探测链路的最小 RTT,并使用该最小 RTT 计算发包速率。
往返时间(RTT) 是网络性能的一个关键指标,表示信号从发送方传输到接收方并再次返回所需的总时间。
TCP拥塞控制及BBR加速
https://steammilk.com/2025/01/08/2025-all/tcp_bbr/