剪藏#你起来我讲两句#剪藏

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

2026 年 4 月 3 日1 分钟
分享Twitter / XTelegram微博

我用内核模块重写了 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 集成,让部署更丝滑。

好的拥塞控制不是让你发得更快,而是让你在该快的时候快、该慢的时候慢——恰到好处。

原文地址: https://mp.weixin.qq.com/s?__biz=Mzg2NTE0MzkxMA==&mid=2247483703&idx=1&sn=27478edc2cb30b2d10371db088da11a4&chksm=cf617c457385b410d20251954999c2e1e740677c3a4077fa760920042b28cbbad839a6d59374&mpshare=1&scene=1&srcid=0403Ikmpk25KAkI8aDFhHB2M&sharer_shareinfo=68f70353a9fbc0dde767772dc7d99c19&sharer_shareinfo_first=68f70353a9fbc0dde767772dc7d99c19#rd

相关文章