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_probes

9

如果要修改的话可以直接修改

# 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机制简述的主要内容,如果未能解决你的问题,请参考以下文章

MAC OS X下如何配置TCP_KEEPALIVE

Java SPI机制简述

Java SPI机制简述

你知道的Go切片扩容机制可能是错的

知识点—python数据类型1

异常和TCP通讯