Come Funziona TCP: Il Motore della Comunicazione Internet Affidabile
TCP (Transmission Control Protocol) trasforma il caotico livello IP best-effort in un **flusso di byte affidabile, ordinato e controllato per errori**. È l'idraulica sotto HTTP, SSH, SMTP, TLS. Ecco la meccanica.
1. Configurazione della Connessione: 3-Way Handshake (SYN, SYN-ACK, ACK)
- Client → Server: **SYN** (seq=x). "Voglio parlare, il mio seq iniziale=x."
- Server → Client: **SYN-ACK** (seq=y, ack=x+1). "OK, il mio seq iniziale=y, ho ricevuto il tuo SYN."
- Client → Server: **ACK** (seq=x+1, ack=y+1). "Ho ricevuto il tuo SYN. Stabilito."
- Stato: `SYN_SENT` → `SYN_RCVD` → `ESTABLISHED`.
2. Trasferimento Dati: Segmenti, Numeri di Sequenza, ACK
- L'app scrive un flusso di byte → TCP li taglia in **segmenti di dimensione MSS** (tipicamente 1460B).
- Ogni segmento riceve un **Numero di Sequenza** = offset del primo byte.
- Il ricevitore invia un **ACK** = prossimo numero di sequenza atteso (cumulativo).
- Retrasmissione: Il mittente avvia un timer (RTO) per segmento. Nessun ACK → **ritrasmetti** (backoff esponenziale).
- Retrasmissione rapida: 3 ACK duplicati → assumi perdita → ritrasmetti *prima* del timer.
3. Controllo di Flusso: Finestra Scorrevole
- Il ricevitore annuncia una **rwnd (Receive Window)** = spazio buffer rimasto.
- Il mittente limita i **byte in volo ≤ min(cwnd, rwnd)**.
- Previene il sovraccarico del ricevitore lento.
4. Controllo di Congestione: I Guardrail della Rete
- Slow Start: cwnd=1 MSS → raddoppia ogni RTT (esponenziale) fino a perdita o ssthresh.
- Congestion Avoidance: cwnd += 1 MSS per RTT (lineare).
- Fast Recovery: Su 3 DupACK: ssthresh=cwnd/2, cwnd=ssthresh+3, ritrasmetti, poi CA.
- Timeout: ssthresh=cwnd/2, cwnd=1 MSS → Slow Start.
- Moderni: **CUBIC** (default Linux), **BBR** (Google, basato su modello).
5. Chiusura della Connessione: 4-Way Handshake (FIN, ACK, FIN, ACK)
- Chiudente attivo → **FIN** (seq=u).
- Passivo → **ACK** (ack=u+1). *Half-close* (può ancora inviare dati).
- Passivo finito → **FIN** (seq=v).
- Attivo → **ACK** (ack=v+1). **TIME_WAIT** (2*MSL) → CLOSED.
Garanzie Chiave
- Affidabilità: Checksum + ACK + Ritrasmissione.
- Ordinamento: Numeri di sequenza → riassembla in ordine.
- Controllo di flusso: Ricevitore non inondato.
- Controllo di congestione: Rete non fusa.
Costo: Intestazioni (20B+), latenza (handshake, attesa ACK), head-of-line blocking (una perdita blocca lo stream). QUIC/HTTP3 sposta questo su UDP per risolvere l'HOL.