Appendice A. Diagramma dello Stato di Connessione TCP
Questa appendice fornisce un'illustrazione dettagliata delle transizioni di stato della connessione TCP.
Diagramma di Transizione di Stato TCP
+---------+
| CLOSED |
+---------+
|
(passive OPEN)
|
v
+---------+
| LISTEN |
+---------+
(rcv SYN) | ^ (CLOSE)
| |
v |
+---------+
|SYN RCVD|
+---------+
(rcv ACK)|
|
(active OPEN) v
+---------+ +---------+
|SYN SENT |<---->| ESTAB |
+---------+ +---------+
| |
| (CLOSE/FIN)
| |
| v
| +---------+
| |FIN WAIT1|
| +---------+
| (rcv ACK) |
| |
| v
| +---------+
| |FIN WAIT2|
| +---------+
| (rcv FIN) |
| |
| v
| +---------+
| |TIME WAIT|
| +---------+
| (timeout) |
| |
| v
| +---------+
+---------->| CLOSED |
+---------+
Chiusura Simultanea: Chiusura Passiva:
FIN WAIT1 --rcv FIN--> CLOSING ESTABLISHED --rcv FIN--> CLOSE WAIT
CLOSING --rcv ACK--> TIME WAIT CLOSE WAIT --CLOSE--> LAST ACK
LAST ACK --rcv ACK--> CLOSED
Descrizioni degli Stati
CLOSED
- Stato fittizio che rappresenta nessun TCB (Transmission Control Block), quindi nessuna connessione
- Questo è il punto di partenza e di arrivo per tutte le connessioni
LISTEN
- Server in attesa di richiesta di connessione da qualsiasi TCP remoto
- Stato di apertura passiva
SYN-SENT
- Client in attesa di richiesta di connessione corrispondente dopo aver inviato SYN
- Stato di apertura attiva
SYN-RECEIVED
- Server in attesa di ACK dopo aver ricevuto SYN e inviato SYN-ACK
- Stato intermedio dell'handshake a tre vie
ESTABLISHED
- Connessione stabilita, trasferimento dati possibile
- Questo è lo stato normale durante la fase di trasferimento dati
FIN-WAIT-1
- Chiusore attivo in attesa di ACK o FIN dal remoto
- Primo stato di terminazione della connessione
FIN-WAIT-2
- In attesa di FIN dal remoto dopo aver ricevuto ACK per il FIN inviato
- Indica che il lato locale non invierà più dati, ma può ancora ricevere
CLOSE-WAIT
- Chiusore passivo in attesa della chiusura dell'applicazione locale dopo aver ricevuto FIN
- Può ancora inviare dati a questo punto
CLOSING
- Stato durante la chiusura simultanea
- In attesa di ACK del FIN dal remoto
LAST-ACK
- Chiusore passivo in attesa di ACK dopo aver inviato FIN
- Va direttamente a CLOSED dopo aver ricevuto ACK
TIME-WAIT
- Il chiusore attivo entra in questo stato dopo aver ricevuto FIN dal remoto e inviato ACK
- Attende 2MSL (Maximum Segment Lifetime)
- Scopi:
- Garantire che l'ACK finale raggiunga il remoto
- Prevenire interferenze di vecchi segmenti con nuove connessioni
Transizioni di Stato Chiave
Stabilimento della Connessione (Handshake a Tre Vie)
CLOSED --> (active open) --> SYN-SENT
SYN-SENT --> (receive SYN-ACK) --> ESTABLISHED
CLOSED --> (passive open) --> LISTEN
LISTEN --> (receive SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (receive ACK) --> ESTABLISHED
Chiusura della Connessione (Handshake a Quattro Vie)
Chiusura Attiva:
ESTABLISHED --> (send FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (receive ACK) --> FIN-WAIT-2
FIN-WAIT-2 --> (receive FIN) --> TIME-WAIT
TIME-WAIT --> (2MSL timeout) --> CLOSED
Chiusura Passiva:
ESTABLISHED --> (receive FIN) --> CLOSE-WAIT
CLOSE-WAIT --> (application close) --> LAST-ACK
LAST-ACK --> (receive ACK) --> CLOSED
Apertura Simultanea
CLOSED --> (send SYN) --> SYN-SENT
SYN-SENT --> (receive SYN) --> SYN-RECEIVED
SYN-RECEIVED --> (receive ACK) --> ESTABLISHED
Chiusura Simultanea
ESTABLISHED --> (send FIN) --> FIN-WAIT-1
FIN-WAIT-1 --> (receive FIN) --> CLOSING
CLOSING --> (receive ACK) --> TIME-WAIT
TIME-WAIT --> (2MSL timeout) --> CLOSED
Importanza dello Stato TIME-WAIT
Perché è Necessario TIME-WAIT?
-
Garantire una Chiusura Affidabile:
- Se l'ACK finale viene perso, il remoto ritrasmetterà FIN
- Lo stato TIME-WAIT garantisce la capacità di rispondere al FIN ritrasmesso
-
Prevenire l'Interferenza della Vecchia Connessione:
- Vecchi segmenti ritardati possono esistere nella rete
- Attendere 2MSL garantisce che i vecchi segmenti scompaiano dalla rete
- Previene che i vecchi segmenti vengano scambiati per dati validi da nuove connessioni
Tempo 2MSL:
- MSL (Maximum Segment Lifetime): Tempo massimo che un segmento può vivere nella rete
- Tipicamente MSL = 2 minuti
- Quindi TIME-WAIT = 2MSL = 4 minuti
- Alcune implementazioni usano tempi più brevi (es., 30 o 60 secondi)
Nota: Per la logica completa di transizione di stato e la gestione dei casi limite, fare riferimento alla specifica completa in RFC 9293.