TCP (Transmission Control Protocol): il protocollo affidabile di Internet
Scopri TCP: come funziona il protocollo affidabile di Internet, ordinamento, ritrasmissione e controllo del traffico per connessioni sicure e stabili.
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.
Importanza del TCP
TCP rende più facile per i programmi di computer comunicare tra loro, tipicamente su una rete di computer. Quando un programma vuole inviare molti dati, il TCP si occupa di dividere i dati, inviarli attraverso la rete e rimetterli insieme correttamente su un altro computer. Nel processo, IP sceglie quali fili e "intersezioni" vengono utilizzati per inviare tutti i dati nel modo più veloce. Lo fa usando i pacchetti.
Se ci sono molte persone che usano la rete, questa può essere sovraccaricata. Inoltre a volte il tempo, le interruzioni di corrente e altri problemi possono rendere difficile la comunicazione. I router su Internet usano qualcosa chiamato bilanciamento del carico per cercare di risolvere alcuni di questi problemi. Ma comunque, le informazioni possono essere consegnate fuori dall'ordine, perse o persino duplicate. TCP è progettato per notare tutti questi problemi e cercare di risolverli. Questo può richiedere un po' di tempo, ed è per questo che Internet a volte sembra lento. Una volta che il ricevitore TCP ha finalmente riassemblato una copia perfetta dei dati originariamente trasmessi, passa quei dati al programma del computer che li ha richiesti. In questo modo, il programma non deve conoscere la rete e il TCP non deve conoscere i dati del programma.
Cerca nell'enciclopedia