智能心跳设计与简要实现

本文探讨了智能心跳在即时通讯系统中的重要性,包括维持连接、防止NAT映射表移除和节省资源。介绍了心跳设计原理,如服务器回执策略,并提供了简要的C++实现示例。智能心跳旨在自动调整周期,确保连接稳定同时减少电量和流量消耗。
摘要由CSDN通过智能技术生成

智能心跳设计与简要实现

Author: Youni

摘要

心跳多用于即时通讯系统中,用于持续的通知后台服务器,客户端依旧存活。心跳包就是双方所定义的一种用来通知对方存活的数据通讯结构。

周期性的发心跳包给服务器主要有以下几个原因:

  1. 通知服务器,客户端存活状态,一旦服务器监测到在某段时间没有收到客户端发来的心跳包,服务器就会释放曾经为此客户端分配的所有资源,例如Socket连接

  2. 定时的刷新NAT内外网IP映射表,以便防止NAT路由器移除映射表,导致客户端和服务器端的连接中断

一个简单的实现就是定期的给服务器发送心跳包,但这种实现引出一个问题,就是周期时间间隔是多少为合适?

由于不同的网络拓扑结构的实现,NAT节点会分配到不同的网路路由当中,不同的NAT有不同的策略来处理映射表,一旦NAT发现某个映射表对应IP在某段时间内没有上行或下行数据,NAT就会移除此IP映射表,导致连接被中断,对于即时通讯的客户端而言就是不能及时的收到推送的消息。

还有一个问题就是较短周期性的发送心跳包,会导致客户端尤其是移动设备的电量和流量的消耗。

基于以上的考虑我们会设计一种智能心跳,他可以根据不同的网络情况,自动调整发送心跳的周期,已解决上述所提出的问题。但是在具体深入智能心跳的设计和简要实现之前,让我们来简单了解下和心跳相关的一些具体的概念,以便帮助读者更好的理解心跳机制。

连接

通常IM系统会建立TCP连接用来保证消息能能够准确无误的传送给对方,原因是因为TCP是面向连接的,并且是按序传送,并且保证了消息的正确送达,一旦双方一方没收到对方的数据报文,TCP就会重传直至得到对方的回执。

所以连接是双方通讯的基本通道,一旦中断,并且没有心跳机制保证,双方式监测不到对方还是连通的,还会继续的保留连接资源,对客户端和服务器端来说都是一种资源的损耗。

一般情况下,一旦IM连接建立,就不会人为的断掉,除非:

  1. 网络自动切换 <-2G->3G<->4G<->WIFI->
  2. 服务器主动关掉连接。有于某种原因服务器负载过大,为了保持服务器继续运行,不得不关掉一些连接,以便释放资源达到减轻负载的目的
  3. 网络路由器强制断开连接,以清除长时间没有数据传输的连接
  4. 客户端app异常中断/或正常退出,这种情况服务器会立即收到RST数据包

Keep-alive

实际上TCP/IP在协议提供了类似一种心跳包的机制,我们称之为Keep-alive机制,简单的描述为下:

  1. 一旦在某段时间内-默认是2个小时,没有数据传输
  2. TCP就会启动探针,实际上是一个keep-alive Packet发送给对方,如果收到对方的ACK回执,TCP会重置计时器,并且重复步骤1
  3. 一旦没有收到对方的ACK,TCP会在某段时间后再次重发探针,然后重复步骤3一定的次数,如果收到,认为对方还存活,否者对方已掉线

Keep-alive time: 就是没有传输数据的空闲时间,例如我们刚才说的2个小时

Keep-alive interval:每隔都少毫秒发送一次探测包

Keep-alive probes:一共发送多少次探测包

以上几个基本的参数不同的OS会有不同的设置方式,在这里不做具体的详细解释

但是这种基于TCP Keep-alive一般都适用于服务器端,但对于客户端来说,要不移动平台不提供类似的API设置,再一个就是其不灵活性,也就是说不能容易动态调整心跳周期,所以客户端不太适用这种TCP keep-alive 的机制,一般客户端都是自定义心跳包,发送给服务器端。

可以参考此文 Linux TCP Keepalive HOWTO获取更多的详细介绍

NAT(Network Address Translation)

处于公网间的节点之间如果需要进行数据传输,就必须要知道对方的公网IP方可进行通讯,但对于那些处于内网的节点,是如何和另外一个外网的节点或者服务器进行通讯的呢?这就引入了NAT,我们称之为Network Address Translation,它的作用就是把内网的IP转换成一个外网的IP。

  1. 内网A发送数据给外网B
  2. NAT路由器转化此内网IP为外网IP,并存储此映射到映射表中,并伪装此数据包的source IP为外网IP,发送给B
  3. 当收到对端发送给内网的节点时,查询映射表找到内网IP,把数据包的destination IP改为内网IP,然后传给内网A节点

以上只是一个最基本的描述,其实NAT最主要的原因就是为了解决IP地址数量紧缺的问题,当大量内外节点需要和外网通讯的时候,NAT可以把这些节点通过某些策略转换成少量的公网IP地址,达到了IP共享的目的。

根据上述的描述,我们对NAT有了一个最基本的了解,其实NAT还有更复杂的种类和不同的实现,具体可以参考

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值