Salta al contenuto
Note per Studenti Esercizio - UDP e TCP su tre collegamenti, messaggio da 225 kB

Esercizio - UDP e TCP su tre collegamenti, messaggio da 225 kB

In questa pagina 7

Testo. Si trasmette un messaggio di M=225M=225 kbyte dall'host AA all'host BB attraverso A→R1→R2→BA\to R_1\to R_2\to B con C1=24C_1=24 Mbit/s, τ1=1\tau_1=1 ms; C2=6C_2=6 Mbit/s, τ2=4\tau_2=4 ms; C3=24C_3=24 Mbit/s, τ3=4\tau_3=4 ms.

  1. Con UDP a livello di trasporto e pacchetti di dimensione massima L=1500L=1500 byte, calcolare il tempo totale (si trascurano elaborazione, accodamento e intestazioni di tutti i livelli).
  2. Con TCP tra AA e BB: MSS=1500\text{MSS}=1500 B, ACK e segmenti di apertura trascurabili, intestazioni trascurabili, cwnd\text{cwnd} iniziale =1500=1500 B, ssthresh=12 000\text{ssthresh}=12\,000 B, rwnd=1\text{rwnd}=1 MB. Calcolare il tempo totale (dall'apertura della connessione alla ricezione dell'ultimo ACK), con la trasmissione dei dati che comincia il prima possibile.
  3. Ripetere con rwnd=13,5\text{rwnd}=13{,}5 kB.
  4. Ripetere (con rwnd=13,5\text{rwnd}=13{,}5 kB) nel caso in cui la seconda finestra di pacchetti sia persa, con timeout pari a 33 RTT; i pacchetti fuori ordine vengono scartati e non generano ACK.

Teoria usata: 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 →, 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 →, 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 →. Convenzione di calcolo (apertura a 2τ2\tau, round a distanza di un RTT, flusso continuo): vedi Esercizio - TCP, slow start e messaggio da 18 kB su un collegamento da 8 Mbps.

Dati comuni

MSS=1500⋅8=12 000\text{MSS}=1500\cdot8=12\,000 bit. Tempi di trasmissione di un segmento: T1=T3=12 000/(24⋅106)=0,5T_1=T_3=12\,000/(24\cdot10^6)=0{,}5 ms, T2=12 000/(6⋅106)=2T_2=12\,000/(6\cdot10^6)=2 ms; il collegamento 2 è il collo di bottiglia. Somma delle propagazioni τ=1+4+4=9\tau=1+4+4=9 ms. Segmenti: 225 000/1500=150225\,000/1500=150.

RTT=T1+T2+T3+2τ=0,5+2+0,5+18=21 ms,apertura=2τ=18 ms.\text{RTT}=T_1+T_2+T_3+2\tau=0{,}5+2+0{,}5+18=21\ \text{ms},\qquad\text{apertura}=2\tau=18\ \text{ms}.

(1) UDP

UDP non ha apertura, né ACK, né finestra: AA spedisce i 150150 pacchetti uno dietro l'altro. Il collegamento 2 è più lento del 1, quindi i pacchetti escono da R1R_1 a distanza T2=2T_2=2 ms: il tempo è determinato dal collo di bottiglia. Si finisce quando l'ultimo pacchetto arriva a BB (nessun ACK da aspettare).

  • il primo pacchetto arriva a R1R_1 dopo T1+τ1=1,5T_1+\tau_1=1{,}5 ms;
  • il collegamento 2 lavora senza pause per 150⋅T2=300150\cdot T_2=300 ms;
  • l'ultimo pacchetto, finita la trasmissione sul collegamento 2, si propaga per τ2\tau_2, viene trasmesso dal collegamento 3 in T3T_3 e si propaga per τ3\tau_3.

TUDP=T1+τ1+K T2+τ2+T3+τ3=0,5+1+150⋅2+4+0,5+4=310 ms.T_{UDP}=T_1+\tau_1+K\,T_2+\tau_2+T_3+\tau_3=0{,}5+1+150\cdot2+4+0{,}5+4=\boxed{310\ \text{ms}}.

(2) TCP con rwnd=1\text{rwnd}=1 MB

ssthresh=12 000/1500=8\text{ssthresh}=12\,000/1500=8 segmenti; rwnd=106/1500≈666\text{rwnd}=10^6/1500\approx666 segmenti (non limita).

Soglia del flusso continuo. Il collo di bottiglia ha T2=2T_2=2 ms, quindi servono swnd⋅T2≥RTT\text{swnd}\cdot T_2\ge\text{RTT}, cioè swnd≥21/2=10,5\text{swnd}\ge21/2=10{,}5 segmenti, che con finestre intere significa 1111.

round cwnd\text{cwnd} inizio (ms) segmenti inviati (totale)
1 1 18 1
2 2 39 3
3 4 60 7
4 8 81 15
5 9 102 24
6 10 123 34
7 11 144 continuo

