🚀 KCP协议的纯Rust实现 - 快速可靠的ARQ协议,比TCP降低30%-40%延迟
📖 简介
kcp-ovo 是一个快速可靠的ARQ(Automatic Repeat-reQuest)协议的纯Rust实现。KCP是一个低延迟、高可靠性的传输层协议,相比传统TCP可以降低30%-40%的延迟,最大RTT减少三倍。
本项目完整复刻了skywind3000/kcp的原版C代码,使用纯Rust重写,充分利用Rust的类型安全和内存安全特性,同时提供类似TCP的Stream API简化使用。
✨ 特性
核心特性
- ✅ 纯Rust实现 - 无FFI依赖,完全使用Rust重写
- ✅ 内存优化 - 使用mimalloc全局分配器优化内存性能
- ✅ 类型安全 - 充分利用Rust类型系统,防止内存错误
- ✅ 零成本抽象 - 性能接近原版C实现
- ✅ 双API设计 - 提供底层API和Stream API(高级API)
Stream API(推荐)
- ✅ 简单易用 - 类似TCP的使用体验
- ✅ 自动管理 - 自动处理update和socket读写
- ✅ 标准trait - 实现Read/Write trait
- ✅ 开箱即用 - 几行代码即可使用
底层API
- ✅ 完全控制 - 精确控制KCP行为
- ✅ 零开销 - 无额外抽象层
- ✅ 易于集成 - 适合集成到现有事件循环
🚀 快速开始
安装
在Cargo.toml中添加:
[]
= "0.1"
Stream API(推荐)
Echo服务器
use KcpListener;
use ;
Echo客户端
use KcpStream;
use ;
底层API
use ;
📊 性能
性能对比
| 指标 | TCP | KCP (默认) | KCP (快速模式) | 提升 |
|---|---|---|---|---|
| 平均RTT | 100ms | 60-70ms | 40-50ms | 30%-60% |
| 最大RTT | 300ms | 100ms | 90ms | 3倍 |
| 延迟波动 | 高 | 中 | 低 | 显著降低 |
适用场景
| 场景 | 推荐配置 | 预期延迟 |
|---|---|---|
| 游戏实时通信 | fast_mode() |
20-50ms |
| 视频直播 | 自定义配置 | 100-200ms |
| 文件传输 | 高吞吐配置 | 200-500ms |
| IoT设备 | 低功耗配置 | 可配置 |
🔧 配置选项
预定义配置
use KcpConfig;
// 默认配置(平衡模式)
let config = default;
// 快速模式(最低延迟)
let config = fast_mode;
// 自定义配置
let config = KcpConfig ;
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
mtu |
1400 | 最大传输单元,影响单个包大小 |
interval |
100 | 内部更新间隔(ms),影响响应速度 |
nodelay |
false | 是否启用无延迟模式 |
fastresend |
0 | 快速重传触发次数 |
nocwnd |
false | 是否禁用拥塞控制 |
rcv_wnd |
128 | 接收窗口大小(segment数) |
详细配置说明请参考:性能优化指南
📚 文档
生成API文档:
💡 示例程序
项目包含丰富的示例程序:
| 示例 | 说明 | 运行方式 |
|---|---|---|
stream-api |
Echo服务器/客户端 | cargo run --example stream-api -- [server|client] |
low-level-api |
底层API演示 | cargo run --example low-level-api |
file-transfer |
文件传输示例 | cargo run --example file-transfer -- [send|recv] <file> |
更多示例请查看 examples/ 目录。
🏗️ 模块结构
src/
├── lib.rs # 库入口,全局分配器
├── error.rs # 错误类型定义
├── queue/ # 队列管理模块
│ ├── segment.rs # 数据段结构
│ └── deque.rs # 双向队列
├── codec/ # 编解码模块
│ └── mod.rs # 大端序编解码工具
├── config/ # 配置模块
│ └── params.rs # KcpConfig配置
├── core/ # 核心协议模块
│ └── kcp.rs # KCP控制块(主要实现)
└── stream.rs # Stream API(可选feature)
🎯 API选择指南
Stream API(推荐大多数应用)
何时使用:
- ✅ 新项目开发
- ✅ 需要快速上手
- ✅ 类似TCP的使用体验
- ✅ 不需要精细控制KCP
优点:
- 简单易用,几行代码即可使用
- 自动管理KCP状态更新
- 实现标准IO trait
- 自动处理socket读写
示例:
use KcpStream;
use ;
let mut stream = connect?;
stream.write_all?;
let mut buffer = ;
stream.read?;
底层API(推荐高级用户)
何时使用:
- ✅ 需要精细控制KCP行为
- ✅ 集成到现有事件循环(如tokio)
- ✅ 需要零开销抽象
- ✅ 复杂的网络场景
优点:
- 完全控制KCP行为
- 精确管理update()时机
- 可以自定义输出逻辑
- 更灵活,无额外抽象层
示例:
use ;
let mut kcp = new?;
kcp.set_output?;
kcp.send?;
kcp.flush;
📦 Feature Flags
| Feature | 默认启用 | 说明 |
|---|---|---|
stream |
✅ 是 | Stream API高级封装,推荐使用 |
使用方式:
# 默认配置(包含Stream API)
= "0.1"
# 仅使用底层API
= { = "0.1", = false }
# 显式启用Stream API
= { = "0.1", = ["stream"] }
🧪 测试
运行测试:
# 运行所有测试
# 运行测试并显示输出
# 运行特定测试
测试覆盖:
- ✅ 24个核心单元测试
- ✅ 2个Stream API测试
- ✅ 所有测试通过
🔄 开发路线图
已完成 ✅
- Phase 1-9: 项目初始化和基础结构
- Phase 10-16: 核心KCP协议实现
- Phase 17: 测试基础设施
- 单元测试(24个核心测试)
- 测试依赖配置
- Phase 18: Stream API实现
- KcpStream客户端封装
- KcpListener服务端封装
- Read/Write trait实现
- Phase 19: 文档和示例
- 入门教程
- API指南
- 性能优化指南
- 故障排查指南
- 3个示例程序
计划中 📋
- Phase 20: 集成测试和边界测试
- Phase 21: 性能基准测试
- 性能基准测试
- 更多......
📄 许可证
MIT License
本项目基于skywind3000/kcp(MIT License),使用相同的许可证。
详见 LICENSE 文件。
🙏 致谢
- skywind3000/kcp - 原版KCP协议实现
- mimalloc-rust - Rust内存分配器
🤝 贡献
欢迎提交Issue和Pull Request!
贡献指南
- Fork本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启Pull Request
开发规范
- 遵循Rust代码风格(
cargo fmt) - 通过Clippy检查(
cargo clippy) - 添加单元测试(
cargo test) - 更新相关文档
📮 联系方式
- GitHub: cherish-ltt/kcp-ovo
- Issues: 提交Issue
🌟 Star History
如果这个项目对你有帮助,请给一个Star⭐️