受不了洲际网络环境写了LotSpeed 加速模块

我用内核模块重写了 TCP 拥塞控制,重传率降了 90%
作者:uk0 | 2026-03-23
跑跨洋链路的时候,你有没有遇到过这种情况:带宽明明有 1Gbps,实际跑起来只用了 60%,重传率飙到 3%,RTT 抖得像心电图。CUBIC 在这种高延迟、高丢包的场景下,基本就是躺平状态。
我折腾了几个天,写了一个叫 LotSpeed 的内核模块。不需要重新编译内核,insmod 一下就能用。核心思路是把 BBR v3、FAST TCP 和 Hybla 三种算法的优势揉到一起,再配一个智能队列调度器 NeoQ。目前测试下来,重传率从 1-3% 降到了 0.3% 以下,带宽利用率拉到了 95% 以上。
LotSpeed 是什么
一句话概括:LotSpeed 是一个可加载的 Linux 内核模块,实现了混合式 TCP 拥塞控制算法。它以 Netfilter hook 的方式工作,通过修改出站 ACK 包中的 rwnd(接收窗口)字段,间接控制对端的发送速率。
核心能力:
混合算法引擎 — BBR v3 的带宽估计 + FAST TCP 的延迟控制 + Hybla 的高延迟补偿
NeoQ 队列调度 — 四级优先级(Express/High/Normal/Bulk)+ CoDel AQM + 流状态追踪
自动调优 — 11 种预设配置,实时分析网络状态自动切换
零侵入 — 标准 .ko 模块,insmod 加载,rmmod 卸载,不碰内核源码
[插图:LotSpeed 系统架构图:用户空间(自动调优脚本)↔ /proc 接口 ↔ 内核空间(lotspeed.ko + sch_neoq.ko)↔ TCP/IP 协议栈]
为什么 CUBIC 不够用
TCP 的发送窗口公式很简单:effective_window = min(cwnd, rwnd)。CUBIC 通过一个三次函数来调整 cwnd,在低延迟局域网里表现不错。但一旦 RTT 超过 100ms,问题就来了。
CUBIC 的窗口增长依赖时间而非 RTT,高延迟链路上增长太慢。丢包后直接砍半窗口,恢复又要很久。结果就是:带宽利用率 70-80%,收敛时间 10+ 个 RTT,重传率 1-3%。
BBR 解决了一部分问题,但单独用 BBR 也有坑:它对丢包不够敏感,在高丢包环境下容易过于激进。FAST TCP 延迟控制精准,但对带宽估计不够好。Hybla 专为高延迟设计,但在低延迟场景下反而过于激进。
我的思路很简单:既然每种算法都有自己的长板,那就把它们的长板拼起来。
核心设计:三合一状态机
LotSpeed 的核心是一个四状态的状态机,借鉴了 BBR v3 的设计:
STARTUP → 快速探测带宽上限,用 Hybla 的 RTT² 缩放加速收敛
DRAIN → 排空队列中的积压数据,降低排队延迟
PROBE_BW → 稳态运行,4 个子阶段(CRUISE/REFILL/PROBE_UP/PROBE_DOWN)周期性探测
PROBE_RTT → 定期降窗测量最小 RTT,保持延迟基线准确
在 PROBE_BW 阶段,FAST TCP 的延迟控制发挥作用。它通过 alpha 参数控制目标队列长度:当 RTT 开始膨胀,说明队列在积压,立刻收缩窗口;当 RTT 接近最小值,说明还有余量,可以继续加。
[插图:状态机流转图:STARTUP → DRAIN → PROBE_BW(4 子阶段循环)→ PROBE_RTT → 回到 PROBE_BW]
Brave Mode:防抖保护
实际网络中 RTT 经常出现短暂抖动(比如路由切换、突发流量)。如果每次抖动都触发窗口调整,反而会造成不必要的吞吐量波动。
Brave Mode 的做法是:检测到 RTT 突然飙升时,冻结当前窗口一段时间(默认 200ms),等抖动过去再恢复正常控制。这个简单的机制在实测中减少了约 15% 的不必要窗口调整。
History Cache:连接记忆
LotSpeed 会为每个目标 IP 维护一个历史缓存(TTL 20 分钟,最多 8192 条)。当同一个目标的新连接建立时,直接用历史数据初始化参数,跳过 STARTUP 阶段的盲目探测。这让重复连接的收敛时间从 5+ RTT 降到了接近 1 RTT。
NeoQ:不只是拥塞控制
光有好的拥塞控制算法还不够,发送端的队列管理同样关键。NeoQ 是我配套写的一个 qdisc(队列调度器),解决的是「发什么先、丢什么」的问题。
它把数据包分成四个优先级:Express(ACK、SYN 等控制包)> High(HTTP/HTTPS 流量)> Normal(普通数据)> Bulk(大文件传输)。每个队列独立运行 CoDel AQM,根据排队延迟智能丢包,而不是等队列满了才丢。
NeoQ 还会追踪每条流的状态(NEW/STARTUP/STEADY/RECOVERY/DRAIN),对重传包做特殊处理——检测到重传时立刻提升优先级,加速恢复。
自动调优:11 种预设 + 实时切换
不同网络环境需要不同的参数。LotSpeed 自带一个 Bash 守护进程 lotspeed-autotune.sh,它会持续监测 RTT、丢包率和 ECN 标记,自动在 11 种预设之间切换:从保守模式(conservative)到激进模式(aggressive),从数据中心(datacenter)到卫星链路(satellite),覆盖了主流场景。
你也可以手动指定预设,或者通过 /proc/lotspeed/ 接口实时调整 30+ 个 sysctl 参数。
实测效果
TCP 发送窗口 = min(cwnd, rwnd)。通过控制 rwnd,我们间接控制了对端的发送速率——不需要对端做任何修改。
性能对比(vs CUBIC 基线):
┌──────────────┬──────────────┬──────────────┐
│指标│CUBIC 基线│LotSpeed│
├──────────────┼──────────────┼──────────────┤
│重传率│1-3%│< 0.3%│
│ 带宽利用率│70-80%│> 95%│
│平均 RTT│1.5x min│< 1.15x min │
│收敛时间│10+ RTT│< 5 RTT│
└──────────────┴──────────────┴──────────────┘
重传率降了一个数量级,带宽利用率接近理论上限。对于跨洋链路和卫星链路这种高延迟场景,改善尤其明显。
三步上手
LotSpeed 的使用非常简单,不需要重新编译内核:
1. 编译
make clean && make
2. 加载模块
sudo insmod lotspeed.ko
3. 启动自动调优
sudo ./lotspeed-autotune.sh --daemon
加载后通过 cat /proc/lotspeed/stats 查看实时统计,cat /proc/lotspeed/conns 查看活跃连接。需要 Linux 6.18.2+ 内核(推荐 XanMod 或 BBRv3 patch 版本)。
写在最后
LotSpeed 目前已经完成了核心功能开发(Phase 1-3),正在进行生产环境的性能测试和 A/B 对比。代码完全开源,欢迎感兴趣的同学来看看。
GitHub:https://github.com/uk0/lotspeed
如果你也在做网络优化相关的工作,或者对 TCP 拥塞控制有自己的想法,欢迎 Star、提 Issue、或者直接 PR。下一步我计划加入 DKMS 支持和 systemd 集成,让部署更丝滑。
好的拥塞控制不是让你发得更快,而是让你在该快的时候快、该慢的时候慢——恰到好处。