TCP 的 保活机制(KeepAlive机制。这个机制的原理是这样的:

定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个「探测报文」,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

在 Linux 内核可以有对应的参数可以设置保活时间、保活探测的次数、保活探测的时间间隔,以下都为默认值:

net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_keepalive_intvl=75
net.ipv4.tcp_keepalive_probes=9

心跳包

很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。

心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。

在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。

心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。

其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。

在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。

总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

前面说到,许多IM协议实现了自己的心跳机制,而不是直接依赖于底层的机制,不知道真正的原因是什么。

就我看来,一些简单的协议,直接使用底层机制就可以了,对上层完全透明,降低了开发难度,不用管理连接对应的状态。而那些自己实现心跳机制的协议,应该是期望通过发送心跳包的同时来传输一些数据,这样服务端可以获知更多的状态。例如某些客户端很喜欢收集用户的信息……反正是要发个包,不如再塞点数据,否则包头又浪费了……

如果客户端不发送数据,什么时候才会断开处于 ESTABLISHED 状态的连接?(TCP保活机制和心跳包)相关推荐

  1. linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程

    linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程 server.c #include <sys/stat.h>#include <fcntl.h> ...

  2. php发送数据到视图格式_PHP-FPM的相关知识的深度解释

    一.需要搞清楚几个名词概念 1. CGI(Common Gateway Interface,CGI)通用网关接口, 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能.CGI ...

  3. Android Socket连接(模拟心跳包,断线重连,发送数据等)

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat 喻志强的博客 耐心 细心 用心 传播正能量 RSS订阅 原 A ...

  4. 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )

    文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...

  5. Android客户端 和 pc服务器 建立socket连接并发送数据

    服务器使用java代码 1.服务端需要创建一个ServerSocket(port) 2.port(端口) 地址范围在0~65535请使用1024以上的端口,尽量偏大使用,否则可能和你主机上的其他应用程 ...

  6. C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据)

    C# SuperSocket 手把手教你入门 傻瓜教程系列教程 C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据) C# SuperSocket 手把手教你 ...

  7. 如何在客户端发送ajax请求,ajax - 从服务器(nodejs)发送数据到客户端(ajax请求)

    如何使用nodejs将数据从服务器发送到客户端? 所以基本上我通过点击一个按钮来调用这个函数 javascriptfunction createStuff(tid) { $.ajax({ type: ...

  8. client netty 主动发数据_Netty服务器无限循环给客户端发送数据

    主要思路: * 服务器每隔两秒发送一次服务器的时间 * 客户端接收服务器端数据,打印出服务器的时间 服务器端代码 package netty.time.server; import io.netty. ...

  9. Netty服务器无限循环给客户端发送数据

    2019独角兽企业重金招聘Python工程师标准>>> 主要思路: * 服务器每隔两秒发送一次服务器的时间 * 客户端接收服务器端数据,打印出服务器的时间 服务器端代码 packag ...

最新文章

  1. 面试官:Redis用过是吧?那你讲讲Redis都有哪些监控指标?
  2. 第七课.Logistic回归算法
  3. [cb]ScriptableWizard 创建向导
  4. 如何把js变量传递给html页面,如何将js变量从一个html文件传递给另一个?
  5. GDI+中发生一般性错误的解决办法(转帖)
  6. 微软想证明Windows比Chrome好 主要源自恐惧?
  7. 转 Linux查看文件编码格式及文件编码转换
  8. Modbus-RTU入门篇
  9. html 图片浮层,纯css图片悬浮代码(expression)
  10. 国考省考申论:归纳概括多个主体身上的优秀品质,透过动词现象(怎么做的),找到名词(精神品质)本质
  11. (SWAT-2)SWAT中土地利用数据库建立
  12. SAP 业务技术平台(BTP) Workflow(工作流)功能介绍
  13. GraphSage:Inductive Representation Learning on Large Graphs
  14. 第二层、三层、四层交换机原理
  15. elementUI textarea 禁止拉伸
  16. B/S结构和C/S结构详细介绍
  17. 大学计算机基础专升本复习提纲
  18. gl.glenable()介绍
  19. PAT 计算机程序设计能力考试--大纲
  20. 人工智能意念控制打字_智能打字稿批量属性分配

热门文章

  1. [转载]沧桑战神 4.25 收评 明天大盘能否接着忽悠?
  2. ACM 深搜 SeedingTempter of the Bone
  3. 大数据分析培训课程python时间序列ARIMAX模型
  4. 引擎十一:体积感SSS,SSR
  5. 浏览器渲染与浏览器内核相关杂谈
  6. 计算机专业的数学应学到什么水平?应该学习数学的那些分支?
  7. Metro UI 界面完全解析 (转载)
  8. 强化学习(一)Fundamentals of Reinforcement Learning
  9. 微软奥兹:花1万小时学习才成计算机专家
  10. douban怎么了?