Qual è la differenza tra lo stato della porta “LISTENING”, “TIME_WAIT”, “CLOSE_WAIT” e “ESTABLISHED”?


Risposte:


58

La manpage di netstatha 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 ae b). Entrambi creano prese e passano allo LISTENstato. Quindi un programma (diciamo a) prova a connettersi all'altro ( b). ainvia una richiesta ed entra nello SYN_SENTstato, briceve la richiesta ed entra nello SYN_RECVstato. Quando briconosce la richiesta, entrano nello ESTABLISHEDstato e svolgono la propria attività. Ora possono succedere un paio di cose:

  1. adesidera chiudere la connessione ed entra FIN_WAIT1. briceve la FINrichiesta, invia un ACK(poi aentra FIN_WAIT2), entra CLOSE_WAIT, dice ache sta chiudendo e entra LAST_ACK. Una volta ariconosciuto questo (ed entra TIME_WAIT), bentra CLOSE. aaspetta un po 'per vedere se è rimasto qualcosa, quindi entra CLOSE.
  2. ae bhanno terminato l'attività e decidono di chiudere la connessione (chiusura simultanea). Quando aè in FIN_WAIT, e invece di ricevere un ACKda b, riceve un FIN(come bdesidera anche chiuderlo), aentra CLOSING. Ma ci sono ancora alcuni messaggi da inviare (quello ACKche adovrebbe ottenere per il suo originale FIN), e una volta che questo ACKarriva, aentra TIME_WAITcome al solito.

Ulteriori informazioni alla risposta di Muru. Diagramma di stato su netstat (citato da: http://www4.cs.fau.de/Projects/JX/Projects/TCP/tcpstate.html )! inserisci la descrizione dell'immagine qui
charkh
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.