TCP keepalive 和 http keep-alive 以及心跳保活

TCP keepalive 和 http keep-alive 以及心跳保活,第1张

很多人认为,TCP协议有KeepAlive机制,为何基于它的通讯链接仍然需要在应用层实现额外的心跳保活呢?本文将从移动端IM的角度告诉你,即使使用的是TCP协议,应用层的心跳保活仍旧必不可少。

在使用TCP长连接的IM服务设计中,往往都会涉及到心跳。心跳一般是指客户端每隔一定时间向服务端发送自定义指令,以判断双方是否存活,因其按照一定间隔发送,类似于心跳,故称为心跳指令。

TCP是一个基于连接的协议,其连接状态是由一个状态机进行维护,连接完毕(三次握手)后,双方都会处于established状态,这之后的状态并不会主动进行变化。也就是说,即使上层不进行任何调用,一直使TCP连接空闲,那么它仍然是保持连接的状态。这个时候就需要一种机制来检测TCP连接的状态,KeepAlive就是背负这个使命出现的。

那么问题来了,KeepAlive是用来检测TCP连接状态的,那为什么还需要心跳呢?这里就需要考虑一种情况了,假如某台服务器因为某些原因导致负载超高,CPU100%,无法响应任何业务需求,但是使用TCP探针仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态,对客户端而言,这时最好的选择就是断线后重新连接其他服务器,而不是一直认为当前服务器是可用状态,一直向当前服务器发送些必然后失败的请求。

从上面我们可以知道,KeepAlive并不适合检测双方存活的场景,这种场景还得依赖于应用层的心跳。应用层的心跳有着更大的灵活性,可以控制检测时机、间隔和处理流程,甚至可以在心跳包上附带额外信息。从这个角度而言,应用层的心跳的确是最佳实践。

TCP KeepAlive用于检测连接的死活,而心跳机制则附带一个额外的功能:检测通讯双方的存活状态。

从上面我们可以得出结论,目前而言,应用层心跳的确是检测连接有效性,双方是否存活的最佳实践,那么剩下的问题就是怎么实现。

最简单粗暴的方法是定时心跳,如每隔30秒心跳一次,15秒内没有收到心跳包则认为当前连接已失效,断开连接并进行重连。这种做法最直接,实现也简单。唯一的问题就是耗电和耗流量。以一个协议包 5 个字节计算,一天收发 2880 个心跳包,一个月就是 5 x 2 x 2880 x 30 = 08 M 的流量,如果手机上多装几个 IM 软件,每个月光心跳就好几兆流量没了,更不用说频繁的心跳带来的电量损耗。

既然频繁心跳会带来耗电和耗流量的弊端,改进的方向自然就是减少心跳频率,但也不能过于影响连接检测的实时性。基于这个需求,一般可以将心跳间隔根据程序状态进行调整,当程序在后台时(这里主要指安卓),尽量拉长心跳间隔,5分钟、甚至10分钟都可以。

而当App在前台时则按照原来规则 *** 作。连接可靠性的判断也可以放宽,避免一次心跳超时就认为连接无效的情况,使用错误积累,只在心跳超时n次后才判定当前连接不可用。

修改Teredo状态。
不去线上模式服务器暂时无法使用解决方法:修改Teredo状态。
在以上问题出现之后NAT类型会提醒Teredo错误,这样就只能修改Teredo的状态。
在以下路径计算机配置-管理模板-网络-TCPIP设置-IPv6转换技术,最后的末端来启动Teredo的默认限定,最后状态要是企业客户端。

