Salta al contenuto
Note per Studenti Esercizio - TCP con perdita di finestra e riduzione di rwnd

Esercizio - TCP con perdita di finestra e riduzione di rwnd

In questa pagina 7

Testo. Si trasferiscono 39,539{,}5 kB con TCP. Parametri: MSS=500\text{MSS}=500 byte, RTT=500\text{RTT}=500 ms, timeout T1=2⋅RTTT_1=2\cdot\text{RTT}. Condizioni iniziali: rwnd=12\text{rwnd}=12 kB, ssthresh=8\text{ssthresh}=8 kB, cwnd=500\text{cwnd}=500 B. Inoltre: al tempo 33 s tutti i segmenti in volo vengono persi; al tempo 4,54{,}5 s il ricevitore imposta rwnd=2\text{rwnd}=2 kB.

  1. Disegnare l'andamento nel tempo di cwnd\text{cwnd}, ssthresh\text{ssthresh} e rwnd\text{rwnd}.
  2. 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 MSS=500\text{MSS}=500 B (con 11 kB =1000=1000 B):

  • messaggio: 39 500/500=7939\,500/500=79 segmenti;
  • rwnd=12\text{rwnd}=12 kB =24=24 segmenti, poi 22 kB =4=4 segmenti;
  • ssthresh=8\text{ssthresh}=8 kB =16=16 segmenti; cwnd\text{cwnd} iniziale 11;
  • timeout T1=2 RTT=1T_1=2\,\text{RTT}=1 s.

