Il protocollo TCP, Transmission Control Protocol (in italiano Protocollo di Controllo di Trasmissione), è uno dei protocolli principali del livello trasporto del modello TCP/IP.
Il protocollo TCP permette, a livello delle applicazioni, di gestire i dati provenienti (o a destinazione) del livello inferiore del modello (cioè il protocollo IP). Una volta che i dati sono forniti al protocollo IP, quest'ultimo li incapsula in datagrammi IP, fissando il campo protocollo a 6 (Per sapere se il protocollo applicato è TCP, ecc.). TCP è un protocollo orientato connessione, cioè permette a due terminali che comunicano di controllare lo stato della trasmissione. Le caratteristiche principali del protocollo TCP sono le seguenti:
TCP permette di rimettere in ordine i datagrammi provenienti dal protocollo IP;
TCP permette di verificare il flusso di dati per evitare una saturazione della rete;
TCP permette di formattare i dati in segmenti di lunghezza variabile per rimandarli al protocollo IP;
TCP permette la multiplazione di dati, cioè di far circolare simultaneamente delle informazioni provenienti da sorgenti (applicazioni ad esempio) distinte su una stessa linea;
TCP permette infine di cominciare e finire una comunicazione in modo "cortese.
Grazie al protocollo TCP, le applicazioni possono comunicare in modo sicuro (grazie al sistema di accuse di ricezione del protocollo TCP), indipendentemente dai livelli inferiori. Questo significa che i router (che lavorano a livello internet) hanno come unico ruolo l'invio dei dati sotto forma di datagramma, senza preoccuparsi del controllo dei dati stessi, dato che questo è realizzato dal livello trasporto (più particolarmente dal protocollo TCP).
Al momento di una comunicazione con il protocollo TCP, i due terminali devono stabilire una connessione. Il terminale emittente (quello che chiede la connessione) è detto client, mentre il terminale ricettore è detto server. Siamo allora in un ambiente client-server. I terminali di un tale ambiente comunicano in modo connesso, cioè la comunicazione avviene nei due sensi.
Per permettere il buon svolgimento della comunicazione e di tutti i controlli che l'accompagnano, i dati sono incapsulati, cioè viene aggiunta un'intestazione ai pacchetti di dati che permette di sincronizzare le trasmissioni e assicurarne la ricezione. Un'altra particolarità del TCP è di poter regolare la banda dei dati grazie alla sua capacità di emettere dei messaggi di dimensione variabile, questi messaggi sono detti segmenti.
TCP permette di effettuare un compito importante: la multiplazione/demultiplazione, cioè di far transitare su una stessa linea dei dati provenienti da applicazioni diverse o in altre parole di mettere in serie delle informazioni arrivate in parallelo:
Queste operazioni sono realizzate grazie al concetto di porte (o socket), cioè un numero associato ad un tipo di applicazione, che, combinato ad un indirizzo IP, permette di determinare in modo univoco un'applicazione che gira su un dato terminale.
Un segmento TCP è costituito come segue:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Porta Sorgente | Porta destinazione | ||||||||||||||||||||||||||||||
Numero d'ordine | |||||||||||||||||||||||||||||||
Numero di ricevute di ritorno | |||||||||||||||||||||||||||||||
Spostamento dati |
Riservato | URG | ACK | PSH | RST | SYN | FIN | Finestra | |||||||||||||||||||||||
Somma di controllo | Puntatore di emergenza | ||||||||||||||||||||||||||||||
Opzioni | Riempimento | ||||||||||||||||||||||||||||||
Dati |
Significato dei differenti campi:
Porta sorgente (16 bit), porta relativa all'applicazione in corso su un terminale sorgente;
Porta destinazione (16 bit), porta relativa all'applicazione in corso su un terminale destinazione;
Numero d'ordine (32 bit), quando il flag SYN è a zero, il numero d'ordine è quello della prima parola del segmento in corso. Quando SYN è a 1, il numero d'ordine è uguale quello iniziale usato per sincronizzare i numeri di sequenza (ISN);
Numero di ricevuta di ritorno (32 bit), il numero della ricevuta di ritorno anche chiamato numero di ricevimento corrisponde al numero (d'ordine) del prossimo segmento atteso e non del numero dell'ultimo segmento ricevuto;
Spostamento di dati (4 bit), permette di individuare l'inizio dei dati nel pacchetto. Lo spostamento in questa fase è essenziale dato che il campo di opzioni è di dimensione variabile;
riservato (6 bit), campo inutilizzato attualmente ma previsto per il futuro;
Flag (6x1 bit), i flag rappresentano delle informazioni supplementari. Queste informazioni sono:
URG, se questo flag è a 1 il pacchetto deve essere trattato urgentemente;
ACK, se il flag è a 1 il pacchetto è una ricevuta di ritorno;
PSH (PUSH), se il flag è a 1, il pacchetto funziona secondo il metodo PUSH;
RST, se il flag è a 1, la connessione viene reinizializzata;
SYN, il flag TCP SYN indica una richiesta di connessione;
FIN, se questo flag è a 1, la connessione si interrompe.
Finestra (16 bit), campo che permette di conoscere in numero di byte che il ricevitore desidera ricevere senza ricevuta di ritorno;
Somma di controllo (Checksum o CRC), la somma di controllo è realizzata facendo la somma dei campi di dati dell'intestazione, per poter verificare l'integrità dell'intestazione;
Puntatore di emergenza (16 bit), indica il numero d'ordine a partire dal quale l'informazione diventa urgente;
Opzioni (Dimensione variabile), opzioni diverse;
Riempimento, si riempie lo spazio rimanente dopo le opzioni con degli zero per avere una lunghezza multipla di 32 bit.
Il protocollo TCP passicura il trasferimento dei dati in modo affidabile, anche se utilizza il protocollo IP che non integra nessun controllo di consegna dei datagrammi.
In realtà, il protocollo TCP ha un sistema di ricevute di ritorno che permette al client e al server di assicurarsi della buona ricezione reciproca dei dati. All'emissione di un segmento, si associa un Numero d'ordine (detto anche numero di sequenza). Alla ricezione di un segmento di dato, il terminale ricettore rimanda un segmento di dato il cui flag ACK è a 1 (per segnalare che si tratta di una ricevuta di ritorno) accompagnato da un numero di ricevute di ritorno uguale al numero d'ordine precedente:
Inoltre, grazie ad un timer scattato alla ricezione di un segmento a livello del terminale emittente, il segmento è rispedito non appena scade il tempo fissato, dato che in questo caso il terminale emittente considera il segmento perso:
Tuttavia, se il segmento non è perso e arriva comunque al destinatario, il terminale ricettore saprà grazie al numero d'ordine che si tratta di un doppione e conserverà solo l'ultimo segmento arrivato a destinazione.
Dato che questo processo di comunicazione, che si fa grazie ad un'emissione di dati e di una ricevuta di ritorno, è basato su un numero d'ordine (detto generalmente numero di sequenza), bisogna che i terminali emittenti e ricettori (client e server) conoscano il numero d'ordine iniziale dell'altro terminale. Per stabilire la connessione fra le due applicazioni si applica spesso lo schema seguente:
Le porte TCP devono essere aperte;
L'applicazione sul server è passiva, cioè l'applicazione è in modalità ascolto, in attesa di una connessione;
L'applicazione sul client fa una richiesta di connessione sul server dove l'applicazione è in apertura passiva. L'applicazione del client è detta in apertura attiva.
I due terminali devono quindi sincronizzare le loro frequenze grazie ad un meccanismo comunemente detto three ways handshake (stretta di mano in tre tempi), che si ritrova anche in fine di sessione. Questo dialogo permette di iniziare la comunicazione, esso si svolge in tre tempi, come indicato dal suo nome:
In un primo momento il computer emittente (il client) trasmette il segmento il cui flag SYN è a 1, per segnalare che questo si tratta di un segmento di sincronizzazione, con numero d'ordine N, ovvero il numero d'ordine iniziale del client;
In un secondo momento il terminale ricevente (il server) riceve il segmento iniziale che proviene dal client, poi gli invia la ricevuta di ritorno, ovvero un segmento il cui flag ACK è a 1 e il flag SYN è a 1 (dato che è ancora di una sincronizzazione). Questo segmento contiene il numero d'ordine di questo computer (del server), ovvero il numero d'ordine iniziale del client. Il campo più importante di questo segmento è quello della ricevute di ritorno ha il numero d'ordine iniziale del client, aumentato di 1;
Infine, il client trasmette al server una ricevuta di ritorno, ovvero un segmento il cui flag ACK è a 1, il cui flag SYN è pari a 0 (non è più di un segmento di sincronizzazione). Il suo numero d'ordine è aumentato e quello della ricevute di ritorno è il numero d'ordine iniziale del server aumentato di 1:
In seguito a questa sequenza di tre scambi, i due terminali sono sincronizzati e la comunicazione può cominciare. Esiste una tecnica di pirateria, detta spoofing IP, che permette di corrompere questa relazione di approvazione a fini nocivi.
In alcuni casi, è possibile limitare il numero delle ricevute di ritorno, per rendere più fluida la rete, fissando un numero di sequenza che necessita di una ricevuta di ritorno alla fine. Questo numero è infatti memorizzato nel campo Finestra dell'intestazione TCP/IP.
Questo metodo è effettivamente detto "Metodo della finestra scorrevole" dato che definisce in un certo modo un intervallo di sequenze che non hanno bisogno di ricevute di ritorno, e che si sposta man mano che le ricevute di ritorno sono ricevute:
Inoltre, la dimensione di questa finestra non è fissa. In effetti, il server può includere nelle sue ricevute di ritorno memorizzando nel campo finestra la dimensione che gli sembra più adatta. Così, quando la ricevuta di ritorno indica una richiesta d'aumento della finestra, il client sposterà il bordo destro della finestra:
Invece, in caso di diminuzione, il client non sposterà il bordo destro della finestra verso sinistra ma aspetterà che il bordo sinistro avanzi (con l'arrivo delle ricevute di ritorno):
Tanto il client quanto il server possono chiedere di mettere fine ad una connessione
La fine della connessione avviene in questo modo:
Uno dei terminali invia un segmento con il flag FIN a 1, e l'applicazione si mette in stato di attesa di fine, cioè finisce di ricevere i segmenti in corso e ignora i successivi;
Dopo la ricezione del segmento, l'altro terminale invia una ricevuta di ritorno con il flag FIN a 1 e continua a spedire i segmenti in corso. In seguito a questo il terminale informa l'applicazione che un segmento FIN è stato ricevuto, poi invia un segmento FIN all'altro terminale, chiudendo così la connessione.
Per ulteriori informazioni sul protocollo TCP, la cosa migliore è fare riferimento alla RFC 793 che spiega in dettaglio il protocollo: RFC 793.
Foto: © Pixabay.