什么是心跳线
心跳线是用于连接A、B两台服务器间的网线。在这两台服务器A、B中,A为工作机,B为备份机,它们之间通过一根心跳线来连接。一般在服务器上都配有两块网卡,其中一块专门用于两台服务器(节点)间的通讯。安装在服务器上的软件通过心跳线来实时监测对方的运行状态。一旦正在工作的主机A因为各种硬件故障,如电源失效、主要部件失效或者启动盘失效等导致系统发生故障,心跳线会反映给互为备份的另外一台主机,主机B可以立即投入工作。这样可以在最大限度上保证网络的正常运行。这也称为“心跳检测”。心跳线主要利用一条RS-233检测链路来完成,采用Ping方式检测验证系统Down机检测的准确性。

 不仅是苹果,绝大多数智能手表和手环都是采用这一技术,但通常都是非医疗级别的产品,只能是作为一种参考数据。在心率测量上,还有另一种方式--电极式,大多数心电图仪等能达到医疗器械级别的产品会采取这种技术。采取光电式主要通过光反射来测量心率:它是根据心脏跳动时,人体全身血管会有微小波动的原理,射出一束光到人的手腕上,并用摄像头观察反射的阴影。如果其中有微小变化,则认为心脏跳动一次。
与电极式测量相比,光电式测量可以单手 *** 作,不需要像电极式方式那样需两个触点也即双手来检测数据,这样可以实现主动读取数据和远程读取数据,更适合于配合云端大数据的服务。这也是它被广泛应用于可穿戴设备上的原因。
看似受追捧的技术,实则面临着许多问题。
主要问题
在活动中利用光电式测量心率必须克服五个对准确性产生影响的基础性问题:
1、光线干扰
2、肤色
3、交叉问题
4、传感器在人体上的位置
5、低灌注
下面我们来具体看一下这五个方面的具体问题。
光线干扰
事实上,光电式心率测量设备最大的技术障碍是如何将生物特征信号从干扰中分离出来,特别是运动干扰。不幸的是,当把光线射入一个人的皮肤时,只有一小部分光量子返回给传感器,并且收集的所有光量子,只有百分之一或千分之一是由心脏收缩的血流量调节的,剩下的都分散在非搏动性生理物质上,例如皮肤、肌肉、肌腱等等。因此,当这些非搏动性生理物质四处移动,比如在锻炼或者日常生活活动中,由此导致的光线随着时间变化运动躁动分散是很难从光线随着真实血流量的分散中区分出来的。周围光线干扰还加剧这个问题的严重性,比如随着时间的变化,太阳光的干扰可以完全渗透到光电探测器中,甚至创造出近似生理性质的脉动信号。
肤色
人类拥有非常多种不同的漂亮肤色,多到以至于菲氏量表为肤色数值分类和对紫外线的反应而提供了7个类型的标准。不同的肤色对光的吸收是不同的,因此每一种肤色的特点在于都有不同的吸光图谱。那么,这意味着光电式心率测量设备传感器捕获的光的强度和波长是取决于穿戴传感器的人的肤色的。例如,深色皮肤吸收绿色光较多,这也表明了为什么大多数设备采用绿色LED作为光线发射器,限制了透过深色皮肤准确测量心率的能力的问题。这同样暴露出透过纹身的皮肤测量心率的问题,这也是苹果被人们诟病的“纹身门”,手腕有纹身的苹果手表用户发现显示屏上的数据显示非常微弱,甚至没有。
交叉问题
光电式心率监测器存在由于周期性活动期间的运动而产生的交叉干扰方面的问题,这个问题面临的最大的挑战是这种活动带来持续性的相同重复的动作。这点在记录慢跑和跑步期间的步伐频率时最常见,因为这些数据通常与心跳频率(140-180下/步数每分钟)处于同一个基本区间里。许多光电式心率监测设备面临的这个问题使得运算法则很容易将通过光电监测数据录入的步伐速率错误解读成心率。这就是为人所知的“交叉问题”,因为在图表上查看这些数据时,当心率和步伐速率发生重叠,许多光电式心率监测设备倾向于锁定步伐速率并将其显示为心率,尽管心率可能会在重叠后发生巨大改变。这个交叉干扰的问题在苹果表上体现很明显。

代码就算了。搜索一下,大把UDP的实现的。
客户端,定时给服务器发送一个表明自己身份(用户ID、IP、等能唯一识别的就行)、和时间或序号的数据,表示还“活”着。服务器也定时判断哪个还“活”着,发现不“活”了立即更新其状态


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10649742.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存