8 votes

La connexion reste signalée comme ETABLIE même si l'hôte n'est pas connecté

Je travaille sur une distribution Linux embarquée et j'ai besoin de surveiller les connexions entrantes et sortantes (si elles sont toujours actives, etc.) et je rencontre des problèmes car j'ai remarqué que même si l'hôte distant coupe la connexion, je peux toujours voir la connexion comme ESTABLISHED via netstat.

J'ai deux versions différentes de ce système Linux embarqué : une qui utilise un ancien noyau 2.6.34 et qui fonctionne bien, tandis que celle qui échoue utilise un noyau 3.18.18.

En cherchant plus d'informations, je soupçonne que je dois définir / changer les délais TCP, donc je les ai configurés via syctl.conf mais cela ne change rien. Le système qui utilise le noyau 2.6.34 n'a pas les délais TCP configurés, donc cela me fait penser que les délais TCP ne sont pas à l'origine de mon problème.

Avez-vous une idée de ce qui pourrait être la raison pour laquelle la connexion reste comme ESTABLISHED?

2voto

nKn Points 5401

Si un hôte se déconnecte de l'autre et que vous voyez toujours sa connexion comme ESTABLISHED, c'est probablement lié au fait qu'il ne respecte pas le protocole TCP et ne ferme pas proprement la connexion.

La sortie de netstat est un interprète de l'état actuel des connexions TCP. Si un client souhaite se déconnecter/fermer le socket qui a été précédemment ouvert et établi, il doit en informer le système distant. Cela se fait en envoyant une requête FIN à l'autre nœud (plus d'informations ici), dans ce cas, le serveur.

S'ils échouent à le faire, le client se déconnecte effectivement, mais le serveur distant continue de penser que le client est toujours connecté et maintient donc son état comme ESTABLISHED, et c'est là que le paramètre tcp_keepalive_time entre en jeu. Comme aucun autre paquet ne sera reçu, le noyau attendra le temps spécifié par ce paramètre pour expirer la connexion et la fermer de force.

Vous pouvez déboguer ce problème en utilisant l'outil tcpdump. Vous pouvez simplement écouter la connexion provenant de l'hôte client côté serveur et vérifier s'il échoue à envoyer la requête FIN.

tcpdump host X.X.X.X and port Y

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