最后更新:2022-07-04 15:14:15 手机定位技术交流文章
很多人认为,TCP协议本身在前一天有一个“保持活”机制,为什么基于其沟通联系,还是需要在应用层面实现额外的心脏跳动保护?本文将从移动端 IM实践的视角向你讲,即使使用TCP协议,应用心跳层仍然是至关重要的.

什么是心跳保活?
在设计使用TCP长连接的IM服务时,它通常涉及心脏的跳动。心跳一般指一个末端(在大多数情况下是一个客户端),它每隔一定时间发送一个自定义命令到相反的末端。要确定双方是否活着,因为它在一定时间内被发送,类似于心跳,故被称为心跳指令。
TCP协议不是自有的 KeepAlive 吗?
然后就出现了一个问题:为什么您需要在应用层中做心脏跳动?TCP不是可靠的连接吗?我们不能依靠TCP来检测故障 吗?例如,TCP的KeepAlive机制被用来实现这一点。目前应用层状心脏跳动是最佳做法 吗?什么样的心跳是最佳的练习。
许多与手机通讯有关的人从来没有认真考虑过这些问题,在我们的潜意识中,我们认为这是简单的心脏跳动。 事实并不那么简单,请继续往下看。
保持有效的远程通信联系的重要性
对于客户端而言,使用TCP长连接完成业务的最大驱动因素是:当当前连接可用时,每个请求只是简单的发送和接收数据,避免DNS分析,连接建立等时间,大大加快了请求的速度,也可以从服务器接收实时消息。但前提是连接可用。
如果连接不能很好地维护,每件请求都会变成一个成功:祝你好运,通过长途连接发送请求和接收反馈。运气差,当前连接已失效,请求延迟,没有反馈,直到迟到,它还需要建立一个联系的过程,它比HTTP更低效率。维护连接的先决条件是测试连接的可用性,当连接无法使用时,放弃当前的连接并创建一个新的连接。
基于这一前提,必须有一个测试连接可用性的机制,同时,移动网络的特殊性也要求客户在空闲时间发送某些命令,以避免连接被检索。
对于服务器来说,也是重要的及时通知连接的可用性:一方面,服务器需要及时清理无效的连接以减轻负载,另一方面,还有业务要求,例如服务器需要及时处理玩家在游戏拷贝中停用时间。
为什么TCP的KeepAlive不能取代层-Heart-Blow-Backup机制
上面提到了维护连接的重要性,所以让我们回到实际的实现。 为什么我们需要使用应用程序层心脏来进行测试,而不是直接使用TCP的特性? 即时通讯聊天软件应用程序开发可以添加v:weikeyun24咨询

我们知道TCP是一个基于连接的协议,连接状态由状态机维护,连接完毕后,双方都处于稳定状态,之后的状况不会发生积极的变化。这意味着如果顶部没有电话,总是留下TCP连接空白,即使这个连接没有数据,但仍保持联系,一天,一周,甚至一个月,即使在这段时间里, 由于倒塌, 中间路线也无数次重新启动.让我们看一下现实的栗子:当我们在自己的VPS上创建sh时,然后 accidentally 踢出网,TCP无法检测网络的变化。当我们重新连接电网时,你仍然可以正常使用ssh,同时,没有TCP重新连接。
有些人会说,TCP没有“保持生命”机制,实施这一机制难道不足够吗?但是事实上,TCP KeepAlive机制实际上并不适用于这方面。在“保持生命”机制被激活后,TCP层将在指定的时间后发送相应的KeepAlive探测器来确定连接的可用性。正常时间是7200秒,失败后再尝试10次,每场比赛时间为75秒。显然,默认值不能满足我们的需要,在修改设置后,它是否可以满足?答案仍旧是否定的。
由于TCP KeepAlive被用来检测一个连接的死亡,心脏跳动机制有一个额外的功能:它检测两个通信的生存状态。
考虑一种情况,服务器由于某种原因过载,CPU 100%,无法应付任何商业要求,但使用TCP探测器仍然可以确定连接状态,这是典型的情况,连接是活的,但服务提供者是死的,对客户端而言,最好的选择是切断后重新连接到其他服务器。而不是总是认为当前服务器是可用的,总是向当前服务器发送一些请求,这些请求不可避免地失败。
从上面我们可以看到,KeepAlive不适合测试两个现场场景,这个场景也取决于应用层的心率。层状心跳的应用具有更大的灵活性,可以控制检测时机,间隔和处理流程,额外的信息甚至可以添加到心跳袋。从这个角度而言,应用心率的确是最佳的实践.
实施心脏卫生机制
从以上我们可以得出结论,目前,层状心脏跳动是测试连接的有效性和两个方面是否存活的最佳实践,所以剩下的问题是如何实现。
当然,最简单的残忍是时机。如果心脏每30秒一次跳动,如果您在15秒内没有收到心脏拍子包,当前连接被认为是无效。切断并重新连接。这种做法最直接,实现也简单。唯一的问题是比较电力消耗和流量消耗.计算每个协议包5字节,每天收到2880张心跳包,一个月是5*2*2880*30 =0.8M的流量,如果你的手机上有多个IM软件,它就像每个月的轻心跳,有几毫米的流动。更不用说由于频繁的心脏跳动而造成的电力损失。
因为频繁的心脏跳动会导致能量消耗和流量消耗,改善的方向是自然地降低心率,但它也可以影响连接检测的实时性太多。基于这个需求,一般来说,可以根据程序的状况调整心率间隔,当程序处于背景时(这主要是关于Android),尽量拉长心跳间隔,5分钟甚至10分钟。
当应用程序在前面时,它按照最初的规则运行。可以扩大连接可靠性的判断,避免在心脏病发作时认为连接无效的情况,使用错误积累,只有在n的心脏跳动之后,当前的连接才被认为无法使用。当然,还有一些技巧,比如从你最后收到的包中按时间安排你的心跳,而不是固定的时间。这也在一定程度上降低了心率。
本文由 在线网速测试 整理编辑,转载请注明出处。