微信的Mars网络框架是2016年12月28号开源的。
前一段时间开始对其进行了连续的学习和了解。
一、主要的学习资料如下:
1. 微信公众号的文章:
2017.01.10 微信Mars——移动互联网下的高质量网络连接探索(周志杰) http://www.infoq.com/cn/presentations/wechat-mars-high-quality-network-connection
2017.01.04 微信终端跨平台组件 Mars 系列(三)连接超时与IP&Port排序 http://mp.weixin.qq.com/s/LGEmNa2qxdjdhy4yY6CN2w
2016.12.28 微信终端跨平台组件 mars 系列 - 我们如约而至 http://mp.weixin.qq.com/s/JVsVrKwJlOwoB3Rz0e17wQ
2016.12.09 微信终端跨平台组件 mars 系列(二) - 信令传输超时设计 http://mp.weixin.qq.com/s/PnICVDyVuMSyvpvTrdEpSQ
2016.11.28 微信Mars:客户端跨平台组件的开发经验 http://mp.weixin.qq.com/s/obfHNHYXDZDMGrZd-TpRGA
2016.10.11 微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog http://mp.weixin.qq.com/s/cnhuEodJGIbdodh0IxNeXQ
2016.10.15 微信客户端怎样应对弱网络 http://ppt.geekbang.org/slide/show/203
2015.08.17 Android微信智能心跳方案 http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb8123f1b5ab58810ac8bc5994&scene=21#wechat_redirect
2. IM开发者社区:
微信分享开源IM网络层组件库Mars的技术实现(视频+PPT)[附件下载] http://www.52im.net/thread-691-1-1.html
社区的文章基本与公众号的相同,看社区主要看文章下面的问答,可以作为补充知识进行参考。
3. wiki地址:
https://github.com/Tencent/mars/wiki
这里相当于官方文档说明,实操性比较强,遇到问题时可以先来这里查询和提问,mars rd的回复很及时。
4. QQ 交流群:581426866
qq群也是提问的好地方,其他同行回答问题也都很积极,但免不了会有些闲扯和跑偏的话题。
—————以下是学习心得——————-
二、mars主要特点
主要组成:基础库(COMM)、通用日志模块(XLOG)、网络诊断模块(SDT)、信令传输网络模块(STN)。其中STN是mars的核心模块。
开发语言:C++
具体实现:基于Socket,提供了长连、短连两种类型的通道,不支持完整的Http
应用场景:主要针对信令数据而设计的,在微信内部的应用场景主要是:普通CGI请求类似收发消息收发语音,业务CGI支付请求等。
推广程度:是微信日常中使用最频繁的网络通道,已经应用到了多个腾讯内部应用中。
最佳实践:私有协议+stn的分层模式
微信的网络框架:大体分为两种类型:信令网络、数据网络。其中STN负责信令网络,CDN组件则负责数据网络。CDN尚未开源。
这里要强调的是,如果没有计划开发私有协议,那么大可不必使用mars。
ps:
1.何为信令数据?mars的rd回复说:一般来说回包大小不超过64kb都认为是信令数据。在微信内部:消息语音等是stn数据,图片视频是cdn数据。STN网络和SDN网络的主要区别是超时设计的不同。
2.目前四大模块中,XLOG可以单独使用,SDT必须配合STN一起使用。
三、STN的精髓之一:超时时间
- 方案一:总读写超时
超时=请求发送耗时(发包大小/最低网速)+响应信令接收耗时(最大回包大小/最低网速)+服务器处理请求耗时(约定的最大耗时)+等待耗时(队列大小*常量);
- 方案二:分步的读写超时
超时1=请求发送耗时(发包大小/最低网速)+首包传输时间+服务器处理请求耗时(约定的最大耗时)+等待耗时(队列大小*常量);
超时2=包包超时~RTT;
不同网络下的固定 RTT。
- 方案三:动态的读写超时
a.理想的超时=请求发送耗时(发包大小/动态网速)+响应信令接收耗时(真实回包大小/动态网速)+服务器动态耗时+等待耗时(队列大小*常量);
b.实践中的超时:
在方案二的基础上,适当根据网络状况适当动态化。
将客户端网络环境区分为优良(Excellent)、评估(Evaluating)两种状态;
网速快、稳定就是条件1:优良,信令失败或网络类型切换是条件2:评估。
进入优良状态后,就缩短信令收发的预期,即减小首包超时时间
ps:
RTT:数据的往返时间
RTO:重传超时间隔,倍乘的关系被称为“指数退避”。微信团队经测试发现:Android系统实现,RTO 的值基本符合“指数退避”原则。iOS 中 ,并未发现 TCP RTO 的规律,但可以看出 iOS 确实采用了较为激进的超时时间设定,对重试更为积极。
MSS:就是TCP数据包每次能够传输的最大数据分段。三次握手时取双方提供的最小值作为MSS值;以太网中MSS值为1460字节。
四、STN的精髓之二:连接策略
串行连接vs并行连接vs复合连接
微信采用的是复合连接
五、STN的精髓之三:IP&Port
这里的主要内容是:
5.1 IP&Port 的组成
在微信中,IP有多种来源类型。优先级从上而下分别为:
WXDNS IP
DNS IP
Auth IP
Hardcode IP
其中,WXDNS IP 是通过微信自建的 DNS 服务获得的IP列表,自建 DNS 对防劫持、有效期控制等有重要作用。
DNS IP 则是通过常规的 DNS 解析获得的 IP 列表。
Auth IP 是微信动态下发的保底IP列表。
而Hardcode IP 则是最终的保底IP列表。
总体而言,分为常规IP列表、保底IP列表两个类别。WXDNS IP、DNS IP 为常规列表,Auth IP,Hardcode IP 为保底列表。
在 Port 的选择上,微信服务在常规情况下提供2个端口,预防端口被*的情况。特别情况下,可以通过配置下发进行端口更新。
5.2 IP&Port 排序算法
1.早期的随机组合
2.后来的“以史为鉴”
3.再后来的“遗忘历史”
—————以下是实际操练——————-
六、运行demo(android版)
1. 从github下载源码:https://github.com/Tencent/mars
2. 在android studio中打开\mars\samples\android\marsSampleChat工程;
3. 将云服务改为本地服务:
步骤1:修改替换云服务域名marsopen.cn的NewDNS解析(MarsServiceStub.java),将ip地址改为本地电脑的 IP 地址;
步骤2:全局搜索字符串”marsopen.cn”,修改替换为”127.0.0.1”;
4. 启动Server:
进入mars源码目录下的samples/server,执行start_server.py脚本;
5. 安装marsSampleChat app到android手机,多台手机的话可以实现群聊功能
七、源码分析: