Sistemi e Reti - Anno 4 - Modulo 3 - Lezione 03 - TCP Caratteristiche Segmento
Sistemi e Reti · Anno 4 · Modulo 3 · Lezione 03
✍ Autore: profgiagnotti · Materia: Sistemi e Reti

TCP — caratteristiche e struttura del segmento

Dal perché HTTP, SSH e FTP usano TCP, alle sei garanzie fondamentali, fino a header, flag, sequence number e opzioni moderne (MSS, Window Scale, SACK, Timestamps).

⏱ 55 min 📚 Anno 4 · Modulo 3 🧠 TCP · Header · Flag
// OBIETTIVI DI APPRENDIMENTO
✓Elencare e spiegare le sei caratteristiche principali di TCP: connection-oriented, affidabile, full-duplex, byte-stream, controllo del flusso e della congestione
✓Descrivere la struttura dell'header TCP (20 byte fissi + opzioni) identificando il ruolo di ogni campo
✓Spiegare il ruolo di Sequence Number, Acknowledgment Number e dei flag SYN, FIN, ACK, RST, PSH, URG
✓Conoscere le principali opzioni TCP (MSS, Window Scale, SACK, Timestamps) e il loro scopo
✓Collocare TCP da RFC 793 a RFC 9293 e comprenderne l'evoluzione moderna con SACK, CUBIC, BBR, TFO

1. TCP — il protocollo che garantisce tutto

HTTP, HTTPS, SSH, FTP, SMTP: tutti usano TCP. Non è un caso. TCP è il protocollo di trasporto che garantisce che i dati arrivino a destinazione integri, ordinati e senza duplicati, indipendentemente da quello che succede nella rete sottostante. È la fondamenta su cui è costruita la maggior parte di Internet.

Ma questa garanzia ha un costo: TCP è complesso, ha un header minimo di 20 byte, richiede una connessione esplicita e mantiene stato su entrambi gli host. Capire come funziona internamente ti permette di capire perché alcune applicazioni sono lente, perché certi firewall si comportano in modo strano, e come i moderni protocolli come QUIC cercano di migliorarlo.

📌 Definizione da ricordare

TCP è un protocollo di livello Transport connection-oriented, affidabile, full-duplex e byte-stream, con controllo di flusso (rwnd) e controllo di congestione (cwnd).

Le sei caratteristiche fondamentali

01 · CONNECTION-ORIENTED

Handshake a tre vie

Prima di trasferire dati, TCP stabilisce una connessione con three-way handshake. Solo dopo che entrambi gli host hanno concordato parametri e ISN inizia il trasferimento.

02 · AFFIDABILE

ACK, ritrasmissione, riordino

Garanzia che ogni byte venga ricevuto correttamente tramite acknowledgment, ritrasmissione in caso di perdita e riordinamento di segmenti fuori sequenza.

03 · FULL-DUPLEX

Dati in entrambe le direzioni

Dati scorrono in entrambe le direzioni simultaneamente. Ogni lato ha Sequence Number indipendente. ACK e dati viaggiano con piggybacking.

04 · BYTE-STREAM

Nessun confine di messaggio

TCP non conosce i confini dei messaggi applicativi. L'app invia un flusso continuo; TCP lo segmenta. Contrasto con UDP che è message-oriented.

05 · CONTROLLO DEL FLUSSO

Evita buffer overflow

Il ricevitore comunica spazio disponibile tramite Window Size. Il mittente non può inviare più byte di quanti il ricevitore possa accettare.

06 · CONTROLLO CONGESTIONE

Evita collasso di rete

TCP adatta la velocità allo stato della rete tramite Slow Start, AIMD, CUBIC, BBR. Nessuna app può inviare a piena velocità se la rete è congestionata.

Affidabile ACK + Retransmit Ordinato Seq + riordino Full-Duplex 2 flussi + piggyback Byte-Stream No msg boundaries Controllo Flusso → rwnd Window Size = spazio rx buffer Controllo Congestione → cwnd CUBIC / BBR / Slow Start

2. La struttura dell'header TCP

L'header TCP ha una dimensione minima di 20 byte (5 parole da 32 bit), espandibile fino a 60 byte con le opzioni. Ogni campo ha un ruolo preciso nel meccanismo di consegna affidabile.

RFC 9293 · HEADER TCP - 32 BIT PER RIGA
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port (16) | Destination Port (16) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number (32) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number (32) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Data | |C|E|U|A|P|R|S|F| | |Offs.|Res|W|C|R|C|S|S|Y|I| Window Size (16) | |(4) |(3)|R|E|G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum (16) | Urgent Pointer (16) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options (0–40 byte, variabile) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Campi dell'header — analisi dettagliata

