TCP - connessione, affidabilità e controllo di flusso
In questa pagina 9
In questa pagina 7
TCP (Transmission Control Protocol) è un protocollo di trasporto orientato alla connessione e affidabile. Rispetto a UDP (Protocollo UDPUDP (User Datagram Protocol) è il protocollo di trasporto senza connessione e inaffidabile: rispetto a IP aggiunge soltanto la comunicazione processo-processo (numeri di porta) e un controllo d'errore facoltativo. L'intestazione è di soli 8 byte (porta sorgente, porta destinazione, lunghezza, checksum). Il checksum copre pseudo-intestazione (indirizzi IP, protocollo 17, lunghezza), intestazione e dati, ed è il complemento a uno della somma a 16 bit; se vale 0 significa "non calcolato", e un risultato 0 si trasmette come 0xFFFF. UDP non ha connessione, numeri di sequenza, controllo di flusso, di errore né di congestione: si sceglie per i messaggi brevi (DNS, DHCP, RIP, SNMP) e per le applicazioni in tempo reale, dove conta non aggiungere ritardo.Protocollo UDP →) aggiunge tre fasi esplicite e un insieme di meccanismi di affidabilità:
- apertura della connessione (connection set-up): handshake a tre vie;
- trasferimento dei dati: un flusso di byte (byte stream), come se tra mittente e destinatario ci fosse un circuito dedicato;
- chiusura della connessione: non si liberano risorse nella rete, ma solo negli host finali.
Per essere affidabile TCP combina idee di Go-Back-N e di Selective Repeat (Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective RepeatARQ (Automatic Repeat reQuest) rende affidabile un collegamento che sbaglia: il ricevitore conferma (ACK) i frame ricevuti bene, il trasmettitore ritrasmette allo scadere del timeout. Servono timeout (contro il deadlock) e numeri di sequenza (contro i duplicati). Con $t_G=t_F+2\tau_p+t_A$ e probabilità di errore $p$: Stop-and-Wait $\rho=\frac{t_F(1-p)}{t_G}$; Go-Back-N con finestra $N\ge t_G/t_F$ $\rho=\frac{1-p}{1+(N-1)p}$; Selective Repeat $\rho=1-p$. Efficienza $\eta=\rho,I/F$. La finestra ottima è la capacità del tubo in pacchetti. In Selective Repeat esiste anche una lunghezza ottima del frame: con overhead $o$ e probabilità di errore sul bit $P_b$, $x_{ott}\simeq\frac o2+\sqrt{o/P_b}$ (frame più corti se il canale sbaglia di più).Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective Repeat →, e per la teoria generale degli ARQ Tecniche ARQ - stop-and-wait, go-back-N e selective repeatL'ARQ (automatic repeat request) usa un codice che rivela gli errori e fa ritrasmettere i pacchetti sbagliati, con conferme ACK/NACK. Con $p=1-(1-P_{bit})^L$ la probabilità che un pacchetto sia errato, $t_P$ il tempo di pacchetto, $t_A$ quello dell'ACK e $\tau_P$ il ritardo di propagazione: stop-and-wait $S=\frac{t_P(1-p)}{t_P+t_A+2\tau_P}$; go-back-N $S=\frac{(1-p),t_P}{1+(N-1)p}$ con $N-1=\left\lceil\frac{2\tau_P}{t_P+t_A}\right\rceil$; selective repeat $S=(1-p)\frac{t_P}{t_P+t_A}$. Il numero medio di trasmissioni di un pacchetto è $\frac1{1-p}$.Tecniche ARQ - stop-and-wait, go-back-N e selective repeat →): checksum per rilevare gli errori, numeri di byte, di sequenza e di riscontro (acknowledgment) per ritrasmettere i pacchetti persi o corrotti e per riordinare quelli arrivati fuori ordine, riscontri cumulativi e selettivi. Il controllo di congestione è in TCP - controllo di congestioneLa congestione nasce quando collegamenti veloci alimentano un collegamento lento: le code dei router si riempiono, i pacchetti si perdono o ritardano e, nel caso peggiore, la rete collassa (quasi solo ritrasmissioni). TCP controlla la propria finestra di congestione cwnd con il feedback delle perdite (timeout o tre ACK duplicati): slow start (cwnd raddoppia a ogni RTT) fino alla soglia ssthresh, poi congestion avoidance (+1 MSS per RTT); a ogni perdita ssthresh = W/2. Le varianti si distinguono per come reagiscono ai tre dupACK: Tahoe riparte da cwnd = 1 dopo la ritrasmissione rapida; Reno usa il fast recovery (ssthresh = cwnd/2, cwnd = ssthresh + 3, +1 per ogni altro dupACK); NewReno gestisce gli ACK parziali e recupera più perdite nella stessa finestra; SACK riscontra i blocchi ricevuti e ritrasmette solo quello che manca.TCP - controllo di congestione →, la stima del timeout in Stima del timeout di ritrasmissione (RTO)TCP ritrasmette un segmento se il suo ACK non arriva entro il timeout di ritrasmissione (RTO), che deve seguire il tempo di andata e ritorno (RTT) della rete: troppo corto provoca ritrasmissioni inutili, troppo lungo rallenta il recupero. L'RTT si misura con un solo timer per connessione (granularità G del clock). Si mantengono una media mobile esponenziale SRTT_i = (1-α)SRTT_{i-1} + α·rtt_i con α = 1/8 e la deviazione media MAD_i = (1-ρ)MAD_{i-1} + ρ|rtt_i - SRTT_{i-1}| con ρ = 1/4 (in RFC 6298 RTTVAR, β = 1/4); RTO = SRTT + 4·MAD, con minimo di 1 s. L'algoritmo di Karn ignora le misure dei segmenti ritrasmessi (non si sa a quale trasmissione si riferisce l'ACK) e a ogni timeout consecutivo il valore raddoppia fino a 64 volte T0. Per un RTT gaussiano la deviazione media vale MAD = σ·sqrt(2/π) ≈ 0,797σ.Stima del timeout di ritrasmissione (RTO) →.
I servizi di TCP
- Processo-processo: come UDP, usa i socket e le porte (Livello di trasporto - porte e multiplexingIl livello di trasporto (transport layer) offre la comunicazione logica end-to-end tra processi applicativi di host diversi, ed è realizzato solo negli host finali, non nei router. Il livello di rete consegna al computer giusto (indirizzo IP), il trasporto consegna al processo giusto (numero di porta di 16 bit, 0-65535). Una porta più un indirizzo IP formano un socket; la quaterna (IP sorgente, porta sorgente, IP destinazione, porta destinazione) identifica una connessione. I servizi sono: comunicazione processo-processo, indirizzamento, incapsulamento/decapsulamento, multiplexing/demultiplexing e, se il protocollo è affidabile, controllo di errore, di flusso e di congestione. I protocolli sono UDP (senza connessione, inaffidabile), TCP (con connessione, affidabile) e SCTP (combina i due).Livello di trasporto - porte e multiplexing →).
- Full-duplex: i dati possono viaggiare nei due sensi contemporaneamente; ogni estremo ha un proprio buffer di invio e uno di ricezione.
- Multiplexing e demultiplexing: come UDP, ma serve una connessione per ogni coppia di processi (identificata dalla quaterna porte-IP).
- Servizio affidabile: usa i riscontri per verificare che i dati siano arrivati sani e salvi.
- Orientato alla connessione: le fasi sono tre (apertura, scambio, chiusura). La connessione è logica, non fisica: i segmenti TCP viaggiano dentro datagrammi IP che possono essere persi, corrotti, riordinati e seguire percorsi diversi. TCP trasforma il servizio inaffidabile e senza connessione di IP in un servizio affidabile e con connessione per l'applicazione.
- Flusso di byte: i dati dell'applicazione sono un flusso senza "etichette" o separatori di messaggi.
Il segmento TCP
L'intestazione è organizzata in parole da 32 bit; i campi fissi occupano 20 byte, seguiti da al più 40 byte di opzioni.
| parola | campi |
|---|---|
| 1 | porta sorgente (16) · porta destinazione (16) |
| 2 | numero di sequenza (32) |
| 3 | numero di riscontro, acknowledgment number (32) |
| 4 | HLEN (4) · riservato (6) · flag (6) · finestra, window size (16) |
| 5 | checksum (16) · puntatore urgente (16) |
| 6... | opzioni e riempimento (fino a 40 byte) |
- Porte (16 + 16 bit): dei processi di mittente e destinatario.
- Numero di sequenza (SN, 32 bit): numero assegnato al primo byte di dati contenuto nel segmento. All'apertura ciascuna parte sceglie con un generatore casuale un numero di sequenza iniziale (initial sequence number, ISN) in .
- Numero di riscontro (AN, 32 bit): il prossimo byte atteso dal ricevente. Se ha ricevuto con successo il byte , risponde . È un riscontro cumulativo: AN significa che tutti i byte fino al compreso sono stati ricevuti. ACK e dati possono viaggiare nello stesso segmento (piggybacking).
- HLEN (4 bit): lunghezza dell'intestazione in parole da 4 byte, quindi sempre tra ( byte) e ( byte).
- Flag (6 bit): URG (il puntatore urgente è valido), ACK (il numero di riscontro è valido), PSH (consegna subito all'applicazione), RST (azzera la connessione), SYN (sincronizza i numeri di sequenza), FIN (il mittente ha finito). Con ECN (RFC 3168) si aggiungono CWR ed ECE.
- Finestra (16 bit): lo spazio di buffer libero del ricevente, in byte (receive window, rwnd). Con 16 bitcon k bit si rappresentano i numeri da 0 a 2^k − 1Sistemi di numerazione posizionali → vale al massimo byte; il valore lo decide il ricevente e il mittente deve rispettarlo. Serve per il controllo di flusso e di congestione.
- Checksum (16 bit): come in UDP ma obbligatorio; copre intestazione, dati e pseudo-intestazione (con protocollo ).
- Puntatore urgente (16 bit): valido solo con URG; sommato a SN dà il numero dell'ultimo byte urgente.
- Opzioni (fino a 40 byte): end of option (riempimento), no operation (allineamento), MSS, SACK, timestamp.
MSS: dimensione massima del segmento
L'opzione MSS (maximum segment size) dice la massima quantità di dati TCP (esclusa l'intestazione TCP) che un host accetta in un segmento. Il valore predefinito è byte, il massimo . Per evitare la frammentazione IP (Datagramma IP e frammentazioneIPv4 è un servizio senza connessione, non affidabile, best effort: i pacchetti (datagrammi) possono essere persi, corrotti, riordinati o ritardati. L'intestazione ha 20-60 byte (HLen conta parole da 4 byte, da 5 a 15); il campo Total Length (16 bit) dà la lunghezza totale fino a 65 535 byte; TTL limita i salti, Protocol identifica il protocollo trasportato (1 ICMP, 6 TCP, 17 UDP), il checksum copre solo l'intestazione. Se un datagramma è più grande dell'MTU del collegamento viene frammentato: solo il payload si divide, ogni frammento ha un'intestazione propria; l'Offset (13 bit) è in unità di 8 byte, MF=1 in tutti i frammenti tranne l'ultimo, e il riassemblaggio avviene solo a destinazione.Datagramma IP e frammentazione →) un host dovrebbe annunciare come MSS la dimensione del più grande datagramma IP che sa gestire, cioè l'MTU meno le intestazioni IP e TCP.
Formula (MSS). (con intestazioni di 20 byte ciascuna).
Esempio. Ethernet, MTU byte: byte (i byte del datagramma IP contengono byte di intestazione IP, di intestazione TCP e il resto è payload). Un collegamento con MTU dà . Un segmento pieno è quindi byte di dati più di TCP byte e, con i di IP, esattamente byte (l'MTU): la frazione di byte utili è .
Numeri di sequenza e di riscontro
Ogni byte del flusso ha un numero. Il numero di sequenza di un segmento è quello del suo primo byte; il successivo parte dal numero precedente più il numero di byte trasportati.
Esempio. File di byte, ISN , segmenti da byte:
| segmento | SN | byte trasportati |
|---|---|---|
| 1 | – | |
| 2 | – | |
| 3 | – | |
| 4 | – | |
| 5 | – |
Dopo aver ricevuto il segmento 3 per intero il ricevente risponde AN . Passaggi: l'SN del segmento è (qui per ); l'ultimo byte del segmento 3 è e il prossimo byte atteso è . Gli estremi «» e «» nascono dal fatto che un segmento da byte con primo byte copre i byte .
Proprietà (quanti numeri di sequenza consuma un segmento). Un segmento senza dati (per esempio un semplice ACK) non consuma numeri di sequenza. I segmenti SYN e FIN, pur senza dati, ne consumano uno (come se portassero un byte immaginario), perché devono essere riscontrati.
Apertura della connessione: handshake a tre vie
Il client apre la connessione e passa per tre segmenti (three-way handshaking). Esempio con SYN, ISN del client , ISN del server :
- SYN. Il client invia un segmento con solo il flag SYN, SN (il suo ISN, scelto a caso). Non porta dati, non ha numero di riscontro e non definisce la finestra, ma consuma un numero di sequenza.
- SYN + ACK. Il server risponde con SYN e ACK: SN (il suo ISN, diverso: la comunicazione è full-duplex e ogni verso ha il suo), AN (riscontra il SYN, atteso il byte ), rwnd . Anche questo consuma un numero di sequenza.
- ACK. Il client riscontra: SN , AN , rwnd . Un ACK senza dati non consuma numeri di sequenza; l'implementazione può però far portare al terzo segmento i primi dati del client (piggyback), e allora consuma tanti numeri quanti sono i byte.
Tempi. Se i segmenti di apertura sono trascurabili rispetto al tempo di propagazione , il client riceve il SYN+ACK dopo (un tempo di andata e ritorno di sola propagazione) e può iniziare a spedire dati subito, nello stesso segmento dell'ACK (piggyback). Nella convenzione degli esercizi del corso il tempo di apertura prima dei dati è con piggyback (i dati partono insieme al terzo segmento), mentre senza piggyback il terzo segmento deve prima raggiungere il server e il conto sale a . Con ms: ms oppure ms.
Scambio dei dati
Dopo l'apertura i due lati scambiano dati e riscontri nei due versi, con piggybacking. Esempio: il client invia byte in due segmenti, poi il server ne invia in uno, poi il client un altro segmento:
| da | SN | AN | dati |
|---|---|---|---|
| client | – | ||
| client | – | ||
| server | – | ||
| client | (solo ACK) |
Chiusura della connessione
A tre vie. Il client invia un segmento con FIN (consuma un numero di sequenza), SN . Il server risponde con FIN+ACK (SN , AN ; consuma anch'esso un numero). Il client invia l'ultimo ACK (AN ) e chiude la sessione nei due versi.
A quattro vie con chiusura a metà (half closing). Il client invia FIN, il server risponde solo con ACK e continua a inviare dati, mentre il client può spedire solo ACK senza dati. Quando ha finito, il server invia il suo FIN e il client risponde con ACK e chiude.
Le finestre di TCP
Finestra di invio
La finestra di invio (send window) somiglia a quella di Selective Repeat (Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective RepeatARQ (Automatic Repeat reQuest) rende affidabile un collegamento che sbaglia: il ricevitore conferma (ACK) i frame ricevuti bene, il trasmettitore ritrasmette allo scadere del timeout. Servono timeout (contro il deadlock) e numeri di sequenza (contro i duplicati). Con $t_G=t_F+2\tau_p+t_A$ e probabilità di errore $p$: Stop-and-Wait $\rho=\frac{t_F(1-p)}{t_G}$; Go-Back-N con finestra $N\ge t_G/t_F$ $\rho=\frac{1-p}{1+(N-1)p}$; Selective Repeat $\rho=1-p$. Efficienza $\eta=\rho,I/F$. La finestra ottima è la capacità del tubo in pacchetti. In Selective Repeat esiste anche una lunghezza ottima del frame: con overhead $o$ e probabilità di errore sul bit $P_b$, $x_{ott}\simeq\frac o2+\sqrt{o/P_b}$ (frame più corti se il canale sbaglia di più).Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective Repeat →) ma con alcune differenze:
- la dimensione è in byte, non in pacchetti (anche se la trasmissione avviene per segmenti);
- il mittente TCP può inviare segmenti appena li riceve dal suo processo;
- il Selective Repeat teorico potrebbe usare un timer per ogni pacchetto; TCP usa un solo timer.
Si distinguono: i byte già inviati e riscontrati; i byte in volo (inviati ma non riscontrati, a partire dal primo byte non riscontrato ); i byte che si possono ancora inviare (usable window), fino al prossimo byte da inviare ; e i byte fuori dalla finestra, che si possono inviare solo quando la finestra scorre.
Formula (finestra di invio). , e un nuovo byte si può inviare se . rwnd (finestra del ricevitore) dipende dall'estremo di destinazione; cwnd (finestra di congestione, TCP - controllo di congestioneLa congestione nasce quando collegamenti veloci alimentano un collegamento lento: le code dei router si riempiono, i pacchetti si perdono o ritardano e, nel caso peggiore, la rete collassa (quasi solo ritrasmissioni). TCP controlla la propria finestra di congestione cwnd con il feedback delle perdite (timeout o tre ACK duplicati): slow start (cwnd raddoppia a ogni RTT) fino alla soglia ssthresh, poi congestion avoidance (+1 MSS per RTT); a ogni perdita ssthresh = W/2. Le varianti si distinguono per come reagiscono ai tre dupACK: Tahoe riparte da cwnd = 1 dopo la ritrasmissione rapida; Reno usa il fast recovery (ssthresh = cwnd/2, cwnd = ssthresh + 3, +1 per ogni altro dupACK); NewReno gestisce gli ACK parziali e recupera più perdite nella stessa finestra; SACK riscontra i blocchi ricevuti e ritrasmette solo quello che manca.TCP - controllo di congestione →) dipende dalla rete.
Esempio. Con rwnd MSS e cwnd MSS, MSS; quando cwnd sale a MSS, MSS: oltre rwnd non si può andare.
Finestra di ricezione
Anche questa è simile a quella di Selective Repeat, ma: TCP lascia che il processo ricevente legga ("pull") i dati con il suo ritmo, quindi una parte del buffer può essere occupata da byte ricevuti e già riscontrati, in attesa di essere letti; e il riscontro è cumulativo (indica il prossimo byte atteso) anziché selettivo.
Formula (finestra del ricevitore).
Controllo di flusso
Il buffer è di dimensione fissa, ma TCP obbliga mittente e ricevente ad adattare le finestre. La finestra del ricevitore si chiude quando arrivano byte che l'applicazione non consuma, si apre quando l'applicazione li legge. Il mittente adegua la sua: la finestra di invio si chiude se arriva un ACK con rwnd ridotta, si apre se rwnd aumenta, e si restringe (shrinks) se il margine destro arretra: situazione da evitare.
Esempio. Buffer del ricevente di byte; i byte sono numerati da .
| passo | evento | rwnd | il mittente può inviare |
|---|---|---|---|
| 0 | stato iniziale | – | |
| 1 | il mittente invia SN , byte; il ricevente risponde AN | – | |
| 2 | il mittente invia SN , byte; il ricevente risponde AN (buffer occupato: ) | – | |
| 3 | l'applicazione legge byte; il ricevente invia AN (buffer occupato: ) | – | |
| 4 | l'applicazione legge altri byte; il ricevente invia AN (occupato: ) | – |
Nei passi 1 e 2 i byte sono riscontrati ma rwnd diminuisce: la finestra si chiude. Nei passi 3 e 4 gli ACK sono ripetuti, perché il ricevente non ha ricevuto nuovi dati ma ha liberato posto: la finestra si riapre.
Il blocco (deadlock) e il persist timer
Se il ricevente riempie il buffer, invia un ACK con rwnd e il mittente si ferma. Per ripartire serve un ACK con rwnd : il ricevente lo manda (come ACK duplicato) quando l'applicazione ha liberato almeno un MSS o metà buffer. Ma se questo ACK si perde, il mittente non lo saprà mai e resterebbe bloccato per sempre, mentre il ricevente aspetta dati.
Definizione (persist timer). Quando rwnd il mittente avvia un persist timer (inizialmente ms, dipende dall'implementazione). Se scade senza aver ricevuto segmenti, il mittente invia una sonda (probe) di 1 byte, che fa ripetere al ricevente il prossimo byte atteso e la finestra corrente. Se il ricevente è ancora pieno rifiuta la sonda; altrimenti la riscontra e annuncia la finestra disponibile. A ogni mancata risposta il timer raddoppia (backoff esponenziale), fino a un massimo di s.
Esempio. Sonde a , , , , , , , s: il valore dopo mancate risposte è s (progressione geometrica di ragione ) e, arrivati a s, che supera il massimo, si ferma a s. Dopo l'ottava sonda quindi si sonda ogni s.
Il problema dei datagrammi minuscoli e l'algoritmo di Nagle
Se l'applicazione mittente produce dati lentamente, TCP potrebbe inviare segmenti da pochi byte, con grande overhead: un segmento con 1 byte di dati diventa un datagramma di byte, e l'efficienza è (peggio ancora contando collegamento e fisico).
Definizione (algoritmo di Nagle). Dopo aver inviato il primo segmento, il mittente accumula i dati nel buffer d'uscita e aspetta o che arrivi l'ACK del ricevente, o che si siano accumulati dati sufficienti per riempire un MSS; poi trasmette.
L'algoritmo tiene conto sia della velocità dell'applicazione sia di quella della rete: su una rete veloce gli ACK tornano presto e i segmenti partono spesso; su una lenta si accumula di più.
La sindrome della finestra stupida (silly window syndrome)
Il problema opposto nasce quando è il ricevente a consumare i dati lentamente. Per esempio il mittente produce blocchi da 1 kB, ma l'applicazione ricevente legge 1 byte per volta: se il buffer è pieno e ne libera uno solo, il ricevente annuncia rwnd e il mittente invia un segmento di 1 byte; trasmettere un blocco lungo richiede un'eternità. Due rimedi lato ricevente:
- ACK ritardato (delayed ACK): l'ACK non parte subito ma solo quando nel buffer c'è una quantità decente di spazio.
- Algoritmo di Clark: l'ACK parte subito all'arrivo dei dati, ma annuncia una finestra finché non c'è spazio per almeno un MSS oppure finché almeno metà del buffer è libero.
Controllo di errore
L'applicazione consegna a TCP un flusso di dati e pretende che sia consegnato all'altro estremo per intero, in ordine, senza errori, perdite e duplicati. TCP lo ottiene con tre strumenti semplici: checksum, riscontro e timeout; più la ritrasmissione. I segmenti fuori ordine non vengono scartati: il ricevente li tiene e riscontra il byte che manca.
Ritrasmissione allo scadere dell'RTO. Il mittente ha un solo retransmission timeout per connessione. Quando scade, rispedisce il segmento in testa alla coda (quello con il numero di sequenza più basso) e riavvia il timer. Il valore dell'RTO è dinamico e dipende dal tempo di andata e ritorno (RTT) dei segmenti: Stima del timeout di ritrasmissione (RTO)TCP ritrasmette un segmento se il suo ACK non arriva entro il timeout di ritrasmissione (RTO), che deve seguire il tempo di andata e ritorno (RTT) della rete: troppo corto provoca ritrasmissioni inutili, troppo lungo rallenta il recupero. L'RTT si misura con un solo timer per connessione (granularità G del clock). Si mantengono una media mobile esponenziale SRTT_i = (1-α)SRTT_{i-1} + α·rtt_i con α = 1/8 e la deviazione media MAD_i = (1-ρ)MAD_{i-1} + ρ|rtt_i - SRTT_{i-1}| con ρ = 1/4 (in RFC 6298 RTTVAR, β = 1/4); RTO = SRTT + 4·MAD, con minimo di 1 s. L'algoritmo di Karn ignora le misure dei segmenti ritrasmessi (non si sa a quale trasmissione si riferisce l'ACK) e a ogni timeout consecutivo il valore raddoppia fino a 64 volte T0. Per un RTT gaussiano la deviazione media vale MAD = σ·sqrt(2/π) ≈ 0,797σ.Stima del timeout di ritrasmissione (RTO) →.
Ritrasmissione rapida (fast retransmit). Il ricevente deve inviare un ACK duplicato (dupACK) ogni volta che riceve un segmento fuori ordine. Un dupACK non dice se il segmento è stato perso o solo riordinato dalla rete. Se arrivano tre ACK duplicati (cioè l'ACK originale più tre copie identiche) è un forte indizio di perdita, e il segmento indicato dall'ACK si ritrasmette subito, senza aspettare il timeout.
Esempio (segmento perso, timeout). Il client invia quattro segmenti da byte, byte – . Il segmento (–) si perde. Il server riceve – e – (ACK ), poi – fuori ordine: non lo scarta, ma riscontra ancora ACK (dupACK). Un solo dupACK non basta per la ritrasmissione rapida: dopo il timeout il client rispedisce – e il server, avendo già –, risponde ACK .
Esempio (ritrasmissione rapida). Il client invia sei segmenti da byte (–); il terzo (–) si perde, e il timeout non scade prima del terzo dupACK:
| arriva al server | ACK inviato | nota |
|---|---|---|
| – | ||
| – | ||
| – (fuori ordine) | 1° ACK duplicato | |
| – (fuori ordine) | 2° ACK duplicato | |
| – (fuori ordine) | 3° ACK duplicato: ritrasmissione rapida | |
| – (ritrasmesso) | tutto ricevuto |
L'ACK conferma in un colpo solo i byte –: è il vantaggio del riscontro cumulativo.
ACK ritardati
Normalmente TCP non invia l'ACK nell'istante in cui riceve i dati: li ritarda sperando di avere dati in viaggio nello stesso verso, così da spedire l'ACK nello stesso pacchetto (delayed ACK). Un ACK parte ogni pacchetti dati consecutivi ricevuti (in quasi tutte le implementazioni ), o allo scadere di un breve timer. Il parametro entra nel modello del tasso di invio (Modello analitico del tasso di invio di TCPIl modello analitico del corso calcola il tasso di invio a regime B (segmenti al secondo) di un flusso TCP Reno in funzione della probabilità di perdita p, dell'RTT, del parametro di ACK ritardato b e del timeout T0. Il tempo è diviso in round di durata RTT; il ciclo della finestra tra due perdite segnalate da tre dupACK (TDP) ha media E[W] = (2-3b)/(3b) + sqrt(((3b-2)/(3b))^2 + 8(1-p)/(3bp)) e il tasso è B = E[Y]/E[A] (pacchetti inviati diviso durata di un TDP). Per p piccolo si ottiene la formula della radice quadrata B = (1/RTT) sqrt(3/(2bp)) (circa 1,22/(RTT sqrt p) per b = 1 e 0,87/(RTT sqrt p) per b = 2). Con i timeout si aggiungono la probabilità Q che una perdita finisca in timeout, E[R] = 1/(1-p) pacchetti e E[Z^TO] = T0 f(p)/(1-p) secondi di attesa: B = (E[Y] + Q E[R])/(E[A] + Q E[Z^TO]). Con la finestra massima Wmax il tasso non supera Wmax/RTT.Modello analitico del tasso di invio di TCP →).
Finestra, BDP e throughput massimo
TCP è un protocollo a finestra scorrevole: ogni RTT si possono inviare al più segmenti non riscontrati (stessa logica di Go-Back-N e Selective Repeat in Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective RepeatARQ (Automatic Repeat reQuest) rende affidabile un collegamento che sbaglia: il ricevitore conferma (ACK) i frame ricevuti bene, il trasmettitore ritrasmette allo scadere del timeout. Servono timeout (contro il deadlock) e numeri di sequenza (contro i duplicati). Con $t_G=t_F+2\tau_p+t_A$ e probabilità di errore $p$: Stop-and-Wait $\rho=\frac{t_F(1-p)}{t_G}$; Go-Back-N con finestra $N\ge t_G/t_F$ $\rho=\frac{1-p}{1+(N-1)p}$; Selective Repeat $\rho=1-p$. Efficienza $\eta=\rho,I/F$. La finestra ottima è la capacità del tubo in pacchetti. In Selective Repeat esiste anche una lunghezza ottima del frame: con overhead $o$ e probabilità di errore sul bit $P_b$, $x_{ott}\simeq\frac o2+\sqrt{o/P_b}$ (frame più corti se il canale sbaglia di più).Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective Repeat →: la finestra deve coprire la capacità del tubo). Il canale è usato in modo continuo se la finestra permette di trasmettere finché non torna l'ACK del primo segmento. Con tempo di trasmissione di un segmento ( lunghezza in bit, bitrate) il mittente impiega per spedire l'intera finestra, e l'ACK del primo segmento torna dopo un RTT dall'inizio dell'invio: per non fermarsi deve valere
dove nel secondo passaggio si è moltiplicato per e si è usato .
Definizione (BDP). Il prodotto banda-ritardo (bandwidth-delay product) è , la quantità di bit in volo. La finestra ideale in bit è .
Se si spreca banda (il mittente aspetta gli ACK); se i pacchetti in eccesso si accodano nei router, il RTT aumenta e si può arrivare a perdite.
Esempio (continuità). Mbit/s, byte bit, ms per tratta: ms, ms (ACK trascurabile). Serve , cioè segmenti.
Formula (throughput massimo). La finestra limita la quantità di dati inviabili per RTT, quindi qualunque variante di TCP non può superare
Perché: in ogni RTT il mittente può spedire al più segmenti da byte, cioè byte (dopo di che deve aspettare gli ACK); i byte inviati per RTT, divisi per la durata dell'RTT, sono il tasso massimo. Se la finestra è espressa in byte (come rwnd) il prodotto è la finestra stessa. Per avere bit/s si moltiplica per .
Esempio. Collegamento da Mbit/s, ms, byte. bit kB, cioè segmenti: per riempire il canale servono segmenti in volo. Con la sola finestra a 16 bit ( byte, senza l'opzione di scalatura) il throughput è al più Mbit/s (il fattore converte byte in bit, s è l'RTT): solo il del canale, perché . Nel grafico l'utilizzazione cresce linearmente con la finestra e arriva a solo con ; la finestra a 16 bit ( segmenti) si ferma al .
{"tipo":"funzione","titolo":"Utilizzazione del canale U = min(1, W/342,5) con C = 100 Mbit/s, RTT = 40 ms, MSS = 1460 byte: con rwnd massima di 16 bit (≈ 44,9 segmenti) U = 13%","curve":[{"espressione":"min(1,x/342.47)","etichetta":"U"}],"x":[0,400],"y":[0,1.1],"verticali":[{"x":44.89,"etichetta":"65 535 B"},{"x":342.47,"etichetta":"BDP"}],"assi":{"x":"W (segmenti in volo)","y":"U"}}
``` Esercizi su questi temi: <a class="wiki" href="/internet/esercizi/esercizio-tcp-con-finestra-del-ricevitore-di-4-segmenti-su-tre-collegamenti/">Esercizio - TCP con finestra del ricevitore di 4 segmenti su tre collegamenti</a>; per misurare capacità e ritardo con i tempi di andata e ritorno, <a class="wiki" href="/internet/esercizi/esercizio-capacita-e-ritardo-di-propagazione-di-un-collegamento-con-due-messaggi-echo/">Esercizio - capacita e ritardo di propagazione di un collegamento con due messaggi echo</a>.
Versione ripasso
Servizi
- TCP (Transmission Control Protocol): con connessione e affidabile (Protocollo UDPUDP (User Datagram Protocol) è il protocollo di trasporto senza connessione e inaffidabile: rispetto a IP aggiunge soltanto la comunicazione processo-processo (numeri di porta) e un controllo d'errore facoltativo. L'intestazione è di soli 8 byte (porta sorgente, porta destinazione, lunghezza, checksum). Il checksum copre pseudo-intestazione (indirizzi IP, protocollo 17, lunghezza), intestazione e dati, ed è il complemento a uno della somma a 16 bit; se vale 0 significa "non calcolato", e un risultato 0 si trasmette come 0xFFFF. UDP non ha connessione, numeri di sequenza, controllo di flusso, di errore né di congestione: si sceglie per i messaggi brevi (DNS, DHCP, RIP, SNMP) e per le applicazioni in tempo reale, dove conta non aggiungere ritardo.Protocollo UDP → è il caso opposto). Tre fasi: apertura (handshake a tre vie), trasferimento di un flusso di byte, chiusura (libera risorse solo negli host).
- Affidabilità: combina Go-Back-N e Selective Repeat (Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective RepeatARQ (Automatic Repeat reQuest) rende affidabile un collegamento che sbaglia: il ricevitore conferma (ACK) i frame ricevuti bene, il trasmettitore ritrasmette allo scadere del timeout. Servono timeout (contro il deadlock) e numeri di sequenza (contro i duplicati). Con $t_G=t_F+2\tau_p+t_A$ e probabilità di errore $p$: Stop-and-Wait $\rho=\frac{t_F(1-p)}{t_G}$; Go-Back-N con finestra $N\ge t_G/t_F$ $\rho=\frac{1-p}{1+(N-1)p}$; Selective Repeat $\rho=1-p$. Efficienza $\eta=\rho,I/F$. La finestra ottima è la capacità del tubo in pacchetti. In Selective Repeat esiste anche una lunghezza ottima del frame: con overhead $o$ e probabilità di errore sul bit $P_b$, $x_{ott}\simeq\frac o2+\sqrt{o/P_b}$ (frame più corti se il canale sbaglia di più).Protocolli ARQ - Stop-and-Wait, Go-Back-N e Selective Repeat →) con checksum, numeri di sequenza e riscontro, ACK cumulativi e selettivi. Congestione: TCP - controllo di congestioneLa congestione nasce quando collegamenti veloci alimentano un collegamento lento: le code dei router si riempiono, i pacchetti si perdono o ritardano e, nel caso peggiore, la rete collassa (quasi solo ritrasmissioni). TCP controlla la propria finestra di congestione cwnd con il feedback delle perdite (timeout o tre ACK duplicati): slow start (cwnd raddoppia a ogni RTT) fino alla soglia ssthresh, poi congestion avoidance (+1 MSS per RTT); a ogni perdita ssthresh = W/2. Le varianti si distinguono per come reagiscono ai tre dupACK: Tahoe riparte da cwnd = 1 dopo la ritrasmissione rapida; Reno usa il fast recovery (ssthresh = cwnd/2, cwnd = ssthresh + 3, +1 per ogni altro dupACK); NewReno gestisce gli ACK parziali e recupera più perdite nella stessa finestra; SACK riscontra i blocchi ricevuti e ritrasmette solo quello che manca.TCP - controllo di congestione →; timeout: Stima del timeout di ritrasmissione (RTO)TCP ritrasmette un segmento se il suo ACK non arriva entro il timeout di ritrasmissione (RTO), che deve seguire il tempo di andata e ritorno (RTT) della rete: troppo corto provoca ritrasmissioni inutili, troppo lungo rallenta il recupero. L'RTT si misura con un solo timer per connessione (granularità G del clock). Si mantengono una media mobile esponenziale SRTT_i = (1-α)SRTT_{i-1} + α·rtt_i con α = 1/8 e la deviazione media MAD_i = (1-ρ)MAD_{i-1} + ρ|rtt_i - SRTT_{i-1}| con ρ = 1/4 (in RFC 6298 RTTVAR, β = 1/4); RTO = SRTT + 4·MAD, con minimo di 1 s. L'algoritmo di Karn ignora le misure dei segmenti ritrasmessi (non si sa a quale trasmissione si riferisce l'ACK) e a ogni timeout consecutivo il valore raddoppia fino a 64 volte T0. Per un RTT gaussiano la deviazione media vale MAD = σ·sqrt(2/π) ≈ 0,797σ.Stima del timeout di ritrasmissione (RTO) →.
- Processo-processo (Livello di trasporto - porte e multiplexingIl livello di trasporto (transport layer) offre la comunicazione logica end-to-end tra processi applicativi di host diversi, ed è realizzato solo negli host finali, non nei router. Il livello di rete consegna al computer giusto (indirizzo IP), il trasporto consegna al processo giusto (numero di porta di 16 bit, 0-65535). Una porta più un indirizzo IP formano un socket; la quaterna (IP sorgente, porta sorgente, IP destinazione, porta destinazione) identifica una connessione. I servizi sono: comunicazione processo-processo, indirizzamento, incapsulamento/decapsulamento, multiplexing/demultiplexing e, se il protocollo è affidabile, controllo di errore, di flusso e di congestione. I protocolli sono UDP (senza connessione, inaffidabile), TCP (con connessione, affidabile) e SCTP (combina i due).Livello di trasporto - porte e multiplexing →), full-duplex, una connessione per ogni coppia di processi; la connessione è logica: TCP rende affidabile il servizio di IP.
Segmento
Intestazione in parole da 32 bit: 20 byte fissi più al più 40 di opzioni.
| parola | campi |
|---|---|
| 1 | porta sorgente (16), porta destinazione (16) |
| 2 | numero di sequenza (32) |
| 3 | numero di riscontro (32) |
| 4 | HLEN (4), riservato (6), flag (6), finestra (16) |
| 5 | checksum (16), puntatore urgente (16) |
| 6... | opzioni (fino a 40 byte) |
- SN: numero del primo byte di dati del segmento; l'ISN è scelto a caso in . AN: prossimo byte atteso; se ricevuto il byte si risponde ; è cumulativo (AN : ricevuti tutti i byte fino al ). ACK e dati nello stesso segmento: piggybacking.
- HLEN: intestazione in parole da 4 byte, da ( B) a ( B).
- Flag: URG, ACK, PSH, RST, SYN, FIN (con ECN anche CWR ed ECE).
- Finestra: buffer libero del ricevente in byte (rwnd), al massimo ; decide il ricevente.
- Checksum: come UDP ma obbligatorio (protocollo ). Opzioni: MSS, SACK, timestamp.
- MSS (dati TCP senza intestazione; predefinito B, massimo B): . Ethernet: ; MTU : .
Numeri di sequenza
- File di byte, ISN , segmenti da : SN , , , , (byte –). Ricevuto per intero il 3° segmento: AN .
- Un segmento senza dati (solo ACK) non consuma numeri di sequenza; SYN e FIN ne consumano uno (devono essere riscontrati).
Apertura e chiusura
- SYN: SN (ISN del client), niente dati né AN, consuma un numero.
- SYN+ACK: SN (ISN del server, diverso: ogni verso ha il suo), AN , rwnd .
- ACK: SN , AN , rwnd . Senza dati non consuma numeri; con i primi dati (piggyback) ne consuma quanti i byte.
- Tempi: con segmenti di apertura trascurabili, prima dei dati con piggyback, senza ( ms: o ms).
- Chiusura a tre vie: FIN (SN ), FIN+ACK (SN , AN ), ACK (AN ); FIN consuma un numero. A quattro vie (half closing): FIN, solo ACK, il server continua a inviare dati, poi il suo FIN e l'ultimo ACK.
Finestre e controllo di flusso
- Invio (come Selective Repeat ma in byte, un solo timer): byte riscontrati, in volo (da ), usabili (fino a ), fuori finestra. . Es.: rwnd MSS, cwnd MSS MSS; cwnd .
- Ricezione: riscontro cumulativo e lettura pull da parte del processo: .
- La finestra si chiude se l'applicazione non legge, si apre quando legge, non deve restringersi (margine destro indietro).
- Esempio (buffer , byte da ):
| passo | evento | rwnd | può inviare |
|---|---|---|---|
| 0 | inizio | – | |
| 1 | invia B, AN | – | |
| 2 | invia B, AN | – | |
| 3 | l'applicazione legge B, AN | – | |
| 4 | legge altri B, AN | – |
- Deadlock: ACK con rwnd e poi l'ACK con rwnd si perde. Persist timer (inizio ms): allo scadere sonda di 1 byte; a ogni mancata risposta il timer raddoppia fino a s (, , , , , , , s).
- Nagle (datagrammi minuscoli: 1 B di dati B, efficienza ): dopo il primo segmento accumula i dati finché arriva l'ACK o si riempie un MSS.
- Silly window (ricevente lento, rwnd ): rimedi lato ricevente, ACK ritardato e algoritmo di Clark (annuncia rwnd finché c'è spazio per un MSS o metà buffer libero).
Controllo di errore
- Strumenti: checksum, riscontro, un solo RTO, ritrasmissione. I fuori ordine non si scartano: il ricevente riscontra il byte mancante. Allo scadere dell'RTO si rispedisce il segmento più vecchio e si riavvia il timer.
- Ritrasmissione rapida: un dupACK a ogni segmento fuori ordine; dopo 3 dupACK (ACK originale più tre copie) si ritrasmette senza attendere il timeout.
- Esempio (timeout). Byte – in quattro segmenti, perso –: ACK per –, poi – dà dupACK (uno solo non basta); al timeout si rispedisce – e il server risponde ACK .
- Esempio (3 dupACK). Sei segmenti da B (–), perso –: ACK , , poi –, –, – danno ACK per tre volte; ritrasmesso –, ACK (conferma in un colpo –).
- ACK ritardati: un ACK ogni pacchetti () o al timer (Modello analitico del tasso di invio di TCPIl modello analitico del corso calcola il tasso di invio a regime B (segmenti al secondo) di un flusso TCP Reno in funzione della probabilità di perdita p, dell'RTT, del parametro di ACK ritardato b e del timeout T0. Il tempo è diviso in round di durata RTT; il ciclo della finestra tra due perdite segnalate da tre dupACK (TDP) ha media E[W] = (2-3b)/(3b) + sqrt(((3b-2)/(3b))^2 + 8(1-p)/(3bp)) e il tasso è B = E[Y]/E[A] (pacchetti inviati diviso durata di un TDP). Per p piccolo si ottiene la formula della radice quadrata B = (1/RTT) sqrt(3/(2bp)) (circa 1,22/(RTT sqrt p) per b = 1 e 0,87/(RTT sqrt p) per b = 2). Con i timeout si aggiungono la probabilità Q che una perdita finisca in timeout, E[R] = 1/(1-p) pacchetti e E[Z^TO] = T0 f(p)/(1-p) secondi di attesa: B = (E[Y] + Q E[R])/(E[A] + Q E[Z^TO]). Con la finestra massima Wmax il tasso non supera Wmax/RTT.Modello analitico del tasso di invio di TCP →).
BDP e throughput
- Canale pieno se , cioè , con . ; spreca banda, riempie le code.
- Esempio: Mbit/s, bit, ms: ms, ms, .
- . Esempio: Mbit/s, ms, MSS : BDP bit kB segmenti; con B: Mbit/s (). Esercizi: Esercizio - TCP con finestra del ricevitore di 4 segmenti su tre collegamenti, Esercizio - capacita e ritardo di propagazione di un collegamento con due messaggi echo.
Errori tipici: SN pari all'ultimo byte (è il primo); AN invece di ; contare un ACK senza dati come consumo di sequenza; scordare che SYN e FIN consumano un numero; contare un solo dupACK come ritrasmissione rapida.
Esercizi su questo argomento
- Esercizio - Cinque pacchetti da A e B e TCP da 18,75 KB su collegamenti da 100 a 1000 kbps
- Esercizio - Cinque pacchetti da A e trasferimento TCP di 50 KB con finestra persa
- Esercizio - Messaggio da 225 KB con UDP e con TCP Reno, anche con il terzo segmento perso
- Esercizio - RTT e swnd, TCP da 100 KB e stop-and-wait su ogni collegamento
- Esercizio - Sei pacchetti con traffico concorrente e TCP con rwnd limitata
- Esercizio - SRTT, deviazione media e RTO da sette misure di RTT
- Esercizio - TCP con finestra del ricevitore di 4 segmenti su tre collegamenti
- Esercizio - TCP con perdita di finestra e riduzione di rwnd
- Esercizio - TCP e stop-and-wait su tre collegamenti, messaggio da 100 kB
- Esercizio - TCP, slow start e 120 segmenti su un collegamento da 32 Mbps
- Esercizio - TCP, slow start e messaggio da 18 kB su un collegamento da 8 Mbps
- Esercizio - UDP e TCP su tre collegamenti, messaggio da 225 kB
Lezioni in cui compare
Teoria collegata
- Crittografia asimmetrica, RSA e TLS
- Datagramma IP e frammentazione
- Firewall
- Introduzione alla sicurezza delle reti
- Livello applicazione - HTTP
- Livello di trasporto - porte e multiplexing
- Modello analitico del tasso di invio di TCP
- Posta elettronica - SMTP, POP3 e IMAP
- Stima del timeout di ritrasmissione (RTO)
- Storia e struttura di Internet
- TCP - controllo di congestione