概述
心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。长连接断开后一直占用系统资源,可以通过心跳包判断连接是否断开;使用心跳包检测到连接已经死了,就断开连接。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、 线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。
心跳包
应用程序在逻辑层发送心跳包(空的echo包)来判断与服务器的链接是否正常,一般方法如下:首先是服务器在一个Timer事件中定时向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应, 如果在一定时间内没有收到客户端的回应,则可认为客户端已经掉线;同样,如果客户端在一定时间内没有收到服务器的心跳包,则可认为连接不可用。
心跳检测步骤:
1 客户端每隔一个时间间隔发生一个探测包给服务器
2 客户端发包时启动一个超时定时器
3 服务器端接收到检测包,应该回应一个包
4 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了
乒乓包
乒乓包大致的意思可总结为在心跳包发送的基础上,附加了少量简单的数据信息。
如面试题:朋友圈有人点赞评论的显示原理简单介绍,客服端如果知道有人点赞评论,服务器如何将相应的点赞评论的数据发送至客户端r> 1.微信客户端每隔一段时间就向服务器询问,是否有人评论r> 2.当服务器检查到有人给评论时,服务器发送一个乒乓包给客户端,该乒乓包中携带的数据是[有 人评论的标志位]
注:步骤1和2,服务器和客户端不需要建立连接,只是发送简单的乒乓包。
3.当客户端接收到服务器回复的带有评论标志位的乒乓包后,才真正的去和服务器通过三次握手建立连接;建立连接后,服务器将评论的数据发送给客户端。
SO_KEEPLIVE
1.因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心跳包,代码较多 且稍显复杂,而利用TCP/IP协议层为内置的KeepAlive功能来实现心跳功能则简单得多。
2.不论是服务端还是客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包, 而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。
3.因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认并不开启KeepAlive功 能,尽管这微不足道,但在按流量计费的环境下增加了费用,另一方面,KeepAlive设置不合理时可能会 因为短暂的 络波动而断开健康的TCP连接。并且,默认的KeepAlive超时需要7,200,000 MilliSeconds, 即2小时,探测次数为5次。对于很多服务端应用程序来说,2小时的空闲时间太长。
其实有些说法认为SO_KEEPLIVE的意义不大,就是如果服务器端没有心跳机制,那么客户端连接上来以后,客户端突然断线,那么服务器端不知道对方已掉线,依然会保持连接,但是目前绝大多数软件都自带心跳机制。所以它并没有什么用。
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114455 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!