美文网首页网络
linux的KEEPALIVE属性,心跳机制

linux的KEEPALIVE属性,心跳机制

作者: WendySays | 来源:发表于2016-07-23 12:04 被阅读344次

对于面向连接的TCP socket,在实际应用中通常都要检测对端是否处于连接中,连接端口分两种情况:

  • 1、连接正常关闭,调用close() shutdown()连接优雅关闭,send与recv立马返回错误,select返回SOCK_ERR;
  • 2、连接的对端异常关闭,比如网络断掉,突然断电.

对于第二种情况,判断连接是否断开的方法有一下几种:
  • 自己编写心跳包程序,简单的说就是自己的程序加入一条线程,定时向对端发送数据包,查看是否有ACK,根据ACK的返回情况来管理连接。此方法比较通用,一般使用业务层心跳处理,灵活可控,但改变了现有的协议;
  • 使用TCP的keepalive机制,UNIX网络编程不推荐使用SO_KEEPALIVE来做心跳检测(为什么??)。keepalive原理:TCP内嵌有心跳包,以服务端为例,当server检测到超过一定时间(/proc/sys/net/ipv4/tcp_keepalive_time 7200 即2小时)没有数据传输,那么会向client端发送一个keepalive packet,此时client端有三种反应:
    1、client端连接正常,返回一个ACK.server端收到ACK后重置计时器,在2小时后在发送探测.如果2小时内连接上有数据传输,那么在该时间的基础上向后推延2小时发送探测包;
    2、客户端异常关闭,或网络断开。client无响应,server收不到ACK,在一定时间(/proc/sys/net/ipv4/tcp_keepalive_intvl 75 即75秒)后重发keepalive packet, 并且重发一定次数(/proc/sys/net/ipv4/tcp_keepalive_probes 9 即9次);
    3、客户端曾经崩溃,但已经重启.server收到的探测响应是一个复位,server端终止连接。

SO_KEEPALIVE的缺点:

根据MSDN的文档,如果为socket设置了KEEPALIVE选项,TCP/IP栈在检测到对方掉线后, 任何在该socket上进行的调用(发送/接受调用)就会立刻返回,错误号是WSAENETRESET;同时,此后的任何在该socket句柄的调用会立刻失败,并返回WSAENOTCONN错误。

该机制的缺点:

  • 一、SO_KEEPALIVE无法控制,它会每时每刻都发;
  • 二、SO_KEEPALIVE设置空闲2小时才发送一个“保持存活探测分节”,不能保证实时检测。对于判断网络断开时间太长,对于需要及时响应的程序不太适应。
    当然也可以修改时间间隔参数,但是会影响到所有打开此选项的套接口!关联了完成端口的socket可能会忽略掉该套接字选项。

参考链接:
在Linux环境下使用TCP的keepalive机制:实现了心跳函数,代码逻辑清晰(看代码)
http://www.tuicool.com/articles/yAJ36bz
Linux SO_KEEPALIVE属性:对非活动连接的检测方法跟出现的情况写的比较细致(看描述)
http://blog.csdn.net/callinglove/article/details/38380673
LINUX C网络编程中的心跳机制:解释了不使用SO_KEEPALIVE的缺点
http://blog.csdn.net/yuyin86/article/details/24997175

相关文章

  • linux的KEEPALIVE属性,心跳机制

    对于面向连接的TCP socket,在实际应用中通常都要检测对端是否处于连接中,连接端口分两种情况: 1、连接正常...

  • 移动端心跳包

    移动端心跳包 TCP的心跳机制 TCP协议,本身拥有一个KeepAlive机制,既然有了心跳机制,为什么还要在应用...

  • 心跳

    什么是心跳? 心跳就是用来检测TCP连接的双方是否可用。但是TCP本身不是有就一个keepAlive机制么,那是因...

  • nginx 下 keepalive 配置

    keepalive 通过心跳线 确认 线上IP是否存活 若心跳线 断开。 则主动激活ip 安装keepalive...

  • 心跳相关

    一、TCP中已有SO_KEEPALIVE选项,为什么还要在应用层加入心跳包机制? 参考文章:https://blo...

  • iOS 即时通讯(二):心跳保活

    前言 很多人认为,TCP协议有KeepAlive机制,为何基于它的通讯链接仍然需要在应用层实现额外的心跳保活呢?本...

  • linux网络相关配置

    Linux控制keepalive net.ipv4.tcp_keepalive_time 保活时间 net.ipv...

  • Keepalived高可用

    Keepalive:http://www.keepalived.org/《老男孩Linux运维》 Keepaliv...

  • vc-keep-alive给keep-alive一个小升级

    GithubLive Demo 主要修改了 keepAlive 的缓存机制, 可以像 APP 那样前进刷新, 返回...

  • 即时通讯:socket 那些你不知道的事 - 心跳

    为什么TCP的 KeepAlive 不能满足心跳需求? 首先说下心跳包的主要作用是告知对方连接端,我还活着,心还在...

网友评论

    本文标题:linux的KEEPALIVE属性,心跳机制

    本文链接:https://www.haomeiwen.com/subject/eecwjttx.html