腾讯Mars协议定义

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中的字节进行加密

 

腾讯Mars协议定义

上一篇:正则表达式


下一篇:Collection之ArrayList