-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Mars 自定义扩展
目前 Mars 支持自定义 xlog 的加密部分和长短连协议加解包部分。需要强调的是想要自定义这些扩展,需要在本地编译 Mars 才可以,编译方法见 Mars Android 接入指南 和 Mars iOS/OS X 接入指南 中的编译部分。切记,在自定义实现时,可以增加函数,但是不能删除头文件中已有的函数,也不能修改头文件中的函数原型。
xlog 的具体实现可以参考[微信终端跨平台组件 Mars 系列(一) - 高性能日志模块 xlog] (http://mp.weixin.qq.com/s/cnhuEodJGIbdodh0IxNeXQ)
在自定义日志加密算法前,先来了解一下日志的结构:
|magic start(char)|seq(uint16_t)|begin hour(char)|end hour(char)|length(uint32_t)|crypt key(uint32_t)|log|magic end(char)|
以上结构为一个日志结构体,在 Xlog.AppednerModeSync (同步模式)下,每写一行日志都会组装成一个日志结构体写入到日志文件中。在 Xlog.AppednerModeAsync (异步模式)下,mmap 中的数据是是一个日志结构体,每当往 mmap 中写入一行日志数据时,同时会修改结构体中的 length 的值。
所以结构体中有四部分是不能去除的:magic start、length、log、magic end。其他部分可以根据需要增减。
日志默认是提供 ecdh +tea的混合加密算法,具体使用方法见 Xlog 加密指引。如果你只是想更改加密算法的话,只需要修改两个函数(注意,老版本是需要单独把log_crypt.h和log_crypt.cc文件单独复制到上层代码里实现。最新版本已经不需要这么做):
void CryptSyncLog(const char* const _log_data, size_t _input_len, char* _output, size_t& _output_len);
void CryptAsyncLog(const char* const _log_data, size_t _input_len, char* _output, size_t& _output_len);
自定义加密算法后,一定要修改解密 xlog 的 python 脚本。修改python的解压逻辑需要注意:因为日志是先压缩后再让你重定义加密的,所以解密脚本中需要先解密再解压,而且需要注意解密脚本中有两种类型:同步日志和异步日志,注意和你的加密算法对应上。
长连的加包是在 Req2Buf 之后进行的,也即长连的 body 是 Req2Buf 得到的数据,长连的头部是加包上去的。加解包自定义实现可以在这两个函数中进行实现:
void (*longlink_pack)(uint32_t _cmdid, uint32_t _seq, const AutoBuffer& _body, const AutoBuffer& _extension, AutoBuffer& _packed, longlink_tracker* _tracker);
int (*longlink_unpack)(const AutoBuffer& _packed, uint32_t& _cmdid, uint32_t& _seq, size_t& _package_len, AutoBuffer& _body, AutoBuffer& _extension, longlink_tracker* _tracker);
同时这里还可以针对心跳包(noop)进行自定义,默认的心跳包是只有一个长连接头部,没有 body 部分。
uint32_t (*longlink_noop_cmdid)();
bool (*longlink_noop_isresp)(uint32_t _taskid, uint32_t _cmdid, uint32_t _recv_seq, const AutoBuffer& _body, const AutoBuffer& _extend);
void (*longlink_noop_req_body)(AutoBuffer& _body, AutoBuffer& _extend);
void (*longlink_noop_resp_body)(const AutoBuffer& _body, const AutoBuffer& _extend);
bool (*longlink_complexconnect_need_verify)();
和长连一样,短连的加包也是在 Req2Buf 之后进行的,也即短连的 body 是 Req2Buf 得到的数据,短连的头部是加包上去的。即使修改短连的加包逻辑也请只在 HTTP 协议基础上增减字段,建议不要改为其他协议,因为本身短连就是为了弥补长连私有协议的请求可能被中间设备丢掉而做的。
void (*shortlink_pack)(const std::string& _url, const std::map<std::string, std::string>& _headers, const AutoBuffer& _body, const AutoBuffer& _extension, AutoBuffer& _out_buff, shortlink_tracker* _tracker);
uint32_t (*longlink_noop_interval)();
默认为 0,会走 Mars 自带的逻辑。若想自定义,该值给大于 0 的值即可,单位为 ms ,例如你想自定义 1min 的心跳间隔,需返回值 1*60*1000。
目前Mars中已经固定了几种协议:
- 心跳包 cmdid = 6 可在 longlink_packer.cc 自定义
- signalling cmdid = 243。 cmdid 的值可在 longlink_packer.cc 自定义。该功能不主动调用不会触发。
- push 数据包。默认 seq = 0 会被认为是 push 数据包,可在 longlink_packer.cc 自定义。
注意自定义时不要与以上三种有冲突。
Mars Android 接入指南
Mars iOS/OS X 接入指南
Mars Windows 接入指南
Xlog 加密使用指引
Mars 常用术语
Mars 常见问题
Mars 自定义扩展
Mars Sample 使用说明
Mars Android 接口详细说明
Mars iOS/OS X 接口详细说明
Mars 其他资料
STN Benchmark
Xlog Benchmark
微信 Mars — 移动互联网下的高质量网络连接探索(小蛮腰科技大会PPT)
微信终端跨平台组件 Mars 系列(一) - 高性能日志模块 xlog
微信终端跨平台组件 Mars 系列 (二) - 信令传输超时设计