/Protocol

the protobuf template of miHoYo Vila

MIT LicenseMIT

米哈游大别野数据协议

协议包构造方式

按小端字节序(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之后的二进制数组

消息体协议

待补充