Salta al contenuto
Note per Studenti Esercizio - Messaggio da 225 KB con UDP e con TCP Reno, anche con il terzo segmento perso

Esercizio - Messaggio da 225 KB con UDP e con TCP Reno, anche con il terzo segmento perso

Esame
In questa pagina 6

Testo (tema d'esame, sessione di gennaio, esercizio 1 con soluzioni numeriche). Rete a commutazione di pacchetto a datagramma (store-and-forward), code indipendenti per ogni interfaccia di uscita.

Collegamento Estremi Capacità Propagazione
C1C_1 A – R1 2424 Mbit/s 11 ms
C5C_5 B – R1 2020 Mbit/s 11 ms
C6C_6 C – R1 1515 Mbit/s 0,50{,}5 ms
C2C_2 R1 – R2 66 Mbit/s 44 ms
C7C_7 R2 – D 2424 Mbit/s 44 ms
C8C_8 R2 – E 44 Mbit/s 1,51{,}5 ms
C3C_3 R2 – R3 1212 Mbit/s 44 ms
C4C_4 R3 – F 2424 Mbit/s 22 ms
C9C_9 R3 – G 2424 Mbit/s 66 ms

La domanda 1 (arrivo dei due pacchetti di C verso E e G con traffico concorrente di A e B) è già svolta in Esercizio - Pacchetti di C verso E e G con traffico concorrente. Qui le altre tre. Senza altro traffico, si trasferisce un messaggio di M=225M=225 KB da A a D (cammino C1,C2,C7C_1,C_2,C_7).

  1. Tempo totale con UDP, pacchetti massimi di L=1500L=1500 B, senza intestazioni né elaborazione.
  2. Con TCP Reno, MSS=1500\text{MSS}=1500 B, apertura e ACK trascurabili, cwnd=1500\text{cwnd}=1500 B all'inizio, ssthresh=12 000\text{ssthresh}=12\,000 B, rwnd=1\text{rwnd}=1 MB: tempo totale dall'apertura all'ultimo ACK, con i dati che partono appena possibile.
  3. Con rwnd=13,5\text{rwnd}=13{,}5 KB: stesso calcolo se il terzo segmento è perso e il timeout è 33 RTT.

Teoria usata: 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 →, 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 →, Analisi delle prestazioni di reteLe prestazioni di una rete si misurano con tre famiglie di metriche: traffico (bitrate $R_0$ massimo del collegamento, throughput $S\le R_0$ dati consegnati con successo, goodput al livello applicazione), ritardo (end-to-end $d_{tot}=d_{proc}+d_{queue}+d_{trans}+d_{prop}$ con $d_{trans}=L/R$ e $d_{prop}=d/v$; jitter; RTT) e capacità del tubo (BDP $=R\cdot$ ritardo, bit che riempiono il collegamento), più l'affidabilità (PER, PDR, PLR). Il throughput di un percorso è quello del collegamento collo di bottiglia, $\min$ dei bitrate, ricordando che i collegamenti condivisi dividono la capacità.Analisi delle prestazioni di rete →.

Grandezze di base

L=1500L=1500 B =12 000=12\,000 bit; numero di segmenti K=225 000/1500=150K=225\,000/1500=150. Tempi di trasmissione sul cammino A→D:

Collegamento C1C_1 C2C_2 C7C_7
T=L/CT=L/C 0,50{,}5 ms 22 ms 0,50{,}5 ms
τ\tau 11 ms 44 ms 44 ms

Il collo di bottiglia è C2C_2: Tb=2T_b=2 ms.

  • Andata di un segmento: 0,5+1+2+4+0,5+4=120{,}5+1+2+4+0{,}5+4=12 ms.
  • Ritorno dell'ACK (trascurabile): τ7+τ2+τ1=4+4+1=9\tau_7+\tau_2+\tau_1=4+4+1=9 ms.
  • RTT=12+9=21\text{RTT}=12+9=21 ms; BDP=6 Mbit/s⋅21 ms=126\text{BDP}=6\ \text{Mbit/s}\cdot21\ \text{ms}=126 kbit =10,5=10{,}5 MSS, quindi swnd∗=11\text{swnd}^*=11 MSS.

Domanda 2: UDP

Nessun ACK né attese; i segmenti escono dal collo di bottiglia uno ogni Tb=2T_b=2 ms. L'ultimo (150150-esimo) arriva a

TUDP=12+(150−1)⋅2=310 ms.T_{\text{UDP}}=12+(150-1)\cdot2=\mathbf{310\ \text{ms}}.

Domanda 3: TCP Reno, nessuna perdita

Apertura. SYN e SYN+ACK di lunghezza trascurabile: solo propagazione, τ1+τ2+τ7=9\tau_1+\tau_2+\tau_7=9 ms per ciascuno, 1818 ms in totale; l'ACK finale porta il primo segmento di dati, che parte a 1818 ms.

Crescita della finestra. ssthresh=12 000/1500=8\text{ssthresh}=12\,000/1500=8 MSS. In slow start la finestra raddoppia ogni RTT (1,2,4,81,2,4,8); a 88 inizia la congestion avoidance con +1+1 MSS per RTT (9,10,11,…9,10,11,\dots).

RTT 1 2 3 4 5 6
finestra 11 22 44 88 99 1010

Segmenti inviati: 1+2+4+8+9+10=341+2+4+8+9+10=34 (la parte di slow start è una somma geometrica1 + 2 + 4 + ... + 2^k = 2^(k+1) − 1, perché ogni termine è il doppio del precedenteSerie notevoli - geometrica, telescopica, armonica →: 1+2+4+8=151+2+4+8=15; poi 9+10=199+10=19). Poiché swnd∗=11\text{swnd}^*=11, finché la finestra è ≤10\le10 il mittente aspetta un RTT per finestra; dalla settima finestra swnd=11≥BDP\text{swnd}=11\ge\text{BDP}: flusso continuo per i 150−34=116150-34=116 segmenti restanti.

TTCP=18⏟apertura+6 RTT+(116−1) Tb+RTT=18+126+230+21=395 ms.T_{\text{TCP}}=\underbrace{18}_{\text{apertura}}+6\,\text{RTT}+(116-1)\,T_b+\text{RTT}=18+126+230+21=\mathbf{395\ \text{ms}}.

Il termine +RTT+\text{RTT} finale è il ritorno dell'ACK dell'ultimo segmento (dal suo invio): in totale 395395 ms dall'inizio dell'apertura all'ultimo ACK. Lettura dei termini: 1818 ms l'handshake; 6 RTT=1266\,\text{RTT}=126 ms le prime sei finestre, ciascuna lunga un RTT perché swnd⋅Tb<RTT\text{swnd}\cdot T_b<\text{RTT} (con 1010 segmenti: 20<2120<21 ms); (116−1) Tb=230(116-1)\,T_b=230 ms il flusso continuo (il primo dei 116116 segmenti parte all'inizio della settima finestra, l'ultimo 115 Tb115\,T_b dopo).

Domanda 4: rwnd=13,5\text{rwnd}=13{,}5 KB, terzo segmento perso

rwnd=13 500/1500=9\text{rwnd}=13\,500/1500=9 MSS: la finestra di invio è min⁡(cwnd,9)\min(\text{cwnd},9), quindi cresce fino a 99 e lì si ferma. Poiché 9 Tb=189\,T_b=18 ms <RTT=21<\text{RTT}=21 ms, il mittente è limitato dalla finestra: 99 segmenti per RTT.

Fino alla perdita.

  1. t=18t=18 ms: parte il segmento 11; il suo ACK torna a 18+21=3918+21=39 ms, cwnd=2\text{cwnd}=2.
  2. t=39t=39 ms: partono i segmenti 22 e 33; il 33 comincia a essere trasmesso a 39+0,5=39,539+0{,}5=39{,}5 ms ed è perso. Il segmento 22 arriva, il suo ACK (cwnd=3\text{cwnd}=3) permette di inviare i segmenti 4,54,5, che arrivano fuori ordine e sono scartati: niente ACK nuovi.
  3. Il timeout scade 3 RTT=633\,\text{RTT}=63 ms dopo l'invio del segmento 33: a 39,5+63=102,539{,}5+63=102{,}5 ms.

Dopo il timeout. ssthresh=cwnd/2=3/2→2\text{ssthresh}=\text{cwnd}/2=3/2\to2 MSS (almeno 22 MSS) e cwnd=1\text{cwnd}=1. Si ritrasmette dal segmento 33 (consegnati finora: 11 e 22; restano 148148). Finestre: 1,21,2 (si raggiunge ssthresh), poi +1+1 per RTT: 3,4,5,6,7,8,93,4,5,6,7,8,9 (limite di rwnd): in 99 RTT si inviano 1+2+⋯+9=451+2+\dots+9=45 segmenti (somma dei primi numeri naturali1 + 2 + ... + n = n(n+1)/2Sommatorie →: 9⋅10/2=459\cdot10/2=45); ne restano 148−45=103=11⋅9+4148-45=103=11\cdot9+4:

  • 1111 finestre da 99 (ognuna dura un RTT, perché 9 Tb<RTT9\,T_b<\text{RTT});
  • una finestra finale da 44 segmenti.

L'ultimo segmento parte 3 Tb3\,T_b dopo il primo della finestra finale, e il suo ACK torna dopo un RTT:

T=102,5+9 RTT+11 RTT+3 Tb+RTT=102,5+189+231+6+21=549,5 ms.T=102{,}5+9\,\text{RTT}+11\,\text{RTT}+3\,T_b+\text{RTT}=102{,}5+189+231+6+21=\mathbf{549{,}5\ \text{ms}}.

Lettura dei termini: 102,5102{,}5 ms è l'istante del timeout (dall'inizio dell'apertura); 9 RTT9\,\text{RTT} le nove finestre 1,…,91,\dots,9 dopo il timeout; 11 RTT11\,\text{RTT} le undici finestre da 99; 3 Tb3\,T_b la serializzazione dei 44 segmenti dell'ultima finestra; RTT\text{RTT} il ritorno dell'ultimo ACK.

Grafico interattivo: Finestra di invio (segmenti) nei round dopo i 18 ms di apertura (1 round = 21 ms): domanda 3 senza perdite e domanda 4 (rwnd = 9 MSS, terzo segmento perso, timeout dopo 3 RTT)

Confronto con la soluzione ufficiale

Domanda Mio Ufficiale
2 310310 ms TUDP=310T_{\text{UDP}}=310 ms
3 395395 ms TTCP=395T_{\text{TCP}}=395 ms
4 549,5549{,}5 ms TTCP=549,5T_{\text{TCP}}=549{,}5 ms

Coincide. (La soluzione ufficiale riporta solo i risultati.) Il valore dell'ultima domanda dipende da dove si fa partire il timeout: contandolo dall'inizio dell'invio del segmento perso (come qui) si ottiene 549,5549{,}5 ms; contandolo dalla fine della sua trasmissione si avrebbero 0,50{,}5 ms in più.

Errori comuni

  • Mettere nel conto la finestra di 1111 MSS come se fosse ancora in congestion avoidance a +1+1 per RTT: dalla settima finestra il collegamento è saturo e il tempo cresce solo di TbT_b per segmento.
  • Con rwnd=9\text{rwnd}=9 MSS dimenticare che la finestra si ferma a 99 (non a swnd∗=11\text{swnd}^*=11): il collegamento resta non saturo.
  • Contare come consegnato il segmento 33 o i successivi (scartati perché fuori sequenza).
  • Prendere ssthresh=ssthreshvecchio/2=4\text{ssthresh}=\text{ssthresh}_{\text{vecchio}}/2=4: si usa la finestra effettiva al momento della perdita.

(Verificato con Python: simulatore TCP a finestra intera con ACK cumulativi e timeout: 395395 ms e 549,5549{,}5 ms; UDP 310310 ms con il simulatore a eventi a coda.)

Versione ripasso

Dati. K=150K=150 segmenti da 1212 kbit; cammino C1 (T=0,5)C_1\,(T=0{,}5), C2 (2)C_2\,(2), C7 (0,5)C_7\,(0{,}5); Tb=2T_b=2 ms; RTT=12+9=21\text{RTT}=12+9=21 ms; BDP=10,5\text{BDP}=10{,}5 MSS (swnd∗=11\text{swnd}^*=11); apertura 1818 ms. (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 →)

  • UDP: 12+149⋅2=31012+149\cdot2=310 ms.
  • TCP: finestre 1,2,4,8,9,101,2,4,8,9,10 (3434 seg.), poi continuo: 18+6 RTT+115 Tb+RTT=39518+6\,\text{RTT}+115\,T_b+\text{RTT}=395 ms.
  • rwnd=9\text{rwnd}=9 MSS, 3° segmento perso: timeout a 39,5+3 RTT=102,539{,}5+3\,\text{RTT}=102{,}5 ms; ssthresh=2\text{ssthresh}=2; finestre 1,…,91,\dots,9 (4545 seg.), restano 103=11⋅9+4103=11\cdot9+4: 102,5+9 RTT+11 RTT+3 Tb+RTT=549,5102{,}5+9\,\text{RTT}+11\,\text{RTT}+3\,T_b+\text{RTT}=549{,}5 ms.
  • Errore tipico: finestra oltre rwnd; contare consegnati i segmenti fuori sequenza.

Lezioni in cui compare

Teoria collegata