TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

转载 2015年02月11日 11:29:12

TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活


分类: linux2013-11-29 17:46 3855人阅读 评论(1) 收藏 举报

1. TCP保活的必要性

1) 很多防火墙等对于空闲socket自动关闭

2) 对于非正常断开服务器并不能检测到为了回收资源必须提供一种检测机制.


2. 导致TCP断连的因素

如果网络正常, socket也通过close操作来进行优雅的关闭那么一切完美可是有很多情况比如网线故障客户端一侧突然断电或者崩溃等等这些情况server并不能正常检测到连接的断开


3. 保活的两种方式:

1) 应用层面的心跳机制

自定义心跳消息头一般客户端主动发送服务器接收后进行回应(也可以不回应). 这里不进行详述.

PS: 有人从软件的功能角度列出第三种方式就是通过第三方软件来进行探测确定连接的有效性这种方式局限性很大而且不属于软件内部的功能实现不进行讨论.

2) TCP协议自带的保活功能

打开keep-alive功能即可具体属性也可以通过API设定.


4. 两种方式的优劣性

TCP协议自带的保活功能使用起来简单减少了应用层代码的复杂度推测也会更节省流量因为一般来说应用层的数据传输到协议层时都会被加上额外的包头包尾TCP协议提供的检活其发的探测包理论上实现的会更精妙(用更少的字节完成更多的目标), 耗费更少的流量.

由应用自己实现的应用层的心跳为心跳消息额外定义一个消息类型就可以了就是应用正常的消息包只是这个包特殊点专门用来检活而已通常比较小可能只有消息头就可以了除非需要额外的信息

应用层心跳的好处我个人的理解有两点

一是比较灵活因为协议层的心跳只能提供最纯粹的检活功能但是应用层自己可以随意控制包括协议可能提供的是秒级的但是你想做成毫秒级的都任意(虽然实际几乎不会有这种时间级别的心跳), 包里还甚至可以携带额外的信息这些都是灵活之处.

二是通用应用层的心跳不依赖协议如果有一天不用TCP要改为UDP协议层不提供心跳机制了但是你应用层的心跳依旧是通用的可能只需要做少许改动就可以继续使用.

应用层心跳的不好的地方也很显而易见增加开发工作量由于应用特定的网络框架还可能很增加代码结构的复杂度再就是根据上面的推测应用层心跳的流量消耗还是更大的毕竟这本质上还是个普通的数据包.


5. 到底选用那种心跳方式?

优劣点第4节已经进行了阐述因此如果能确定你们更换协议的可能性非常小同时只是需要检活的功能那么用协议自带的就绝对OK使用简单而且高效有些自负的人总喜欢用自己搞的来代替成熟协议自带的东西代替系统内核提供的东西其实往往你应用层实现的东西都是更拙劣的网上看了一些关于协议的Keep-alive不靠谱的说法也都比较空想和想当然都没有拿出任何事实论据或实验数据这点大家有见解欢迎交流哈~


6. 类Unix平台如何使用Keep-alive

keepalive默认是关闭的因为虽然流量极小毕竟是开销因此需要用户手动开启有两种方式开启.

1) 在代码里针对每个socket进行单独设定使用起来灵活.

除了keepAlive 开关还有keepIdle, keepInterval, keepCount 3个属性使用简单如下:

  1. int keepAlive = 1;   // 开启keepalive属性. 缺省值: 0(关闭)  
  2. int keepIdle = 60;   // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s)  
  3. int keepInterval = 5;   // 探测时发探测包的时间间隔为5秒. 缺省值:75(s)  
  4. int keepCount = 2;   // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)  
  5. setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));  
  6. setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));  
  7. setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));  
  8. setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));  

使用时需要#include <netinet/tcp.h>, 否则SOL_TCPTCP_KEEPIDLE3个宏找不到.

ps: 忍不住吐槽一下, 网上大量毫不负责的转载, 千篇一律的搜索结果, 很多人根本都没进行过任何验证吧. 为了找这么个头文件都费了不小的事. 大多数帖子里的说的都是不可用的.

2) 修改配置文件对整个系统所有的socket有效.

我们可以用cat命令查看到系统中这几个默认的值.

#cat /proc/sys/net/ipv4/tcp_keepalive_time  7200  

#cat /proc/sys/net/ipv4/tcp_keepalive_intvl  75  

#cat /proc/sys/net/ipv4/tcp_keepalive_probes  9

修改它们:

#echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time  

#echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl  

#echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes


链接推荐:

闲说HeartBeat心跳包和TCP协议的KeepAlive机制

TCP Keepalive HOWTO


相关文章推荐

TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

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

TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素...
  • wjs1033
  • wjs1033
  • 2014年07月08日 15:48
  • 446

tcp连接探测Keepalive和心跳包

采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃、当机、网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回。很多时候,这不是...
  • wjs1033
  • wjs1033
  • 2014年07月08日 11:03
  • 502

TCP连接探测中的Keepalive和心跳包

1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制.   2. 导致T...
  • yhc1991
  • yhc1991
  • 2015年06月15日 10:55
  • 313

TCP连接探测中的Keepalive和心跳包

原文链接:http://blog.csdn.net/aa2650/article/details/17027845 1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭...

TCP连接探测中的Keepalive 和心跳包

采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃、当机、网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回。很多时候,这不是...

TCP keepAlive详解(TCP心跳包)

TCP keepAlive含义: 在TCP中有一个Keep-alive的机制可以检测死连接,原理很简单,TCP会在空闲了一定时间后发送数据给对方: 1.如果主机可达,对方就会响应ACK应答,就认为...
  • whatday
  • whatday
  • 2015年04月02日 16:32
  • 2578

心跳机制tcp keepalive的讨论、应用及“断网”、"断电"检测的C代码实现(Windows环境下)

说明: 1. 本文的讨论和实验都以Windows为例, 其实在linux上也大同小异。 2. 在第一次写此博文时, 我对某些地方有一些误解, 现予以更正, 对文章结...
  • stpeace
  • stpeace
  • 2015年04月13日 22:38
  • 7592

tcp keepalive介绍与netty 心跳实现

前言编写过c/s 网络通信程序人都知道,一个网络通信程序必须包括客户端与服务端,在编写服务端程序的时候通常会设置一些tcp协议的参数来优化tcp层,常用的包括:SO_REUSEADDR、SO_KEEP...

TCP心跳 | TCP keepAlive

应用层对于每个socket采用如下函数来开启 keepalive机制,其参数将采用系统上述配置。 setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
举报原因:
原因补充:

(最多只允许输入30个字)