8 votes

Les options Keep-Alive ne fonctionnent pas sous Linux pour une connexion sortante

Est-ce que quelqu'un sait si Linux prend en charge les options de socket keep-alive sur une connexion sortante?

J'ai établi une connexion sortante avec des options keep-alive mais netstat --timers affiche off (je suppose que les timers sont désactivés) :

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

Les connexions entrantes avec les mêmes options de socket appliquées affichent :

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

J'aimerais pouvoir voir les options de socket mais ni ss ni lsof ne me les afficheront.

7voto

aculich Points 3460

Tout d'abord, vous devez vous assurer que le keepalive TCP est activé sur votre système. Vous pouvez vérifier les paramètres par défaut comme ceci :

# 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

Ensuite, assurez-vous de le configurer correctement dans votre code. Cela devrait ressembler à ceci :

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

Sur mon système, lorsque j'utilise le code ci-dessus pour définir SO_KEEPALIVE des deux côtés, je vois :

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)

Ensuite, j'ai vérifié avec Wireshark que le keepalive NOP était envoyé.

Plus de détails peuvent être trouvés dans le TCP Keepalive HOWTO.

0voto

user393527 Points 1

Client-sysctl-setting:

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

client 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

mais aucun paquet capturé ce qui signifie que tcp_keepalive_time ne fonctionne pas

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X