文档章节

Socket心跳包机制总结

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

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

转载地址:http://blog.sina.com.cn/s/blog_a459dcf5010153m5.html

本文转载自:http://blog.csdn.net/liwb1987/article/details/38316653

依宸2016
粉丝 1
博文 94
码字总数 0
作品 0
济南
高级程序员
私信 提问
TCP面试常见题:张小方的知乎Live:轻松搞定技术面试中常见的网络通信问题

http://blog.csdn.net/analogouslove 张小方 的知乎 Live:轻松搞定技术面试中常见的网络通信问题 https://www.zhihu.com/lives/922110858308485120?utmsource=qq&utmmedium=social 本live列......

libaineu2004
2017/12/20
0
0
Android上保持Socket长连接

0.Thanks 性能优化十六之WakeLock唤醒锁以及JobScheduler使用 安卓 java 判断socket断开 android保持服务不休眠(持续运行)以及唤醒屏幕的方法 1.概述 前阵子接到一个用户反馈说,公司的一款...

栗子酱油饼
2018/01/07
0
0
一个心跳保活类的设计—改进

前面设计了一个心跳保活类,如果它仅仅用作保活机制,那未免有点太大材小用了,因此可以考虑使用它来传递消息,目前只要服务器有回复就说明服务仍然在,但是我设计出了CON_RESULT结构: type...

晨曦之光
2012/04/10
164
0
TCP连接探测中的Keepalive和心跳包

1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常, socket也通...

wenhuifu
2018/06/27
0
0
关于TCP长连接和发送心跳的一些理解

作者:郭无心 链接:https://www.zhihu.com/question/35013918/answer/63664974 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 游戏服务器常常有心跳包的设计。 我们的心跳包就是为...

huang19830104
2018/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

读书replay《maven实战》.1.20190526

前情提要 maven这个工具用了好久了,但是一直都用的迷迷糊糊的,没有对它进行过系统性的学习,只是知道一些常用的功能怎么实现,所以20190516这一天我从JD购买了徐晓斌老师所著的《maven实战...

wanxiangming
35分钟前
0
0
真实项目案例实战——【状态设计模式】使用场景

什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。 状态模式应用场景 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根...

须臾之余
42分钟前
1
0
Java 实现把字符串转换成整数【底层实现】

https://blog.csdn.net/zl18310999566/article/details/80263396

qimh
45分钟前
0
0
IDEA的debugger

1、win下节省内存空间 3、条件断点

一只小青蛙
56分钟前
3
0
炸!亿级数据DB秒级平滑扩容

一步一步,娓娓道来。 一般来说,并发量大,吞吐量大的互联网分层架构是怎么样的? 数据库上层都有一个微服务,服务层记录“业务库”与“数据库实例配置”的映射关系,通过数据库连接池向数据...

编程SHA
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部