基本介绍
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