Il Transmission Control Protocol (TCP) è uno dei protocolli principali dell'Internet Protocol Suite. TCP fa parte della popolare combinazione "TCP/IP" usata da Internet. Il protocollo Internet, o IP, si assicura che i dati su Internet arrivino al posto giusto; TCP si occupa invece di fornire una comunicazione affidabile, ordinata e senza perdite tra due endpoint. TCP aiuta anche a controllare il traffico su Internet in modo che le reti non si sovraccarichino. Questi protocolli, che sono come linguaggi usati dai computer, sono progettati in modo che qualsiasi computer e qualsiasi programma (come un browser web o un client di posta elettronica) possano usarli.

Caratteristiche principali

  • Orientato alla connessione: prima di trasferire dati i due endpoint stabiliscono una connessione (three-way handshake).
  • Affidabilità: garantisce che i dati arrivino completi e nel giusto ordine grazie a numeri di sequenza e conferme (ACK).
  • Controllo di flusso: evita che il destinatario venga sovraccaricato usando una finestra scorrevole (sliding window).
  • Controllo della congestione: regola la velocità di invio per evitare di congestionare la rete (algoritmi come Slow Start, Congestion Avoidance, Fast Retransmit/Recovery, e implementazioni moderne come Cubic o BBR).
  • Servizio orientato ai byte: TCP tratta i dati come un flusso ordinato di byte, non come messaggi distinti.

Come funziona, in breve

Un trasferimento TCP si svolge tramite segmenti: ogni segmento contiene un pezzo di dati più un'intestazione con informazioni di controllo. Le parti fondamentali del funzionamento sono:

  • Three-way handshake (stabilire la connessione):
    • Il client invia un segmento con il flag SYN e un numero di sequenza iniziale (ISN).
    • Il server risponde con SYN+ACK, indicando il proprio ISN e confermando l'ISN del client.
    • Il client invia un ACK per completare la connessione.
  • Trasferimento dati: ogni segmento inviato è numerato; il destinatario invia ACK per i byte ricevuti (ack cumulativo o selettivo con SACK se supportato).
  • Gestione perdite: se non arriva un ACK entro il timeout (RTO) il mittente ritrasmette i dati; algoritmi di rilevamento di perdite possono accelerare la ritrasmissione (fast retransmit).
  • Chiusura della connessione: la terminazione avviene con uno scambio di segmenti con i flag FIN e ACK, che può essere a quattro passi o in alcuni casi combinato.

Intestazione TCP (campi chiave)

Un'intestazione TCP di base è lunga 20 byte e contiene, tra gli altri:

  • Porta sorgente e porta destinazione: identificano le applicazioni (range 0–65535).
  • Numero di sequenza (32 bit): posizione del primo byte del segmento nel flusso bytestream.
  • Numero di conferma (ACK, 32 bit): prossimo byte atteso.
  • Offset dell'intestazione: lunghezza dell'intestazione (con eventuali opzioni).
  • Flags: tra cui SYN, ACK, FIN, RST, PSH, URG.
  • Window size: dimensione della finestra di ricezione (controllo di flusso); può essere estesa con window scaling.
  • Checksum: verifica di integrità su intestazione e dati.
  • Opzioni: MSS (Maximum Segment Size), timestamps, SACK permesso, window scale, TCP Fast Open, ecc.

Controllo di flusso e finestra scorrevole

Il destinatario annuncia quanto spazio disponibile nella sua buffer tramite il campo window. Il mittente può inviare fino a quella quantità di dati non ancora confermati. Questo meccanismo, insieme al concetto di sequenze e ACK, crea la sliding window che regola il flusso tra i due endpoint.

Controllo della congestione

TCP implementa algoritmi per evitare di saturare la rete. Alcuni passaggi importanti:

  • Slow Start: la finestra di congestione (cwnd) cresce esponenzialmente all'inizio per scoprire la capacità disponibile.
  • Congestion Avoidance: quando si raggiunge una soglia (ssthresh), la crescita diventa più prudente (lineare).
  • Fast Retransmit / Fast Recovery: meccanismi per reagire rapidamente a perdite senza attendere il timeout.
  • Algoritmi moderni: NewReno, Cubic (diffuso nei kernel Linux) e BBR (basato su stima di banda e ritardo) migliorano throughput e utilizzo della rete.

Affidabilità avanzata

  • SACK (Selective Acknowledgment): permette al ricevente di indicare quali blocchi di dati sono arrivati, evitando ritrasmissioni inutili.
  • RTO basato su RTT: il tempo di ritrasmissione è calcolato dinamicamente con algoritmi che stimano il Round-Trip Time e la sua variabilità.
  • SYN cookies: tecnica per mitigare attacchi di tipo SYN flood senza allocare subito risorse di connessione sul server.
  • Timestamps e window scaling: opzioni che permettono misurazioni più accurate e finestre più grandi per alte latenze/alte capacità.

TCP vs UDP

  • TCP: affidabile, orientato alla connessione, ordinato, controllo di flusso e congestione. Ideale per applicazioni come web (HTTP/HTTPS), posta, FTP, SSH.
  • UDP: senza connessione, veloce, minimo overhead, nessuna garanzia di consegna o ordine. Usato per DNS, streaming multimediale, giochi in tempo reale e protocolli che implementano affidabilità a livello applicazione.

Applicazioni comuni

Molte applicazioni che richiedono trasferimenti affidabili usano TCP: web browsing (HTTP/HTTPS), posta elettronica (SMTP/IMAP/POP3), trasferimento file (FTP, SFTP), remote login (SSH). Sopra TCP spesso viene anche eseguita la crittografia di trasporto come TLS per garantire riservatezza e integrità.

Limitazioni e problemi pratici

  • Head-of-line blocking: poiché TCP garantisce l'ordine, un pacchetto perso blocca la consegna dei successivi finché non viene ritrasmesso; questo può penalizzare multiplexing di flussi.
  • Interazione con NAT e firewall: NAT traduce le porte e può complicare connessioni peer-to-peer; i dispositivi di rete devono tracciare lo stato TCP.
  • Vettori d'attacco: attacchi come SYN flood o RST injection possono disturbare connessioni; sono disponibili contromisure (SYN cookies, filtri, rate limiting).
  • Overhead e latenza: l'handshake e i controlli aumentano la latenza rispetto a UDP per trasferimenti molto brevi o a bassa latenza.

Estensioni e miglioramenti moderni

  • SACK, Timestamp, Window Scaling: opzioni implementate per migliorare affidabilità e prestazioni su link moderni.
  • TCP Fast Open: riduce la latenza permettendo di inviare dati già durante il handshake in condizioni sicure.
  • Nuovi algoritmi di congestione: Cubic, BBR, e altri migliorano throughput su reti ad alta banda o con elevata latenza.
  • Protocolli alternativi: QUIC (basato su UDP) affronta alcune limitazioni di TCP, come l'handshake e l'head-of-line blocking, combinando controllo di congestione, crittografia e multiplexer di flussi.

Conclusione

TCP è il protocollo di riferimento per comunicazioni affidabili su Internet. Fornisce un servizio orientato alla connessione, garantendo consegna ordinata e corretta dei dati, controllo del flusso e della congestione. Nonostante alcune limitazioni e complessità, rimane essenziale per molte applicazioni; le sue estensioni e i nuovi protocolli derivati continuano a evolvere per rispondere alle esigenze delle reti moderne.