CampoDimensioneRuolo
Source Port16 bitPorta del processo mittente (client: porta effimera; server: porta well-known)
Destination Port16 bitPorta del processo destinatario — usata per il demultiplexing
Sequence Number32 bitNumero del primo byte del payload in questo segmento. Inizializzato con l'ISN
Acknowledgment Number32 bitProssimo byte atteso dal ricevitore (ACK cumulativo). Valido solo se ACK=1
Data Offset4 bitLunghezza header in parole da 32 bit. Min 5 (=20 byte), max 15 (=60 byte)
Reserved3 bitRiservati, devono essere 0
Flags9 bitCWR, ECE, URG, ACK, PSH, RST, SYN, FIN — controllano la connessione
Window Size16 bitSpazio disponibile nel buffer rx (byte). Base del controllo del flusso
Checksum16 bitPseudo-header IP + header TCP + dati. Obbligatorio (a differenza di UDP)
Urgent Pointer16 bitOffset fino ai dati urgenti. Valido solo se URG=1, usato raramente
Options0–40 byteEstensioni negoziabili: MSS, Window Scale, SACK, Timestamps

3. I flag TCP — il linguaggio della connessione

I 9 bit di flag sono lo strumento con cui TCP comunica lo stato della connessione. Ogni flag attivo (=1) ha un significato preciso:

FLAG · APERTURA

SYN

Synchronize — apertura connessione. Presente nel 1° e 2° messaggio del three-way handshake. Consuma 1 numero di sequenza.

FLAG · CONFERMA

ACK

Acknowledgment — il campo Ack Number è valido. Presente in quasi tutti i segmenti tranne il primo SYN.

FLAG · CHIUSURA

FIN

Finish — chiusura graziosa. Chi invia FIN non trasmetterà più dati ma può ancora ricevere. Consuma 1 seq.

FLAG · ERRORE

RST

Reset — chiusura immediata anomala. Nessun graceful close. Usato per stato inconsistente o rifiuto connessione.

FLAG · PUSH

PSH

Push — richiede al ricevitore di consegnare i dati all'app immediatamente senza aspettare il riempimento del buffer.

FLAG · URG / ECN

URG / CWR / ECE

URG = dati urgenti. CWR/ECE = Explicit Congestion Notification (RFC 3168). Raramente usati nelle implementazioni comuni.

⚠️ Errore comune

Confondere FIN e RST: FIN è una chiusura ordinata (half-close possibile), RST è una chiusura brusca che scarta buffer e notifica errore all'app. In Wireshark, RST spesso indica porte chiuse o firewall che blocca.

💬 Tip del docente

All'interrogazione: SYN e FIN consumano 1 byte di sequenza anche se non trasportano payload. È una domanda trabocchetto classica! Ricorda: ISN casuale per sicurezza anti-hijacking.

4. Sequence Number, ACK cumulativo e Window Size

📌 Definizione da ricordare

Sequence Number = numero del primo byte del payload nel flusso complessivo. Ack Number = prossimo byte atteso (ACK cumulativo che conferma tutto fino a N-1).

I campi Sequence Number e Acknowledgment Number sono il meccanismo centrale di TCP.

🎯 Sequenza operativa

ISN pseudocasuale scelto all'apertura (non 0) per sicurezza anti IP spoofing e session hijacking. SYN e FIN = +1 seq. ACK cumulativo semplifica la gestione ma rende inefficienti perdite multiple senza SACK.

ESEMPIO · TRASFERIMENTO 1000 BYTE (ISN=0, MSS=200)
SeqNum=0, len=200 → byte 0–199 → ACK=200 (prossimo byte atteso) SeqNum=200, len=200 → byte 200–399 → ACK=400 SeqNum=400, len=200 → PERDUTO → ACK=400 (ricevitore richiede ancora 400) SeqNum=600, len=200 → byte 600–799 → ACK=400 (fuori ordine! ACK duplicato) SeqNum=400, len=200 → ritrasmissione → ACK=800 -- ACK cumulativo: ACK=800 conferma ricezione di tutti i byte 0–799

Window Size — il controllo del flusso in un campo

Il campo Window Size (16 bit) comunica al mittente quanti byte il ricevitore può ancora accettare nel suo buffer. Regola fondamentale:

REGOLA MITTENTE TCP
LastByteSent - LastByteAcked ≤ min(cwnd, rwnd) cwnd = congestion window (limitata dalla rete) rwnd = receive window (limitata dal buffer del ricevitore)
⚠️ Problema 16 bit su reti veloci

