Uso netstat
per controllare lo stato della mia porta.
Mi chiedevo che cosa è la differenza tra stato della porta LISTENING
, TIME_WAIT
, CLOSE_WAIT
, FIN_WAIT1
e ESTABLISHED
?
Uso netstat
per controllare lo stato della mia porta.
Mi chiedevo che cosa è la differenza tra stato della porta LISTENING
, TIME_WAIT
, CLOSE_WAIT
, FIN_WAIT1
e ESTABLISHED
?
Risposte:
La manpage di netstat
ha una breve descrizione di ogni stato:
ESTABLISHED
The socket has an established connection.
SYN_SENT
The socket is actively attempting to establish a connection.
SYN_RECV
A connection request has been received from the network.
FIN_WAIT1
The socket is closed, and the connection is shutting down.
FIN_WAIT2
Connection is closed, and the socket is waiting for a shutdown
from the remote end.
TIME_WAIT
The socket is waiting after close to handle packets still in the
network.
CLOSE The socket is not being used.
CLOSE_WAIT
The remote end has shut down, waiting for the socket to close.
LAST_ACK
The remote end has shut down, and the socket is closed. Waiting
for acknowledgement.
LISTEN The socket is listening for incoming connections. Such sockets
are not included in the output unless you specify the
--listening (-l) or --all (-a) option.
CLOSING
Both sockets are shut down but we still don't have all our data
sent.
UNKNOWN
The state of the socket is unknown.
È possibile utilizzare i diagrammi di transizione di stato (esempi qui , qui e qui ) per comprendere meglio gli stati.
Considera due programmi che tentano una connessione socket (chiamali a
e b
). Entrambi creano prese e passano allo LISTEN
stato. Quindi un programma (diciamo a
) prova a connettersi all'altro ( b
). a
invia una richiesta ed entra nello SYN_SENT
stato, b
riceve la richiesta ed entra nello SYN_RECV
stato. Quando b
riconosce la richiesta, entrano nello ESTABLISHED
stato e svolgono la propria attività. Ora possono succedere un paio di cose:
a
desidera chiudere la connessione ed entra FIN_WAIT1
. b
riceve la FIN
richiesta, invia un ACK
(poi a
entra FIN_WAIT2
), entra CLOSE_WAIT
, dice a
che sta chiudendo e entra LAST_ACK
. Una volta a
riconosciuto questo (ed entra TIME_WAIT
), b
entra CLOSE
. a
aspetta un po 'per vedere se è rimasto qualcosa, quindi entra CLOSE
.a
e b
hanno terminato l'attività e decidono di chiudere la connessione (chiusura simultanea). Quando a
è in FIN_WAIT
, e invece di ricevere un ACK
da b
, riceve un FIN
(come b
desidera anche chiuderlo), a
entra CLOSING
. Ma ci sono ancora alcuni messaggi da inviare (quello ACK
che a
dovrebbe ottenere per il suo originale FIN
), e una volta che questo ACK
arriva, a
entra TIME_WAIT
come al solito.