mars源码Tcp分析链接

一、mars Tcp链接超时、心跳间隔

链接超时
 [ConnectImpatient, 473][MARS]_vecaddr size:4, m_timeout:10000, m_interval:4000, m_error_interval:4000, m_max_connect:3

1 host ip或者端口不可用 socket 也不进行尝试,如果域名直接dns解析失败不进行尝试,

2 IPConnectTimoutMode默认用的是FIXED 固定的,interval_默认4000ms
 laststart_connecttime = curtime - std::max(interval_, error_interval_);

 curtime = gettickcount();
 next_connect_timeout = int(((0 == lasterror) ? interval_ : error_interval_) - (curtime - laststart_connecttime));

 next_connect_timeout 为-1,当前时间减去laststart_connecttime

 next_connect_timeout小于interval_或error_interval_,timeout使用的是
 timeout = std::min(timeout, (int)interval_);
 next_connect_timeout>0就是大于interval_或error_interval_,timeout使用的就是next_connect_timeout
 timeout = std::min(timeout, next_connect_timeout);


重链 Reconnect

static unsigned long const sg_interval[][5]  = {
        {5,  10, 20,  30,  300},
        {15, 30, 240, 300, 600},
        {0,  0,  0,   0,   0},
};

 1 前台活动状态(forground-active),前台状态10分钟以上,可以认为是App正常运行状态

 前台状态小于1分钟,15s重连一次
 前台状态大于等于1分钟,小于10分钟,30s重连一次;
 前台状态大于等于10分钟,4分钟一次;


 2 后台活动状态(background-active),切后台10分钟内为后台活动状态

     background-active: 5分钟重连一次

 3 后台非活动状态(inactive),切到后台10分钟后状态为inactive。

   inactive: 0s,60s,120s,240s,360s,480s,600s,600s...


 心跳

active: 以最小间隔发送心跳包,设定为3.5分钟
#define MinHeartInterval (3  * 60 * 1000 + 30 * 1000)   // 3.5 minute

inactive:非活动状态: 每次递增20s,直到心跳最大间隔 10分钟
__GetNextHeartbeatInterval 如果smartheartbeat创建获取智能心跳时间


那么,如何判断一个心跳间隔有效呢?微信采用的方案是使用固定短心跳直到满足三次连续短心跳成功,则认为这个间隔有效。
探测过程大致为:60 秒短心跳,连续发 3 次后开始探测,90,120,150,180,210,240,270
前后台策略


另外,考虑到 App 在前后台对于长连接的需求是不同的。因此当微信在前台活跃态时,采用了 固定心跳机制;
在前台熄屏态或者后台活跃态(进入后台 10 分钟内)时,先用几次最小心跳维持长连接,然后进入 自适应心跳机制;
在后台稳定态(超过 10 分钟),则采用自适应心跳计算出来的最大心跳作为固定值。
如果在运行过程中,发生了心跳失败,则进行重连。同时将心跳间隔调整为断线前间隔减去 20s,
重新走自适应心跳;如果连续 5 次均失败,则以初始心跳 180s 继续测试。

二、mars tcp链接

NetCore::NetCore 
NetCore::Singleton是个单例,会初始化 __InitLongLink
LongLinkTaskManager->CreateLongLink 创建默认长链接配置
并且开启std __OnLongLinkNetworkError的网络探测
zombie_task_manager_->StartTask.开启一个延迟任务执行
网络变化时OnNetworkChange执行StartTask,从新创建新的Socket


NetCore::StartTask
获取GetLongLink
GetLongLink->LongLinkMetaData->LongLinkChannelFactory
new LongLink->__RunConnect->config_.host_listGetLongLinkItems->__MakeIPPorts 获取ip_items地址把数据塞给ConnectImpatient

__RunConnect->ConnectImpatient
ComplexConnect::ConnectImpatient 
1 ConnectCheckFSM::ECheckOK == vecsocketfsm[i]->CheckStatus()
2 retsocket = vecsocketfsm[i]->Socket();
根据对比串行连接与并行连接,通过复合连接获取SOCKET
ConnectCheckFSM::ECheckOK == vecsocketfsm[i]->CheckStatus()
选出连接成功的获取index,更行_conn_profile

三、SDT网络探测

NetCore::Singleton是个单例,会初始化 __InitLongLink
更改连接IP和端口信息__OnLongLinkNetworkError

ShouldNetCheck 组合IP和端口组合成 check_ipport_list
sdt::StartActiveCheck()  插入check_list列表中 // 检测网络,为啥静态方法
SdtCore::__RunOn执行 StartDoCheck探测,对象什么时候创建的__RunOn
tcp_send以NonBlock进行写入,for循环串行,noop_send
ReportNetCheckResult 上报checkresult_profiles  通过JNI上报给端上

mars源码Tcp分析链接_第1张图片
mars源码Tcp分析链接_第2张图片

你可能感兴趣的:(音视频,c++,c语言)