1 个不稳定版本

0.12.0 2022年10月4日
0.10.1 2022年8月9日
0.9.0 2022年6月12日
0.1.1 2022年3月28日

#756网络编程

MIT 许可证

180KB
3.5K SLoC

rust-raknet 构建状态 ChatOnDiscord Crate Crate

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

结果

image

(2022年6月12日)

在高数据包丢失率网络环境中,本项目与TCP相比可以减少约50%的延迟时间。

贡献

选项

  • 报告BUG
  • 提交关于建议的问题
  • 提交改进的PR
  • 添加rust-raknet的示例使用
  • 补充rust-raknet的使用文档

人人为我,我为人人。

依赖项

~2.7–9MB
~65K SLoC