码迷,mamicode.com
首页 > 系统相关 > 详细

Linux 之Keep alive

时间:2014-10-26 18:17:00      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   sp   div   on   

基本介绍

Keep alive 可以设置在操作系统级别, 作用于对本机所建立的连接. 在设定的时间内对远程主机返送一个简单的tcp 包,用来探测远程主机是否还有响应。

主要应用场景有2个:
1. 更早的知道远程主机down 掉了。
正常情况下A 主机 和B 主机建立了连接。 A 发送了信息给B 主机,B 说收到了, A 开始等待。 但B 主机down 掉了, 但B 又没有对A 说自己已经down 了, 所以A 会一直等下去(除非应用程序设置的有timeout 机制)。使用了keep alive 可以更早的探测到B down 掉了。

2. A 和 B 之间的其他网络设备会主动关闭掉太空闲的连接, 因为网络设备用来保持2台机器的连接是需要资源的,而资源是有限的。
如果A, B 上的应用程序有时交换请求的时间会比较长,例如需要创建一个大的索引。 当过了一段时间后A 通过已建立的连接去和B 通信,然而这个连接却已经被中间的某些设备关闭掉了。就会带来不必要的麻烦。 所以可以通>过keep alive 的机制,定期的发送一些请求,让那些中间设备知道2个机器之间还有交互,从而就不会关闭连接了。


为了解决上述的2个问题, 大部分程序不会自己去实现一个keep alive 的功能。当可以很方便的使用Linux 所提供的这个服务, 只需要在创建socket 的时候,告诉Linux Kernel 说我需要你的 Keep alive 功能。

int keepalive = 1;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive , sizeof(keepalive ));

相关参数:

tcp_keepalive_time

发送keep alive 包的时间间隔,单位是秒。

tcp_keepalive_intvl
如果发送的,但没有回应。过多久才会再发一个。

tcp_keepalive_probes
发送多少个都没有回应,会认为对方是down 掉了。

# cat /proc/sys/net/ipv4/tcp_keepalive_time
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes

 

上述方式仅仅对当前Linux 实例有效。 如果想保证始终有效需要修改/etc/sysctl.conf
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_intvl=60
net.ipv4.tcp_keepalive_probes=20

参考文档

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html

http://stackoverflow.com/questions/17740492/how-i-will-use-setsockopt-and-getsockopt-with-keep-alive-in-linux-c-programming

Linux 之Keep alive

标签:style   blog   http   color   io   使用   sp   div   on   

原文地址:http://www.cnblogs.com/zhfan/p/4052161.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!