tcp_keepalive_intvl 是TCP保活机制中连续两次探测包的间隔时间(秒),默认75秒;它与tcp_keepalive_time(首次探测延迟)、tcp_keepalive_probes(最大失败次数)协同工作,共同决定连接断开时机。

Linux 系统中,tcp_keepalive_intvl 控制的是 TCP 连接在被判定为“空闲且疑似断开”后,**连续两次保活探测包(keepalive probe)之间的间隔时间**,单位是秒。它不决定首次探测何时开始,而是影响后续重试节奏。
先理解保活三参数协同关系
TCP 保活机制依赖三个内核参数共同作用:
- tcp_keepalive_time:连接空闲多久后,开始发送第一个保活探测包(默认 7200 秒 = 2 小时)
- tcp_keepalive_intvl:第一个探测未收到响应时,隔多久发第二个,之后每次重试都按此间隔(默认 75 秒)
- tcp_keepalive_probes:连续多少次探测无响应,才真正关闭连接(默认 9 次)
举例:若 time=600、intvl=30、probes=3,则第 1 次探测在空闲 10 分钟后发出,若无响应,第 2 次在 10 分 30 秒后,第 3 次在 11 分钟后;3 次全失败即断连(总耗时约 11 分钟)。
全局修改 tcp_keepalive_intvl
适用于所有新建立的 TCP 连接(已存在的连接不受影响):
- 临时生效(重启失效):
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30 - 永久生效:写入
/etc/sysctl.conf或/etc/sysctl.d/99-custom.conf:net.ipv4.tcp_keepalive_intvl = 30
然后运行sudo sysctl -p加载
应用层单独设置(更常用、更精准)
每个 socket 可独立配置,优先级高于内核全局值。以 C 和 Python 为例:
-
C 语言(使用
setsockopt):int intvl = 30;<br>setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl));
-
Python(需启用 keepalive 后再设间隔):
import socket<br>s = socket.socket()<br>s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)<br># Linux 特有选项<br>s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 30)
注意:TCP_KEEPINTVL 是 Linux 扩展选项,部分系统(如 macOS)用 TCP_KEEPALIVE 替代,行为略有差异。
验证是否生效
可通过以下方式确认当前连接使用的保活参数:
- 查进程 socket 状态(需 root):
ss -tlnp | grep :端口找到 inode,再查/proc/net/tcp对应行的st字段是否为01(ESTABLISHED),然后看uid和inode - 更直接的方式是抓包验证:
使用tcpdump -i any port XXXX and 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0'或过滤 ACK 包,观察保活探测包(纯 ACK,无 payload)的发送间隔


















