• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sean2020
V2EX  ›  程序员

用 Rust 重写 kcptun,完全线上兼容 kcptun-go

  •  
  •   sean2020 · Jul 30 · 2058 views

    🚀 kcptun-rs: 基于 Rust 重构的 KCP 加速隧道

    这是一个使用 Rust 完整重构的 kcptun ( https://github.com/xtaci/kcptun) 兼容实现。不仅做到完全兼容原版 Go 协议与算法,同时在二进制体积控制与系统底层 IO 上优化。

    🔗 项目地址: https://github.com/xsean2020/kcptun-rs


    ✨ 核心亮点

    1. 100% 协议与算法双向兼容( Drop-in Replacement )
    • 无缝替换:Rust 客户端 / 服务端可与现有的 Go 版本 kcptun 双向互通,无需修改已有拓扑或配置文件。
    • 全加密算法覆盖:完整支持原版包含的 14 种加密算法( AES, Blowfish, Twofish, Cast5, 3DES, Salsa20, SM4, XOR 等)以及 AES-GCM 。
    • 68 项 E2E 互通测试:通过严格的端到端集成测试,确保包含 SMUX 多路复用、Snappy 压缩在内的每一层协议报文与 Go 版本完全对齐。
    1. 极致的二进制体积控制
    • 超小身材:通过精细化剥离重型依赖、定制编译配置与优化静态链接,编译产物体积控制极其优秀,极度适合部署在路由器、OpenWrt 及各类资源受限的嵌入式设备中。
    1. 深入底层的零拷贝与批量 IO
    • SMUX 刷新逻辑重构:将 SMUX 刷新循环拆分为 4 阶段,大幅降低锁竞争与 CPU 轮询消耗。
    • 管道零拷贝与批量系统调用:KCP 输出管道做到全链路 Zero-Copy ,结合 sendmmsg / recvmmsg 批量网络 IO ,显著降低内核态/用户态切换开销。

    🛠️ 跨语言完全兼容踩坑记录

    在做到完全无缝兼容 Go 版的过程中,我也解决了一系列隐蔽的跨语言协议细节:

    1. Snappy 校验和差异:Go 与 Rust 生态中 Snappy 对 CRC32 / CRC32C 的默认处理存在细微差异(早期 Go 端会静默吃掉数据),经过逐层报文分析后实现了严格对齐。
    2. Twofish 算法逻辑对齐:修复了 256-bit 密钥下缺失第 5 层 S-box 的问题,确保密文输出与 Go x/crypto 算出的结果完全一致。
    3. Blowfish 密钥调度优化:修正了早期版本中在处理每块加密时重复调度密钥的问题。

    欢迎有嵌入式加速需求、路由器部署场景或对 Rust 网络数据平面感兴趣的朋友前去体验、提 Issue 或点个 ⭐ Star !

    👉 https://github.com/xsean2020/kcptun-rs

    20 replies    2026-07-31 22:01:14 +08:00
    Tsing2
        1
    Tsing2  
       Jul 30
    在全民 AI 浮躁的时代,能沉下心来搞基础建设的课题,实属难得
    kongkx
        2
    kongkx  
       Jul 30 via iPhone
    kcptun 不是已经 404 了吗
    RobinHuuu
        3
    RobinHuuu  
       Jul 30 via Android
    UDP 在翻墙上面用处真不大
    HeyWeGo
        4
    HeyWeGo  
       Jul 30
    年初的时候笔记本想下载 kcp 套着过墙来着,发现 404 了,真是及时雨。感谢
    PyCode
        5
    PyCode  
       Jul 30
    可以分享下重写的开发过程吗?对这个感兴趣
    sean2020
        6
    sean2020  
    OP
       Jul 30
    主要是 ai 移植,设置目标,核心在于验收,让 ai 不停 loop
    dxatgp02
        7
    dxatgp02  
       Jul 30
    趁楼主没有拉库跑路马上 fork 一份,打游戏没有这感觉枪都在抖。
    dxatgp02
        8
    dxatgp02  
       Jul 30
    cargo build -r
    启动报错
    Error: invalid value: integer `-1`, expected u64 at line 22 column 21
    linux-arm64 架构
    服务端还是 g ,客户端用 rs
    sean2020
        9
    sean2020  
    OP
       Jul 30
    @dxatgp02 make linux
    sean2020
        10
    sean2020  
    OP
       Jul 30   ❤️ 1
    @dxatgp02 等下晚点更新一下 linux 下有 bug, arm 和 macos 正常
    sean2020
        11
    sean2020  
    OP
       Jul 30
    @dxatgp02 非常感谢你的反馈,上面问题已经修复, 为了方便上传了 vendor ,请重新执行 make vendor && make release 编译, 还有啥问题非常欢迎提出
    capric
        12
    capric  
       Jul 31
    支持 windows 吗,建议用 mise.toml 替代 makefile ,跨平台支持更好
    sean2020
        13
    sean2020  
    OP
       Jul 31
    @capric 理论上因该支持, 等下个版本我在到 windows 上试试, 目前感觉有些设计不合理在重构
    dxatgp02
        14
    dxatgp02  
       Jul 31
    @sean2020 Error: invalid value: integer `-1`, expected u64 at line 22 column 21
    用了最新代码还是有问题,我看了一下代码,默认配置与配置文件一起时,是不是应该用配置文件的参数。但代码好像是依然用默认配置。
    cli.param_xxx.or(cfg.param_xxx);
    sean2020
        15
    sean2020  
    OP
       Jul 31
    @dxatgp02 项目中 删除 vendor 和 .cargo 目录,执行 make release 因该可以了,我在 centos7 上测试编译通过了,这部分我后期优化一下, 当初想着把库保存下来防止依赖库找不到了,忘记考虑跨平台问题了 这个是之前交叉编译用了 musl ,它和 gnu 不兼容导致的
    dxatgp02
        16
    dxatgp02  
       Jul 31
    @sean2020 理解一开始主要动机还是想自己用,我用的是 pi4b4g 的 arm64 。删除了 vendor 与.cargo 又运行过 cargo clean 清理之前编译文件,mark release 后用配置文件启动就上面报的错。
    sean2020
        17
    sean2020  
    OP
       Jul 31
    @dxatgp02 我理解错了我以为是编译错误,你的配置文件是啥?我忘记测试配置文件启动了 我用的命令行参数
    sean2020
        18
    sean2020  
    OP
       Jul 31
    @dxatgp02 感谢反馈默认参数没对齐,autoexpire ,scavengettl 参数没对齐, 关闭默认值是 0 ,后面修正一下全部参数对齐, 目前感觉 kcp-rs 包设计不合理正在优化,想把它做成一个可独立运行的包, 像直接用 tcp 一样的方式,修正可能有点慢
    iWill
        19
    iWill  
       18h 42m ago
    0.1.0 版本, 客户端尝试 填入服务器域名连接,出现错误提示。go 版本无此问题

    [2026-07-31T13:14:29Z INFO kcptun_client] key derived: crypt=aes-128, key=bd..26
    Error: invalid socket address syntax
    sean2020
        20
    sean2020  
    OP
       17h 58m ago
    @iWill 不好意思 这个问题还没处理,目前只支持 ip,还没接入域名 , -l ":8080" 这种方式也不支持必须 ip:port , 等我重构完 在处理这个问题, 当初按 go 方式实现感觉有些地方不合理,现在正在重构中,不好意思哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2946 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 07:59 · PVG 15:59 · LAX 00:59 · JFK 03:59
    ♥ Do have faith in what you're doing.