Cosa significa LAST_ACK come valore di stato in netstat?


15

Se un server Windows ha diverse migliaia di porte aperte nello LAST_ACKstato (come mostrato da netstat), cosa potrebbe significare? È perché un endpoint sta aspettando che l'altro risponda?

Risposte:


10

Lo stato last_ack (se ricordo correttamente il mio stack TCP) è lo stato in cui hai ricevuto il tuo messaggio FIN per chiudere la connessione dal tuo vicino, ma devi comunque svuotare e chiudere la connessione. Invia tu stesso il FIN finale e attendi un ACK.

In genere appeso in last_ack significa che l'applicazione mantiene aperto un socket anche quando l'altra estremità ha terminato l'invio dei dati. Questo può accadere per diversi motivi. Potrebbe esserci un firewall o un altro bilanciamento del carico che perde l'ultimo ACK dal client e ti lascia bloccato nello stato last_ack. Se le connessioni non scadono dopo alcuni minuti (10 o giù di lì), probabilmente hai un bug.

Dai un'occhiata al diagramma di stato su http://tangentsoft.net/wskfaq/articles/debugging-tcp.html


4
Non corretto. Stai descrivendo CLOSE_WAIT.
user207421

4

LAST_ACK è l'ultimo stato prima di chiudere la connessione TCP.


1
Grazie, cosa può causare il blocco di una porta in questo stato?
Nick Bolton,

Si tratta di un server web IIS (o altro servizio) su cui lo stai vedendo o della tua applicazione?
Imo,

L'applicazione implementa il client XML-RPC "Cook Computing" (da Asp.Net, eseguito tramite IIS) e sta parlando con un server XML XML-RPC.
Nick Bolton,

1
Sono le fasi finali della conversazione TCP con il client. Il tuo software sembra chiudere () la sessione TCP e invia un LAST_ACK al client. Il client dovrebbe quindi inviare una conferma di ricezione del LAST_ACK. Sono d'accordo con pehrs in quel client (forse firewall) potrebbe non averlo riconosciuto o il pacchetto potrebbe essere andato perso ... questi sono i due casi più probabili.
Imo

1
Non "invia un LAST_ACK al client". Invia un FIN ed è attualmente in attesa di un ACK, avendo già ricevuto un FIN e inviato un ACK. È l'ultimo stato dopo aver chiuso la connessione.
user207421

2

LAST_ACK significa che il tuo fine ha ricevuto un FIN dal peer, inviato un ACK, inviato un FIN e sta aspettando l'ACK finale dal peer. A questo punto non c'è più nulla che l'applicazione possa fare: il socket è chiuso. L'applicazione potrebbe anche essere uscita. Da qui in poi spetta a TCP rinviare la FIN fino a quando non ottiene l'ACK finale o il timeout. Non puoi fare molto come amministratore se non indagare sulla rete.


0

Credo che @lmo abbia ragione nel dire che è "l'ultimo stato prima di chiudere la connessione TCP", ma in aggiunta a ciò, in base alla mia lettura della pagina di Wikipedia, vale la pena notare che questo non fa parte del " Active Close "meccanismo che (a mio avviso) rappresenta la fine della maggior parte delle connessioni ben educate, ma piuttosto parte della sequenza" Passive Close ", presumibilmente associata a Bad Stuff Happening.

(FWIW, sono le lingue, non le reti. Sarei felice di chiarimenti da una persona delle reti.)


Non ha ragione nel dirlo, e non c'è niente di male in una chiusura passiva. Significa solo che il peer si è chiuso prima di te.
user207421
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.