zoukankan      html  css  js  c++  java
  • 互联网的长在线、心跳和断线重连

    概述

            目前IM软件有一个基本的功能就是长在线,即只要有网络就保持登录,然而,网络状态是无法预测的,所以IM软件经常会有”离线“状态,尤其是手机客户端。长在线这个功能依赖断线重连完成。

            通常,网络不稳定是造成不能长时间在线的主要原因,还有比如:服务器强制注销客户端、次客户端被主客户端踢。目前的qq和飞信都有断线重连机制。有时候IM软件自动完成登录,有时候需要用户手动登录。所以,断线重连是一个广泛的概念。可以这么理解:除了从登录界面进去的登录,都可以称之为断线重连。

    断线重连的定义

            使得IM软件能够长在线,或者短时间内掉线,用户无感知。

            广义断线重连:用户已经成功登录IM客户端,用户将程序放到后台、或者手机重启,IM软件再次进入前台,软件应帮助用户实现自动登录。

            狭义的断线重:客户端的网络状况是不可预知的,可能从2G切换到3G或者WiFi,或者又切换到2G,甚至“飞行模式”(iOS设备)。客户端要及时对网络的变化做出反应,即尝试进行登录。

            总之:断线重连,一般是网络原因引起的,目的是让IM软件维持在线。

    实现方法

            IM客户端始终尽可能的保持连接跟服务器的连接,客户端维护登录状态,以便断线重连。从逻辑层次上来说,断线重连的逻辑是基于登录的逻辑的,首次登录成功后,都有可能有断线重连。断线重连,实质上分为两步:一、使客户端断线;二、让客户端重连服务器。一般来说这两步是一个有前后顺序,完整的过程。

    一、使客户端断线,即让客户端处于“未连接”状态。以下情况将触发这个事件:

        1.网络切换,如从WiFi切换到4G,网络事件。

        2.网络连接失败、网络不可用。

        3.心跳失败、心跳超时,失败统称心跳失败。

        4.IM软件后台运行即将结束。

    二、让客户端重连服务器,客户端根据以下几种情况实现重连服务器。

        1.iOS系统“网络可用”的通知

        2.IM软件切换到前台,用户触发事件。

        3.网络切换,如从WiFi切换到4G,网络事件。

        4.心跳失败的事件。

        5.客户端重新启动事件。

    断线重连的场景可以总结为下面几个:

        1. 重新启动(自动登录)

            属于广义的断线重连,需要提前加载用户缓存,保证用户到达主界面后能看到历史信息。

        2. 网络错误,网络切换

            网络连接失败有很多种,不同的场景,客户端要使用不同的逻辑处理。

        3. 心跳失败

             心跳超时,失败统称心跳失败。这个案例说明当前客户端——服务器连接已经损坏,或者当前用户身份有变化。心跳失败后首先将客户端离线,然后进行断线重连操作,避免心跳失败和网络错误事件一并发生,造成两次登录。

        4. 网络可达或者切换到前台

            为了避免重复登录,当IM软件处于“登录成功”、“连接中”或者“已注销”的几个状态的时候,客户端忽略“网络可达或者切换到前台”的事件。

    客户端心跳

            IM基本的底层逻辑中有“心跳”概念,即客户端定时向Server发一个信令包,表示客户端还“活”着。注意,是客户端发起的。心跳是一个拟人的比喻,跟人的心跳相似。那么心跳终止了会发生什么事情呢?分为两种情况:Server主动断开socket,客户端主动断开socket。

        1. Server主动断开socket

             Server只是接收客户端发起的心跳。假如,Server长时间没有收到客户端的心跳,Server认为客户端已经“死了”,主动断开这个连接。此时客户端可能就是假在线了。

        2. 客户端断开socket

            客户端对待心跳,要比Server麻烦一些。客户端要关注两个值:

            心跳间隔值,即客户端多长时间发一次心跳?

            心跳的超时时间。客户端发送一次心跳,如果长时间得不到Server应答,代表网络糟糕。客户端需要断开socket,主动离线。

     
          很明显,第二点就是客户端主动断开的情况,一般情况下,超时时间为60秒。
          网上也有争论:到底是否需要心跳,微信是没有心跳的,qq和飞信有心跳。也有专家说心跳包已经影响到移动网络,因为心跳是定时频繁发送。
     

    心跳失败也会引起断线重连

    下面是“心跳失败”引起的断线重连的流程图

    信令风暴

            互联网应用的心跳包除了宣告终端在线外,还有一项重要的任务,就是提供终端的即时地址,方便应用服务器的寻址。         有了互联网应用的心跳机制,应用服务器可以及时下发(Push)用户相关的信息,比如微信中的短消息、图片或者语音等。心跳包也会带来很多副作用,比如终端更为费电,还可能给移动通信网络带来信令风暴。

            看起来很完美的心跳机制,为什么会给移动网络带来信令风暴呢?原来,移动通信网络中由于用户众多、资源稀缺,每个用户都是动态占用资源,比如IP地址以及无线信道。每次发送心跳包,都需要移动通信网络为用户分配资源,分配的过程体现在信令的发送和接收上。一次心跳包的发送过程,牵涉的信令多达几十条。 随着互联网APP的普及,大量的终端周期性地发送心跳包,效果类似于IP网络中的DDOS,必然对移动通信网络设备带来冲击,造成拥塞等情况,这种现 象就是信令风暴。

    https://blog.csdn.net/kobejayandy/article/details/46701251

  • 相关阅读:
    在多线程中使用静态方法是否有线程安全问题(转载)
    为什么乐观的人多能成功呢?
    每个人都是超级英雄-《技巧:如何用一年的时间获得十年的经验》
    003|再谈10000小时,三板斧破四困境
    002|也谈10000小时
    在职场中如何通过讲故事,影响他人、支持自己(下篇)
    全面解读:微信服务号升级和群发增至4条的应用方法
    Technical reading July-15
    read links July-14
    Technical news July-11
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4186399.html
Copyright © 2011-2022 走看看