| Crates.io | kcp-ovo |
| lib.rs | kcp-ovo |
| version | 0.1.1 |
| created_at | 2026-01-04 09:19:35.399434+00 |
| updated_at | 2026-01-04 09:19:35.399434+00 |
| description | KCP协议的纯Rust实现 |
| homepage | |
| repository | https://github.com/cherish-ltt/kcp-ovo |
| max_upload_size | |
| id | 2021640 |
| size | 218,405 |
🚀 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简化使用。
在Cargo.toml中添加:
[dependencies]
kcp-ovo = "0.1"
use kcp_ovo::KcpListener;
use std::io::{Read, Write};
fn main() -> std::io::Result<()> {
let mut listener = KcpListener::bind("0.0.0.0:8888")?;
println!("服务器启动在 0.0.0.0:8888");
let (mut stream, addr) = listener.accept()?;
println!("客户端 {} 已连接", addr);
let mut buffer = [0u8; 1024];
loop {
match stream.read(&mut buffer) {
Ok(0) => break,
Ok(n) => {
stream.write_all(&buffer[..n])?;
}
Err(e) => {
eprintln!("错误: {}", e);
break;
}
}
}
Ok(())
}
use kcp_ovo::KcpStream;
use std::io::{Read, Write};
fn main() -> std::io::Result<()> {
let mut stream = KcpStream::connect("127.0.0.1:8888")?;
stream.write_all(b"Hello, KCP!")?;
let mut buffer = [0u8; 1024];
let n = stream.read(&mut buffer)?;
println!("收到: {}", String::from_utf8_lossy(&buffer[..n]));
Ok(())
}
use kcp_ovo::{Kcp, KcpConfig};
fn main() -> kcp_ovo::KcpResult<()> {
// 创建KCP实例
let mut kcp = Kcp::new(0x11223344, KcpConfig::default())?;
// 设置输出回调
kcp.set_output(|data, _kcp| {
// 通过UDP socket发送
udp_socket.send_to(data, &remote_addr)?;
Ok(data.len())
});
// 发送数据
kcp.send(b"Hello, KCP!")?;
kcp.flush();
// 接收UDP数据并输入到KCP
let (len, _) = udp_socket.recv_from(&mut buf)?;
kcp.input(&buf[..len])?;
// 更新KCP状态
kcp.update(current_timestamp_ms);
// 接收数据
let mut recv_buf = [0u8; 4096];
let recv_len = kcp.recv(&mut recv_buf)?;
println!("收到: {}", String::from_utf8_lossy(&recv_buf[..recv_len]));
Ok(())
}
| 指标 | 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 kcp_ovo::KcpConfig;
// 默认配置(平衡模式)
let config = KcpConfig::default();
// 快速模式(最低延迟)
let config = KcpConfig::fast_mode();
// 自定义配置
let config = KcpConfig {
mtu: 1400, // 最大传输单元
interval: 20, // 内部更新间隔(ms)
nodelay: true, // 无延迟模式
fastresend: 2, // 快速重传触发次数
stream: false, // 流式模式
nocwnd: true, // 禁用拥塞控制
rcv_wnd: 128, // 接收窗口大小
..Default::default()
};
| 参数 | 默认值 | 说明 |
|---|---|---|
mtu |
1400 | 最大传输单元,影响单个包大小 |
interval |
100 | 内部更新间隔(ms),影响响应速度 |
nodelay |
false | 是否启用无延迟模式 |
fastresend |
0 | 快速重传触发次数 |
nocwnd |
false | 是否禁用拥塞控制 |
rcv_wnd |
128 | 接收窗口大小(segment数) |
详细配置说明请参考:性能优化指南
生成API文档:
cargo doc --open
项目包含丰富的示例程序:
| 示例 | 说明 | 运行方式 |
|---|---|---|
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)
何时使用:
优点:
示例:
use kcp_ovo::KcpStream;
use std::io::{Read, Write};
let mut stream = KcpStream::connect("127.0.0.1:8888")?;
stream.write_all(b"Hello")?;
let mut buffer = [0u8; 1024];
stream.read(&mut buffer)?;
何时使用:
优点:
示例:
use kcp_ovo::{Kcp, KcpConfig};
let mut kcp = Kcp::new(0x11223344, KcpConfig::fast_mode())?;
kcp.set_output(|data, _| udp_socket.send(data))?;
kcp.send(b"Hello")?;
kcp.flush();
| Feature | 默认启用 | 说明 |
|---|---|---|
stream |
✅ 是 | Stream API高级封装,推荐使用 |
使用方式:
# 默认配置(包含Stream API)
kcp-ovo = "0.1"
# 仅使用底层API
kcp-ovo = { version = "0.1", default-features = false }
# 显式启用Stream API
kcp-ovo = { version = "0.1", features = ["stream"] }
运行测试:
# 运行所有测试
cargo test
# 运行测试并显示输出
cargo test -- --nocapture
# 运行特定测试
cargo test test_kcp_new
测试覆盖:
MIT License
本项目基于skywind3000/kcp(MIT License),使用相同的许可证。
详见 LICENSE 文件。
欢迎提交Issue和Pull Request!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)cargo fmt)cargo clippy)cargo test)如果这个项目对你有帮助,请给一个Star⭐️