BBRplus能和Shadowsocks、kcptun一起用吗:TCP拥塞控制和KCP分别管哪一段
搜"ss bbrplus""bbrplus kcptun"的人,多半在想一个问题:我已经装了 Shadowsocks,又听说 kcptun 能加速、BBRplus 也能加速,能不能叠在一起用?这篇依据 kcptun 和 KCP 的 README,把这几样东西各自管哪一段讲清楚。结论先说:它们不是叠加关系,而是管不同的段。
先说明依据:kcptun 的官方仓库 github.com/xtaci/kcptun 我这里直接读不到,所以读的是 GitHub 上的镜像(fork)里的 README,里面的帮助输出版本是 20251124;另外读了 KCP 协议(skywind3000/kcp)的 README 和 shadowsocks-rust 的 README。BBR 部分用的是我之前读过的内核 tcp_bbr.c 和 BBRplus 补丁。我没有搭过 kcptun,也没有测速过,下面凡是推论的地方都会注明。
先看 kcptun 是什么,数据怎么走
kcptun 的 README 对自己的定位,是基于 KCP 协议的隧道,带多路复用(SMUX)、纠错(FEC,用的是 Reed-Solomon 码)和加密。README 的 QuickStart 里给了一个转发 8388 端口的例子,并把数据流画出来了:
1 | 应用 -> KCP 客户端(8388/tcp) -> KCP 服务端(4000/udp) -> 目标服务器(8388/tcp) |
也就是说,一条连接被拆成了三段:
| 段 | 协议 | 在哪里 |
|---|---|---|
| 应用到 kcptun 客户端 | TCP | 一般在你自己的设备上,本机内部 |
| kcptun 客户端到 kcptun 服务端 | UDP(KCP) | 跨公网 |
| kcptun 服务端到目标服务器 | TCP | 如果目标就在同一台 VPS 上,就是本机内部 |
README 示例转发的是一个 TCP 端口,我读到的 README 里没有提到 Shadowsocks,端口号 8388 只是例子里的数字(它恰好也是 Shadowsocks 常用的默认端口)。
KCP 是什么
KCP 来自另一个项目(skywind3000/kcp)。它的 README 对自己的说明是:一个高性能的可靠传输协议,设计目标是比传统 TCP 显著降低延迟,能把平均延迟降低 30% 到 40%,最大延迟最多低到约三分之一,代价是多花 10% 到 20% 的带宽。这是 KCP 作者自己的说法,不是我测的。
README 还提到:KCP 默认遵循和 TCP 类似的公平流控,会考虑发送缓冲、接收缓冲、拥塞控制和慢启动;但对延迟敏感的小数据,可以配置成绕开拥塞控制和慢启动,只靠缓冲区大小来限制。kcptun 的 FAQ 里对应的写法是手动模式:
1 | -mode manual -nodelay 1 -interval 20 -resend 2 -nc 1 |
README 同时警告,改这些底层参数之前要完全理解每一项,否则可能让性能或稳定性变差。
BBR 和 BBRplus 管的是哪一段
BBR 和 BBRplus 是 Linux 内核里的 TCP 拥塞控制算法,决定的是内核里 TCP 连接"发多快"(BBRplus 的来历见 BBRplus是什么)。它们只作用在TCP 连接上,并且作用在发送方一侧。
把这个和上面的数据流放在一起看:
- 跨公网的那一段是 UDP(KCP),不是 TCP,所以不归内核的 TCP 拥塞控制管,由 KCP 自己的重传、窗口、拥塞控制(或被
-nc关掉)和 FEC 负责; - 内核的 BBR 或 BBRplus 只会管那两段 TCP,而这两段通常在本机内部,不是瓶颈所在。
所以按数据流推:服务器上开了 BBRplus,也不会改变 kcptun 那一段跨公网的行为。这是我根据 README 里的数据流得出的推论,没有实测。
几种方案对比
| 方案 | 跨公网的那一段 | 拥塞控制由谁管 | 内核 BBR 或 BBRplus 有用吗 |
|---|---|---|---|
| Shadowsocks 直连(TCP) | TCP | 内核 | 有,作用在服务器发给客户端的方向(发送方在服务器) |
| Shadowsocks 的 UDP 转发 | UDP | 不是 TCP 拥塞控制 | 没有直接作用 |
| Shadowsocks 加 kcptun | UDP(KCP) | KCP 自己 | 对跨公网那段没有直接作用 |
| Hysteria2 | UDP(QUIC) | Hysteria 自己 | 没有直接作用 |
最后一行补充一下:站内 Hysteria2速度慢怎么办 里讲过,Hysteria2 客户端写了 bandwidth 就启用 Brutal,不写则用它自己的 BBR,那是 Hysteria 自己 QUIC 实现里带的拥塞控制(QUIC 跑在用户态程序里),和内核里的 tcp_bbr 模块不是一回事。
上传方向要留意一点:TCP 的拥塞控制在发送方生效,所以客户端上传时起作用的是客户端系统的拥塞控制,服务器上的设置管不到。这是 TCP 的一般原理。
Shadowsocks 这边是怎么回事
shadowsocks-rust 的 README 显示它支持 TCP 和 UDP 转发(配置里有 mode: tcp_and_udp),也支持 SIP003 插件(示例里写的是 --plugin "v2ray-plugin")。我读到的 README 没有提到 kcptun。常见的做法是把 kcptun 当成另一个独立的进程,放在 Shadowsocks 前面,让 kcptun 服务端把流量转给 Shadowsocks 的 TCP 端口。
按 README 里的命令格式套用,大致是这样(我没有实际跑过,端口和密码换成自己的):
1 | # 服务端:把 UDP 4000 收到的流量转给本机的 Shadowsocks 端口 |
README 特别说明,这几项参数必须在客户端和服务端完全一致,否则连不上:--key 和 --crypt、--QPP 和 --QPPCount、--nocomp、--smuxver。
注意,这样套出来之后,Shadowsocks 客户端要把服务器地址改成指向本地的 kcptun 客户端端口。按 README 的示例,kcptun 转发的是 TCP 端口,Shadowsocks 的 UDP 转发不会自动走这条隧道,这一点 README 没有展开,我没有验证。
用 kcptun 要考虑的几点(都来自 README)
- 状态:我读到的镜像 README 顶部有一条项目状态提示:这个项目已归档、不再维护,上游不提供二进制,仅供研究和参考。搜索结果也给出了同样的说法。官方仓库我这里读不到,请你以 github.com/xtaci/kcptun 首页的最新说明为准。新部署前要把这一点考虑进去;
- 带宽开销:FEC 默认是 10 个数据包配 3 个冗余包,README 给的开销公式是
parityshard / datashard,也就是默认多占约 30% 的带宽;线路好的话可以调小-parityshard,设成 0 就关掉 FEC; - CPU:Reed-Solomon 纠错比较吃 CPU,README 说低端 ARM 设备可能有性能问题,建议关掉 FEC(
--datashard 0 --parityshard 0)并用--crypt salsa20; - 系统设置:README 建议提高打开文件数限制(
ulimit -n 65535),并给了一组改善 UDP 处理的 sysctl 参数,比如net.core.rmem_max和wmem_max调到 26214400,慢速处理器上还要把-sockbuf调大。这和 Hysteria2 调大 UDP 缓冲区是同一类问题,见 Hysteria2速度慢怎么办; - UDP 的现实问题:UDP 流量在一些网络里可能被限速或封端口,判断方法可以参考 Hysteria2被封还是被QoS限速;
- 免责声明:README 开头有免责声明,要求使用者遵守当地法律法规,也说明这是通用的网络传输加速工具。
那想"加速 Shadowsocks"该怎么做
按这篇的逻辑,思路是:
- 如果走的是 TCP 直连,先开内核的 BBR,见 x-ui、3x-ui和Xray怎么开BBR 里讲的内核层面开启和验证方法(对 Shadowsocks 同样适用,因为是内核设置);要用 BBRplus 就要换内核,先看 BBRplus是什么,它是实验性方案,不保证更快;
- 开了还慢,别在 BBR 上死磕,先判断是不是线路本身的问题,见 为什么开了BBR,网速却感觉一点没提升 和 VPS网络测速用什么工具最好;
- 想换一种 UDP 方案,现在更常见的做法是直接用自带 UDP 传输的协议,比如 Hysteria2,对比见 Hysteria2节点的优点和缺点是什么;
- 如果一定要用 Shadowsocks,注意它的抗封锁问题,见 3x-ui配置Shadowsocks节点及抗封锁分析 和 S-UI配置Shadowsocks。
小结
- BBR 和 BBRplus 是内核的 TCP 拥塞控制,只管 TCP 连接,并且在发送方生效;
- Shadowsocks 走 TCP 时,服务器开 BBR 或 BBRplus 对服务器发出的流量有作用,但能不能提速要看线路;
- kcptun 把跨公网的一段换成了 UDP 上的 KCP,那一段不归内核 TCP 拥塞控制管,所以它们不是叠加,而是管不同的段;
- kcptun 有 FEC 带宽开销、CPU 开销和 UDP 缓冲区要求,我读到的镜像 README 提示项目已归档、不再维护;
- 本文依据 README 和数据流做的推论,没有搭建 kcptun,也没有测速,请以实际测试为准。