Mars

发布时间 2023-04-12 18:21:42作者: lvye1221

简介

腾讯推出的通讯协议库

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

开发文档

http://docs.wildfirechat.cn

 

移动端 库 的编译说明

https://github.com/wildfirechat/proto

 

野火论坛

http://bbs.wildfirechat.cn/

 

本地环境搭建

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排序

https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=2649286458&idx=1&sn=320f690faa4f97f7a49a291d4de174a9&chksm=8334c3b8b4434aae904b6d590027b100283ef175938610805dd33ca53f004bd3c56040b11fa6#rd

提到:

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 暂时采用此种方式实现,先用