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

8

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

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

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

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

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

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

James Hartig
la source

Réponses:

7

Vous devez d'abord vous assurer que TCP keepalive 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

Assurez-vous ensuite que vous le définissez correctement dans votre code. Ça devrait ressembler a quelque chose comme ca:

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)

Et puis j'ai vérifié avec wirehark que le keepalive NOPétait envoyé.

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

aculich
la source
Merci pour l'info, mais je les avais déjà définis et je les configure exactement de la même manière que vous, je ne configure simplement pas keepalive dans netstat.
James Hartig
1
Dans ce cas, postez plus d'informations sur votre système et le code source (ou un cas de test simplifié) afin que je puisse essayer de reproduire le problème, sinon il n'y a pas grand-chose à faire ici pour déboguer.
aculich
@aculich a raison, si vous avez défini keepalive dans le système, c'est votre application qui ne l'utilise pas correctement. Je conseille de lire le HOWTO TCP Keepalive comme suggéré par aculich ou de publier le code source de l'application ou essayez d'exécuter un lsof pour voir ce qui se passe
tmow
0

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 garder 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 pas de capture de package , ce qui signifie que tcp_keepalive_time ne fonctionne pas

user393527
la source