简单通用数据交换协议

  cheney

Simple data exchange protocol 简单通用数据交换协议
主要依靠长度位进行拆包,如果长度位校验失败则快速失败,基于收到数据的时间重新寻找帧头。
依靠包序号进行异步通信,对应的请求包和响应包的序号相同。
依靠 TCP 协议提供错误和重发功能。

连接维持

  • 客户端和服务端,如果一个链接超过 15 秒没有收到数据,主动发起 Ping 。
  • 客户端和服务端,凡是收到 Ping 都必须马上回复一个 Pong 。
  • 客户端如果 60 秒没有收到数据,则主动退出。
  • 服务端如果 60 秒没有从某个链接收到数据,则结束链接。

通信层

帧格式

| 包长度 (4 byte) | 长度校验(1 byte)| 包校验(1 byte)| 包序号 (8 byte) | 命令长度 (1 byte)| 命令 | 元数据长度 (1 byte) | 元数据 (可以为空) | 数据 ( 可以没有,最长小于 2^32 - 4 -1 -1 -8 -1 -命令长度) ~ 2,147,483,000 |

包长度

后续所有字节的长度,包含自己的长度。
有符号的 32 位目前已经足够表示。最高符号位的用法保留。

长度校验

将数据长度逐字节异或所得

包校验

将包序号+命令长度+命令+数据逐字节异或所得

包序号

8 个字节可见字符表示的随机数

命令长度

命令为字符串,长度为命令字符串的长度。

命令

具体命令,应用处理,系统命令以 @ 开头,应用命令不能和系统命令相同。
- @Ping
- @Pong

元数据长度

元数据序列化后的长度

元数据

键值都是字符串的单层表,用于扩展对数据的描述。
可以没有

数据

原始数据字节,使用 Pojo 作为序列化方案。
可以没有