socket心跳包机制

心跳包
心跳包就是在客户端和服务器间定时通知对方本身状态的一个本身定义的命令字,按照必定的时间间隔发送,相似于心跳,因此叫作心跳包服务器

心跳包的做用网络

  网络中的接收和发送数据都是使用SOCKET进行实现。可是若是此套接字已经断开,那发送数据和接收数据的时候就必定会有问题。但是如何判断这个套接字是否还可使用呢?这个就须要在系统中建立心跳机制。其实TCP中已经为咱们实现了一个叫作心跳的机制。若是你设置了心跳,那TCP就会在必定的时间(好比你设置的是3秒钟)内发送你设置的次数的心跳(好比说2次),而且此信息不会影响你本身定义的协议。所谓“心跳”就是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道本身“在线”。 以确保连接的有效性。
  所谓的心跳包就是客户端定时发送简单的信息给服务器端告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息若是服务端几分钟内没有收到客户端信息则视客户端断开。好比有些通讯软件长时间不使用,要想知道它的状态是在线仍是离线就须要心跳包,定时发包收包。发包方:能够是客户也能够是服务端,看哪边实现方便合理。通常是客户端。服务器也能够定时轮询发心跳下去。心跳包之因此叫心跳包是由于:它像心跳同样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长链接,至于这个包的内容,是没有什么特别规定的,不过通常都是很小的包,或者只包含包头的一个空包。在TCP的机制里面,自己是存在有心跳包的机制的,也就是TCP的选项。系统默认是设置的是2小时的心跳频率。可是它检查不到机器断电、网线拔出、防火墙这些断线。并且逻辑层处理断线可能也不是那么好处理。通常,若是只是用于保活仍是能够的。心跳包通常来讲都是在逻辑层发送空的包来实现的。下一个定时器,在必定时间间隔下发送一个空包给客户端,而后客户端反馈一个一样的空包回来,服务器若是在必定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。只须要send或者recv一下,若是结果为零,则为掉线。可是,在长链接下,有可能很长一段时间都没有数据往来。理论上说,这个链接是一直保持链接的,可是实际状况中,若是中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把必定时间以内没有数据交互的链接给断掉。在这个时候,就须要咱们的心跳包了,用于维持长链接,保活。在获知了断线以后,服务器逻辑可能须要作一些事情,好比断线后的数据清理呀,从新链接呀固然,这个天然是要由逻辑层根据需求去作了。总的来讲,心跳包主要也就是用于长链接的保活和断线处理。通常的应用下,断定时间在30-40秒比较不错。若是实在要求高,那就在6-9秒。服务器端

心跳包机制
  跳包之因此叫心跳包是由于:它像心跳同样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长链接,至于这个包的内容,是没有什么特别规定的,不过通常都是很小的包,或者只包含包头的一个空包。
在TCP的机制里面,自己是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。可是它检查不到机器断电、网线拔出、防火墙这些断线。并且逻辑层处理断线可能也不是那么好处理。通常,若是只是用于保活仍是能够的。
心跳包通常来讲都是在逻辑层发送空的echo包来实现的。下一个定时器,在必定时间间隔下发送一个空包给客户端,而后客户端反馈一个一样的空包回来,服务器若是在必定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
  其实,要断定掉线,只须要send或者recv一下,若是结果为零,则为掉线。可是,在长链接下,有可能很长一段时间都没有数据往来。理论上说,这个链接是一直保持链接的,可是实际状况中,若是中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把必定时间以内没有数据交互的链接给断掉。在这个时候,就须要咱们的心跳包了,用于维持长链接,保活。
  在获知了断线以后,服务器逻辑可能须要作一些事情,好比断线后的数据清理呀,从新链接呀……固然,这个天然是要由逻辑层根据需求去作了。
总的来讲,心跳包主要也就是用于长链接的保活和断线处理。通常的应用下,断定时间在30-40秒比较不错。若是实在要求高,那就在6-9秒。

心跳检测步骤:
1客户端每隔一个时间间隔发生一个探测包给服务器
2客户端发包时启动一个超时定时器
3服务器端接收到检测包,应该回应一个包
4若是客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5若是客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了软件

相关文章
相关标签/搜索