Slow start 1,2,4,81,2,4,8 (1+2+4+8=151+2+4+8=15, una somma geometrica1 + 2 + 4 + ... + 2^k = 2^(k+1) − 1, perché ogni termine è il doppio del precedenteSerie notevoli - geometrica, telescopica, armonica →), poi avoidance 9,109,10; con cwnd=11≥10,5\text{cwnd}=11\ge10{,}5 il flusso diventa continuo. Nei primi sei round si inviano 3434 segmenti; restano 150−34=116150-34=116, tutti in flusso continuo a partire da 144144 ms: uno ogni T2=2T_2=2 ms. L'ultimo inizia 115⋅2=230115\cdot2=230 ms dopo, a 374374 ms, e il suo ACK torna un RTT dopo: TTCP=Tsetup+6 RTT+(150−34−1)T2+RTT=18+126+230+21=395 ms.T_{TCP}=T_{setup}+6\,\text{RTT}+(150-34-1)T_2+\text{RTT}=18+126+230+21=\boxed{395\ \text{ms}}.

(3) TCP con rwnd=13,5\text{rwnd}=13{,}5 kB

13 500/1500=913\,500/1500=9 segmenti: swnd=min⁡(cwnd,9)\text{swnd}=\min(\text{cwnd},9). La finestra non può superare 9<10,59<10{,}5, quindi non si arriva mai al flusso continuo: ogni finestra dura 9T2=189T_2=18 ms <21<21 ms.

round swnd\text{swnd} inizio (ms) segmenti inviati (totale)
1 1 18 1
2 2 39 3
3 4 60 7
4 8 81 15
5, 6, …\dots 9 (limitata da rwnd\text{rwnd}) 102+21j102+21j +9+9 per round

Dopo i primi 1515 segmenti restano 135=15⋅9135=15\cdot9 segmenti: esattamente 1515 finestre da 99, la prima a 102102 ms, l'ultima a 102+14⋅21=396102+14\cdot21=396 ms; i suoi 99 segmenti escono in 8T2=168T_2=16 ms e l'ACK dell'ultimo torna un RTT dopo l'inizio dell'ultimo segmento: TTCP=Tsetup+4 RTT+15 RTT+(9−1)T2=18+84+315+16=433 ms.T_{TCP}=T_{setup}+4\,\text{RTT}+15\,\text{RTT}+(9-1)T_2=18+84+315+16=\boxed{433\ \text{ms}}.

(4) Perdita della seconda finestra, rwnd=13,5\text{rwnd}=13{,}5 kB

  • A 1818 ms parte la prima finestra (1 segmento); l'ACK torna a 3939 ms.
  • A 3939 ms parte la seconda finestra, di 22 segmenti (cwnd=2\text{cwnd}=2): vanno persi entrambi.
  • Il temporizzatore parte a 3939 ms e scade dopo 3 RTT=633\,\text{RTT}=63 ms, a 102102 ms.
  • Alla scadenza: ssthresh=cwnd/2=2/2=1\text{ssthresh}=\text{cwnd}/2=2/2=1 segmento e cwnd=1\text{cwnd}=1. Poiché cwnd=ssthresh\text{cwnd}=\text{ssthresh}, la ripartenza avviene già in congestion avoidance: non c'è slow start, la finestra cresce di 11 per round: 1,2,3,…1,2,3,\dots
  • I segmenti fuori ordine sono scartati senza ACK (nessun ACK duplicato, quindi niente ritrasmissione rapida).
round dopo il timeout swnd\text{swnd} inizio (ms) segmenti consegnati (totale con il primo)
1 1 102 2
2 2 123 4
3 3 144 7
…\dots …\dots …\dots …\dots
8 8 249 1+36=371+36=37
9 9 (limita rwnd\text{rwnd}) 270 46

I segmenti inviati fino alla finestra da 88 inclusa sono 1+(1+2+⋯+8)=1+36=371+(1+2+\dots+8)=1+36=37 (somma dei primi numeri naturali1 + 2 + ... + n = n(n+1)/2Sommatorie →: 8⋅9/2=368\cdot9/2=36). Restano 150−37=113150-37=113, inviati con finestre da 99: 113=12⋅9+5113=12\cdot9+5, cioè 1212 finestre complete (da 270270 ms) più un'ultima da 55 segmenti, che comincia a 270+12⋅21=522270+12\cdot21=522 ms: TTCP=Tsetup+RTT+Tout+8 RTT+12 RTT+RTT+(5−1)T2=18+21+63+168+252+21+8=551 ms.T_{TCP}=T_{setup}+\text{RTT}+T_{out}+8\,\text{RTT}+12\,\text{RTT}+\text{RTT}+(5-1)T_2=18+21+63+168+252+21+8=\boxed{551\ \text{ms}}. Nessuna finestra è continua (9T2=18<219T_2=18<21).

Grafico interattivo: Finestra di invio (segmenti) nei round dopo l'apertura (18 ms; 1 round = 21 ms): caso (2) rwnd = 1 MB, caso (3) rwnd = 9 MSS, caso (4) seconda finestra persa con timeout dopo 3 RTT

(I risultati TCP, 395395, 433433 e 551551 ms, sono stati verificati con Python con un simulatore a eventi di collegamenti in serie; il caso UDP con la formula: 310310 ms.)

Confronto con la soluzione ufficiale

