Il protocollo TCP

E' un protocollo di trasporto di tipo connection-oriented per la trasmissione dati tra due host.

Il protocollo TCP ha il compito di fornire alle applicazioni un servizio affidabile per il trasferimento dei dati attraverso la rete. Questo protocollo offre un servizio orientato alla connessione (connection-oriented), esso garantisce la consegna e l'ordinamento corretto dei dati grazie all'utilizzo di sequence number e conferme di consegna. Tra gli host impegnati nella comunicazione viene simulato un colloquio diretto attraverso un canale che consente lo scambio interattivo delle informazioni (full-duplex). I dati vengono presentati e ricevuti da TCP ai protocolli superiori come un'unica sequenza (byte-stream). In questo modo è il TCP ad occuparsi di segmentarli lasciando ai protocolli superiori solo il compito di prepararli. Le informazioni contenute in un segmento sono suddivise in due parti: l'intestazione (header) e i dati (data). Il Transmission Control Protocol è utilizzato da diversi protocolli a livello applicativo quali FTP, Telnet, SMTP, POP3 ed altri.

HEADER TCP
L'intestazione di un pacchetto TCP è formata dai seguenti campi:
Source Port: campo di 16 bit, contiene il numero porta utilizzata dall'host mittente;
Destination Port: campo di 16 bit, contiene il numero della porta utilizzata dall'host destinatario;
Sequence Number: campo di 32 bit, definisce l'ordine in cui i segmenti devono essere riassemblati. E' utilizzato anche nella fase di connessione (handshake);
Acknowledgment Number: campo di 16 bit, contiene il prossimo numero di sequenza che l'host destinatario si aspetta di ricevere dall'host mittente. Esprime il numero di segmenti ricevuti correttamente fino a quel momento;
Data Offset: campo di 4 bit, definisce la lunghezza in parole a 32 bit dell'intestazione TCP. Indica dove inziano i dati;
Reserved: campo di 6 bit, riservato per futuri utilizzi;
Urgent Controlo Bit: campo di 6 bit, contiene a sua volta 6 flag da un bit:
 - URG se è attivo indica che il campo Urgent Pointer è significativo e deve essere letto;
 - ACK se attivo indica che il campo Acknowledgement Number è significativo è deve essere letto;
 - PSH se attivo significa che il pacchetto deve essere inviato immediatamente, invece di attendere il riempimento del buffer;
 - RST viene utilizzato per indicare che la connessione deve essere reinizializzata, solitamente a seguito di problemi;
 - SYN viene utilizzato per stabilire una sessione, indica al destinatario di leggere il campo Sequence number e sincronizzare il proprio con esso;
 - FIN indica che l'host mittente non ha più dati da spedire, e vuole terminare la connessione;
Windows Size: campo di 16 bit, contiene la dimensione del buffer di dati che il mittente può accettare;
Checksum: campo di 16 bit, stabilisce la correttezza delle informazioni (Intestazione+Dati);
Urgent Pointer: campo di 16 bit, indica quale porzione dati è urgente;
Options: campo di dimensione varabile, contiene le opzioni per la comunicazione;
Padding: campo di dimensioni variabili, è utilizzato per far raggiungere all'area d'intestazione una dimensione di 32 bit o un suo multiplo;
Data: i dati trasportati dal protocollo;

I FLAG TCP
Durante una sessione TCP è di fondamentale importanza lo stato dei flag del campo Urgent Control Bit che possono assumere combinazioni differenti:
SYN: è presente nel primo pacchetto di un host che intende stabilire la connessione con un altro;
SYN | ACK: è la risposta di un host contattato che accetta la connessione;
ACK: a connessione stabilita ogni pacchetto è confermato tramite i flag ACK attivo;
FIN: è inviato da un host che intende chiudere una sessione;
FIN | ACK: è la risposta di un host che conferma la chiusura di una connessione;
RST: viene inviato da un host che riceve un pacchetto inatteso e che quindi non accetta la connessione;

STATI DI UNA SESSIONE TCP
Una sessione TCP attraversa diversi stati in seguito al verificarsi di determinati eventi:
LISTEN: host in attesa di connessione;

SYN-SENT: host che ha inviato una richiesta di connessione ed è in attesa di risposta;
SYN-RECEIVED: host in attesa di conferma per la richiesta di connessione dopo aver ricevuto ed inviato una richiesta di conferma;
ESTABLISHED: host con una connessione aperta durante la quale i dati sono inviati e ricevuti;
FIN-WAIT1: host in attesa di una richiesta di termine della sessione o di conferma di richiesta di termine della connessione;
FIN-WAIT2: host in attesa di una richiesta di termine della sessione da parte di un host remoto;
CLOSE-WAIT: host in attesa di terminare la sessione;
CLOSING: host in attesa della conferma della richiesta di termine di connessione;
LAST-ACK: host in attesa della conferma dellle richiesta di termine della connessione già inviata all'host remoto;
TIME-WAIT: host in attesa (per un determinato lasso di tempo) per garantire che l'host remoto abbia ricevuto la conferma della richiesta di termine della connessione;
CLOSED: non esiste connessione tra host;

