TCP - controllo di congestione
In questa pagina 7
In questa pagina 6
Che cos'è la congestione
Si ha congestione quando il carico offerto alla rete supera la sua capacità. Nasce perché i router e i commutatori hanno code: un router ha una coda di ingresso e una di uscita per ogni interfaccia, e se non riesce a elaborare i pacchetti alla velocità con cui arrivano le code si riempiono. Esempio tipico: due sorgenti e collegate da link da Mbit/s a un router che le inoltra su un collegamento da Mbit/s: i collegamenti veloci alimentano uno lento.
Conseguenze:
- se le code traboccano, i pacchetti sono scartati;
- i pacchetti in coda subiscono ritardo (che cresce rapidamente quando la utilizzazione del collegamento si avvicina a : Introduzione alla teoria delle codeUn sistema a coda (QS) è fatto da un processo di arrivi (di Poisson, tasso $\lambda$), una coda e uno o più servitori con tasso di servizio $\mu$. Carico offerto $G=\lambda/\mu$, fattore di carico $\rho=\lambda/(m\mu)$: il sistema è stabile solo se $\rho<1$, e allora il throughput è $\lambda$ (altrimenti è $m\mu$). Legge di Little: $E[x]=\lambda E[s]$, valida per qualsiasi disciplina. Coda M/M/1: $E[x]=\frac{\rho}{1-\rho}$, $E[s]=\frac{1/\mu}{1-\rho}$, $E[w]=\frac{\rho/\mu}{1-\rho}$. Con servizio deterministico (M/D/1, caso particolare di Pollaczek-Khinchin): $E[w]=\frac{\rho}{2\mu(1-\rho)}$. Il ritardo cresce senza limite quando $\rho\to1$.Introduzione alla teoria delle code → e Sistemi a coda - processo di Poisson, M/M/1 e formula di LittleUn sistema a coda ha arrivi (di pacchetti, file) e un servitore (il collegamento). Con arrivi di Poisson di intensità $\lambda$ e tempi di servizio esponenziali di media $\frac1\mu$ (coda M/M/1) e $\rho=\frac\lambda\mu<1$: $P[N=n]=(1-\rho)\rho^n$, numero medio nel sistema $\bar N=\frac\rho{1-\rho}$, tempo medio di permanenza $\bar W=\frac1{\mu-\lambda}$, attesa in coda $\bar W_q=\frac\rho{\mu-\lambda}$. La formula di Little $\bar N=\lambda\bar W$ vale in generale. Con buffer finito (M/M/1/K) i pacchetti sono persi con $P_K=\frac{(1-\rho)\rho^K}{1-\rho^{K+1}}$.Sistemi a coda - processo di Poisson, M/M/1 e formula di Little →);
- i flussi che attraversano il collegamento congestionato hanno throughput scadente;
- può arrivare il collasso di rete: i flussi inviano finestre intere ma progrediscono pochissimo, e la maggior parte dei pacchetti in rete sono ritrasmissioni. Altra causa di collasso: sorgenti non controllate dal feedback (come un flusso 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 →).
Il collasso non è solo teoria: è stato osservato più volte in reti reali.
Ginocchio e precipizio; efficienza ed equità
Se si disegna il throughput in funzione del carico offerto, la curva sale linearmente, poi si appiattisce nel ginocchio (knee): da lì in poi più carico dà solo più ritardo. Più avanti c'è il precipizio (cliff): oltre, il throughput crolla (collasso).
Grafico interattivo: Throughput in funzione del carico offerto (andamento qualitativo, unità normalizzate alla capacità): retta ideale tratteggiata, curva reale con ginocchio e precipizio
- Evitare la congestione (congestion avoidance) significa operare vicino al ginocchio: si rallenta se si sa che più avanti c'è un precipizio.
- Controllare la congestione (congestion control) significa operare al precipizio e rallentare quando si nota un calo di capacità (la perdita di un pacchetto è un'indicazione).
Requisiti: usare le risorse in modo efficiente (massimo throughput senza ritardi eccessivi: il ginocchio), distribuirle in modo equo (fair) e prevenire o evitare il collasso. Senza conoscere i requisiti dei flussi, equo significa dividere in parti uguali.
Formula (indice di equità di Jain). Per flussi con rate : Vale se tutti hanno lo stesso rate, se uno solo usa tutto.
Perché i limiti: indicando con la media dei rate e con la loro varianzaI momenti E[X^k] e i momenti centrati E[(X − μ)^k] descrivono la forma di una legge; la varianza Var(X) = E[(X − μ)²] = E[X²] − E[X]² misura quanto X si disperde attorno alla media, vale Var(aX + b) = a² Var(X) e Var(X) = 0 solo se X è costante.Varianza e momenti → (sempre ), si ha e , quindi , con uguale solo se (rate tutti uguali). Se uno solo usa tutto, : .
Esempio. Tre flussi su un link da Mbit/s. Divisione : . Divisione : . Divisione : .
L'idea di TCP
TCP sonda il canale per trovare il punto appena prima del precipizio (la "capienza del tubo") e rallenta quando lo supera. È un protocollo a finestra: in ogni RTT si possono inviare al più pacchetti non riscontrati. Adattare significa adattare il ritmo di immissione di pacchetti nella rete.
Le variabili del mittente:
- cwnd (congestion window): la finestra decisa dal mittente in base al feedback della rete, in segmenti (MSS) o byte;
- rwnd: la finestra annunciata dal ricevente, per il controllo di flusso (TCP - connessione, affidabilità e controllo di flussoTCP (Transmission Control Protocol) è il protocollo di trasporto con connessione e affidabile: trasforma il servizio senza connessione e inaffidabile di IP in un flusso di byte ordinato, senza errori né duplicati. La connessione si apre con l'handshake a tre vie (SYN, SYN+ACK, ACK) e si chiude con tre o quattro segmenti (FIN). I byte sono numerati: il numero di sequenza è quello del primo byte del segmento, il numero di ACK (cumulativo) è il prossimo byte atteso. Il mittente può inviare $\min(\text{rwnd},\text{cwnd})$ byte non ancora confermati; rwnd (finestra del ricevitore, in un campo di 16 bit) è il controllo di flusso. L'errore si gestisce con checksum, ACK, timeout di ritrasmissione (RTO) e ritrasmissione rapida dopo tre ACK duplicati. Per usare tutto il canale la finestra deve valere almeno il prodotto banda-ritardo (BDP); il throughput massimo è $\text{MSS}\cdot W_{\max}/\text{RTT}$.TCP - connessione, affidabilità e controllo di flusso →);
- ssthresh (slow start threshold): una stima corrente della capacità disponibile, mantenuta per ogni connessione.
Formula (finestra effettiva). .
Esempio. Con MSS e MSS: , poi , (si raggiunge ssthresh), , (si raggiunge rwnd: da lì resta anche se cwnd continua a crescere: ).
Slow start e congestion avoidance
Slow start (SS, "partenza lenta", esponenziale) e congestion avoidance (CA, "evitamento della congestione", lineare) sono algoritmi con obiettivi diversi implementati insieme:
- SS: alla partenza della connessione e dopo un timeout controlla la fase iniziale di trasmissione: si parte piano ma si cresce in fretta, per arrivare presto a un buon throughput. Il nome inganna: la crescita è esponenziale.
- CA: quando si è raggiunta la capacità del collegamento, controlla la trasmissione crescendo lentamente per non causare congestione.
Si parte con MSS e (un valore molto grande, o prefissato).
Formula (regole per ogni ACK nuovo).
- se (SS): ;
- se (CA): .
Conseguenza per RTT: in SS raddoppia a ogni RTT (un ACK per ogni segmento: per ACK vale per round); in CA aumenta di 1 MSS per RTT (arrivano ACK, ciascuno vale ).
Il conto: in un round il mittente invia segmenti e riceve ACK. In SS ogni ACK somma : . In CA ogni ACK somma : . Per questo la crescita in SS è esponenziale ( dopo round) e in CA è lineare ().
Esempio. Partendo da con : round : ; round : ; round : ; round : ; da qui , , , . Nel round la finestra vale e sono stati inviati segmenti in tutto ( dopo il round ): è la somma di una progressione geometricaLe serie di cui si conosce il carattere e da usare come termine di paragone: geometrica (converge a 1/(1-q) se |q|<1), telescopiche (somma b_1 - lim b_n, come Mengoli), armonica generalizzata (1/n^alpha converge se e solo se alpha>1).Serie notevoli - geometrica, telescopica, armonica → di ragione , . Viceversa, per arrivare a una finestra in SS servono round (Esponenziale e logaritmoLa funzione esponenziale a^x (base positiva diversa da 1) e la sua inversa, il logaritmo in base a, con grafici e proprietà.Esponenziale e logaritmo →): da a sono round.
Alcune precisazioni:
- Nello slow start la finestra cresce di 1 per ogni ACK; quindi di quanti ACK arrivano nel round, cioè quanti segmenti sono stati riscontrati. In CA la crescita è di 1 per round, indipendentemente dal numero di ACK. L'esempio delle slide suppone che gli ACK non siano ritardati.
- Con gli ACK ritardati (un ACK ogni segmenti) in SS la finestra cresce di un fattore per round, in CA di MSS per round: è il motivo per cui compare nel modello analitico (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 →). Il conto: in un round con segmenti arrivano ACK; in SS ciascuno somma , quindi ; in CA ciascuno somma , quindi .
- Dopo un timeout lo slow start riparte e continua fino a metà della finestra a cui avvenne la congestione, che è la nuova ssthresh.
Convenzione per i calcoli in round. Negli esercizi del corso, a ogni RTT: se si passa a ; se si aggiunge . La finestra di invio effettiva è sempre .
Esercizi: Esercizio - TCP, slow start e messaggio da 18 kB su un collegamento da 8 Mbps, Esercizio - TCP, slow start e 120 segmenti su un collegamento da 32 Mbps, Esercizio - TCP con perdita di finestra e riduzione di rwnd, Esercizio - UDP e TCP su tre collegamenti, messaggio da 225 kB, Esercizio - TCP e stop-and-wait su tre collegamenti, messaggio da 100 kB.
Come TCP scopre le perdite
- Timeout di ritrasmissione (RTO). Il mittente ha un timer per connessione (non per pacchetto). Se l'ACK dell'ultimo pacchetto temporizzato non arriva prima che scada, il pacchetto è considerato perso. L'RTO si calcola dinamicamente: 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) →.
- ACK duplicati. Con i pacchetti , se il si perde, la ricezione di genera quattro volte lo stesso ACK, : i pacchetti sono arrivati e il primo fuori ordine è il . Il ricevente deve inviare un dupACK a ogni segmento fuori ordine, e non si sa se sia perdita o solo riordino. Dopo (di solito ) dupACK TCP presume che il segmento sia perso e ritrasmette quello indicato dal -esimo dupACK: ritrasmissione rapida (fast retransmit).
Il timeout è l'indizio di congestione grave (non arriva più niente); i tre dupACK sono un indizio lieve (qualche pacchetto è comunque passato).
Formula (reazioni di base, regole del corso). Quando la congestione è indicata da dupACK: . Con timeout: e (nuovo slow start). ( è la finestra al momento dell'evento.)
Le varianti di TCP
Old Tahoe
Implementa slow start e congestion avoidance e usa solo il timeout come recupero. Allo scadere del timeout riparte dal primo pacchetto non riscontrato, senza ritrasmettere esplicitamente (in pratica un Go-Back-N).
Tahoe
Aggiunge la ritrasmissione rapida. Alla -esima dupACK: ritrasmette il segmento mancante, pone e e riparte dallo slow start, come se fosse scaduto un timeout. In SS: se c'è congestione, ssthresh e ; se non c'è, a ssthresh si passa in CA; in CA, se c'è congestione, stesso trattamento (ssthresh dimezzata, ritorno in SS). Tahoe tratta allo stesso modo timeout e tre dupACK.
Reimpostare dopo la ritrasmissione rapida è inefficiente: è come riavviare la connessione, con possibile calo di throughput. Ma i dupACK dicono che i pacchetti dopo quello perso sono arrivati: si può ritrasmettere meno e far avanzare cwnd con più decisione. È l'idea del fast recovery.
Reno: fast recovery
Reno aggiunge a Tahoe lo stato di fast recovery (recupero rapido), per riprendersi da una congestione lieve. Quando il ricevente continua a mandare dupACK, ogni dupACK in più vuol dire che un altro pacchetto è uscito dalla rete.
Formula (Reno).
- Alla terza dupACK: ; si ritrasmette il segmento mancante; MSS (i tre pacchetti che hanno generato i tre dupACK hanno lasciato la rete).
- A ogni dupACK successivo: MSS (un altro pacchetto ha raggiunto il ricevente) e si trasmette un pacchetto se cwnd lo consente.
- Quando arriva un ACK che riscontra dati nuovi: e si esce dal fast recovery (si prosegue in CA).
- Dopo un timeout: come Tahoe (, , slow start).
Esempio. : tre dupACK , ; due dupACK in più ; all'ACK nuovo e CA (). Tahoe, nello stesso caso, ripartirebbe da .
Limite di Reno: se nella stessa finestra si perdono più segmenti, il primo ACK che riscontra dati nuovi (parziale, perché non copre tutta la finestra) fa uscire dal fast recovery; per recuperare il secondo segmento servono altri tre dupACK, e a volte non ne arrivano abbastanza e scatta il timeout.
NewReno
NewReno recupera più perdite nella stessa finestra, restando nel fast recovery finché non è riscontrato tutto ciò che era in volo quando è iniziata la perdita. Variabili: recover (il più alto numero di sequenza trasmesso quando inizia il recupero) e flightsize (pacchetti in volo).
Formula (NewReno).
- Alla -esima dupACK: ; ; MSS; si azzera il timer di ritrasmissione (per evitare un timeout durante il recupero); si ritrasmette il segmento mancante.
- A ogni nuovo dupACK: , e si trasmette se cwnd lo permette.
- Quando arriva un ACK che riscontra dati nuovi: se (ACK completo) allora ed esce dal fast recovery; altrimenti è un ACK parziale che riscontra pacchetti: , si azzera il timer, si ritrasmette il pacchetto con e si trasmette se consentito.
Esempio (slide del corso). Finestra in CA, sono in volo i pacchetti ; si perdono e ; ACK ritardati con . Il ricevente manda (riscontra ), (riscontra ), poi ogni pacchetto che arriva fuori ordine () genera un dupACK. Alla terza dupACK il mittente ha già inviato fino a : , , , ; ritrasmette . Gli altri dupACK portano cwnd a , , e fanno partire . L'arrivo di al ricevente genera (riscontra e , manca ): è un ACK parziale () con , quindi ; in volo ci sono , cioè pacchetti , quindi parte un nuovo pacchetto, , e si ritrasmette . Quando poi arriva , : ACK completo, e fine del recupero. Due perdite sono state recuperate in due RTT senza timeout.
SACK: riscontro selettivo
Con l'opzione SACK (selective acknowledgment) il ricevente comunica quali blocchi ha ricevuto, così il mittente ritrasmette solo quello che manca.
- Apertura: l'opzione si negozia nel solo segmento SYN: Kind , Length .
- Uso: in ogni ACK, quando ci sono pacchetti fuori ordine, compare l'opzione con Kind , Length variabile e una lista di blocchi: per ognuno il bordo sinistro (primo byte del blocco) e il bordo destro (primo byte dopo il blocco), 4 byte ciascuno.
Formula (lunghezza dell'opzione SACK). Con blocchi: byte. Poiché le opzioni TCP sono al massimo byte, (). Se c'è anche il timestamp ( byte con riempimento), restano byte e ().
Passaggio: ogni blocco ha due bordi da byte, quindi byte, e a questi si aggiungono byte per Kind e Length. Imporre dà , cioè perché è intero; con byte disponibili dà , cioè .
Esempio. Il ricevente ha i byte – (campo ACK , riscontro cumulativo), manca –, ha –, manca –, ha –. Opzione: Kind , Length , blocchi e .
NewReno con SACK. Alla -esima dupACK: ; ; (senza "": non serve, perché il numero di pacchetti in rete si calcola con la variabile pipe); si ritrasmette il segmento mancante; , diminuita dei pacchetti che SACK dice già arrivati. Finché : se la lista SACK mostra un buco si ritrasmette il primo pacchetto mancante, altrimenti si trasmette un pacchetto nuovo, e aumenta di 1. A ogni nuovo ACK (duplicato o no) e si ripete il ciclo. Con un ACK che riscontra dati nuovi oltre recover si esce dal recupero.
Riepilogo
| variante | slow start | CA | ritrasmissione rapida | fast recovery | recupera più perdite |
|---|---|---|---|---|---|
| Old Tahoe | sì | sì | no | no | no |
| Tahoe | sì | sì (solo dopo timeout) | sì | no | no |
| Reno | sì | sì | sì | sì | no |
| NewReno | sì | sì | sì | sì | sì |
La finestra nel tempo: Tahoe e Reno a confronto
Esempio completo, a round (un round RTT; non si conta l'attesa dell'RTO, che sul grafico tempo-reale sarebbe uno o più RTT di silenzio). iniziale MSS. Nel round () scade un timeout: ssthresh , (uguale in Tahoe e Reno). Nel round () arrivano 3 dupACK: ssthresh ; Tahoe riparte con (slow start), Reno con (CA, ignorando la fase di gonfiamento durante il recupero).
| round | Tahoe cwnd | Tahoe ssthresh | Reno cwnd | Reno ssthresh | evento a fine round |
|---|---|---|---|---|---|
| 1 | 1 | 16 | 1 | 16 | |
| 2 | 2 | 16 | 2 | 16 | |
| 3 | 4 | 16 | 4 | 16 | |
| 4 | 8 | 16 | 8 | 16 | |
| 5 | 16 | 16 | 16 | 16 | |
| 6 | 17 | 16 | 17 | 16 | |
| 7 | 18 | 16 | 18 | 16 | |
| 8 | 19 | 16 | 19 | 16 | |
| 9 | 20 | 16 | 20 | 16 | timeout |
| 10 | 1 | 10 | 1 | 10 | |
| 11 | 2 | 10 | 2 | 10 | |
| 12 | 4 | 10 | 4 | 10 | |
| 13 | 8 | 10 | 8 | 10 | |
| 14 | 10 | 10 | 10 | 10 | |
| 15 | 11 | 10 | 11 | 10 | |
| 16 | 12 | 10 | 12 | 10 | 3 dupACK |
| 17 | 1 | 6 | 6 | 6 | |
| 18 | 2 | 6 | 7 | 6 | |
| 19 | 4 | 6 | 8 | 6 | |
| 20 | 6 | 6 | 9 | 6 | |
| 21 | 7 | 6 | 10 | 6 | |
| 22 | 8 | 6 | 11 | 6 | |
| 23 | 9 | 6 | 12 | 6 | |
| 24 | 10 | 6 | 13 | 6 |
Nel round si raggiunge la soglia () e da lì si cresce di per round. Dopo il timeout lo slow start si ferma al valore (metà di ) e riprende la crescita lineare. Dopo i tre dupACK Reno perde meno finestra: nel round ha contro i di Tahoe.
Grafico interattivo
Linea continua: Tahoe; tratteggiata: Reno (coincide con Tahoe fino al round ).
Tahoe, Reno, NewReno e SACK con quattro perdite in una finestra
Il confronto sperimentale di Fall e Floyd (simulazione con quattro pacchetti persi nella stessa finestra) si riassume così:
- Tahoe NewReno: Tahoe riparte da , NewReno recupera una perdita per RTT (quattro ritrasmissioni, una per RTT), in tempi simili.
- Reno fatica a recuperare più perdite nella stessa finestra: ritrasmette il primo pacchetto perso, poi servono abbastanza trasmissioni per produrre nuovi dupACK e permettere la seconda ritrasmissione, e alla fine scatta il timeout.
- SACK dà le prestazioni migliori: con i dupACK arricchiti dalle informazioni SACK il mittente fa ritrasmissioni selettive dei soli pacchetti persi, quindi recupera tutte le perdite in circa un RTT.
Versione ripasso
Congestione
- Congestione: carico offerto capacità della rete. Es.: sorgenti da Mbit/s verso un link da . Conseguenze: code che traboccano (pacchetti scartati), ritardo, throughput scadente, collasso (finestre intere inviate ma quasi solo ritrasmissioni; anche per sorgenti senza feedback come 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 →).
- Throughput contro carico: sale, si appiattisce nel ginocchio (knee), poi crolla al precipizio (cliff). Evitare la congestione = operare vicino al ginocchio; controllarla = operare al precipizio e rallentare quando si nota una perdita.
- Indice di Jain: , ( rate uguali, uno solo usa tutto). Link da Mbit/s: ; ; .
Idea di TCP e finestra
TCP sonda il canale e rallenta oltre il limite; adattare significa adattare il ritmo di immissione. Variabili: cwnd (decisa dal mittente in base alla rete), rwnd (annunciata dal ricevente: TCP - connessione, affidabilità e controllo di flussoTCP (Transmission Control Protocol) è il protocollo di trasporto con connessione e affidabile: trasforma il servizio senza connessione e inaffidabile di IP in un flusso di byte ordinato, senza errori né duplicati. La connessione si apre con l'handshake a tre vie (SYN, SYN+ACK, ACK) e si chiude con tre o quattro segmenti (FIN). I byte sono numerati: il numero di sequenza è quello del primo byte del segmento, il numero di ACK (cumulativo) è il prossimo byte atteso. Il mittente può inviare $\min(\text{rwnd},\text{cwnd})$ byte non ancora confermati; rwnd (finestra del ricevitore, in un campo di 16 bit) è il controllo di flusso. L'errore si gestisce con checksum, ACK, timeout di ritrasmissione (RTO) e ritrasmissione rapida dopo tre ACK duplicati. Per usare tutto il canale la finestra deve valere almeno il prodotto banda-ritardo (BDP); il throughput massimo è $\text{MSS}\cdot W_{\max}/\text{RTT}$.TCP - connessione, affidabilità e controllo di flusso →), ssthresh (stima della capacità).
. Esempio con , : , poi resta anche se cwnd cresce ().
Slow start e congestion avoidance
Si parte con MSS e (grande). Per ogni ACK nuovo:
- SS se : , quindi raddoppia a ogni RTT (crescita esponenziale);
- CA se : , quindi MSS per RTT (arrivano ACK da ).
- Con ACK ritardati (): in SS fattore per round, in CA MSS per round (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 →).
- Convenzione in round: se , ; se , . Invio sempre con .
- Esempio, : round –: (, segmenti inviati: ); poi
- Esercizi: Esercizio - TCP, slow start e messaggio da 18 kB su un collegamento da 8 Mbps, Esercizio - TCP, slow start e 120 segmenti su un collegamento da 32 Mbps, Esercizio - TCP con perdita di finestra e riduzione di rwnd, Esercizio - UDP e TCP su tre collegamenti, messaggio da 225 kB, Esercizio - TCP e stop-and-wait su tre collegamenti, messaggio da 100 kB.
Rilevare le perdite
- Timeout (RTO), un timer per connessione (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) →): indizio grave.
- ACK duplicati: pacchetti , perso il : generano quattro volte . Dopo dupACK si ritrasmette il segmento indicato (fast retransmit): indizio lieve.
- Regole di base: dupACK ; timeout e .
Varianti
- Old Tahoe: SS e CA, recupero solo col timeout.
- Tahoe: aggiunge il fast retransmit; al -esimo dupACK ritrasmette, , e riparte da SS (come un timeout): inefficiente, perché i dupACK dicono che i pacchetti successivi sono arrivati.
- Reno (fast recovery):
- terza dupACK: , ritrasmette, MSS;
- ogni dupACK successivo: e si trasmette se consentito;
- ACK con dati nuovi: , si esce e si prosegue in CA.
- Esempio: , ; due dupACK ; ACK nuovo , poi (Tahoe ripartirebbe da ).
- Limite: con più perdite nella stessa finestra il primo ACK parziale fa uscire dal recovery; servono altri tre dupACK o scatta il timeout.
- NewReno: resta nel recovery finché non è riscontrato tutto ciò che era in volo. Variabili recover (massimo numero trasmesso all'inizio) e .
- -esima dupACK: , , , azzera il timer, ritrasmette;
- dupACK successivi: ;
- ACK nuovo con (completo): , esce; altrimenti parziale: , ritrasmette , azzera il timer.
- Esempio (, in volo , persi e , ): alla terza dupACK il mittente è a : , , , , ritrasmette . Arriva parziale (, ): , ritrasmette . : completo, . Due perdite in due RTT senza timeout.
- SACK: negoziato nel SYN (Kind , Length ); negli ACK Kind con blocchi (bordo sinistro = primo byte, destro = primo byte dopo il blocco, 4 B ciascuno). Lunghezza B; opzioni al massimo B, quindi ( B), con timestamp ( B) ( B). Esempio: ricevuti – (ACK ), –, –: Length , blocchi e .
- NewReno con SACK: (senza ) e variabile pipe (pacchetti in rete, meno quelli già arrivati secondo SACK): finché si ritrasmette il primo buco, altrimenti si trasmette nuovo.
| variante | SS e CA | fast retransmit | fast recovery | più perdite |
|---|---|---|---|---|
| Old Tahoe | sì | no | no | no |
| Tahoe | sì | sì | no | no |
| Reno | sì | sì | sì | no |
| NewReno | sì | sì | sì | sì |
Tahoe e Reno a confronto
: cwnd ; timeout a , (uguale in Tahoe e Reno); ; 3 dupACK a . Tahoe: (round 24); Reno: (round 24).
Con quattro perdite in una finestra (Fall e Floyd): Tahoe NewReno (una perdita per RTT), Reno fatica e arriva al timeout, SACK è il migliore (ritrasmissioni selettive, circa un RTT).
Errori tipici: in Reno dopo i tre dupACK; dopo il timeout ssthresh è , non la vecchia soglia; usare per ACK anche in CA; trattare come completo un ACK parziale in NewReno.
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 - 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 - throughput TCP di tre flussi con la formula del modello
- Esercizio - UDP e TCP su tre collegamenti, messaggio da 225 kB