微信mars学习笔记

微信的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手机,多台手机的话可以实现群聊功能

七、源码分析:
方法makesureLongLinkConnected
文本消息发送流程

Mars微信官方的终端基础组件,是一个使用 C 编写的业务性无关、平台性无关的基础组件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。主要包括以下几个部分:COMM:基础库,包括socket、线程、消息队列、协程等基础工具;XLOG:通用日志模块,充分考虑移动终端的特点,提供高性能、高可用、安全性、容错性的日志功能;SDT:网络诊断模块;STN:信令传输网络模块(核心模块),负责终端与服务器的小数据信令通道。包含了微信终端在移动网络上的大量优化经验与成果,经历了微信海量用户的考验。Mars 最早起源于微信的实际发展需要。由于微信多平台、亿级用户,微信基础功能的修改影响重大。但不同平台不同的实现导致众多平台上很难统一,一方面不利于质量把关,可能存在重大隐患,一方面也不利于微信对基础研究的深入。因此,微信开始了跨平台基础组件的开发,并且在微信中沉淀多年。随着基础组件的发展与稳定,他们希望通过开源的力量进一步的提升微信的基础,并且也期待行业的互相交流与促进,因此启动了Mars项目。微信的网络层设计到很多不同的业务,在微信中使用到的绝大部分功能,都是基于Mars提供的网络组件,包括文本消息、语音消息、朋友圈等核心功能。只有少部分业务不在范围内,例如VOIP、Webview等。微信中使用到的网络服务,大体分为两种类型:信令网络、数据网络。其中STN负责信令网络,CDN组件则负责数据网络。但由于CDN涉及到腾讯内部的CDN服务,因此在Mars的开源列表中并没有包含CDN部分。SDT网络诊断模块提供了最基础的检测能力,需要由使用者自己组合使用。各个平台的Reachability API能反映的情况有局限,无法应对复杂的网络诊断,事实上有一些开源项目就是为了替换系统API。微信由于自身特点对网络诊断要求很高,因此将它作为基础的跨平台组件进行开发维护。STN是微信的信令传输网络,也可以认为是小数据传输网络,是微信日常中使用最频繁的网络通道。在开源设计上,STN抽象了微信的使用模型,使得STN成为业务无关的网络通道,并且应用到了包括微信在内的多个腾讯内部应用中。与AFNetworking、Retrofit、Okhttp等框架不同,STN不仅是跨平台的网络解决框架,更是着重了“移动互联网“这一特点,结合移动互联网的不稳定特性,做了大量的优化工作,并且这些优化都是经过了微信长时间的验证和使用的。除此之外,STN中还包含了很多其他方面的实用设计,包括自定义DNS、容灾设计、负载考量、APP的前后台考量、休眠机制考量、省电机制等等。STN 比其它网络框架提供更多的功能:数据监控:STN提供了许多数据回调接口,使得应用可以基于这些网络数据,建立统计分析、监控等工具来管理应用的实际网络情况;问题定位:STN中含有很多关键日志,并且日志的设计已经帮助微信定位了很多的网络层问题。结合Mars提供的XLOG日志机制,应用可以运行时也打开日志,非常方便定位;参数配置:STN中将很多参数抽离为配置,使得应用可以根据自己的情况进行修改。网络通道上,目前STN提供了长连、短连两种类型的通道,用于满足不同的需求。使用STN后,应用开发者只需关注业务开发。移动互联网的各种“坑”则可以交由STN帮你处理。 标签:腾讯  微信
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值