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

8

¿Alguien sabe si Linux admite opciones de socket de mantener vivo en una conexión saliente?

Hice una conexión saliente con las opciones de mantener vivo, pero netstat --timers se muestra (supongo que los 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)

Desearía poder ver las opciones de socket, pero ni ss ni lsof me las mostrarán.

James Hartig
fuente

Respuestas:

7

Primero debe asegurarse de que TCP keepalive esté habilitado en su sistema. Puede verificar la configuración predeterminada de esta manera:

# 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

Luego, asegúrese de configurarlo correctamente en su código. Debería verse más o menos así:

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 configurar 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 NOPse estaba enviando el keepalive .

Se pueden encontrar más detalles en el CÓMO TCP Keepalive .

aculich
fuente
Gracias por la información, pero ya los había configurado y lo estoy configurando exactamente de la misma manera que usted, simplemente no estoy configurando keepalive en netstat.
James Hartig
1
En ese caso, publique más información sobre su sistema y el código fuente (o un caso de prueba simplificado) para que pueda intentar reproducir el problema; de lo contrario, no hay mucho para depurar.
aculich
@aculich tiene razón, si ha configurado keepalive en el sistema, es su aplicación la que no lo usa correctamente. Consejo que para leer el TCP Keepalive COMO según lo sugerido por aculich o para publicar el código fuente de la aplicación o bien tratar de ejecutar una lsof para ver lo que sucede
tmow
0

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 mantener 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 paquetes, lo que significa que tcp_keepalive_time no funciona

usuario393527
fuente