Rust에 의한 RakNet 프로토콜 구현.
Raknet은 게임 클라이언트와 서버 간의 통신에 일반적으로 사용되는 신뢰할 수 있는 UDP 전송 프로토콜이며, 기본 통신을 위해 Minecraft Bedrock Edtion에서 사용됩니다.
Raknet 프로토콜은 다양한 신뢰성 옵션을 지원하며 불안정한 네트워크 환경에서 TCP보다 전송 성능이 좋습니다. 이 프로젝트는 리버스 엔지니어링을 통한 프로토콜의 불완전한 구현입니다.
>= Tokio 1.x 비동기 런타임 지원이 필요합니다.
참조 : http://www.jenkinssoftware.com/raknet/manual/index.html
이 프로젝트는 Jenkins Software LLC 또는 RakNet과 관련이 없습니다.
# 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% 정도 지연 시간을 줄일 수 있습니다.
옵션:
이 훌륭한 사람들에게 감사드립니다.
b23r0 | 명사 |
어떤 종류의 기여도 환영합니다! 오픈 소스에 기여하고 싶거나 큰 목적을 달성하고 싶었다면 지금이 기회입니다!
BTC : 1HeroYcNYMhjsq8RYCx1stSaRZnQd9B9Eq
ETH : 0x9999997B3deF7b69c09D7a9CA65E5242fb04a764