这是近期参与的一个云推送项目调研的一点东西,贴上来做个备份:)
如需转载,请注明出处:)
综述
所谓的心跳机制,就是周期性的给服务器发送一个数据包,避免该连接上长期没有数据传送,被传输网络中的防火墙或者NAT等设备中断,就是当一个TCP会话的两个连续报文到达防火墙的时间间隔大于该会话的保持时间时,为了保证网络的安全性,防火墙会从会话表中删除相应的会话信息,后续报文到达防火墙后,防火墙根据自身的转发机制,丢弃该报文,导致通讯中断,必须重新建立连接。
为了保持这个长连接不被防火墙删除,需要在没有数据传送时,通过周期的发送心跳信息来保持会话连续。即心跳的目的:
- 保活链接。
- 检测设备网络状态,保持通讯顺畅。
心跳机制对于客户端来说,是需要付出一些代价的,比如:
- 网络流量。
- 电量。
要减少损耗,一方面要减少每次心跳发送的数据量,更重要的是要减少发送心跳包的次数,因此心跳周期的设置成为关键要素:
- 如果心跳周期过短,那么会频繁的发送心跳,会造成待机时间减少,增加网络流量。
- 如果心跳周期设置过长,那么如果网络出现问题的时候就无法及时的检测的异常并清理资源,发起重连,导致推送消息的延迟,更关键的是过长的心跳会导致防火墙的强制关闭。
所以需要进行权衡,找到一个最合适的心跳时间,但由于网络情况的复杂,我们无法预先知道这个最合适的时间,所以需要找到一种自适应(adaptive)的智能算法来进行猜想。
- 算法需要考虑到以下场景:
- 当前的通讯网络拥塞造成的心跳超时或者服务器挂掉。
- 用户切换网络或者防火墙会话保持时间改变。
初步设计
首先需要确定心跳间隔的最小值min和最大值max,单位为秒,这是我们经过算法得到的心跳间隔不可以超过这个范围。
max和min的确定需要经过实际的统计和测试才能得出,可先初步指定,后续酌情设置,最终的心跳时间会落在这个范围之内。
算法在客户端上实现,因为心跳消息是由客户端发起的,只有客户端能检测到心跳消息的发送失败。
算法流程简述如下:
1)客户端请求goload接口,得到上述提到的min和max,还有T和N和M,后续会介绍。
客户端还需维护3个变量,分别为:当前的心跳间隔cur,min'和max',后续会介绍到。
初始设置如下:
- cur = (min + max) / 2
- min' = min
- max' = max
2)连接tcp server,第一次发送心跳后间隔cur时间后发送第二次心跳。
3)如果第二次发送后服务端响应成功,那么代表网络顺畅且当前的时间间隔没有被NAT杀掉,那么更新数据:
- min' = cur
- cur = (max' + cur) / 2
4)以cur作为心跳间隔继续发送心跳。
5)如果发送心跳没有得到服务端响应(客户端应会设置一个read超时时间,需要酌情设置),则代表出现网络问题,可能是网络拥塞出现了读超时,那么客户端可以重新试图发送心跳N次,间隔为M秒,N和M酌情设置,如果发现还是超时,则尝试重连;也可能是当前的心跳间隔比NAT会话时间大,或者是设备的网络不可用,那么需要进行重连,重连前需要更新下列数据并回到第2个步骤:
- max' = cur
- cur = (cur + min') / 2
6)在经过了若干次计算之后,会得到一个最优的心跳间隔,之后就不需要进行计算了,条件如下:
- cur - min < T or max - cur < T
- T为一个阈值,第1点有提到,可酌情设置。
结论
使用智能心跳策略有利于节省电量和流量,百度也支持了这种策略,但有以下一些小问题:
-
在探测的阶段的重连次数会多一些。
-
增大客户端的逻辑处理。
-
在用户网络情况多变的场景也许不稳定。
相关推荐
心跳计数系统的方案设计.pdf
win32下心跳监控服务器和客户端设计模型,有服务器和客户端程序,可以直接编译连接,给要设计心跳服务器的人做参考,采用可等待定时器和事件机制
Linux环境下实现双机热备用的心跳设计
springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合...
作品:proteus仿真--基于单片机的脉搏心跳检测设计 使用材料:STM32F103、数码管、LCD、按键 平台:proteus 和 keil 技术实现:按键模拟人的脉搏,每按下一次按键,则相当于心跳一次,心跳的次数用数码管显示,...
本设计要解决的问题是提供一种基于STM32单片机测量心跳(心率MAX30102)和呼吸频率(声音传感器)的车用安全带预警OLED显示的方法,该预警方法包括下述步骤: 步骤一:读取心跳频率测量模块和呼吸频率测量模块采集的模拟...
arduino 健康心跳检测仪-_智能家居物联网开发PCB设计方案.rar
智能心跳机制:解决网络的不确定性
此文章主要简介一下webSocket心跳检测机制的实现思路以及代码实现,第一次发布博客如有不足之处,敬请谅解,webSocket心跳检测实现有很多方法 我只是为大家说一下我自己的实现思路
心跳包在核电仪控网络安全性设计中的研究.pdf
通过对PLC心跳信号的处理,可以自由设定交互时间,在交互时间内,没有收到PLC的心跳信号,就判断与PLC的连接断开。
winform socket通讯和心跳包,
2.1.8低功耗设计 无需外部电源供电,设备在平时处于深度休眠状态,每4小时(可配置)定时唤醒发 送心跳数据。4节干电池保守估计可使用半年以上. 2.1.9远程固件升级 门锁可以通过NBIOT在线进行固件升级,升级更新时间...
实现了心跳包的接收 和 发送功能 代码包含客户端和服务器端
c#心跳程序c#心跳程序c#心跳程序
EMD呼吸心跳仿真实例(MATLAB) 基于 EMD、CEEMDAN 算法比较的呼吸心跳信号检测实例(去除呼吸旁瓣干扰,测量心跳频率) 比较了EMD与CEEMDAN算法的优劣 呼吸信号旁瓣通过 Sa() 函数旁瓣模拟 流程: 1、仿真心跳呼吸...
项目包含有mina的服务端与客户端,客户端发送心跳包,服务端响应心跳包
包含定时器和心跳机制,以及主备板间的协商机制
心跳程序,能实现定时接收心跳,同时能够处理接收的数据。
心跳检测的思路及代码 外网服务端保存内网服务端会话的有效性以及平台上监控所有内网的网络状况,模仿心跳机制实现,这里在做一点叙述,关于思路和具体实现.