Le slide danno 310310 ms, 395395 ms, 433433 ms, 551551 ms: coincidono. Nel caso (4) la slide scrive, nella scomposizione, "1+1+2+3+4+5+6+7+8=371+1+2+3+4+5+6+7+8=37": il primo 11 è la prima finestra, il secondo 11 la finestra di ripartenza dopo il timeout. Resta implicito che rwnd=13,5\text{rwnd}=13{,}5 kB si mantiene anche nel caso (4) (si vede dal grafico, swnd=rwnd=9\text{swnd}=\text{rwnd}=9).

Con la regola abituale ssthresh≥2\text{ssthresh}\ge2 MSS la ripartenza sarebbe in slow start e il risultato diverso; qui il corso, con ssthresh=2/2=1\text{ssthresh}=2/2=1, parte direttamente in avoidance.

Errori comuni

  • Dimenticare che UDP non ha apertura né ACK: il tempo è fissato dal collo di bottiglia e termina all'arrivo dell'ultimo pacchetto (310310 ms invece di 395395 ms).
  • Usare la soglia 2τ2\tau al posto del RTT per il flusso continuo: con rwnd=9\text{rwnd}=9 segmenti 9T2=189T_2=18 ms <21<21 ms, quindi la finestra limita ancora.
  • Nel caso (4) riprendere in slow start dopo il timeout: con ssthresh=1\text{ssthresh}=1 si cresce già linearmente.
  • Nel caso (4) non contare nel tempo l'attesa del timeout (33 RTT) e il RTT della prima finestra.

Versione ripasso

Dati. A→R1→R2→BA\to R_1\to R_2\to B: 2424 Mbit/s /1/1 ms, 66 Mbit/s /4/4 ms, 2424 Mbit/s /4/4 ms; M=225M=225 kB =150=150 segmenti da 15001500 B (12 00012\,000 bit). T1=T3=0,5T_1=T_3=0{,}5 ms, T2=2T_2=2 ms (collo di bottiglia), ∑τ=9\sum\tau=9 ms; RTT=0,5+2+0,5+18=21\text{RTT}=0{,}5+2+0{,}5+18=21 ms; apertura 2∑τ=182\sum\tau=18 ms. Convenzione: Esercizio - TCP, slow start e messaggio da 18 kB su un collegamento da 8 Mbps (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 →, 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 →).

(1) UDP: senza apertura né ACK, il tempo è dettato dal collegamento 2: T=T1+τ1+150 T2+τ2+T3+τ3=0,5+1+300+4+0,5+4=310T=T_1+\tau_1+150\,T_2+\tau_2+T_3+\tau_3=0{,}5+1+300+4+0{,}5+4=310 ms.

(2) TCP, rwnd=1\text{rwnd}=1 MB. ssthresh=8\text{ssthresh}=8; flusso continuo se swnd≥RTT/T2=10,5\text{swnd}\ge\text{RTT}/T_2=10{,}5, cioè 1111. Finestre 1,2,4,8,9,101,2,4,8,9,10 (inizi 18,39,…,12318,39,\dots,123 ms): 3434 segmenti in 66 round; dal round 7 (144144 ms) continuo con 150−34=116150-34=116 segmenti. T=18+6⋅21+(116−1)⋅2+21=395 ms.T=18+6\cdot21+(116-1)\cdot2+21=395\ \text{ms}.

(3) rwnd=13,5\text{rwnd}=13{,}5 kB =9=9 segmenti. 9T2=18<219T_2=18<21: mai continuo. Finestre 1,2,4,81,2,4,8 (1515 segmenti), poi 135=15⋅9135=15\cdot9, la prima a 102102 ms. T=18+4⋅21+15⋅21+8⋅2=433 ms.T=18+4\cdot21+15\cdot21+8\cdot2=433\ \text{ms}.

(4) Seconda finestra (2 segmenti, a 3939 ms) persa, RTO =3 RTT=63=3\,\text{RTT}=63 ms. Timeout a 102102 ms: ssthresh=2/2=1=cwnd\text{ssthresh}=2/2=1=\text{cwnd}, quindi si riparte già in congestion avoidance: 1,2,…,81,2,\dots,8 (inizi 102,…,249102,\dots,249 ms), poi 99 (limite di rwnd\text{rwnd}) da 270270 ms. Inviati fino alla finestra da 88: 1+36=371+36=37; restano 113=12⋅9+5113=12\cdot9+5, ultima finestra da 55 a 270+12⋅21=522270+12\cdot21=522 ms. T=18+21+63+8⋅21+12⋅21+21+4⋅2=551 ms.T=18+21+63+8\cdot21+12\cdot21+21+4\cdot2=551\ \text{ms}. I fuori ordine sono scartati senza ACK, quindi niente ritrasmissione rapida. Le slide danno 310,395,433,551310,395,433,551 ms.

Errori: UDP con ACK o apertura; soglia continua con 2τ2\tau invece del RTT; slow start dopo il timeout con ssthresh=1\text{ssthresh}=1; dimenticare l'attesa del timeout e il RTT della prima finestra.

Lezioni in cui compare

Teoria collegata