微信的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 系列(一) - 高性能日志模块xloghttp://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手机,多台手机的话可以实现群聊功能

七、源码分析: 

微信mars学习笔记相关推荐

  1. PC微信hook学习笔记(一)—— 获取个人信息

    PC微信hook学习笔记(一)-- 获取微信个人信息 1 起步 2. 获取基址 2.1 用CE查看个人信息 2.1.1 获取昵称基址 2.1.2 dll模块基址 2.2 用OD查看个人信息 2.3 内 ...

  2. 微信开发学习笔记01

    最近几天做了一下微信开发,总结了一些经验和教训. 首先是微信token链接,最开始连接的时候总是出现token连接失败,总以为是设置的不对,结果第二天就好了.而且发现,如果上传的代码(我用的是新浪云) ...

  3. java微信自动回复机器人开发(java微信开发学习笔记3)

    微信自动回复机器人原理很简单,获取用户发送到后台的数据,然后调用机器人的api进行回复即可.我使用的茉莉机器人,官网地址如下: http://www.itpk.cn/ 茉莉机器人的api:http:/ ...

  4. Android微信分享学习笔记

    说明 只是简单的介绍通过IWXAPI的 sendReq将请求发送到微信终端,分享信息. 基本参考微信开放平台微信开放平台接入指南总结部分API. 介绍 微信分享及收藏是指第三方App通过接入该功能,让 ...

  5. c++微信读书学习笔记——很久以前随便写的

    1,声明函数参数的传递简称传址(void声明里面加&) #include<iostream> #include <vector> #include<fstream ...

  6. 微信支付学习笔记之调用com.github.binarywang.wxpay.service接口

    接口链接:https://github.com/binarywang 使用步骤: 将HttpServletRequest转成 ip /*** 获得请求地址ip* @param httpservletr ...

  7. 【WeChatPay】微信支付V3学习笔记(一)

    微信支付学习笔记 一.获取相关信息 二.API V3 2.1.引依赖 2.2.写配置类 2.2.1.获取商户的私钥文件 2.2.2.获取签名验证器 2.2.3.获取http请求对象 2.3.下单显示微 ...

  8. 微信小程序开发:学习笔记[8]——页面跳转及传参

    微信小程序开发:学习笔记[8]--页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...

  9. SAP FSM 学习笔记(三) 在微信里发起SAP FSM客户预约

    这个系列的第一篇文章,SAP FSM 学习笔记(一) : 使用API消费FSM的数据,我们学习了如何使用SAP FSM提供的nodejs SDK,第二篇文章 SAP FSM 学习笔记(二) : SAP ...

最新文章

  1. 2020年涨薪26-30%,能实现吗?18%数据科学家是这么期待的
  2. 解决Windows对JDK默认版本切换问题
  3. oracle如果为空替换为0,oracle 如何把0转为null
  4. java数组子类型_[改善Java代码]数组的真实类型必须是泛型类型的子类型
  5. windows 从端口找应用
  6. 《操作系统真象还原》-阅读笔记(中)
  7. android builder布局方式,android – AlertDialog.Builder与自定义布局和EditText;无法访问视图...
  8. 将某表某列数据复制到另一张表的某列
  9. Win11系统的显卡驱动安装的详细方法步骤
  10. 天气预报:强势力的“.fans+体育”旋风正席卷全球!
  11. Vmware workstation 安装教程
  12. bzoj4816 Sdoi2017 数字表格
  13. Threejs 字体单独发光
  14. 评分卡分箱原则及单调性
  15. linux 建立http连接失败,【linux】http请求建立连接的时候为啥是tcp三次握手,而不是二次或者四次?...
  16. Paddleocr部署进一步优化
  17. PR放入视频音频后没声音,及提示MME设备内部错误的解决办法
  18. html5微信录音文件,微信H5录音实现
  19. (二)WaveDrom Editor使用教程
  20. google android模拟器多系统,Android模拟器安装教程_体验google_Android系统手机

热门文章

  1. 微信小程序封装图片合成水印
  2. python基础知识补充
  3. IOS微信浏览器input输入账号键盘闪烁
  4. android语音控制歌曲播放,发条 - 支持音乐聚合搜索,歌单导入,语音控制的 APP - Android 应用 - 【最美应用】...
  5. 樱桃是樱花的果实吗?
  6. 基于DNN-ML的3D全息交互
  7. 塔式、机架式、刀片式服务器
  8. ★大塚 愛【LOVE IS BORN】~3rd Anniversary 2006~のライブDVD★
  9. Xcode 10 无开发者账号通过无线网络真机调试
  10. 用LINQ结合CAML查询 Sharepoint 数据库内容