高延迟链路下的 TCP 参数笔记
家里和海外服务器之间延迟一百多毫秒,用 scp 传大文件时速度总是上不去。查了一圈,大部分原因出在默认缓冲区太小。
带宽时延积
单条 TCP 连接能跑到的速度,大致受限于 窗口大小 / RTT。RTT 150ms、目标 100Mbps,需要的窗口大约是 100Mbps × 0.15s ≈ 1.9MB。默认的 tcp_rmem 上限对高延迟链路来说往往不够。
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_rmem = 4096 131072 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
net.ipv4.tcp_slow_start_after_idle = 0
几个参数
bbr 不以丢包作为拥塞信号,在有少量随机丢包的长距离链路上比 cubic 稳得多;fq 负责按流做 pacing。tcp_slow_start_after_idle 关掉后,长连接空闲一会儿再发数据不会重新慢启动。
改完之后单线程从十几兆提升到了接近线路上限。不过要记住:参数只能让连接“用满”带宽,带宽本身是多少,还是由线路决定的。