Was bedeutet LAST_ACK als Zustandswert in netstat?

15

Wenn auf einem Windows-Server mehrere tausend Ports geöffnet sind LAST_ACK(wie von netstat angezeigt), was könnte dies bedeuten? Liegt es daran, dass ein Endpunkt darauf wartet, dass der andere antwortet?

Nick Bolton
quelle

Antworten:

10

Der Status last_ack (wenn ich mich richtig an meinen TCP-Stack erinnere) ist der Status, in dem Sie Ihre FIN-Nachricht erhalten haben, um die Verbindung von Ihrem Nachbarn zu trennen, aber Sie müssen Ihre Verbindung noch spülen und beenden. Sie senden die finale FIN selbst und warten auf eine ACK.

In der Regel hängt last_ack, was bedeutet, dass Ihre Anwendung einen Socket offen hält, auch wenn das andere Ende das Senden von Daten beendet hat. Dies kann mehrere Gründe haben. Möglicherweise ist eine Firewall oder ein anderer Load Balancer vorhanden, der die letzte ACK vom Client verliert und Sie im Status last_ack festhält. Wenn das Zeitlimit für die Verbindungen nach einigen Minuten (ca. 10 Minuten) nicht überschritten wird, liegt wahrscheinlich ein Fehler vor.

Schauen Sie sich das Zustandsdiagramm unter http://tangentsoft.net/wskfaq/articles/debugging-tcp.html an

pehrs
quelle
4
Nicht richtig. Sie beschreiben CLOSE_WAIT.
user207421
4

LAST_ACK ist der letzte Status direkt vor dem Beenden der TCP-Verbindung.

Imo
quelle
1
Danke, was kann dazu führen, dass ein Port in diesem Zustand hängt?
Nick Bolton
Ist dies ein IIS-Webserver (oder ein anderer Dienst), auf dem Sie dies sehen, oder Ihre eigene Anwendung?
Imo
Die Anwendung implementiert den XML-RPC-Client "Cook Computing" (von Asp.Net, ausgeführt über IIS) und kommuniziert mit einem Java XML-RPC-Server.
Nick Bolton
1
Dies ist die letzte Phase der TCP-Konversation mit dem Client. Ihre Software versucht, die TCP-Sitzung zu schließen () und sendet ein LAST_ACK an den Client. Der Client sollte dann eine Bestätigung zurücksenden, dass der LAST_ACK empfangen wurde. Ich stimme pehrs darin zu, dass der Client (möglicherweise die Firewall) dies nicht bestätigt hat oder das Paket verloren gegangen ist. Dies sind die beiden wahrscheinlichsten Fälle.
Imo
1
Es wird kein LAST_ACK an den Client gesendet. Es sendet eine FIN und wartet derzeit auf eine ACK, nachdem es bereits eine FIN empfangen und eine ACK gesendet hat. Dies ist der letzte Status nach dem Schließen der Verbindung.
user207421
2

LAST_ACK bedeutet, dass Ihr End eine FIN vom Peer erhalten, eine ACK gesendet und eine FIN gesendet hat und auf die endgültige ACK vom Peer wartet. Zu diesem Zeitpunkt kann die Anwendung nichts weiter tun: Der Socket ist geschlossen. Möglicherweise wurde die Anwendung sogar beendet. Von hier an ist es Sache von TCP, das FIN erneut zu senden, bis es die endgültige Bestätigung erhält, oder es tritt eine Zeitüberschreitung auf. Sie können als Administrator nicht viel tun, außer das Netzwerk zu untersuchen.

user207421
quelle
0

Ich glaube, dass @lmo zu Recht sagt, dass es "der letzte Zustand unmittelbar vor dem Beenden der TCP-Verbindung" ist, aber darüber hinaus ist es, basierend auf meiner Lektüre der Wikipedia-Seite, erwähnenswert, dass dies nicht Teil der " "Active Close" -Mechanismus, der (nach meinem Verständnis) das Ende der am besten benommenen Verbindungen darstellt, aber eher Teil der "Passive Close" -Sequenz ist, die vermutlich mit "Bad Stuff Happening" in Verbindung gebracht wird.

(FWIW, ich bin Sprachen, keine Netzwerke. Ich würde mich über eine Klärung durch eine Netzwerkperson freuen.)

John Clements
quelle
Er sagt das nicht richtig und es ist nichts Schlimmes an einem passiven Schluss. Es bedeutet nur, dass der Peer vor Ihnen geschlossen wurde.
user207421