Esercizio - TCP con perdita di finestra e riduzione di rwnd
In questa pagina 7
Testo. Si trasferiscono kB con TCP. Parametri: byte, ms, timeout . Condizioni iniziali: kB, kB, B. Inoltre: al tempo s tutti i segmenti in volo vengono persi; al tempo s il ricevitore imposta kB.
- Disegnare l'andamento nel tempo di , e .
- Calcolare il tempo di trasferimento.
Teoria usata: 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 →, 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 →.
Dati in segmenti
Conviene contare in segmenti da B (con kB B):
- messaggio: segmenti;
- kB segmenti, poi kB segmenti;
- kB segmenti; iniziale ;
- timeout s.
Convenzione. L'esercizio dà soltanto il RTT, non separa tempo di trasmissione e propagazione: i tempi di trasmissione sono trascurabili, e il tempo è l'istante in cui parte la prima finestra (l'apertura non viene contata; il risultato ufficiale, s , lo conferma). Ogni finestra inizia un RTT dopo la precedente: a , s, s, (spiegazione completa in Esercizio - TCP, slow start e messaggio da 18 kB su un collegamento da 8 Mbps).
Fase prima della perdita
Slow start fino a (), poi congestion avoidance ( per round).
| tempo (s) | segmenti inviati (totale) | note | |
|---|---|---|---|
| 0 | 1 | 1 | slow start |
| 0,5 | 2 | 3 | |
| 1,0 | 4 | 7 | |
| 1,5 | 8 | 15 | |
| 2,0 | 16 | 31 | raggiunge |
| 2,5 | 17 | 48 | congestion avoidance |
| 3,0 | 18 | (66) | tutti i segmenti sono persi |
non limita mai (). Consegnati con successo prima della perdita: segmenti (lo slow start dà , la somma geometrica1 + 2 + 4 + ... + 2^k = 2^(k+1) − 1, perché ogni termine è il doppio del precedenteSerie notevoli - geometrica, telescopica, armonica →, e a questi si aggiunge la finestra da ). I segmenti inviati a s (dal al ) sono persi, nessun ACK torna.
Il timeout
Il temporizzatore parte quando si invia la finestra persa, a s, e scade dopo s: a s. Alla scadenza (evento grave, come un time-out in Tahoe/Reno): Si riparte in slow start dal primo segmento non confermato (il ). Il valore è la finestra in volo al momento della perdita: è lo stesso sia con sia con "segmenti in volo / 2".
Dopo il timeout, con la riduzione di
Restano segmenti ( è il totale, i già consegnati non si ripetono; i persi sì). (rwnd kB segmenti dal tempo s).
| tempo (s) | segmenti inviati (da ritrasmettere) | |||
|---|---|---|---|---|
| 4,0 | 1 | 24 | 1 | 1 |
| 4,5 | 2 | 24 4 | 2 | 3 |
| 5,0 | 4 | 4 | 4 | 7 |
| 5,5 | 8 | 4 | 4 | 11 |
| 6,0 | 9 | 4 | 4 | 15 |
| 6,5 | 10 | 4 | 4 | 19 |
| 7,0 | 11 | 4 | 4 | 23 |
| 7,5 | 12 | 4 | 4 | 27 |
| 8,0 | 13 | 4 | 4 | 31 |
Da s (sette finestre da ) la finestra di invio è dettata dal ricevitore: anche se continua a crescere (con : poi ), si spediscono solo segmenti per round. Il tempo non dipende da come cresce oltre .
L'ultima finestra (gli ultimi segmenti) parte a s; l'ACK torna un RTT dopo, a s.
Grafico interattivo: cwnd, rwnd e ssthresh nel tempo (t in s, finestre in segmenti da 500 B)
Riepilogo del tempo
Si vede che il tempo, rispetto a una trasmissione senza perdita, è aumentato di (attesa del timeout) più i round persi a riconquistare la finestra.
(Verificato con Python con un simulatore a eventi: s; le sequenze delle finestre coincidono con le tabelle.)
Confronto con la soluzione ufficiale
Le slide danno s (con e nulli), dopo la perdita e dal tempo s: tutto coincide. L'unica cosa lasciata implicita è che il tempo è l'inizio della prima finestra.
Errori comuni
- Non considerare che a si passa a crescita lineare (, non ).
- Calcolare o : la finestra che era in volo alla perdita è .
- Dimenticare che la finestra persa va ritrasmessa: i segmenti - contano di nuovo.
- Usare al posto di dopo s: la finestra effettiva resta .
Versione ripasso
Dati. kB segmenti da B; s, s; segmenti (poi kB da s), , ; a s tutti i segmenti in volo sono persi. Tempi di trasmissione trascurabili, è la prima finestra, ogni finestra inizia un RTT dopo la precedente (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 →).
Prima della perdita.
| (s) | 0 | 0,5 | 1 | 1,5 | 2 | 2,5 | 3 |
|---|---|---|---|---|---|---|---|
| 1 | 2 | 4 | 8 | 16 | 17 | 18 |
Slow start fino a , poi per round; non limita. Consegnati ; i segmenti di s (dal al ) sono persi.
| (s) | 4 | 4,5 | 5 | 5,5 | 8 | |
|---|---|---|---|---|---|---|
| 1 | 2 () | 4 | 4 | 4 |
Finestre e sette da : . L'ultima parte a s, l'ACK torna a s. Da s la finestra è dettata da , qualunque sia la crescita di . (coincide con le slide).
Errori: crescita esponenziale oltre (, non ); invece di ; non ritrasmettere la finestra persa; usare al posto di .