MARS协议解析
Mars协议简介
Mars 是微信官方的跨平台跨业务的终端基础组件。由腾讯开源,主要用于解决app端通信问题,包括弱网环境下心跳和重连机制。
本文主要阐述Mars组件中使用的协议,协议本上较为简单,具体内容如下
Mars协议定义
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | headLength = 0 | +---------------------------------------------------------------+ | clientVersion = 0 | +---------------------------------------------------------------+ | cmdId = 0 | +---------------------------------------------------------------+ | seq = 0 | +---------------------------------------------------------------+ | bodyLen = 0 | +---------------------------------------------------------------+ | | | options | | | +---------------------------------------------------------------+ | | + body + | | +---------------------------------------------------------------+
协议说明
字段名称 | 字段说明 | 字段类型 | 字节数 |
headLength | 表示消息头字节数,值为固定头20个字节+自定义头的字节数 | int | 4 |
clientVersion | 客户端版本 | int | 4 |
cmdId | 消息类型 | int | 4 |
seq | 消息序号 | int | 4 |
bodyLen | 消息体字节数 | int | 4 |
options | 自定义头 | byte[] | headLength-20 |
body | 消息提 | byte[] | bodyLen |
Options
自定义头开源使用约定协议方式,根据不同的cmdid约定options的长度和解析方式
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | option1 | +---------------------------------------------------------------+ | option2 | +---------------------------------------------------------------+ | option3 | +---------------------------------------------------------------+ | option4 | +---------------------------------------------------------------+ | option5 | +---------------------------------------------------------------+
同样也可以使用序列化后的byte,如protobuf,解析时直接获得所有字节,并通过protobuf进行反序列化进行解析
Body
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | field1 | +---------------------------------------------------------------+ | field2 | +---------------------------------------------------------------+ | field3 | +---------------------------------------------------------------+ | field4 | +---------------------------------------------------------------+ | field5 | +---------------------------------------------------------------+
与options相同,可以跟不同cmdid解析约定格式,或者使用protobuf或者json等序列化工具进行序列化
服务端实践
1、使用protobuf作为序列化工具,可以减少贷款使用量
2、服务端和客户端协商自定义Auth包进行客户端账号密码校验,算法可以使用SCRAM-SHA256等算法
3、服务端接收到cmdid为6时表示为ping包,注意建立连接后第一个包可能是ping包而非auth包
4、建议将body中的字节进行加密