Mars
简介
腾讯推出的通讯协议库
COMM:基础库,包括socket、线程、消息队列、协程等基础工具;
XLOG:通用日志模块,充分考虑移动终端的特点,提供高性能、高可用、安全性、容错性的日志功能;
SDT:网络诊断模块;
STN:信令传输网络模块,负责终端与服务器的小数据信令通道。包含了微信终端在移动网络上的大量优化经验与成果,经历了微信海量用户的考验。
开始编译
编译环境: 安装Visual Studio 2015、cmake、python2.7 编译:
python build_windows.py
所有的编译脚本都在libraries目录
示例程序 Sample 开始使用
环境:
python 2.x
目前下载的是 python 2.7.16
https://www.python.org/downloads/windows/
visual studio 2015
Android NDK 16b
https://developer.android.google.cn/ndk/downloads/older_releases.html
派生程序-野火IM
开发文档
移动端 库 的编译说明
https://github.com/wildfirechat/proto
野火论坛
本地环境搭建
proto | 野火IM的协议栈实现 | |
server | IM server |
http://docs.wildfirechat.cn/quick_start/server.html#%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2
Android的编译
在${mars}/mars/libraries/目录下执行
<code>python build_android.py</code>
重要关注点
https://mp.weixin.qq.com/s/obfHNHYXDZDMGrZd-TpRGA?
提到:
CDN组件则负责数据网络。但由于CDN涉及到腾讯内部的CDN服务,因此在Mars的开源列表中并没有包含CDN部分。
客户端的跨平台组件一般是指由C++等编写的代码,编译为各个平台的二进制链接库,然后通过平台提供的SDK调用和打包进App内。跨平台组件一般都是底层功能,特点是与平台无关、与UI界面无关,像第三方的游戏引擎、数据库等一般都以跨平台形式出现。
微信终端跨平台组件 Mars 系列(三)连接超时与IP&Port排序
提到:
TCP 协议应该是目前使用的最广泛的传输层协议,TCP 建立连接的”三次握手”与连接终止的“四次挥手”也广为人知。
而是某台服务器故障、繁忙、网络不稳定等因素,那75秒的时间只能尝试1个 IP&Port 资源,对于大多数移动应用而言,是不可接受的。我们需要更积极的超时重传机制!!!
然而,我们并不能修改 TCP 的协议栈,我们只能在应用层进行干预,设计应用层的超时机制。说干就干,这个时候你是否已经在构思新的、应用层的连接超时重传机制了呢?应用层的超时重传,典型做法就是提前结束 connect 的阻塞调用,使用新的 IP&Port 资源进行 connect 重试。但是,我们应该选择怎样的连接超时值呢?4秒?10秒?20秒?30秒?不同的应用场景会有不同的选择。我们来看一下常见的几种场景:
- 连不同 or 网络不可用等
- 服务器繁忙 or 中间路由故障等
- 基站繁忙 or 连接信号弱 or 丢包率高等
在第一种场景中,连接超时设置不会带来什么区别。在第二种场景中,部分服务器资源或路由不可用,我们希望连接超时能稍微短一些,使得我们能尽快的发现故障,并且通过更换 IP&Port 的方式获得可用资源或路由路径。而第三种场景则是在移动网络中经常遇到的弱网络的场景。在这种场景中,我们更换 IP&Port 资源也是无效的,因此希望连接超时能相对长一些,进行更多的TCP层的重传。(当然,也不是超时越长越好,后面的分析可以看到很多等待时长是效果低微的)
IP&Port 的组成
在微信中,IP有多种来源类型。优先级从上而下分别为:
WXDNS IP
DNS IP
Auth IP
Hardcode IP
新的ip负载均衡实现: “以史为鉴”和 “遗忘历史”
具体实现查看 Mars 源代码中的 simple_ipport_sort。
https://github.com/WeMobileDev/article/blob/master/微信终端跨平台组件%20Mars%20系列%20-%20我们如约而至.md
虽然最初的设计一直是秉承着业务性无关的设计,但在实际开发过程中仍然难免带上了微信的业务性相关代码,比较典型的就是 newdns 。为了 Mars 以后的维护以及保证开源出去代码的同源,在开源出去之前必须把这些业务性有关的代码抽离出来,抽离后的结构如下:
- mars-open 也就是要开源出去的代码,独立 git repo。
- mars-private 是可能开源出去的代码,依赖 mars-open。
- mars-wechat 是微信业务性相关的代码,依赖 mars-open 和 mars-private。
示例程序
https://github.com/Tencent/mars/wiki/Mars-sample-使用说明
关于微信的心跳机制
https://mp.weixin.qq.com/s/ghnmC8709DvnhieQhkLJpA?
尝试地方
微信开源终端跨平台
https://www.jianshu.com/p/6c9f116dad54
用域名提供服务避免不了DNS解析,但目前业界DNS有不少缺点,比较常见的就是域名劫持、解析转发和更新缓慢。
域名劫持就是请求一个域名,它返回了一个错误的IP。
解析转发常见于比较小的运营商,因为他们不一定有自己的DNS解析服务器。当进行一个DNS解析请求的时候,它会把请求转发到有DNS解析服务器的大运营商,这时初步IP已经发生改变,解析到的IP不是原来的IP了。
因为要有TTL的生存时间,所以更新比较缓慢。
微信有一个“NEW DNS”的概念,和HTTP DNS有同样的功能。
SetLonglinkSvrAddr 长连接地址配置
域名解析地址配置
SetLonglinkSvrAddr
腾讯Mars
std_login.cc L216
野火IM 代码中写到
\mars\libraries\mars_android_sdk\src\main\java\com\tencent\mars\stn\StnLogic.java"(285,31): public static native void setLonglinkSvrAddr(final String host, final int[] ports, final String debugIP); /** * DEBUG IP 说明 * setLonglinkSvrAddr,setShortlinkSvrAddr,setDebugIP 均可用于设置DEBUG IP * setLonglinkSvrAddr: 设置长链接的DEBUG IP; * setShortlinkSvrAddr: 设置短连接的DEBUG IP; * setDebugIP: 设置对应HOST(不区分长短链)的DEBUG IP; * * 优先级: * setDebugIP 为最高优先级 * 同一个接口, 以最后设置的值为准 */ /** * @param host 长链接域名 * @param ports 长链接端口列表 * @param debugIP 长链接调试IP.如果有值,则忽略 host设置, 并使用该IP. */
资料
Mars源码分析
https://segmentfault.com/a/1190000008964528?utm_source=tag-newest
SDK要求上层做域名解析.上层可以实现传统DNS解析,或者自己实现的域名/IP映射
问题及解决
不走newdns的方法
stn\config.h L26 行
//if do not use newdns IP, comment the macro #define USE_LONG_LINK
当前问题
服务器位于香港 阿里云,国外 正常运行,国内经常掉线
【思路一】域名 cdn 加速
WebSocket 与 Socket 的区别
https://www.cnblogs.com/Javi/p/9303020.html
当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。
WebSocket则是一个典型的应用层协议。
一般CDN都可以达到加速Socket的
https://zhidao.baidu.com/question/1951866957325426268.html
【思路二】中转服务器转发操作
将请求的地址 指向到国内阿里云 服务器,然后由 国内的阿里云 服务器转发到 国外服务器。
存在问题: 中转服务器不能承受太大的连接。
目前,2019-10-10 暂时采用此种方式实现,先用