Skip to content

Lezione (2025-11-06)

TCP è un protocollo punto-punto bidirezionale che garantisce un flusso di byte affidabile e consegnato in ordine.

Esiste un meccanismo di controllo di congestione che definisce dinamicamente le dimensioni delle finestre. Gli ACK sono cumulativi.

sezionedimensione (bit)
porta sorgente16
porta destinazione16
numero di sequenza (bytes inviati)32
numero di ACK (bytes ricevuti)32
offset dati (lunghezza delle opzioni)4
spazio inutilizzato3
flag URG: dati urgenti1
flag ACK: il segmento contiene un ACK valido1
flag PSH: invia i dati immediatamente, senza aspettare1
flag RST: resetta la connessione1
flag SYN: usato per settare i numeri di sequenza iniziali1
flat FIN: usato per chiudere la connessione1
lunghezza finestra di ricezione16
checksum header16
offset fine dati urgenti16
opzioni (campo non obbligatorio)0-320

Il numero di sequenza è il numero del primo byte del segmento (rispetto al totale dei byte inviati). Il numero di ACK è il numero di sequenza del prossimo byte atteso dal ricevitore.

Esempio di sequenza e ACK TCP

La procedura di connessione TCP avviene attraverso un three way handshake.

  1. L’host A (colui che inizia la connessione) invia un segmento con flag SYN a 1, porta sorgente A, porta destinazione B e numero di sequenza xx casuale.
  2. L’host B (server in attesa di connessioni) risponde con un segmento con flag SYN e ACK a 1, porta sorgente B, porta destinazione A, numero di sequenza yy casuale e numero di ACK x+1x + 1.
  3. L’host A invia un segmento con flag ACK a 1 e numero di ACK y+1y + 1.

TCP non invia mai un singolo byte alla volta (a meno che non sia forzato). Cerca invece di inviare segmenti lunghi quanto un MSS.

L’MSS è la massima lunghezza dei dati trasportati dal segmento, che dipende dall’MTU dei livelli sottostanti e dalla conformazione di tutto il percorso che devono compiere i pacchetti.

Per scegliere l’MSS si prova ad aumentarlo fino a quando ci si accorge che qualche segmento viene perso.

Le connessioni TCP sono sempre bidirezionali e quindi bisogna che la chiusura avvenga da entrambe le parti.

La chiusura controllata consiste nell’inviare un segmento con FIN=1 e ricevere un ACK. Si possono ancora ricevere segmenti dall’altro host ma non possono contenere dati (connessione half-closed). Quando l’altro host esegue lo stesso processo allora la connessione viene chiusa.

Il flag RST si usa per resettare connessioni non gestibili o che si trovano in uno stato errato.

In questo caso l’host che invia l’RST non deve aspettare altri messaggi e può liberare subito le risorse allocate alla connessione.

Il retransmission timeout è il tempo che un host aspetta per ricevere un ACK, prima di considerare l’invio fallito e riprovare la ritrasmissione.

Questo tempo dipende dal RTT, impostarlo troppo piccolo porta a ritrasmissioni non necessarie, troppo grande porta a una reazione lenta alla perdita di segmenti.

Per calcolare il RTO (RFC 6298) si usano meccanismi di media mobile, che si basano su sugli RTT precedenti (SampleRTT\text{SampleRTT}) 2 valori:

  • EstimatedRTT=(1α) EstimatedRTT+α SampleRTT\text{EstimatedRTT} = (1 - \alpha)\ \text{EstimatedRTT} + \alpha\ \text{SampleRTT}: media mobile del RTT, il valore dei vecchi campioni diminuisce esponenzialmente con valore di α\alpha tipicamente a 0.1250.125.
  • DevRTT=(1β) DevRTT+β SampleRTTEstimatedRTT\text{DevRTT} = (1 - \beta)\ \text{DevRTT} + \beta\ |\text{SampleRTT} - \text{EstimatedRTT}|: deviazione standard dell’errore tra la media dell’RTT e l’RTT misurato.

L’RTO si calcola con la seguente formula:

RTO=EstimatedRTT+4 DevRTT\text{RTO} = \text{EstimatedRTT} + 4\ \text{DevRTT}

Per inizializzare si pone EstimatedRTT=SampleRTT\text{EstimatedRTT} = \text{SampleRTT} e DevRTT=SampleRTT2\text{DevRTT} = \frac{\text{SampleRTT}}{2}.

Il controllo di flusso del protocollo TCP è un meccanismo mediante il quale il ricevitore può controllare la velocità con cui trasmettitore invia i dati.

Il ricevitore comunica quanto spazio libero ha nel proprio buffer di ricezione includendo il valore nel campo ‘finestra di ricezione’ dell’header. Il mittente limita la quantità di dati in volo (che non hanno ricevuto ACK) al valore specificato.