TCP (Transmission Control Protocol): presentazione del protocollo di trasmissione
Quando vogliamo collegarci a Internet, con poche semplici mosse realizziamo una connessione tra router e computer o dispositivo mobile – sia via cavo sia mediante accesso wireless. Non dobbiamo fare nient’altro, poiché l’accesso alla rete funziona in modo automatico così come l’ottenimento di un indirizzo Internet individuale per la ricezione e l’invio dei dati. A rendere possibile questo meccanismo è una raccolta di diversi protocolli denominata anche famiglia di protocolli Internet. Uno dei primi e più importanti membri di questa famiglia è il Transmission Control Protocol (TCP). Esso stabilisce le modalità di scambio dei dati tra i dispositivi collegati nella rete.
Cos’è il TCP (Trasmission Control Protocol)?
Il Transmission Control Protocol, abbreviato con TCP o protocollo TCP, è un accordo standardizzato per la trasmissione dei dati tra diversi utenti di una rete informatica. Le origini di questo protocollo risalgono al 1973, anno in cui gli informatici Robert E. Kahn e Vinton G. Cerf pubblicarono una prima versione del protocollo nell’ambito del loro lavoro di ricerca. Per arrivare alla standardizzazione del TCP nella RFC 793 sarebbero tuttavia serviti altri otto anni. Da allora è stata elaborata tutta una serie di migliorie ed espansioni che, tuttavia, non hanno riguardato il nucleo del protocollo, giunto invariato fino ad oggi. La versione attuale del protocollo, specificata nella RFC 7323, è stata messa a punto nel 2014.
Lo stato di sviluppo odierno del protocollo TCP permette a due punti terminali all’interno di una rete informatica comune di realizzare una connessione attraverso cui può avvenire una trasmissione bidirezionale dei dati. Nell’ambito di questa connessione, le eventuali perdite di dati vengono riconosciute e corrette automaticamente; per questo, il TCP viene denominato anche protocollo affidabile. Nella famiglia di protocolli Internet, il TCP costituisce, insieme all’UDP e all’SCTP, il gruppo dei protocolli di trasporto che, sulla base del modello OSI, vengono classificati nell’architettura di rete al livello di trasporto. Poiché, in quasi tutti i casi, il protocollo TCP si basa sul protocollo Internet (IP) e questa combinazione rappresenta la base per la maggior parte delle reti pubbliche e locali e per i servizi di rete, spesso si parla anche di pila di protocolli TCP/IP, intendendo in senso lato la famiglia di protocolli Internet.
Come funzionano esattamente i collegamenti con il protocollo TCP?
Il TCP permette la trasmissione delle informazioni in entrambe le direzioni. I sistemi informatici che comunicano tramite TCP possono pertanto inviare e ricevere dati contemporaneamente, proprio come avviene durante una conversazione telefonica. Le unità di trasmissione fondamentali utilizzate dal protocollo sono i segmenti (pacchetti) che, oltre al carico utile (ossia il messaggio effettivo), possono contenere anche informazioni di controllo e sono limitati a una dimensione di 1.500 byte. L’instaurazione e l’interruzione delle connessioni, classificabili come connessioni punto-a-punto, nonché la trasmissione stessa dei dati vengono acquisiste dal software TCP nella pila di protocolli di rete del rispettivo sistema operativo.
Il software TCP viene controllato dalle varie applicazioni rete, come browser web o server, attraverso interfacce specifiche, laddove ciascuna connessione deve essere sempre identificata da due punti terminali chiaramente definiti (client e server). A questo riguardo, non ha alcuna rilevanza quale lato assuma il ruolo di client e di server – l’importante è che il software TCP abbia a disposizione per ciascun punto terminale una coppia ordinata e univoca formata da indirizzo IP e porta (detta anche “2-tupla” o “socket”).
L’handshake a tre vie: come funziona in dettaglio l’instaurazione della connessione TCP
I presupposti per instaurare una connessione TCP valida sono i seguenti: entrambi i punti terminali devono disporre già di un indirizzo IP univoco (IPv4 o IPv6) e avere dichiarato e abilitato la porta desiderata per la trasmissione dei dati. Mentre il primo funge da caratteristica identificativa, la seconda è rilevante per l’assegnazione delle connessioni alle applicazioni client e server concrete da parte del sistema operativo.
Il funzionamento dettagliato dell’interazione tra TCP e IP è spiegato nel nostro approfondito articolo TCP/IP.
La procedura concreta di instaurazione della connessione con il protocollo TCP è la seguente:
- Nel primo passaggio, il client che richiede la connessione invia al server un pacchetto SYN o segmento SYN (dall’inglese synchronize = “sincronizzare”) con un numero sequenziale individuale e casuale. Questo numero assicura la trasmissione completa nella sequenza corretta (senza doppioni).
- Dopo che il server ha ricevuto il segmento, acconsente all’instaurazione della connessione restituendo un pacchetto SYN-ACK (dall’inglese acknowledgement = “conferma”), comprensivo del numero sequenziale del client aumentato di 1. Inoltre, trasmette al client il proprio numero sequenziale.
- Infine, il client conferma la ricezione del segmento SYN-ACK inviando un proprio pacchetto ACK che, in questo caso, contiene il numero sequenziale del server aumentato di 1. Al contempo può già trasferire i primi dati al server.
Poiché l’instaurazione della connessione tramite il Transmission Control Protocol prevede in totale tre passaggi, per questo processo è entrata in uso la denominazione “handshake a tre vie”.
Se la porta del server è chiusa o l’accesso è bloccato, il client riceve, anziché un pacchetto di conferma, un pacchetto TCP-RST (dall’inglese reset = “ripristinare”).
TCP Teardown: come funziona l’abbattimento regolato della connessione TCP
Entrambi i partecipanti alla comunicazione possono interrompere una connessione TCP instaurata; in più, la connessione può anche essere interrotta unilateralmente. Quest’ultimo caso viene denominato connessione chiusa per metà; in questa situazione, la controparte è ancora autorizzata a trasmettere dati anche se l’altro partecipante ha già interrotto la connessione.
Le singole tappe dell’abbattimento bilaterale della connessione (che, per semplicità, ipotizziamo essere stato iniziato dal client) possono essere riassunte nel modo seguente:
- Il client invia un segmento FIN al server e gli comunica che non desidera più inviare dati. Come avviene per l’instaurazione della connessione, anche in questo caso invia un proprio numero sequenziale.
- Il server conferma la ricezione del pacchetto inviando un segmento ACK, contenente il numero sequenziale aumentato di 1.
- Quando il server, da parte sua, è pronto per la trasmissione dei dati, invia anch’esso un pacchetto FIN a cui a sua volta allega il proprio numero sequenziale.
- A questo punto tocca al client inviare un pacchetto ACK comprensivo del numero sequenziale aumentato di 1; così facendo, la connessione TCP per il server è ufficialmente chiusa.
Per la parte che ha inviato l’ultimo segmento ACK (nel nostro caso, il client), la connessione tuttavia non è ancora chiusa. Poiché non esiste alcuna certezza che l’ultimo pacchetto inviato sia effettivamente arrivato, il rispettivo partecipante della comunicazione si pone inizialmente in modalità di attesa (detta anche “stato time wait”), fino a quando non sono trascorsi gli intervalli di tempo massimi di un segmento ACK e di un eventuale segmento FIN reinviato (secondo la RFC 793, questi intervalli hanno una durata di 2 minuti ciascuno).
Qual è la struttura di un header TCP?
Com’è tipico per i protocolli di rete, i dati determinanti necessari per instaurare la connessione ed eseguire la trasmissione dei dati con il Transmission Control Protocol si trovano nell’header di un pacchetto TCP. Questi dati di intestazione (detti anche informazioni di controllo) sono anteposti al carico utile (payload) da trasferire e hanno generalmente una dimensione di 20 byte (160 bit); ad essi seguono le informazioni aggiuntive, aventi una dimensione fino a 40 byte (320 bit), che sono opzionali e non vengono utilizzate in tutti i pacchetti.
Nel caso in cui si debbano trasferire solo conferme, messaggi di errore, ecc., come ad es. nel caso dei messaggi SYN e FIN (instaurazione/abbattimento della connessione), sono ammessi anche segmenti TCP senza carico utile, vale a dire sostanzialmente header puri.
Nello specifico, un header TCPr è strutturato nel modo seguente:
I singoli componenti e/o campi dell’intestazione del protocollo TCP hanno il seguente significato:
Porta di origine (16 bit): indica il numero di porta del mittente.
Porta di destinazione (16 bit): indica il numero di porta del destinatario.
Numero sequenziale (32 bit): il numero sequenziale indica il primo byte del carico utile allegato oppure viene inviato durante l’instaurazione e/o l’abbattimento della connessione. Serve al tempo stesso a convalidare e a ordinare (dopo il trasferimento) i segmenti.
Numero di conferma (32 bit): in questo campo viene indicato il numero di conferma che il mittente attende successivamente. Affinché il numero sia valido, deve essere preceduto da un flag ACK (nel campo “Flags”).
Offset (4 bit): il campo “Offset” indica la lunghezza dell’header TCP in blocchi da 32 bit per evidenziare il punto di inizio del carico utile. Poiché questo campo opzionale è variabile, il punto di inizio è diverso da segmento a segmento.
Riservato (6 bit): riservato per usi futuri secondo la RFC 793, fino ad oggi non utilizzato. Questo campo deve sempre avere il valore “0”.
Flags (6 bit): attraverso i sei possibili bit singoli nel campo Flags è possibile attivare diverse azioni TCP per organizzare la comunicazione e l’elaborazione dei dati. I Flag che vengono attivati o non attivati a questo scopo sono i seguenti:
- URG: il flag “Urgent” (urgente) segnala all’applicazione TCP che il carico utile deve essere elaborato immediatamente fino all’Urgent Pointer definito.
- ACK: in combinazione con il numero di conferma, il flag ACK ha la funzione di confermare la ricezione dei pacchetti TCP. Se il flag non è attivato, anche il numero di conferma è automaticamente non valido.
- PSH: il flag “Push” fa sì che un segmento TCP venga inviato immediatamente, senza dapprima essere accumulato nel buffer interno del mittente e del destinatario.
- RST: se si è verificato un errore durante la trasmissione, un pacchetto TCP con flag RST (“Reset”) attivato permette il ripristino della connessione.
- SYN: i messaggi con flag SYN attivato rappresentano il primo passaggio dell’handshake a tre vie, vale a dire che danno inizio all’instaurazione della connessione.
- FIN: il flag “Finish” segnala alla controparte che un partecipante alla comunicazione termina la trasmissione.
Dimensione della finestra (16 bit): in questo campo, al partner della comunicazione viene trasmesso il numero di byte che il destinatario è in grado di ricevere.
Checksum (16 bit): il Transmission Control Protocol è in grado di individuare gli errori di trasmissione in modo affidabile. A questo scopo viene fatto ricorso alla checksum, calcolata in base all’header, al carico utile e al cosiddetto pseudo header.
Urgent Pointer (16 bit): l’Urgent Pointer (puntatore di “urgenza”) indica la posizione del primo byte dopo il carico utile da elaborare con urgenza. Di conseguenza, questo campo è valido e rilevante solo se il flag URG è attivato.
Opzioni (0–320 bit): se è necessario attivare funzioni TCP non comprese nell’header generale, è possibile farlo attraverso il campo delle opzioni. Questo può essere utile ad esempio qualora sia necessario definire la dimensione massima dei segmenti. Le opzioni devono sempre avere una lunghezza pari a un multiplo di 32 bit; in caso contrario è necessario eseguire una compilazione con una serie di bit zero (padding).
Come funziona la trasmissione dati tramite protocollo TCP
Ancora prima che vengano trasferiti i primi dati, generalmente il mittente e il destinatario si accordano riguardo alla dimensione massima dei segmenti TCP da inviare (Maximum Segment Size – MSS). Di norma sono possibili fino a 1500 byte per segmento; di questi, almeno 20 byte devono essere previsti per l’header TCP e altri 20 byte per l’header IP, in modo tale che rimangano 1.460 byte. Se si desidera una dimensione personalizzata, questa deve essere specificata (come indicato sopra) tramite il campo delle opzioni, eseguendo le dovute sottrazioni per la parte del carico utile.
Prendendo in considerazione la dimensione massima del segmento meno l’header, significa dunque che un pacchetto TCP può trasferire soltanto dati con una dimensione di 1,46 kilobyte o 0,00146 megabyte. Ciò detto, affinché sia possibile scambiare tramite il protocollo TCP contenuti web come immagini, le cui dimensioni possono arrivare a varie centinaia di kilobyte, viene utilizzata la segmentazione, grazie alla quale, prima del trasporto, i dati applicativi vengono suddivisi in vari blocchi di dati, numerati e in seguito inviati in ordine casuale. Poiché il destinatario deve confermare la ricezione di ogni singolo segmento e poiché l’ordine effettivo può essere ricostruito sulla base dei numeri sequenziali, in seguito alla trasmissione TCP il destinatario può ricomporre il carico utile ricevuto senza problemi e in modo completo.
Se il mittente non riceve alcuna conferma per un segmento inviato, si verifica il cosiddetto Retransmission Timeout (RTO). Se questo lasso di tempo dopo l’invio di un pacchetto trascorre senza che venga trasmessa una risposta, viene effettuato automaticamente un nuovo invio. Il tempo di questo timer, che può essere adattato dinamicamente con un algoritmo, dipende dalla velocità di trasmissione del caso specifico.
I fatti principali del Transmission Control Protocol in sintesi
Da circa mezzo secolo, il protocollo TCP è uno dei principali protagonisti della storia e dello sviluppo delle reti informatiche. Questo, da una parte, è dovuto all’ottima compatibilità con il protocollo Internet (IP), altro grande protagonista della storia delle reti informatiche, dall’altra alle caratteristiche perlopiù vantaggiose grazie alle quali il TCP si eleva rispetto ad alternative quali l’UDP e l’SCTP. Le caratteristiche principali del TCP possono essere riassunte come segue:
- Il TCP è orientato alla connessione e permette una comunicazione alternata tra due punti terminali in base al cosiddetto handshake a tre vie.
- Il TCP è affidabile, in quanto assicura che tutti i dati vengono trasmessi in modo completo e possano essere ricomposti dal destinatario nell’ordine corretto.
- Il TCP prevede l’invio dei dati in singoli segmenti che possono avere una dimensione massima di 1.500 bytes (compreso header).
- Nel modello OSI, il TCP viene classificato al livello di trasporto (layer 4).
- Nella maggior parte dei casi, il TCP si basa sul protocollo Internet (IP), pertanto spesso si parla anche di pila di protocolli TCP/IP.
- L’header TCP ha una dimensione standard di 20 byte – a cui possono aggiungersi fino a 40 byte di opzioni aggiuntive.