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
- L’applicazione A (client) invia a B (server) il primo TCP segment (detto anche
SYN segment) contenente
-
• un valore all’interno del campo Sequence number detto ISN (Initial Sequence
Number), che è il valore con il quale A intende iniziare la sequenza dei
pacchetti inviati a B;
-
• il flag SYN impostato, per indicare che il valore del campo Sequence Number
è valido;
A -
<SN=100,
SYN>-
B
- B risponde con un altro TCP segment (anche questo viene denominato SYN segment)
contenente
-
• l’ISN di B all’interno del campo Sequence Number;
-
• il valore successivo all’ISN di A (recuperato dal TCP segment appena
ricevuto) all’interno del campo Acknowledgment Number;
-
• il flag SYN impostato, per indicare che il valore del campo Sequence Number
è valido;
-
• il flag ACK impostato, per indicare che il valore del campo Acknowledgment
Number è valido;
A
-<SN=300,
AN=101,
SYN,
ACK>
- B
- A risponde a sua volta con un altro TCP segment, per confermare che ha ricevuto l’ISN
di B. Esso contiene
-
• il valore successivo all’ISN di A nel campo Sequence Number;
-
• il valore successivo all’ISN di B nel campo Acknowledgment Number;
-
• il flag ACK impostato, per indicare che il valore del campo Acknowledgment
Number è valido;
A -
<SN=101,
AN=301,
ACK>-
B
Questi tre TCP segment stabiliscono una connessione. Per questo motivo tale meccanismo
è anche detto three-way handshake.
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 s 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
- L’applicazione A invia un TCP segment (FIN segment) che contiene
-
• il flag FIN impostato, che indica che si desidera interrompere la connessione:
A non intende inviare altri TCP segment a B;
-
• il flag ACK impostato, che indica la conferma dei byte ricevuti fino a quel
momento;
A -
<SN=100,
AN=300,
FIN,
ACK>-
B
- B risponde con un altro TCP segment contenente
-
• il flag ACK impostato, che indica di aver ricevuto il FIN segment da A;
A
-<SN=300,
AN=101,
ACK>
- B
- B invia un altro TCP segment per chiudere a sua volta la comunicazione nell’altra
direzione. Tale TCP segment contiene
-
• il flag FIN impostato, che indica che si desidera interrompere la connessione:
B non intende inviare altri TCP segment ad A;
A
-<SN=300,
AN=101,
FIN,
ACK>
- B
- A risponde con un altro TCP segment contenente
-
• il flag ACK impostato, che indica di aver ricevuto il FIN segment da B;
A -
<SN=101,
AN=301,
ACK>-
B
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.