Convenzione. L'esercizio dà soltanto il RTT, non separa tempo di trasmissione e propagazione: i tempi di trasmissione sono trascurabili, e il tempo 00 è l'istante in cui parte la prima finestra (l'apertura non viene contata; il risultato ufficiale, 8,58{,}5 s =17 RTT=17\,\text{RTT}, lo conferma). Ogni finestra inizia un RTT dopo la precedente: a t=0t=0, 0,50{,}5 s, 11 s, …\dots (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 ssthresh=16\text{ssthresh}=16 (1,2,4,8,161,2,4,8,16), poi congestion avoidance (+1+1 per round).

tempo (s) cwnd\text{cwnd} 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 ssthresh\text{ssthresh}
2,5 17 48 congestion avoidance
3,0 18 (66) tutti i 1818 segmenti sono persi

rwnd=24\text{rwnd}=24 non limita mai (cwnd≤18\text{cwnd}\le18). Consegnati con successo prima della perdita: 1+2+4+8+16+17=481+2+4+8+16+17=48 segmenti (lo slow start dà 1+2+4+8+16=31=25−11+2+4+8+16=31=2^5-1, 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 1717). I 1818 segmenti inviati a 33 s (dal 4949 al 6666) sono persi, nessun ACK torna.

Il timeout

Il temporizzatore parte quando si invia la finestra persa, a t=3t=3 s, e scade dopo T1=1T_1=1 s: a t=4t=4 s. Alla scadenza (evento grave, come un time-out in Tahoe/Reno): ssthresh=cwnd2=182=9,cwnd=1.\text{ssthresh}=\frac{\text{cwnd}}2=\frac{18}2=9,\qquad\text{cwnd}=1. Si riparte in slow start dal primo segmento non confermato (il 4949). Il valore 1818 è la finestra in volo al momento della perdita: ssthresh=9\text{ssthresh}=9 è lo stesso sia con cwnd/2\text{cwnd}/2 sia con "segmenti in volo / 2".

Dopo il timeout, con la riduzione di rwnd\text{rwnd}

Restano 79−48=3179-48=31 segmenti (7979 è il totale, i 4848 già consegnati non si ripetono; i 1818 persi sì). swnd=min⁡(cwnd,rwnd)\text{swnd}=\min(\text{cwnd},\text{rwnd}) (rwnd =2=2 kB =2000/500=4=2000/500=4 segmenti dal tempo 4,54{,}5 s).

tempo (s) cwnd\text{cwnd} rwnd\text{rwnd} swnd\text{swnd} segmenti inviati (da ritrasmettere)
4,0 1 24 1 1
4,5 2 24 →\to 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 t=5t=5 s (sette finestre da 44) la finestra di invio è dettata dal ricevitore: anche se cwnd\text{cwnd} continua a crescere (con ssthresh=9\text{ssthresh}=9: 88 poi 9,10,…9,10,\dots), si spediscono solo 44 segmenti per round. Il tempo non dipende da come cresce cwnd\text{cwnd} oltre 44.

L'ultima finestra (gli ultimi 44 segmenti) parte a 8,08{,}0 s; l'ACK torna un RTT dopo, a 8,58{,}5 s.

Grafico interattivo: cwnd, rwnd e ssthresh nel tempo (t in s, finestre in segmenti da 500 B)

Riepilogo del tempo

Ttot=6 RTT⏟3 s: prime 6 finestre+T1⏟1 s+2 RTT⏟finestre da 1 e 2+7 RTT⏟7 finestre da 4, ultima con il suo ACK=3+1+1+3,5=8,5 s.T_{tot}=\underbrace{6\,\text{RTT}}_{3\ \text{s: prime 6 finestre}}+\underbrace{T_1}_{1\ \text{s}}+\underbrace{2\,\text{RTT}}_{\text{finestre da }1\text{ e }2}+\underbrace{7\,\text{RTT}}_{7\text{ finestre da }4\text{, ultima con il suo ACK}}=3+1+1+3{,}5=\boxed{8{,}5\ \text{s}}. Si vede che il tempo, rispetto a una trasmissione senza perdita, è aumentato di T1T_1 (attesa del timeout) più i round persi a riconquistare la finestra.

(Verificato con Python con un simulatore a eventi: 8,5008{,}500 s; le sequenze delle finestre coincidono con le tabelle.)

Confronto con la soluzione ufficiale

Le slide danno Ttot=Tsetup+6 RTT+Tout+2 RTT+7 RTT+(4−1)Tb=8,5T_{tot}=T_{setup}+6\,\text{RTT}+T_{out}+2\,\text{RTT}+7\,\text{RTT}+(4-1)T_b=8{,}5 s (con TsetupT_{setup} e TbT_b nulli), ssthresh=18/2=9\text{ssthresh}=18/2=9 dopo la perdita e swnd=rwnd=4\text{swnd}=\text{rwnd}=4 dal tempo 4,54{,}5 s: tutto coincide. L'unica cosa lasciata implicita è che il tempo 00 è l'inizio della prima finestra.

Errori comuni

  • Non considerare che a cwnd=16=ssthresh\text{cwnd}=16=\text{ssthresh} si passa a crescita lineare (17,1817,18, non 3232).
  • Calcolare ssthresh=16/2=8\text{ssthresh}=16/2=8 o 17/217/2: la finestra che era in volo alla perdita è 1818.
  • Dimenticare che la finestra persa va ritrasmessa: i segmenti 4949-6666 contano di nuovo.
  • Usare cwnd\text{cwnd} al posto di min⁡(cwnd,rwnd)\min(\text{cwnd},\text{rwnd}) dopo 4,54{,}5 s: la finestra effettiva resta 44.

Versione ripasso

Dati. 39,539{,}5 kB =79=79 segmenti da 500500 B; RTT=0,5\text{RTT}=0{,}5 s, T1=2 RTT=1T_1=2\,\text{RTT}=1 s; rwnd=24\text{rwnd}=24 segmenti (poi 22 kB =4=4 da t=4,5t=4{,}5 s), ssthresh=16\text{ssthresh}=16, cwnd=1\text{cwnd}=1; a t=3t=3 s tutti i segmenti in volo sono persi. Tempi di trasmissione trascurabili, t=0t=0 è 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.

tt (s) 0 0,5 1 1,5 2 2,5 3
cwnd\text{cwnd} 1 2 4 8 16 17 18

Slow start fino a ssthresh=16\text{ssthresh}=16, poi +1+1 per round; rwnd=24\text{rwnd}=24 non limita. Consegnati 1+2+4+8+16+17=481+2+4+8+16+17=48; i 1818 segmenti di t=3t=3 s (dal 4949 al 6666) sono persi.

Timeout a t=3+T1=4t=3+T_1=4 s: ssthresh=18/2=9\text{ssthresh}=18/2=9, cwnd=1\text{cwnd}=1, si riparte dal segmento 4949 in slow start. Restano 79−48=3179-48=31 segmenti, con swnd=min⁡(cwnd,rwnd)\text{swnd}=\min(\text{cwnd},\text{rwnd}) (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 →).

tt (s) 4 4,5 5 5,5 …\dots 8
swnd\text{swnd} 1 2 (rwnd→4\text{rwnd}\to4) 4 4 …\dots 4

Finestre 1,21,2 e sette da 44: 1+2+7⋅4=311+2+7\cdot4=31. L'ultima parte a 88 s, l'ACK torna a 8,58{,}5 s. Da t=5t=5 s la finestra è dettata da rwnd\text{rwnd}, qualunque sia la crescita di cwnd\text{cwnd}. Ttot=6 RTT+T1+2 RTT+7 RTT=3+1+1+3,5=8,5 sT_{tot}=6\,\text{RTT}+T_1+2\,\text{RTT}+7\,\text{RTT}=3+1+1+3{,}5=8{,}5\ \text{s} (coincide con le slide).

Errori: crescita esponenziale oltre ssthresh\text{ssthresh} (17,1817,18, non 3232); ssthresh=16/2\text{ssthresh}=16/2 invece di 18/218/2; non ritrasmettere la finestra persa; usare cwnd\text{cwnd} al posto di min⁡(cwnd,rwnd)\min(\text{cwnd},\text{rwnd}).

Lezioni in cui compare

Teoria collegata