Que signifie LAST_ACK, en tant que valeur d'état dans netstat?

15

Si un serveur Windows a plusieurs milliers de ports ouverts dans l' LAST_ACKétat (comme indiqué par netstat), qu'est-ce que cela pourrait signifier? Est-ce parce qu'un point final attend que l'autre réponde?

Nick Bolton
la source

Réponses:

10

L'état last_ack (si je me souviens bien de ma pile TCP) est l'état lorsque vous avez reçu votre message FIN pour fermer la connexion de votre voisin, mais vous devez toujours vider et arrêter votre connexion. Vous envoyez vous-même la FIN finale et attendez un ACK.

Généralement, le blocage dans last_ack signifie que votre application garde un socket ouvert même lorsque l'autre extrémité a fini d'envoyer des données. Cela peut se produire pour plusieurs raisons. Il peut y avoir un pare-feu ou un autre équilibreur de charge qui perd le dernier ACK du client et vous laisse bloqué dans l'état last_ack. Si les connexions ne sont pas expirées après quelques minutes (environ 10), vous avez probablement un bug.

Jetez un œil au diagramme d'état sur http://tangentsoft.net/wskfaq/articles/debugging-tcp.html

pehrs
la source
4
Pas correcte. Vous décrivez CLOSE_WAIT.
user207421
4

LAST_ACK est le dernier état juste avant de fermer la connexion TCP.

Imo
la source
1
Merci, qu'est-ce qui peut faire bloquer un port dans cet état?
Nick Bolton
Est-ce un serveur Web IIS (ou un autre service) sur lequel vous voyez cela, ou votre propre application?
Imo
L'application implémente le client XML-RPC "Cook Computing" (à partir d'Asp.Net, exécuté via IIS) et parle à un serveur Java XML-RPC.
Nick Bolton
1
Ce sont les dernières étapes de la conversation TCP avec le client. Votre logiciel cherche à fermer () la session TCP et envoie un LAST_ACK au client. Le client doit alors renvoyer un accusé de réception de la réception du LAST_ACK. Je suis d'accord avec les pehrs dans la mesure où le client (peut-être un pare-feu) peut ne pas l'avoir reconnu ou le paquet a peut-être été perdu ... ce sont les deux cas les plus probables.
Imo
1
Il n'envoie pas de LAST_ACK au client. Il envoie un FIN et attend actuellement un ACK, ayant déjà reçu un FIN et envoyé un ACK. C'est le dernier état après la fermeture de la connexion.
user207421
2

LAST_ACK signifie que votre extrémité a reçu un FIN de l'homologue, envoyé un ACK, envoyé un FIN et attend le dernier ACK du pair. À ce stade, l'application ne peut plus rien faire: le socket est fermé. L'application est peut-être même sortie. À partir de là, il appartient à TCP de renvoyer le FIN jusqu'à ce qu'il obtienne l'ACK final, ou expire. Vous ne pouvez pas faire grand-chose en tant qu'administrateur, sauf enquêter sur le réseau.

user207421
la source
0

Je crois que @lmo a raison de dire que c'est "le dernier état juste avant de fermer la connexion TCP", mais en plus de cela, sur la base de ma lecture de la page wikipedia, il convient de noter que cela ne fait pas partie de la " Mécanisme de fermeture active "qui (à ma connaissance) est la fin de la plupart des connexions saines, mais fait plutôt partie de la séquence" Passive Close ", qui est vraisemblablement associée à Bad Stuff Happening.

(FWIW, je suis des langues, pas des réseaux. Je serais heureux d'avoir des éclaircissements d'une personne des réseaux.)

John Clements
la source
Il n'a pas raison de dire cela, et il n'y a rien de mal à une clôture passive. Cela signifie simplement que le pair a fermé avant vous.
user207421