Linux 之Keep alive

基本介绍

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。