跳转至

二进制协议迁移

实现状态:✅ 已实现

二进制协议已在 rvpn-core/src/protocol/ 中完全实现。

当前状态:二进制协议(已实现)

该协议现在使用自定义二进制格式进行所有消息序列化:

// 二进制消息帧格式:[4 字节长度][N 字节负载]
// 实现在 rvpn-core/src/protocol/codec.rs

消息格式

所有消息使用简单的 4 字节长度前缀:

[4 字节:消息长度(大端序)] [N 字节:消息负载]

消息类型

0x01: ProxyConnect(代理连接)

[1 字节:类型 = 0x01]
[8 字节:connection_id(大端序 u64)]
[1 字节:主机长度]
[N 字节:主机(UTF-8)]
[2 字节:端口(大端序 u16)]

0x02: ProxyResponse(代理响应)

[1 字节:类型 = 0x02]
[8 字节:connection_id(大端序 u64)]
[1 字节:成功(0x00 = 失败,0x01 = 成功)]
[2 字节:错误长度(无错误时为 0)]
[N 字节:错误消息(UTF-8,可选)]

0x03: ProxyData(代理数据)

[1 字节:类型 = 0x03]
[8 字节:connection_id(大端序 u64)]
[4 字节:数据长度(大端序 u32)]
[N 字节:数据(原始二进制)]
[1 字节:关闭标志(0x00 = 假,0x01 = 真)]

0x04: RatchetMessage(Ratchet 消息)

[1 字节:类型 = 0x04]
[1 字节:has_dh_public(0x00 = 假,0x01 = 真)]
[32 字节:dh_public(仅当 has_dh_public = 0x01 时存在)]
[4 字节:message_number(大端序 u32)]
[4 字节:previous_chain_length(大端序 u32)]
[12 字节:nonce(原始值)]
[4 字节:密文长度(大端序 u32)]
[N 字节:密文(原始二进制)]

大小对比

ProxyData 示例(1KB 负载)

格式 大小 开销
JSON ~1,400 字节 Base64 + 字段名
二进制 ~1,020 字节 20 字节头部
节省 ~27%

RatchetMessage 示例(1KB 密文)

格式 大小 开销
JSON ~1,500 字节 Base64 + 字段名 + 结构包装
二进制 ~1,060 字节 48 字节头部
节省 ~29%

实现细节

修改的文件

  1. rvpn-core/src/protocol/mod.rs - 添加编解码器模块
  2. rvpn-core/src/protocol/codec.rs - 二进制编解码器实现
  3. rvpn-server/src/handler.rs - 使用二进制编解码器
  4. rvpn-client/src/tunnel.rs - 使用二进制编解码器
  5. rvpn-client/src/socks5.rs - 使用二进制编解码器

实现的收益

  • 带宽:消息大小减少约 30%
  • 延迟:更快的序列化/反序列化
  • CPU:消除了 Base64 编码/解码开销
  • 内存:更可预测的缓冲区大小