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

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

  •  
  •   sean2020 · 10h 19m ago · 1294 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

    11 replies    2026-07-30 21:11:01 +08:00
    Tsing2
        1
    Tsing2  
       10h 11m ago
    在全民 AI 浮躁的时代,能沉下心来搞基础建设的课题,实属难得
    kongkx
        2
    kongkx  
       9h 15m ago via iPhone
    kcptun 不是已经 404 了吗
    RobinHuuu
        3
    RobinHuuu  
       9h 9m ago via Android
    UDP 在翻墙上面用处真不大
    HeyWeGo
        4
    HeyWeGo  
       9h 0m ago
    年初的时候笔记本想下载 kcp 套着过墙来着,发现 404 了,真是及时雨。感谢
    PyCode
        5
    PyCode  
       7h 50m ago
    可以分享下重写的开发过程吗?对这个感兴趣
    sean2020
        6
    sean2020  
    OP
       7h 29m ago
    主要是 ai 移植,设置目标,核心在于验收,让 ai 不停 loop
    dxatgp02
        7
    dxatgp02  
       4h 49m ago
    趁楼主没有拉库跑路马上 fork 一份,打游戏没有这感觉枪都在抖。
    dxatgp02
        8
    dxatgp02  
       4h 23m ago
    cargo build -r
    启动报错
    Error: invalid value: integer `-1`, expected u64 at line 22 column 21
    linux-arm64 架构
    服务端还是 g ,客户端用 rs
    sean2020
        9
    sean2020  
    OP
       3h 57m ago
    @dxatgp02 make linux
    sean2020
        10
    sean2020  
    OP
       3h 56m ago   ❤️ 1
    @dxatgp02 等下晚点更新一下 linux 下有 bug, arm 和 macos 正常
    sean2020
        11
    sean2020  
    OP
       21 mins ago
    @dxatgp02 非常感谢你的反馈,上面问题已经修复, 为了方便上传了 vendor ,请重新执行 make vendor && make release 编译, 还有啥问题非常欢迎提出
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2995 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:32 · PVG 21:32 · LAX 06:32 · JFK 09:32
    ♥ Do have faith in what you're doing.