按小端字节序(LittleEndian)把协议每个字段的value逐个存放到同一个byte数组中。
整个数组分成定长、变长两个部分,定长部分占8byte,变长部分最大 1024K byte ,即协议包总长度最小28 byte,最大1024K+8 byte
定长头决定了一个消息包在一串byte流中的起点和终点。
接收端从读取到Magic字段开始,再读取4个字节获得变长部分长度,再读取DataLen个byte就能获得变长部分的完整数据
字段 | 字段类型 | 区间 | 说明 |
---|---|---|---|
Magic | uint32 | [0,4) | 用于标识报文的开始目前的协议的magic值是十进"制的【0xBABEFACE】 |
DataLen | uint32 | [0,4) | 变长部分总长度=变长头长度+变长消息体长度 |
变长部分包括变长头和消息体。
变长消息体最大长度可能达到1MB,通过读取前HeaderLen个byte的变长头,接收端不需要读完所有的变长数据就能提前做一些逻辑处理,如去重、识别消息体类型
数据类型 | 字段 | 字段类型 | 区间 | 说明 |
---|---|---|---|---|
变长头 | HeaderLen | uint32 | [8,12) | 变长头总长度,变长头部分所字段的总长度 |
变长头 | ID | uint32 | [12,20) | 协议包序列ID,同一条连接上的发出的协议包应该单调递增,相同序列ID且Flag字段相同的包应该被认为是同一个包 |
变长头 | Flag | uint32 | [20,24) | 配合bizType使用,用于标识同一个bizType协议的方向。用 1 代表主动发到服务端的request包用 2 代表针对某个request包回应的response包 |
变长头 | BizType | uint32 | [24,28) | 消息体的业务类型,用于标识Body字段中的消息所属业务类型 |
变长头 | AppID | uint32 | [28,32) | 应用标识。固定为 104 |
消息体 | BodyData | byte数组 | [32,1024K+8) | 协议数据。数据采用protobuf Marshal之后的二进制数组 |
待补充