Max 65535 byte. Con RTT=100ms e banda 1 Gbps, BDP ≈12,5 MB. Con window 64 KB il mittente aspetta ACK ogni 64 KB, sprecando banda. Soluzione: Window Scale (RFC 7323) moltiplicatore fino a 2¹⁴ = 16384× → window effettiva ~1 GB.

SRC DST SEQ=0 len=1460 → ← ACK=1460 rwnd=64240 ACK cumulativo conferma tutto fino a 1459. rwnd = controllo flusso.

5. Opzioni TCP ed evoluzione da RFC 793 a RFC 9293

Le opzioni TCP estendono l'header base aggiungendo funzionalità negoziabili nell'handshake:

OpzioneRFCFunzione
MSS (Maximum Segment Size)RFC 793Max payload che il mittente è disposto a ricevere. Negoziato in SYN. Evita frammentazione IP. Default 536, tipico 1460 su Ethernet (1500-20-20).
Window ScaleRFC 7323Moltiplicatore Window Size. Finisce ~1 GB su reti high BDP.
SACK Selective AcknowledgmentRFC 2018Segnala blocchi non contigui ricevuti. Ritrasmette solo mancanti, non tutto dal gap.
TimestampsRFC 7323RTT preciso e PAWS — Protection Against Wrapped Sequences su connessioni velocissime.
📌 Nota — Checksum su pseudo-header

Il checksum TCP è calcolato su uno pseudo-header che include IP sorgente, destinazione, protocollo e lunghezza segmento — campi del livello IP. Viola la separazione dei livelli ma rileva errori di consegna ad indirizzi errati. Stessa tecnica usata da UDP.

Da RFC 793 (1981) a RFC 9293 (2022)

TCP è stato definito nel 1981 con RFC 793. Nel 2022 è stato aggiornato da RFC 9293 che consolida decenni di correzioni e best practice. RFC 793 è obsoleto. Le implementazioni moderne (Linux, Windows, BSD) seguono RFC 9293 + RFC aggiuntivi per SACK, CUBIC, BBR, TFO (TCP Fast Open) e altri.

EVOLUZIONE

RFC 793 → RFC 9293

Consolidamento, chiarimenti su ISN casuale, handling di opzioni, sicurezza. Documento di riferimento moderno.

MODERN TCP

CUBIC, BBR, TFO, SACK

Linux usa CUBIC/BBR, Window Scale automatico, SACK abilitato di default. Performance su high-bandwidth.

6. Verifica / Esercizio pratico

🔬 Attività — Analizza un flusso TCP

Usa Wireshark o tcpdump su una connessione HTTP verso un sito. Rispondi:

  1. Qual è il valore di MSS negoziato nel SYN? Corrisponde a 1460? Perché?
  2. Verifica Sequence Number: SYN e FIN consumano sequenza? Controlla Ack Numbers.
  3. Cerca Window Scale e SACK nel SYN: quali fattori di scala vedi? La connessione è SACK-permitted?
  4. Calcola BDP: bandwidth × RTT del percorso. La Window Size basta senza scaling?
✅ Soluzione ragionata

1. 1460 = MTU 1500 Ethernet - 20 IP - 20 TCP. Se PPPoE → 1452. 2. Sì: Wireshark mostra Seq 0 per SYN ma next Seq =1. Stesso per FIN. 3. Window Scale tipico 7-8 su Linux (×128/256), SACK-Permitted=1 quasi sempre ON. 4. BDP alto su 1Gbps/100ms = 12,5 MB → serve WS, altrimenti throughput limitato a ~5 Mbps con 64KB.

✓TCP = connection-oriented, affidabile, full-duplex, byte-stream + controllo flusso (rwnd) e congestione (cwnd)
✓Header min 20 byte: Port 16, Seq 32, Ack 32, Data Offset 4, Flag 9, Window 16, Checksum 16, Urgent 16 + Options 0-40
✓Seq = primo byte payload; Ack = prossimo byte atteso; ACK cumulativo
✓ISN casuale per sicurezza; SYN e FIN consumano 1 seq
✓Flag: SYN apertura, ACK conferma, FIN chiusura ordinata, RST reset, PSH push immediato
✓Opzioni: MSS evita frammentazione, WS fino a ~1GB, SACK ritrasmette solo buchi, Timestamps RTT + PAWS

📚 Prossimo passo — TCP handshake a tre vie e chiusura

Ora che conosci header e flag, vediamo come si apre e chiude davvero una connessione: SYN, SYN-ACK, ACK, FIN e stati TIME_WAIT, CLOSE_WAIT, con tcpdump in tempo reale.