register and register ack
This commit is contained in:
parent
7e80578038
commit
939a0514db
@ -34,13 +34,19 @@ sdlan协议的总体格式如下:
|
|||||||
* `0` —— `invalid pkt type`,表示无效的数据包类型
|
* `0` —— `invalid pkt type`,表示无效的数据包类型
|
||||||
* `1` —— `register super`,表示客户端像服务端发送的注册请求
|
* `1` —— `register super`,表示客户端像服务端发送的注册请求
|
||||||
* `2` —— `packet`,表示客户端向服务端(或者客户端发送给客户端)发送的来自tun的数据包。
|
* `2` —— `packet`,表示客户端向服务端(或者客户端发送给客户端)发送的来自tun的数据包。
|
||||||
|
* `3` —— `register`数据包,表示客户端之间打洞请求消息
|
||||||
|
* `4` —— `register_ack`数据包,表示客户端之间打洞请求消息
|
||||||
* ... TODO
|
* ... TODO
|
||||||
|
|
||||||
## 4. 消息体
|
## 4. 消息体
|
||||||
消息提根据协议头中的pc不同,拥有不同的结构,结构体在json化之后,添加到消息体的位置。
|
消息提根据协议头中的pc不同,拥有不同的结构,结构体在json化之后,添加到消息体的位置。
|
||||||
|
|
||||||
### 4.1. RegisterSuper包类型
|
### 4.1. RegisterSuper包类型
|
||||||
`register super`,pc为1,表示客户端像服务端发送的注册请求,该请求每隔15-20秒发送一次
|
`register super`,pc为1,表示客户端像服务端发送的注册请求,该请求每隔15-20秒发送一次,RegisterSuper的json结构如下:
|
||||||
|
|
||||||
|
```json
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
### 4.2. Packet数据包
|
### 4.2. Packet数据包
|
||||||
`packet`,pc为2,表示客户端向服务端(或者客户端发送给客户端)发送的来自tun的数据包。packet数据包的json化之后的结构如下:
|
`packet`,pc为2,表示客户端向服务端(或者客户端发送给客户端)发送的来自tun的数据包。packet数据包的json化之后的结构如下:
|
||||||
@ -71,4 +77,37 @@ sdlan协议的总体格式如下:
|
|||||||
|
|
||||||
其中,`src_ip`为tun的ip数据包的来源ip,`dst_ip`为tun的ip数据包的目的ip。均为大端序的32位无符号整数。`sock`为转发时由sn填充的发送客户端的信息,发送短不需要处理。`data`为tun的数据流量,使用`network_pass`进行加密后的二进制数据。
|
其中,`src_ip`为tun的ip数据包的来源ip,`dst_ip`为tun的ip数据包的目的ip。均为大端序的32位无符号整数。`sock`为转发时由sn填充的发送客户端的信息,发送短不需要处理。`data`为tun的数据流量,使用`network_pass`进行加密后的二进制数据。
|
||||||
|
|
||||||
在发送packet数据包之前,消息体部分的数据,为json化之后的packet使用`header_pass`进行aes加密后的二进制数据。
|
在发送packet数据包之前,消息体部分的数据,为json化之后的packet使用`header_pass`进行aes加密后的二进制数据。
|
||||||
|
|
||||||
|
### 4.3. Register数据包
|
||||||
|
`register`,pc为3,客户端向另一个客户端发送打洞请求的数据包。json格式如下:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
// 源ip
|
||||||
|
"src_ip": $uint32,
|
||||||
|
// 目的ip
|
||||||
|
"dst_ip": $uint32,
|
||||||
|
// supernode转发时开到的发送者的外网ip信息
|
||||||
|
"sock": {
|
||||||
|
// family表示客户端的ip协议版本,2表示ipv4,10表示ipv6
|
||||||
|
"family": 2|10,
|
||||||
|
// 客户端开放的端口, u16
|
||||||
|
"port": $uint16,
|
||||||
|
// 如果family为2,则v4有用,一个四字节的数组,表示ipv4
|
||||||
|
"v4": [1,2,3,4],
|
||||||
|
// 如果family为10,则v6有用,一个16字节的数组,表示ipv6地址
|
||||||
|
"v6": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
|
||||||
|
},
|
||||||
|
// 发送者的tun的ip信息
|
||||||
|
"dev_addr": {
|
||||||
|
// tun设备的ip,大端序的32位无符号
|
||||||
|
"net_addr": $uint32,
|
||||||
|
// 子网掩码1的位数,一般为24
|
||||||
|
"net_bit_len": $uint8,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4. RegisterACK数据包
|
||||||
|
pc为4
|
||||||
@ -83,6 +83,8 @@ pub enum PacketType {
|
|||||||
PKTPacket,
|
PKTPacket,
|
||||||
// 打洞消息
|
// 打洞消息
|
||||||
PKTRegister,
|
PKTRegister,
|
||||||
|
// 打洞消息ACK
|
||||||
|
PKTRegisterACK,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::convert::From<u8> for PacketType {
|
impl std::convert::From<u8> for PacketType {
|
||||||
@ -92,6 +94,7 @@ impl std::convert::From<u8> for PacketType {
|
|||||||
1 => Self::PKTRegisterSuper,
|
1 => Self::PKTRegisterSuper,
|
||||||
2 => Self::PKTPacket,
|
2 => Self::PKTPacket,
|
||||||
3 => Self::PKTRegister,
|
3 => Self::PKTRegister,
|
||||||
|
4 => Self::PKTRegisterACK,
|
||||||
_ => Self::PKTInvalid,
|
_ => Self::PKTInvalid,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,6 +107,7 @@ impl PacketType {
|
|||||||
Self::PKTRegisterSuper => 1,
|
Self::PKTRegisterSuper => 1,
|
||||||
Self::PKTPacket => 2,
|
Self::PKTPacket => 2,
|
||||||
Self::PKTRegister => 3,
|
Self::PKTRegister => 3,
|
||||||
|
Self::PKTRegisterACK => 4,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,3 +9,6 @@ pub use packet::*;
|
|||||||
|
|
||||||
mod register;
|
mod register;
|
||||||
pub use register::*;
|
pub use register::*;
|
||||||
|
|
||||||
|
mod register_ack;
|
||||||
|
pub use register_ack::*;
|
||||||
|
|||||||
@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
pub struct Packet {
|
pub struct Packet {
|
||||||
pub src_ip: u32,
|
pub src_ip: u32,
|
||||||
pub dst_ip: u32,
|
pub dst_ip: u32,
|
||||||
pub sock: SdlanSock,
|
pub sock: Option<SdlanSock>,
|
||||||
|
|
||||||
pub data: Vec<u8>,
|
pub data: Vec<u8>,
|
||||||
}
|
}
|
||||||
@ -23,12 +23,12 @@ mod test {
|
|||||||
let packet = Packet {
|
let packet = Packet {
|
||||||
src_ip: 1,
|
src_ip: 1,
|
||||||
dst_ip: 2,
|
dst_ip: 2,
|
||||||
sock: SdlanSock {
|
sock: Some(SdlanSock {
|
||||||
family: AF_INET,
|
family: AF_INET,
|
||||||
port: 80,
|
port: 80,
|
||||||
v4: [1; 4],
|
v4: [1; 4],
|
||||||
v6: [1; 16],
|
v6: [1; 16],
|
||||||
},
|
}),
|
||||||
data: data.into_bytes(),
|
data: data.into_bytes(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ pub struct Register {
|
|||||||
// 目的ip
|
// 目的ip
|
||||||
pub dst_ip: u32,
|
pub dst_ip: u32,
|
||||||
// supernode转发时开到的发送者的外网ip信息
|
// supernode转发时开到的发送者的外网ip信息
|
||||||
pub sock: SdlanSock,
|
pub sock: Option<SdlanSock>,
|
||||||
// 发送者的tun的ip信息
|
// 发送者的tun的ip信息
|
||||||
pub dev_addr: IpSubnet,
|
pub dev_addr: IpSubnet,
|
||||||
}
|
}
|
||||||
|
|||||||
0
src/packet/register_ack.rs
Normal file
0
src/packet/register_ack.rs
Normal file
@ -6,6 +6,10 @@ use serde::{Deserialize, Serialize};
|
|||||||
pub struct RegisterSuper<'a> {
|
pub struct RegisterSuper<'a> {
|
||||||
// pass, 用于给registersuper一个初步的雁阵,固定8位
|
// pass, 用于给registersuper一个初步的雁阵,固定8位
|
||||||
pub pass: &'a str,
|
pub pass: &'a str,
|
||||||
|
|
||||||
|
// used to match register_super, register_super_ack,
|
||||||
|
// register_super_nak, register_super_acknowledge
|
||||||
|
pub cookie: u32,
|
||||||
// 自身的sock信息
|
// 自身的sock信息
|
||||||
pub sock: Option<peer::SdlanSock>,
|
pub sock: Option<peer::SdlanSock>,
|
||||||
|
|
||||||
@ -37,6 +41,40 @@ mod test {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
struct RegisterSuperWithoutNone<'a> {
|
||||||
|
// pass, 用于给registersuper一个初步的雁阵,固定8位
|
||||||
|
pub pass: &'a str,
|
||||||
|
// 自身的sock信息
|
||||||
|
pub sock: peer::SdlanSock,
|
||||||
|
|
||||||
|
// 自身的ip信息
|
||||||
|
pub dev_addr: peer::IpSubnet,
|
||||||
|
|
||||||
|
// 自身的公钥
|
||||||
|
pub pub_key: &'a str,
|
||||||
|
|
||||||
|
// user's token, can be used to specify a user
|
||||||
|
pub token: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_without_none() {
|
||||||
|
let pkt1 = RegisterSuper {
|
||||||
|
pass: "encrypt!",
|
||||||
|
cookie: 0,
|
||||||
|
sock: None,
|
||||||
|
dev_addr: peer::IpSubnet::new(192, 24),
|
||||||
|
pub_key: "public key",
|
||||||
|
token: "user's token",
|
||||||
|
};
|
||||||
|
let res = serde_json::to_string(&pkt1).unwrap();
|
||||||
|
println!("unmarshaled as {}", res);
|
||||||
|
let pkt2: RegisterSuperWithoutNone = serde_json::from_slice(res.as_bytes()).unwrap();
|
||||||
|
println!("got pkt2: {:?}", pkt2);
|
||||||
|
}
|
||||||
|
|
||||||
fn prepare_data() -> (Common<'static>, RegisterSuper<'static>) {
|
fn prepare_data() -> (Common<'static>, RegisterSuper<'static>) {
|
||||||
let cmn1 = Common {
|
let cmn1 = Common {
|
||||||
version: 1,
|
version: 1,
|
||||||
@ -47,6 +85,7 @@ mod test {
|
|||||||
};
|
};
|
||||||
let pkt1 = RegisterSuper {
|
let pkt1 = RegisterSuper {
|
||||||
pass: "encrypt!",
|
pass: "encrypt!",
|
||||||
|
cookie: 0,
|
||||||
sock: Some(SdlanSock {
|
sock: Some(SdlanSock {
|
||||||
family: AF_INET,
|
family: AF_INET,
|
||||||
port: 1,
|
port: 1,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user