TCP / Transmission Control Protocol

Il protocollo TCP

TCP è uno degli elementi costitutivi più importanti della suite di protocolli TCP/IP. Come definito nelle specifiche RFC793, “TCP è un protocollo affidabile end-to-end orientato alla connessione (connection oriented) e progettato per adattarsi a una gerarchia stratificata di protocolli che supportano applicazioni multi-rete”.

In parole semplici, il protocollo TCP stabilisce una connessione tra l’origine e la destinazione. Durante questa connessione, il protocollo TCP suddivide i dati dell’origine in segmenti, e quindi li riassembla una volta giunti a destinazione. Qualsiasi segmento non ricevuto o ricevuto per errore viene inviato nuovamente.

Nell’ambito del modello OSI, il TCP può essere classificato al livello Transport (livello 4) di tale modello, e il suo utilizzo più comune è quello effettuato in combinazione con il protocollo IP, di livello rete (OSI 3).

Invece nel modello TCP/IP il protocollo TCP occupa il livello 4, ovvero Transport.

Il protocollo TCP è stato progettato con l’interno di superare i problemi di affidabilità delle comunicazioni che affliggono il modello IP del livello 3 (Network) dello stack OSI. TCP è stato quindi realizzato il modo da utilizzare i servizi offerti dai protocolli di rete di livello inferiore (Network, Data-Link e Fisico) in ottica di affidabilità. I protocolli inferiore dello stack OSI infatti definiscono in maniera efficace il modo di trasferimento tramite un canale di comunicazione, ma parimenti non offrono alcuna garanzia sull’affidabilità in termini di consegna dei pacchetti. Il protocollo TCP sopperisce a questa mancanza creando un canale di comunicazione affidabile tra due processi applicativi residenti su due host di rete.

TCP è quindi diventato fondamentale per garantire il corretto funzionamento di una rete IP, dato che si occupa per l’appunto di costruire connessioni di rete nell’ambito di una sottostante rete IP, che, come abbiamo visto, è di tipo best-effort (senza garanzie), e di garantirne al contempo l’affidabilità.

Le sue principali caratteristiche sono le seguenti:

TCP è un protocollo connection oriented e quindi prima di iniziare a trasmettere dati deve stabilire la comunicazione tra il mittente e il destinatario. Il canale di comunicazione, una volta stabilito, rimane attivo anche in assenza di scambio dati, e la sua chiusura non avviene in automatico ma deve essere effettuata esplicitamente. Il protocollo  TCP quindi possiede le funzionalità per creare, mantenere e chiudere una connessione.

TCP è un protocollo affidabile, a differenza del protocollo IP dello stack OSI: esso quindi garantisce la corretta consegna dei segmenti a destinazione attraverso il meccanismo dei flag acknowledgements.

Il servizio offerto da TCP consiste quindi nel trasporto di un flusso di byte in maniera bidirezionale tra due applicazioni in esecuzione su differenti host. Il protocollo permette alle due applicazioni di trasmettere contemporaneamente nelle due direzioni, quindi il servizio è di tipo Full-duplex, anche se non tutti i protocolli applicativi basati su TCP utilizzano questa modalità.

I dati, sotto forma di flusso di byte, che partono dall’host verso il destinatario, sono presi in carico per la trasmissione da parte del protocollo TCP, quindi vengono frazionati in pacchetti, detti segmenti, e consegnati al destinatario. L’host destinatario riceve il flusso dati attraverso una determinata porta logica, e lo passa all’applicativo che ne ha fatto richiesta sull’host destinatario. Ad esempio, le comunicazioni sul protocollo HTTP avvengono in modalità TCP, e gli host coinvolti comunicano sulla porta 80.

Il protocollo TCP garantisce che i dati trasmessi, una volta giunti a destinazione, lo facciano nel corretto ordine e una sola volta. Più specificamente, il protocollo TCP offre ai livelli superiori un servizio equivalente ad una connessione fisica diretta che si occupa del trasporto di un flusso di byte. Il corretto funzionamento di questo flusso di trasporto viene realizzato tramite i meccanismi di acknowledgment e di ritrasmissione su timeout. Il protocollo offre inoltre diverse funzione per il controllo di errori sui pacchetti grazie al campo checksum contenuto nella sua PDU, e anche funzionalità per il controllo del flusso di dati tra host che comunicano tramite reti o canali congestionati, riuscendo a gestire efficacemente la quantità necessaria di segmenti da inviare e gestire.

