TCP vs UDP: confronto, criteri di scelta e QUIC
Chiusura del Modulo 3: confrontiamo TCP e UDP su tutte le dimensioni, impariamo a scegliere il protocollo giusto e scopriamo QUIC, il trasporto moderno di HTTP/3 che unisce affidabilità e velocità.
1. Il confronto definitivo: tabella TCP vs UDP
TCP è affidabilità totale a costo di overhead; UDP è velocità e semplicità a costo zero garanzie. La scelta è un trade-off architetturale, non una preferenza personale.
Arrivati all'ultima lezione del Modulo 3 abbiamo studiato ogni meccanismo del Transport: multiplexing, porte, segmentazione TCP, handshake, ACK, SACK, flow control, congestion control e la semplicità di UDP. Ora li mettiamo fianco a fianco.
| Caratteristica | TCP | UDP |
|---|---|---|
| Connessione | Connection-oriented (3-way handshake) | Connectionless — nessun setup |
| Affidabilità | Garantita: ACK, ritrasmissione, ordine | Best-effort — nessuna garanzia |
| Ordine dei dati | Garantito: riordino lato ricevitore | Non garantito |
| Velocità / Latenza | Più lento (overhead setup + ACK) | Più veloce (zero setup, zero ACK) |
| Dimensione header | 20–60 byte (opzioni variabili) | 8 byte fissi |
| Modello dati | Byte-stream (nessun confine messaggio) | Message-oriented (confini preservati) |
| Controllo flusso | Sì — Receive Window (rwnd) | No |
| Controllo congestione | Sì — cwnd, Slow Start, CUBIC/BBR | No |
| Broadcast / Multicast | No (punto-a-punto) | Sì — ideale per discovery |
| Stati half-open | Sì (TIME_WAIT, FIN_WAIT, CLOSE_WAIT) | N/A — nessuna connessione |
| Overhead kernel | Elevato (TCB, buffer, timer) | Minimo |
| Applicazioni tipiche | HTTP, FTP, SMTP, SSH | DNS, DHCP, VoIP, gaming, streaming live |
Apri netstat -tunap su Linux: vedrai decine di righe TCP in ESTABLISHED/TIME_WAIT e poche UDP senza stato. Ogni socket TCP mantiene un TCB; UDP no. È la prova visiva del costo dell'affidabilità.
2. Quando scegliere TCP o UDP: criteri decisionali
Scegliere il protocollo giusto significa rispondere a 4 domande: i dati possono essere persi? La latenza è più importante della correttezza? Serve broadcast? Chi deve ritrasmettere?
Devi garantire tutti i byte
File transfer, email, web, database. Non puoi perdere neppure un byte, l'ordine conta. Accetti overhead.
La latenza vale più della perdita
VoIP, videocall, gaming, DNS, DHCP: meglio un pacchetto perso che 200ms di attesa per ritrasmissione.
Serve one-to-many?
Discovery di rete, streaming live locale, DHCP: solo UDP supporta broadcast e multicast nativo.
Chi gestisce l'affidabilità?
Con TCP lo fa il kernel. Con UDP lo fa l'applicazione: tu decidi timeout, ACK applicativi, codec adattivo.
All'interrogazione non dire "TCP è meglio di UDP". Di': "TCP se mi serve affidabilità totale e posso pagare in latenza; UDP se la mia app tollera perdite e deve essere reattiva o supportare broadcast. Se voglio entrambi: QUIC".
| Scenario | Scelta | Perché |
|---|---|---|
| Navigazione web (HTTP/2) | TCP + TLS | Documento deve arrivare integro, ordine garantito |
| DNS query | UDP | Query singola, piccola, deve essere velocissima; se persa ritenta il client |
| Zoom / Meet | UDP | Meglio scartare un frame che bloccare lo stream per ritrasmetterlo |
| Git clone / download ISO | TCP | Un bit sbagliato corrompe tutto |
| Streaming live esports | QUIC su UDP | Bassa latenza + affidabilità selettiva + migrazione IP |
3. QUIC (RFC 9000): il meglio di entrambi i mondi
QUIC nasce da Google nel 2013 e diventa standard IETF nel 2021 con RFC 9000. Idea chiave: reimplementare in userspace, sopra UDP, tutto ciò che serve: affidabilità, controllo flusso, congestion control, TLS 1.3 e multiplexing di stream.
QUIC è un protocollo di trasporto affidabile, multiplexato e sicuro costruito su UDP che integra nativamente TLS 1.3 ed elimina l'head-of-line blocking di TCP.
Head-of-line blocking
In HTTP/2, un pacchetto perso blocca tutti gli stream sulla stessa connessione TCP, anche se indipendenti.
Stream indipendenti
QUIC gestisce N stream QUIC dentro una connessione UDP. La perdita su uno stream non blocca gli altri: niente HOL blocking.
Connection ID
TCP identifica la connessione con 4-tupla. QUIC usa un Connection ID: puoi passare da WiFi a 4G senza rompere la connessione.
| Problema di TCP | Come lo risolve QUIC |
|---|---|
| Handshake 2-3 RTT: TCP SYN + TLS 1.3 = 2-3 round-trip prima di inviare dati HTTP | Handshake QUIC+TLS in 1-RTT, 0-RTT se server già visitato (dati già nel primo pacchetto) |
| Head-of-line blocking transport: perdita di 1 pacchetto blocca tutto | Stream indipendenti con flow control per-stream e connection-wide |
| Ossificazione middlebox: firewall/DPI bloccano nuove opzioni TCP | QUIC è su UDP, cifrato: middlebox vede solo UDP, innovazione in userspace senza aggiornare kernel |
| Connection migration: cambiare IP (es. WiFi → 4G) rompe la connessione TCP | Connection ID indipendente dall'IP — migrazione trasparente |
| Loss recovery lento | ACK più ricchi, packet number monotono, SACK migliorato, ritrasmissione precisa |
QUIC NON è "UDP affidabile" nel senso che rende UDP affidabile a livello IP. È un protocollo completo che gira SOPRA UDP ma reimplementa affidabilità in userspace. Dire "metto ACK su UDP = QUIC" è riduttivo: QUIC ha stream, flow control, TLS, migrazione, QPACK.
4. HTTP/3 vs HTTP/2: stack e vantaggi prestazionali
HTTP/3 è semplicemente HTTP su QUIC. Il mapping è diretto: ogni richiesta HTTP/3 è uno stream QUIC bidirezionale.
HTTP/3 è supportato da tutti i browser moderni (Chrome, Firefox, Safari, Edge) e da CDN principali (Cloudflare, Google, Fastly, Akamai). Google usa QUIC per la maggior parte del suo traffico. YouTube e Netflix sfruttano QUIC per ridurre il buffering video. QUIC è ormai infrastruttura web globale.
5. Riepilogo visivo del Modulo 3: il livello Transport
Guardando all'indietro l'intero Modulo 3, il livello Transport è il luogo dove la rete diventa utile per le applicazioni:
IP è il servizio postale che può perdere lettere. UDP è consegnare la lettera così com'è, senza ricevuta. TCP è raccomandata con ricevuta di ritorno, riordino e assicurazione. QUIC è un corriere privato su moto (UDP) che ti offre tutti i servizi della raccomandata ma più veloce, con tracking crittografato e cambio indirizzo al volo.
6. Verifica e laboratorio
🔬 Attività Wireshark + netstat + netcat
Metti in pratica il confronto e preparati alla verifica pratica:
- Lab Wireshark: avvia cattura, apri
https://example.comenslookup example.com. Filtratcpeudp. Confronta handshake TCP (SYN,SYN-ACK,ACK) vs singola query DNS UDP. Identifica SACK e window scaling. - Lab netstat: esegui
ss -tunapenetstat -an. Classifica socket LISTEN, ESTABLISHED, TIME_WAIT. Quanti sono TCP vs UDP? Perché? - Lab netcat: lancia
nc -l -p 9000enc -u -l -p 9001. Invia messaggi con client TCP e UDP. Osserva confini messaggio preservati in UDP ma non in TCP (byte-stream). - Quiz scelta: per ciascuna app scegli TCP/UDP/QUIC motivando: live F1, chat di trading, trasferimento firmware OTA su 10.000 IoT, DNSSEC.
F1 live: QUIC/UDP – latenza imperativa, perdita tollerata. Trading chat: TCP – ordine e affidabilità critica. Firmware OTA: TCP o QUIC con congestion control per non saturare rete. DNSSEC: UDP con fallback TCP se risposta >512B; ora anche DoQUIC/DoH su QUIC per privacy.
7. Riepilogo e concetti chiave
📚 Modulo 3 completato — verso il livello Application
Hai chiuso il Transport: sai come i socket multiplexano, come TCP rende affidabile una rete inaffidabile e perché UDP resta insostituibile dove conta la reattività. Prossimo modulo: DNS, HTTP, API e sicurezza applicativa. Porta con te questa domanda: “chi deve occuparsi del pacchetto perso?”