La chiusura della connessione a livello di trasporto può avvenire:
-
in modo asimmetrico: una stazione può chiudere la connessione quando vuole (come in una comunicazione telefonica); non garantisce che tutti i dati siano stati consegnati;
-
in modo simmetrico: ogni stazione può chiudere la connessione in una sola direzione; i dati possono continuare a scorrere nell’altra direzione;
-
in modo che le due stazioni siano d’accordo nel chiudere la connessione.
Per concordare la chiusura della connessione possono verificarsi dei problemi, esemplificati dal problema dei due eserciti. Due armate di uno stesso esercito si trovano ai lati di un canalone in cui si trova un esercito nemico; le due armate ai lati del canalone insieme potrebbero battere l’esercito nemico, ma ciascuna da sola verrebbe sicuramente sconfitta; dovrebbero mettersi d’accordo sul momento dell’attacco ma possono comunicare solo mandando un messaggero che deve attraversare il canalone (e quindi potrebbe venire catturato). In pratica l’armata che manda il messaggio non è sicura che il messaggio arrivi; potrebbe aspettare una conferma dell’altra armata, ma cosa succede se è il messaggero che porta la conferma ad essere catturato? E si ripropone lo stesso problema con una eventuale conferma della conferma.
Per la chiusura della connessione si utilizza un protocollo three way handshake che però non è infallibile.
Una delle stazioni manda una richiesta di chiusura della connessione; l’altra stazione manda a sua volta la richiesta di chiusura della connessione e fa partire un timer; la prima stazione quando la riceve manda una conferma e chiude la connessione; anche la seconda stazione chiude la connessione quando riceve la conferma.
Se viene persa la conferma finale, la seconda stazione chiude ugualmente la connessione quando scade il timer.
Se si perde la richiesta di chiusura della connessione inviata in risposta dalla seconda stazione, la prima non ricevendo risposta entro un tempo prestabilito invia di nuovo la sua richiesta; riprova per un certo numero di tentativi poi chiude comunque la connessione; la seconda stazione chiude comunque la connessione allo scadere del suo timer.
Il protocollo non funziona nel caso in cui vadano perse tutte le richieste di chiusura della connessione della prima stazione. Una soluzione è che le stazioni chiudano la connessione quando non ricevono nulla per un certo intervallo di tempo. Per evitare che la connessione venga chiusa erroneamente, le stazioni devono scambiarsi messaggi con una certa frequenza; eventualmente devono essere mandati dei messaggi vuoti (dummy).
La chiusura di una connessione TCP funziona in questo modo.