La modalità di connessione

Le connessioni nel livello Transport

Essendo un protocollo connection oriented, TCP si occupa di stabilire una connessione tra i due host prima di iniziare qualsiasi attività di trasmissione o controllo. La connessione tra mittente e destinatario si realizzare attraverso la definizione di un socket, ovvero una coppia di indirizzi IP (quello del mittente e quello del destinatario) e la porta attraverso la quale avverrà la comunicazione (ad esempio la porta 80 del protocollo HTTP).

La connessione TCP ha quindi come obiettivo quello di consentire il corretto scambio di informazioni tra risorse a livello applicativo che si trovano su due host diversi, ad esempio Client e Server.

Alla fine dello scambio di messaggi, TCP effettua esplicitamente la chiusura della connessione.

Apertura di una connessione – Three Way Handshake

La procedura utilizzata per creare una connessione TCP affidabile tra due host si chiama three-way handshake, ovvero, letteralmente, stretta di mano in 3 passaggi. Questa locuzione deriva dal fatto che il protocollo ha necessità di effettuare uno scambio di 3 messaggi tra host mittente e host destinatario per garantire che la connessione sia stata effettuata correttamente.

Consideriamo un host A che vuole aprire una connessione TCP con un altro host B. I passaggi da seguire sono i seguenti:

Figura 25: Three Way Handshake
Figura 25: Three Way Handshake

Passaggio 1: A invia a B un segmento SYN; il flag SYN viene impostato a 1 e il campo Sequence number contiene il valore x che specifica l’Initial Sequence Number di A;

Passaggio 2: B invia ad A un segmento SYN/ACK; i flag SYN e ACK sono impostati a 1, il campo Sequence number contiene il valore y che specifica l’Initial Sequence Number di B e il campo Acknowledgment number contiene il valore x+1, confermando così la ricezione da parte di B dell’Initial Sequence Number inviato da A;

Passaggio 3: A invia a B un segmento ACK; il flag ACK è impostato a 1 e il campo Acknowledgment number contiene il valore y+1 confermando la ricezione da parte di A dell’Initial Sequence Number inviato da B.

Teoricamente il terzo segmento non sarebbe necessario per la corretta apertura della connessione, dal momento che già dopo la ricezione da parte di A del secondo segmento, entrambi gli host hanno espresso la loro disponibilità all’apertura della connessione. Tuttavia, esso risulta necessario al fine di permettere anche all’host B una corretta stima del timeout iniziale, ovvero del tempo intercorso tra l’invio di un segmento e la ricezione del corrispondente ACK.

Il flag SYN risulta utile nell’implementazione pratica del protocollo, e nella sua successiva analisi da parte dei firewall: infatti nel traffico TCP i segmenti SYN stabiliscono nuove connessioni, che quindi potrebbe essere necessario filtrare o controllare, mentre quelli con il flag non attivo appartengono a connessioni già instaurate.

I segmenti utilizzati durante il Three Way Handshake di solito sono composti solo dai dati header, e non da dati veri e propri. In questa fase infatti il campo “Dati” può tranquillamente restare vuoto, trattandosi solo di una fase preparatoria e propedeutica all’instaurarsi di una connessione tra i due host e non finalizzata allo scambio di dati.

Il sistema del three-way handshake si rende necessario in quanto la sequenza numerica (ISN) non è legata ad un clock generale della rete, ed inoltre ogni pacchetto IP potrebbe avere il proprio modo di calcolare l’Initial Sequence Number. Infatti, alla ricezione del primo SYN non è possibile sapere se la sequenza ricevuta appartenga ad un ritardo dovuto ad una precedente connessione o si tratta di una trasmissione vera a proprio. Tuttavia, dal momento che l’ultima sequenza usata nella connessione viene memorizzata, sarà possibile effettuare una richiesta all’host mittente affinché verifichi il flag SYN appartenente alla vecchia connessione.

Chiusura di una connessione – Doppio two-way handshake

Una volta che la connessione TCP è stata stabilita, non è considerata come una singola connessione bidirezionale, ma come l’interazione di due connessioni monodirezionali, quindi ognuno dei due host coinvolti nella connessione dovrà provvedere a chiuderla. In questo modo si possono verificare condizioni di connessioni chiuse a metà, ovvero da parte di uno solo dei due host. Infatti, si può verificare l’evenienza in cui uno degli host ha chiuso, non avendo nient’altro da trasmettere, ma l’altro host ha lasciato la propria connessione attiva, dal momento che potrebbe ancora aver bisogno di ricevere informazioni da parte dell’altro host.

Nel protocollo TCP la chiusura della connessione si può effettuare in due modi: con un single way handshake [25] o con un two way handshake [26]. Nel primo caso i due host chiudono le proprie connessioni contemporaneamente, nel secondo caso invece le connessioni vengono chiuse in momenti diversi.

Figura 26: Chiusura con single way handshake
Figura 26: Chiusura con single way handshake
Figura 27: Chiusura con two way handshake
Figura 27: Chiusura con two way handshake

Il single way handshake ha un funzionamento simile al suo omologo che si occupa dell’apertura della connessione, con la differenza che il flag utilizzato sarà in FIN anziché il SYN. In questa modalità un host mittente invia ad un host destinatario un segmento con la richiesta FIN: il destinatario risponderà con FIN + ACK. A questo punto il mittente invia un ultimo ACK e la connessione viene chiusa da entrambi.

Con l’handshake a 2 vie invece la chiusura della connessione avviene in tempi differenti per i due host. In questo  caso l’host mittente invia la richiesta di FIN e attende l’ACK dal destinatario. Il destinatario a sua volta farà altrettanto, inviando anche lui un FIN e restando in attesa della risposta di ACK. Questo processo genererà quindi 4 segmenti.

In alternativa è possibile chiudere la connessione in maniera più brutale settando il flag di Reset nel segmento e quindi interrompendo la connessione in entrambe le direzioni.