Las opciones Keep-alive no funcionan en Linux para una conexión saliente

¿Alguien sabe si Linux soporta las opciones de socket keep-alive en una conexión saliente?

Hice una conexión saliente con las opciones keep-alive, pero netstat –timers muestra (estoy suponiendo temporizadores están apagados):

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

Las conexiones entrantes con las mismas opciones de socket aplicadas muestran:

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

Ojalá pudiera ver las opciones de socket, pero ni ss ni lsof me mostrarán ellos.

2 Solutions collect form web for “Las opciones Keep-alive no funcionan en Linux para una conexión saliente”

Primero debe asegurarse de que TCP keepalive está habilitado en su sistema. Puede comprobar la configuración predeterminada de este modo:

 # 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 

A continuación, asegúrese de que está configurando correctamente en su código. Debe ser algo como esto:

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

En mi sistema cuando uso el código anterior para establecer SO_KEEPALIVE en ambos lados veo:

 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) 

Y luego verifiqué con wireshark que se estaba enviando el NOP keepalive.

Más detalles se pueden encontrar en el TCP Keepalive HOWTO .

Configuración de cliente-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 

Cliente keep 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 

Pero no cualquier captura de paquete, lo que significa tcp_keepalive_time no funciona

El linux y los temas del servidor de Windows, como ubuntu, centos, apache, nginx, debian y consejos de red.