1 个不稳定版本
0.12.0 | 2022年10月4日 |
---|---|
0.10.1 |
|
0.9.0 |
|
0.1.1 |
|
#756 在 网络编程
180KB
3.5K SLoC
rust-raknet
Rust实现的RakNet协议。
RakNet是一个可靠的UDP传输协议,通常用于游戏客户端和服务器之间的通信,并为Minecraft Bedrock Edition的底层通信所使用。
RakNet协议支持各种可靠性选项,在不可靠的网络环境中,比TCP具有更好的传输性能。本项目是通过逆向工程实现的协议的不完整实现。
需要 >= Tokio 1.x 异步运行时支持。
参考: http://www.jenkinssoftware.com/raknet/manual/index.html
本项目与Jenkins Software LLC和RakNet无关。
特性
- 异步
- MIT许可证
- 纯Rust实现
- 快速重传
- 选择性重传(TCP/完全重传)
- 非延迟ACK(TCP/延迟ACK)
- 不双倍RTO(TCP/双倍RTO)
- 支持Linux/Windows/Mac/BSD
- 兼容Minecraft 1.18.x
入门
# Cargo.toml
[dependencies]
rust-raknet = "*"
文档: https://docs.rs/rust-raknet/latest/rust_raknet/
可靠性
- 不可靠
- 不可靠有序
- 可靠
- 可靠有序
- 可靠有序
示例
//server
async fn serve(){
let mut listener = RaknetListener::bind("127.0.0.1:19132".parse().unwrap()).await.unwrap();
listener.listen().await;
loop{
let socket = listener.accept().await.unwrap();
let buf = socket.recv().await.unwrap();
if buf[0] == 0xfe{
//do something
}
}
listener.close().await.unwrap();
}
//client
async fn connect(){
let socket = RaknetSocket::connect("127.0.0.1:19132".parse().unwrap()).await.unwrap();
socket.send(&[0xfe], Reliability::ReliableOrdered).await.unwrap();
let buf = socket.recv().await.unwrap();
if buf[0] == 0xfe{
//do something
}
socket.close().await.unwrap();
}
基准测试
使用Tcp与本项目进行比较。设置服务器数据包丢失率为50%,客户端连接到服务器,服务器每30ms发送一个800字节的数据包,共100次。客户端计算每个接收数据的延迟时间,并计算接收100次的平均时间。以下为测试结果。
测试代码: https://github.com/b23r0/rust-raknet/blob/main/example/test_benchmark/src/main.rs
结果
(2022年6月12日)
在高数据包丢失率网络环境中,本项目与TCP相比可以减少约50%的延迟时间。
贡献
选项
- 报告BUG
- 提交关于建议的问题
- 提交改进的PR
- 添加rust-raknet的示例使用
- 补充rust-raknet的使用文档
人人为我,我为人人。
依赖项
~2.7–9MB
~65K SLoC