+----------+--------------------------------------------------+
| 12B nonce | AES-GCM 密文 |
+----------+--------------------------------------------------+
内部明文结构:
+----------+-------------------+----------+
| 8B 时间戳 | 实际消息内容 | 16B tag |
+----------+-------------------+----------+| 字段 | 长度 | 说明 |
|---|---|---|
| nonce | 12 字节 | 每条消息随机生成,不可复用 |
| 时间戳 | 8 字节 | 大端序 uint64,发送时刻的 Unix 毫秒时间戳 |
| 消息内容 | 可变 | 实际业务数据(明文) |
| GCM tag | 16 字节 | AES-GCM 自动生成的认证标签,含在密文末尾 |
key = SHA256(seed) → 32 字节 AES-256 密钥客户端须保证每条消息使用独立的随机 nonce,且发送时系统时钟误差在 5 秒以内。
| 消息内容 | 说明 |
|---|---|
__hb__ | 心跳包,须在 5 秒内发送一次,超过 10 秒未收到心跳则强制断开 |
__ping__ | 查询当前房间信息(在线人数 + 成员列表) |
{"type":"__join__","uid":"...","nickname":"..."} | 设置当前用户的 UID 和昵称,加入后广播给房间其他成员 |
| 其他任意内容 | 业务消息,广播给房间内所有其他成员 |
| 消息内容 | 说明 |
|---|---|
__auth_ok__ | 认证成功确认,收到后方可发送业务消息 |
__pong__:<人数>:<成员JSON> | __ping__ 的响应,示例见下 |
{"type":"__leave__","uid":"..."} | 广播通知,某用户已离开房间 |
__closed__ | 服务端主动关闭连接通知(仅 UDP) |
__pong__ 示例:__pong__:3:[{"uid":"user_1","nickname":"玩家A"},{"uid":"user_2","nickname":"玩家B"},{"uid":"user_3","nickname":"玩家C"}]tcp_port 环境变量配置(默认不启用,需显式配置)。+--------------------+-------------------------------+
| 4B Length (uint32) | Payload(加密载荷) |
+--------------------+-------------------------------+客户端 服务端
│ │
│──── TCP Connect ────────────────────────► │ ① TCP 三次握手
│ │
│──── [32B 密钥种子(明文)] ──────────────► │ ② 发送密钥种子
│ │ (服务端派生 AES 密钥)
│ │
│──── [帧: 加密的 connect_key] ────────────► │ ③ 发送认证帧
│◄─── [帧: 加密的 "__auth_ok__"] ─────────── │ ④ 认证成功
│ │
│──── [帧: 加密的 "__hb__"] ───────────────► │ ⑤ 心跳(≤5s 一次)
│──── [帧: 加密的业务消息] ────────────────► │ ⑥ 发送业务消息
│◄─── [帧: 加密的广播消息] ─────────────────│ ⑦ 接收房间广播
│ │[ 32字节随机种子 ]SHA256(seed) 派生 AES-256 密钥,后续所有消息均用此密钥加解密。connect_key,封装为帧发送:connect_key = "从主控分配的用户连接密钥"
frame = encode_frame(encrypt(connect_key))__auth_ok__ → 认证成功,进入正常通信udp_port 环境变量配置(默认不启用,需显式配置)。+--------------------+-------------------------------+
| 8B ConnectId | Payload(加密载荷) |
+--------------------+-------------------------------+