SESSIONE TCP
Il presupposto per instaurare una connessione è l'esistenza di un server con un socket attivo in stato di listen (apertura passiva). Inizialmente il client ed il server sono in stato closed. Successivamente una sessione TCP attraversa i seguenti passaggi:
- Instaurazione della connessione
1. Il client esegue una procedura chiamata apertura attiva creando un socket, ed inviando un segmento TCP con il flag SYN (synchronize) settato ed un sequence number (random) seq=x;
[Host A (Stato Syn Sent)] SEQ=100 SYN --> [Host B (Stato LISTEN)]
2. Il server risponde con il flag SYN e ACK (risposta di conferma) attivi, inviando un sequence number  settato a seq=y e ACK x+1 oppure se non accetta la connessione risponde inviando un pacchetto con flag RST attivo;

[Host A (Stato ESTABLISHED)] <-- SEQ=300 ACK=101 SYN,ACK [Host B (Stato Syn Received)]
3. Il client riceve il segmento dal server e ne invia uno con il flag ACK settato: ACK x+1. Durante questa fase gli host impostano la dimensione massima del buffer di trasmissione (Window Size). La procedura three-way handshake è terminata ed inizia il trasferimento dati;
[Host A (Stato ESTABLISHED)] SEQ=101 ACK=301 ACK --> [Host B (Stato ESTABLISHED)]
- Scambio dati
4. I Dati vengono scambiati tra i due host.
[Host A (Stato ESTABLISHED)] SEQ=101 ACK=301 ACK (Dati) --> [Host B (Stato ESTABLISHED)]
- Termine della connessione
5. Per rilasciare la connessione il client invia un segmento contenente il flag FIN settato;
[Host A (Stato FIN-WAIT-1)] SEQ=500 ACK=700 FIN,ACK --> [Host B (Stato CLOSE-WAIT)]
6. Il server lo riceve e invia un segmento di conferma con il successivo numero sequenziale atteso ACK y+1;
[Host A (Stato FIN-WAIT-2)] <-- SEQ=700 ACK=501 ACK [Host B (Stato CLOSE-WAIT)]
7. Il server invia la richiesta di fine connessione e la conferma con il flag FIN;
[Host A (Stato TIME-WAIT)] <-- SEQ=700 ACK=501 FIN,ACK [Host B (Stato LAST-ACK)]
8. Il client conferma la ricezione, ed il server chiude la connessione;
[Host A (Stato TIME-WAIT)] SEQ=501 ACK=701 ACK --> [Host B (Stato CLOSED]
9. La connessione viene chiusa anche dal lato client;
[Host A (Stato CLOSED)]

FINESTRE SCORREVOLI e TIMEOUT
Il meccanismo delle finestre scorrevoli (Sliding Windows) viene utilizzato dal TCP/IP per migliorare le performance di una trasmissione. La dimensione della finestra di trasmissione, contenuto nel campo Windows Size, viene scambiata tra i due host nella fase di handshaking (può comunque variare in seguito durante la sessione).
Questa dimensione indica il numero massimo di segmenti che si possono inviare ogni volta. Il meccanismo dei timeout permette invece di rispedire un pacchetto, qualora scaduto un determinato periodo di tempo (timeout appunto) non sia stata ricevuta la conferma da parte dell'host remoto.

Poniamo che a seguito dell'handshake si abbia una finestra di partenza di 6 segmenti:
1. L'host mittente invia i 6 segmenti al all'host destinatario.
Host A [(1)(2)(3)(4)(5)(6)]7 8 9 10 11 12  - Host B [ ]
Host A (1)(2)(3)(4)(5)(6) --> Host B
2. Se l'host destinatario riceve solamente i segmenti 1 e 2, invia una conferma indicando che si aspetta il segmento 3, inidicando quindi che i segementi 1 e 2 sono stati ricevuti. A questo punto la finestra si sposta di due segmenti in modo da poter trasmettere i segmenti 7 ed 8.
Se non viene confermata la ricezione dei segmenti da 3 a 6 inviati precedentemente, il timer di ritrasmissione raggiunge lo zero e vengono quindi rispediti ma con il tempo di timeout raddoppiato.
Host A 1 2 [(3)(4)(5)(6)(7)(8)] 9 10 11 12  - 1 2 [ ]
Host A (7)(8) --> Host B
3. L'host destinatario invia un pacchetto di conferma in cui si aspetta di ricevere il segmento 8, indicando quindi di aver ricevuto i segmenti fino al 7. La finestra a questo punto scorre oltre il segmento 7, e si devono inviare i segmenti da 8 a 12 e cosi via.
Host A 1 2 3 4 5 6 7 [(8)(9)(10)(11)(12)] - Host B 1 2 3 4 5 6 7 []
Host A (8)(9)(10)(11)(12) --> Host B

Grazie a queste tecniche si ha un miglioramento delle prestazioni in quanto, l'host destinatario può inviare le conferme di ricezione di più segmenti (contigui) contemporaneamente riducendo quindi il traffico di rete. Naturalmente una finestra troppo grande potrebbe portare a perdere troppi segmenti e quindi a peggiorare la trasmissione.

Privacy Policy