Skip to content

协议说明

二进制包头格式

EasyTier 使用自定义的 16 字节二进制包头:

Byte 0-3   Byte 4-7   Byte 8-9  Byte 10  Byte 11   Byte 12-13  Byte 14-15
┌──────────┬──────────┬─────────┬────────┬─────────┬────────────┬──────────┐
│fromPeerId│ toPeerId │pktType  │ flags  │fwdCnt   │  reserved  │   len    │
│  uint32  │  uint32  │ uint16  │ uint8  │ uint8   │  uint16    │  uint16  │
└──────────┴──────────┴─────────┴────────┴─────────┴────────────┴──────────┘

字段说明

字段类型字节说明
fromPeerIduint320-3发送方 Peer ID
toPeerIduint324-7接收方 Peer ID
pktTypeuint168-9包类型
flagsuint810标志位
fwdCntuint811转发计数器
reserveduint1612-13保留字段
lenuint1614-15负载长度

包类型 (PacketType)

名称说明
0Invalid无效
1Data数据包
2HandShake握手包
3RoutePacket路由包 (已弃用)
4Ping心跳请求
5Pong心跳响应
6TaRpcTA RPC (已弃用)
7Route路由 (已弃用)
8RpcReqRPC 请求
9RpcRespRPC 响应
10ForeignNetworkPacket外网数据包
11KcpSrcKCP 源
12KcpDstKCP 目标

握手流程

Client (Peer A)                          Relay (PeerID: 10000001)
     │                                           │
     │──── HandShake ───────────────────────────▶│
     │     fromPeerId = A_ID                     │
     │     payload = {magic, version,            │
     │                network_name,              │
     │                network_secret_digest}      │
     │                                           │
     │                      register peer        │
     │                      derive groupKey      │
     │                                           │
     │◀─── HandShake Response ───────────────────│
     │     fromPeerId = 10000001                 │
     │     toPeerId = A_ID                       │
     │                                           │
     │◀─── RpcResp: SyncRouteInfo ───────────────│
     │     (room peer list)                      │
     │                                           │

RPC 协议

PeerCenterRpc

  • methodIndex = 0ReportPeers: Peer 上报自己的直连信息
  • methodIndex = 1GetGlobalPeerMap: 获取全局 Peer 拓扑图(SHA-256 增量同步)

OspfRouteRpc

  • methodIndex = 0SyncRouteInfo: OSPF 风格的路由信息同步
  • 支持增量 Peer 信息推送
  • 连接位图 (connBitmap) 表示 Peer 间连通性

Protobuf 定义

协议使用 Protocol Buffers 3 定义,详见 protos/ 目录:

protos/
├── common.proto      # 通用消息类型
├── peer_rpc.proto    # EasyTier Peer RPC 协议
├── error.proto       # 错误类型
└── google/protobuf/
    └── timestamp.proto  # 标准时间戳

安全设计

密钥派生

javascript
key128 = SHA256(network_secret).slice(0, 16)  // 用于 AES-128-GCM
key256 = SHA256(network_secret)                // 用于 AES-256-GCM

分组隔离

javascript
groupKey = SHA256(network_name + ":" + SHA256(network_secret))

只有持有相同 network_namenetwork_secret 的节点才能被分配到同一分组并互相通信。

基于 MIT 许可证发布