心跳

作者: Amor瑾年v | 来源:发表于2019-11-08 17:54 被阅读0次

什么是心跳?

心跳就是用来检测TCP连接的双方是否可用。但是TCP本身不是有就一个keepAlive机制么,那是因为TCP的keepAlive机制只能保证连接的存在,但是并不能保证客户端以及服务器的可用性。(例如某台服务器因为某些原因导致负载过高,CPU100%,无法响应任何业务请求,但是使用TCP探针则仍旧能够确定连接状态,这就是典型的连接活着但是业务提供方已死的状态。)

这个时候心跳机制就起到作用了:

  • 我们客户端发起心跳Ping(一般都是客户端),假如设置在10秒后如果没有收到回调,那么说明服务器或者客户端某一方出现问题,这时候我们需要主动断开连接。
  • 服务端也是一样,会维护一个socket的心跳间隔,当约定时间内,没有收到客户端发来的心跳,我们会知道该连接已经失效,然后主动断开连接。

其实我们真正需要心跳机制的原因其实主要是在于国内运营商NAT超时。

那么究竟什么是NAT超时呢?

原来这是因为IPV4引起的,我们上网很可能会处在一个NAT设备(无线路由器之类)之后。
NAT设备会在IP封包通过设备时修改源/目的IP地址. 对于家用路由器来说, 使用的是网络地址端口转换(NAPT), 它不仅改IP, 还修改TCP和UDP协议的端口号, 这样就能让内网中的设备共用同一个外网IP. 举个例子, NAPT维护一个类似下表的NAT表:


2702646-cefd86afd8b99939.png

NAT设备会根据NAT表对出去和进来的数据做修改, 比如将192.168.0.3:8888发出去的封包改成120.132.92.21:9202, 外部就认为他们是在和120.132.92.21:9202通信. 同时NAT设备会将120.132.92.21:9202收到的封包的IP和端口改成192.168.0.3:8888, 再发给内网的主机, 这样内部和外部就能双向通信了, 但如果其中192.168.0.3:8888 == 120.132.92.21:9202这一映射因为某些原因被NAT设备淘汰了, 那么外部设备就无法直接与192.168.0.3:8888通信了。
我们的设备经常是处在NAT设备的后面, 比如在大学里的校园网, 查一下自己分配到的IP, 其实是内网IP, 表明我们在NAT设备后面, 如果我们在寝室再接个路由器, 那么我们发出的数据包会多经过一次NAT.

国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断。

而国内的运营商一般NAT超时的时间为5分钟,所以通常我们心跳设置的时间间隔为3-5分钟。

接着我们来讲讲PingPong机制:

很多小伙伴可能又会感觉到疑惑了,那么我们在这心跳间隔的3-5分钟如果连接假在线(例如在地铁电梯这种环境下)。那么我们岂不是无法保证消息的即时性么?这显然是我们无法接受的,所以业内的解决方案是采用双向的PingPong机制。

2702646-6e51be4cf4ba7b11.jpg

当服务端发出一个Ping,客户端没有在约定的时间内返回响应的ack,则认为客户端已经不在线,这时我们Server端会主动断开Scoket连接,并且改由APNS推送的方式发送消息。
同样的是,当客户端去发送一个消息,因为我们迟迟无法收到服务端的响应ack包,则表明客户端或者服务端已不在线,我们也会显示消息发送失败,并且断开Scoket连接。

还记得我们之前CocoaSyncSockt的例子所讲的获取消息超时就断开吗?其实它就是一个PingPong机制的客户端实现。我们每次可以在发送消息成功后,调用这个超时读取的方法,如果一段时间没收到服务器的响应,那么说明连接不可用,则断开Scoket连接

最后就是重连机制:

理论上,我们自己主动去断开的Scoket连接(例如退出账号,APP退出到后台等等),不需要重连。其他的连接断开,我们都需要进行断线重连。
一般解决方案是尝试重连几次,如果仍旧无法重连成功,那么不再进行重连。

如果 Model 过多,可能导致 APP 打包后的体积骤增,但 IM 服务所使用的 Model 非常少,比如在 ChatKit-OC 中只用到了一个 Protobuf 的 Model:Message对象,对包体积的影响微乎其微。

参考文章涂耀辉ios即时通讯,感谢作者的无私分享。

相关文章

  • 心跳

    文/安澜 我撑着伞 走过一条人潮汹涌的街道 一朵春寒料峭的花 轻轻落在我的肩头 于是 ...

  • 心跳

    上班都是玩的心跳 从早上赶公交 挤公交 到中午吃饭叫餐 38 39 40 42 43 44 和同事一起叫的号...

  • 心跳

    夜里静静听着—— 我的心跳, 扑通、扑通、扑通, 有节奏、力度,又很弱小。 扑通、扑通、扑通, 像大大地喘着气, ...

  • 心跳

    感受几声心跳 头脑中的噗通 揣摩细胞频率 手随机械牵引 缓慢向前挪动 终究无力停留 唯有一段音韵 唤醒时间知觉 偶...

  • 心跳

    停电的下午 雨声淅淅沥沥 窗口的光打在书上 忽明忽暗 文字在跳跃 我开始摇晃 听 这是心跳的声音 听,心跳在拨弄身...

  • 心跳

    冰凉的夜里 想伸手打开冰凉的手机 因为手机里有一颗滚烫的心 思念不停,它律动不止 砰,砰,砰 有很多次,想找你 说...

  • 心跳

    多少次 当我安静下来时 天空也随之停止了摆动 我注视着的方向 是我回不去的岁月 和无忧的童年 远处的鹧鸪声 一声、...

  • 心跳

    阴雨天 趴在床上 听雨声与心跳声相合 活着 感受世间沧桑 是对生命的负责 还是对自己的放弃。

  • 心跳

    你陪我玩的心跳 刺激又震颤 开始的完美 转而就换了结局 对不起 再见

  • 心跳

    爱你的感觉 像心跳时刻产生共鸣 呼吸随时都形成回音 在我的许愿瓶中/装点成那最美的梦

网友评论

      本文标题:心跳

      本文链接:https://www.haomeiwen.com/subject/uclwbctx.html