18.3.2 La connessione

18.3.2.1 Apertura

Si supponga che un’applicazione (socket) A voglia comunicare con un’altra, B. Secondo il protocollo TCP, la prima operazione da effettuare è quella di stabilire una connessione. A tal fine viene effettuata la sincronizzazione del sequence number tra A e B (A informa B del suo sequence number attuale e B risponde ad A di aver ricevuto il suo sequence number e viceversa) per mezzo delle seguenti operazioni

  1. L’applicazione A (client) invia a B (server) il primo TCP segment (detto anche SYN segment) contenente
    A ---><SN=100, SYN>---> B
  2. B risponde con un altro TCP segment (anche questo viene denominato SYN segment) contenente
    A <---<SN=300, AN=101, SYN, ACK><--- B
  3. A risponde a sua volta con un altro TCP segment, per confermare che ha ricevuto l’ISN di B. Esso contiene
    A ---><SN=101, AN=301, ACK>---> B

Questi tre TCP segment stabiliscono una connessione. Per questo motivo tale meccanismo è anche detto three-way handshake.


pict
Figura 18.3: Diagramma relativo all’apertura di una connessione TCP.

L’applicazione A effettua quella che viene chiamata un’apertura attiva della connessione (active open), mentre l’applicazione B fa un’apertura passiva (passive open).

La RFC 793 specifica che il serial number dovrebbe essere visto come un contatore (incrementato ogni 4 ms circa). Lo scopo di questo valore è quello di fare in modo che i pacchetti che rimangono congestionati nella rete non vengano presi successivamente in considerazione nel caso in cui siano consegnati in ritardo, rispetto al flusso dei pacchetti inviati nella connessione esistente.

È opportuno sottolineare il fatto che il primo TCP segment con il quale A invierà le informazioni a B conterrà nel campo Sequence Number il valore successivo al primo SYN segment inviato, ovvero lo stesso valore dell’ultimo TCP segment necessario all’apertura della connessione. Questo perché la conferma della ricezione del messaggio non incrementa tale valore, altrimenti sarebbe necessario risincronizzarlo e quindi si avrebbe un ciclo infinito di sincronizzazione.
18.3.2.2 Chiusura

Si supponga che un’applicazione (socket) A voglia chiudere la connessione esistente con un’altra, B. A tal fine vengono effettuate le seguenti operazioni

  1. L’applicazione A invia un TCP segment (FIN segment) che contiene
    A ---><SN=100, AN=300, FIN, ACK>---> B
  2. B risponde con un altro TCP segment contenente
    A <---<SN=300, AN=101, ACK><--- B
  3. B invia un altro TCP segment per chiudere a sua volta la comunicazione nell’altra direzione. Tale TCP segment contiene
    A <---<SN=300, AN=101, FIN, ACK><--- B
  4. A risponde con un altro TCP segment contenente
    A ---><SN=101, AN=301, ACK>---> B


pict
Figura 18.4: Diagramma relativo alla chiusura di una connessione TCP.

La chiusura completa della connessione coinvolge 4 TCP segment. Anche in questo caso, si parla di chiusura attiva (active close) da parte di chi effettua la chiusura del canale di comunicazione per primo, per distinguerla dalla chiusura passiva (passive close) effettuata da chi riceve la richiesta di chiusura.