Keep-alive选项在Linux上不适用于传出连接

有谁知道Linux是否支持传出连接上的保持活动套接字选项?

我做了一个传出连接保持活着选项,但netstat – 时间炫耀(我假设定时器closures):

tcp 0 0 localhost.localdomain:44307 172.16.0.15:2717 ESTABLISHED off (0.00/0/0) 

使用相同套接字选项的传入连接显示:

 tcp 0 0 172.16.0.3:8585 localhost.localdomain:21527 ESTABLISHED keepalive (29.26/0/0) 

我希望我能看到套接字选项,但ss或lsof都不会让我看到它们。

首先,您需要确保您的系统上启用了TCP Keepalive。 你可以检查这样的默认设置:

 # sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75 

然后确保在代码中正确设置它。 它应该看起来像这样:

 int optval = 1; if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) < 0) { perror("setsockopt()"); close(s); exit(EXIT_FAILURE); } 

在我的系统上,当我使用上面的代码来设置SO_KEEPALIVE双方我看到:

 tcp 0 0 127.0.0.1:48591 127.0.0.1:5555 ESTABLISHED keepalive (6958.37/0/0) tcp 0 0 127.0.0.1:5555 127.0.0.1:48591 ESTABLISHED keepalive (6958.37/0/0) 

然后我用wiresharkvalidation了keepalive NOP被发送。

更多细节可以在TCP Keepalive HOWTO中find 。

客户的sysctl设置:

 sudo /sbin/sysctl -a|grep keep net.ipv4.tcp_keepalive_time = 20 net.ipv4.tcp_keepalive_probes = 1 net.ipv4.tcp_keepalive_intvl = 1 

客户端保持tcpdump:

 sudo /usr/sbin/tcpdump -nn -vv -i bond0 tcp and host 10.201.126.72 and port 8001 tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes 

但没有任何包捕获,这意味着tcp_keepalive_time不起作用