Infine, la disponibilità della comunicazione attraverso i numeri di porta, ci permette di ottenere delle connessioni di tipo multiplexing.

La Figura [24] mostra un tipico segmento TCP.

Figura 24: Segmento TCP
Figura 24: Segmento TCP

Source Port (16 bit): Identifica il numero di porta associato alla connessione TCP sull’host sorgente, o mittente.

Destination Port (16 bit): Identifica il numero di porta associato alla connessione TCP sull’host di destinazione.

Sequence Number (32 bit): Numero che indica lo scostamento (espresso in byte) dell’inizio del segmento TCP all’interno del flusso completo, a partire dall’Initial Sequence Number (ISN), deciso all’apertura della connessione.

Acknowledgment Number (32 bit): Numero di riscontro, ha significato solo se il flag ACK è impostato a 1, e conferma la corretta ricezione di una parte del flusso di dati nella direzione opposta, indicando il valore del prossimo Sequence number che l’host mittente del segmento TCP si aspetta di ricevere.

HLEN (4 bit): Indicato anche come Data Offset esprime la lunghezza (in dword da 32 bit, ovvero in Double Word) dell’header del segmento TCP; tale lunghezza può variare da 5 un minimo di dword (20 byte) a 15 dword (60 byte) a seconda della presenza e della lunghezza del campo facoltativo Opzioni/Padding.

Reserved (4 bit): questi 4 bit non sono attualmente utilizzati ma restano predisposti per sviluppi futuri del protocollo; dovrebbero essere impostati a zero.

  • Flags (8 bit): Bit utilizzati per il controllo del protocollo. Può assumere diversi valori, di seguito riportati:
  • CWR (Congestion Window Reduced): se impostato a 1 questo flag indica che l’host sorgente ha ricevuto un segmento TCP con il flag ECE impostato a 1.
  • ECE [ECN (Explicit Congestion Notification) -Echo]: se impostato a 1 indica che l’host supporta il protocollo ECN.
  • URG – se impostato a 1 indica che nel flusso sono presenti dati da inviare in maniera urgente alla posizione, ovvero all’offset, indicata dal campo “Urgent pointer”. Il campo Urgent Pointer punta alla fine dei dati urgenti;
  • ACK – se impostato a 1 indica che il campo Numero di Acknowledgment è valido;
  • PSH – se impostato a 1 indica che i dati in arrivo non devono essere bufferizzati ma che vanno passati subito ai livelli superiori dello stack.
  • RST – se impostato a 1 indica che la connessione non è valida; questo flag viene quindi utilizzato in caso si verifichi un grave errore. A volte viene utilizzato insieme al flag ACK (di Acknowledgment) per determinare la chiusura di una connessione.
  • SYN – se impostato a 1 indica che l’host mittente del segmento vuole aprire una connessione TCP con l’host destinatario e specifica nel campo Numero di Sequenza il valore dell’Initial Sequence Number (ISN); Questo flag ha quindi lo scopo di sincronizzare correttamente i numeri di sequenza dei due host. L’host che ha inviato il SYN deve attendere dall’host remoto un pacchetto SYN/ACK.
  • FIN – se impostato a 1 indica che l’host mittente del segmento vuole chiudere la connessione TCP aperta con l’host destinatario. Il mittente dovrà attendere la conferma dal ricevente (con un FIN-ACK). A questo punto la connessione è ritenuta chiusa per metà: l’host che ha inviato FIN non potrà più inviare dati, mentre l’altro host ha il canale di comunicazione ancora disponibile. Quando anche l’altro host invierà il pacchetto con FIN impostato la connessione, dopo il relativo FIN-ACK, sarà considerata completamente chiusa.

Window (16 bit): Indica la dimensione della finestra di ricezione dell’host mittente, ovvero il numero di byte che il mittente è in grado di accettare a partire da quello specificato dal numero di acknowledgment.

Checksum (16 bit): questo campo si utilizza per effettuare il controllo utilizzato sulla validità del segmento.

Urgent pointer (16 bit): Questo flag indica un dato urgente,  e ha significato solo se il flag URG è impostato a 1. Esso indica lo scostamento in byte a partire dal Numero di Sequenza del byte di dati urgenti all’interno del flusso.

Opzioni/Padding (facoltative): campi di uso facoltativo, per usi del protocollo particolari.

Dati: rappresenta il carico utile o payload da trasmettere cioè la PDU proveniente dal livello superiore.