TCP_KEEPALIVE机制简述
Posted 咖啡馆里聊开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP_KEEPALIVE机制简述相关的知识,希望对你有一定的参考价值。
tcp协议中定义了一种keepalive机制,用于探测失效连接。当客户端非优雅退出时,服务端无法检测到这样的连接,仍然持有socket资源。对于长连接系统,如果失效连接长时间不释放,则导致服务端的服务能力下降,同时也会消耗服务端计算资源。tcp keepalive启用后,120分钟(默认)内,双方没有数据包交互,则从服务端主动发送一个keepalive probe包给客户端,如果客户端正常响应,则连接保持。若客户端返回RST包,或无响应,则socket资源被回收。
应用层KEEPALIVE的必要性
是否有了TCP_KEEPALIVE,仍然还需要应用层的keepalive呢?还是需要。
TCP_KEEPALIVE只解决四层的探测,但当进程死锁或阻塞时,TCP连接仍然正常,但进程间的通信已不正常,所以应用层的心跳面向的是功能层面的探活。
而且从默认的TCP_KEEPALIVE参数看,它是用来释放长期不使用的资源的,而应用层心跳探测是用来准实时发现故障的,两者的本质目的不同。
无响应的判定:每75秒发送1个包,共发9次,如果客户端没有响应,则判定无响应。
linux kernel中关于tcp keepalive的三个参数:
tcp_keepalive_time
keepalive的超时时间,默认7200s。在这个时间内,一个socket如果没有收发流量,则启动keepalive探测
tcp_keepalive_intvl
探测间隔,默认75s。当启动keepalive探测后,相邻两次探测间的间隔
tcp_keepalive_probes
探测次数,默认9次。当发送完9次探测后,仍然没有收到对端的ACK应答,则认为socket失效
配置
配置这三个参数可以使用procfs或systcl
使用procfs时
参数路径为:/proc/sys/net/ipv4/
directory
# 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_probes9
如果要修改的话可以直接修改
# echo 600 > /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
使用sysctl时
可以先查看当前的值
# sysctl \
> net.ipv4.tcp_keepalive_time \
> net.ipv4.tcp_keepalive_intvl \
> net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
也可以通过以下指令修改
# sysctl -w \
> net.ipv4.tcp_keepalive_time=600 \
> net.ipv4.tcp_keepalive_intvl=60 \
> net.ipv4.tcp_keepalive_probes=20
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 20
通过以上两个方式都是临时修改,当reboot后,修改的配置会丢失。持久化的方式:
利用init过程
将定制化的配置参数放在/etc/rc.d/或/etc/init.d/里
通过rc.local脚本实现启动时修改
在/etc/sysctl.conf中增加定制化参数
以上是关于TCP_KEEPALIVE机制简述的主要内容,如果未能解决你的问题,请参考以下文章