Salta al contenuto
Note per Studenti Esercizio - Sei pacchetti con traffico concorrente e TCP con rwnd limitata

Esercizio - Sei pacchetti con traffico concorrente e TCP con rwnd limitata

In questa pagina 7

Testo (simulazione d'esame 2, esercizio 1). Rete a commutazione di pacchetto a datagramma (store-and-forward) con code indipendenti per ogni interfaccia di uscita dei router R1, R2, R3.

Collegamento Estremi Capacità Propagazione
C1C_1 A – R1 2020 Mbit/s 66 ms
C6C_6 B – R1 2525 Mbit/s 22 ms
C2C_2 R1 – R2 2525 Mbit/s 22 ms
C7C_7 R2 – C 22 Mbit/s 1212 ms
C3C_3 R2 – R3 1010 Mbit/s 22 ms
C5C_5 R3 – E 12,512{,}5 Mbit/s 22 ms
C4C_4 R3 – D 12,512{,}5 Mbit/s 22 ms
  1. A t=0t=0 la coda di A contiene quattro pacchetti diretti a E, E, D, D; quella di B due pacchetti diretti a C, C. Lunghezze LC=400L_C=400 kbit, LD=100L_D=100 kbit, LE=200L_E=200 kbit. Calcolare l'istante di arrivo di ogni pacchetto.
  2. Tra A e C c'è una connessione TCP, MSS=1250\text{MSS}=1250 B, apertura e ACK trascurabili, intestazioni trascurabili; cwnd=1250\text{cwnd}=1250 B, ssthresh=10 000\text{ssthresh}=10\,000 B, rwnd=1\text{rwnd}=1 MB. Calcolare la finestra di invio swnd∗\text{swnd}^* che permette un flusso continuo tra A e C.
  3. Tempo totale per trasferire M=50M=50 KB (dall'apertura alla ricezione dell'ultimo byte).
  4. Lo stesso con rwnd=5\text{rwnd}=5 KB.
  5. Lo stesso con rwnd=5\text{rwnd}=5 KB se tutti i pacchetti in volo della settima finestra vanno persi (fuori sequenza scartati), con timeout di 33 RTT.

Teoria usata: Commutazione di circuito e di pacchettoUn nodo di commutazione (switch) può collegare ingresso e uscita in tre modi. Commutazione di circuito: si stabilisce prima un collegamento fisico dedicato (rete telefonica), tempo di consegna $T=3Nt_p+Nt_s+M/R$. Commutazione di pacchetto a datagramma: il messaggio è diviso in $K$ pacchetti con intestazione, ognuno è instradato indipendentemente con store-and-forward, $T=Nt_p+(N+K-1)\frac{M/K+H}{R}$, con $K_{ott}=\sqrt{(N-1)M/H}$. A circuito virtuale: tre fasi (setup, dati, chiusura), connessione logica dedicata ma senza risorse dedicate, identificatore locale che cambia a ogni salto.Commutazione di circuito e di pacchetto →, 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 →, 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 →.

Domanda 1: sei pacchetti con lunghezze diverse

Percorsi: E: C1,C2,C3,C5C_1,C_2,C_3,C_5; D: C1,C2,C3,C4C_1,C_2,C_3,C_4; C (pacchetti di B): C6,C2,C7C_6,C_2,C_7. Tempi di trasmissione T=L/CT=L/C in ms:

Pacchetto C1C_1 C6C_6 C2C_2 C3C_3 C5C_5 C4C_4 C7C_7
E (200200 kbit) 1010 – 88 2020 1616 – –
D (100100 kbit) 55 – 44 1010 – 88 –
C (400400 kbit, da B) – 1616 1616 – – – 200200

Uscita dai due host. A manda E1,E2,D1,D2E_1,E_2,D_1,D_2 uno dietro l'altro; B manda C1,C2C_1,C_2:

  • E1E_1: C1C_1 0→100\to10, in R1 a 1616; E2E_2: 10→2010\to20, in R1 a 2626; D1D_1: 20→2520\to25, in R1 a 3131; D2D_2: 25→3025\to30, in R1 a 3636.
  • C1C_1 (di B, per distinguerlo lo chiamo B1B_1): C6C_6 0→160\to16, in R1 a 1818; B2B_2: 16→3216\to32, in R1 a 3434.

Coda su C2C_2 (R1 → R2). Si servono i pacchetti per ordine di arrivo in R1: E1E_1 (1616), B1B_1 (1818), E2E_2 (2626), D1D_1 (3131), B2B_2 (3434), D2D_2 (3636).

Ordine Pacchetto pronto inizio fine in R2 (+2+2)
1 E1E_1 1616 1616 2424 2626
2 B1B_1 1818 2424 4040 4242
3 E2E_2 2626 4040 4848 5050
4 D1D_1 3131 4848 5252 5454
5 B2B_2 3434 5252 6868 7070
6 D2D_2 3636 6868 7272 7474

In R2. I pacchetti per C (B1B_1, B2B_2) vanno su C7C_7 (22 Mbit/s, T=200T=200 ms): B1B_1 da 4242 a 242242, arriva a C a 242+12=254242+12=\mathbf{254}; B2B_2, pronto a 7070, aspetta fino a 242242, finisce a 442442 e arriva a 454\mathbf{454} ms. I pacchetti per R3 vanno su C3C_3 (coda FIFO per arrivo in R2: E1E_1 2626, E2E_2 5050, D1D_1 5454, D2D_2 7474):

Pacchetto C3C_3 (inizio → fine) in R3 (+2+2)
E1E_1 26→4626\to46 4848
E2E_2 50→7050\to70 7272
D1D_1 70→8070\to80 8282
D2D_2 80→9080\to90 9292

In R3. E1E_1 su C5C_5: 48→6448\to64, arriva a E a 64+2=6664+2=\mathbf{66}; E2E_2: 72→8872\to88, arriva a 90\mathbf{90}. D1D_1 su C4C_4: 82→9082\to90, arriva a D a 92\mathbf{92}; D2D_2: 92→10092\to100, arriva a 102\mathbf{102}.

Pacchetto E1E_1 E2E_2 D1D_1 D2D_2 B1B_1 (a C) B2B_2 (a C)
arrivo (ms) 6666 9090 9292 102102 254254 454454

Domanda 2: finestra per un flusso continuo

Il cammino A→C usa C1,C2,C7C_1,C_2,C_7. Il collo di bottiglia è C7C_7 (22 Mbit/s): con MSS=1250\text{MSS}=1250 B =10=10 kbit, Tb=10 000/2⋅106=5T_b=10\,000/2\cdot10^6=5 ms.

  • Andata di un segmento: T1+τ1+T2+τ2+T7+τ7=0,5+6+0,4+2+5+12=25,9T_1+\tau_1+T_2+\tau_2+T_7+\tau_7=0{,}5+6+0{,}4+2+5+12=25{,}9 ms.
  • Ritorno dell'ACK: τ7+τ2+τ1=12+2+6=20\tau_7+\tau_2+\tau_1=12+2+6=20 ms.

RTT=25,9+20=45,9 ms,swnd∗≥RTTTb=45,95=9,18 ⇒ swnd∗=10 MSS.\text{RTT}=25{,}9+20=45{,}9\ \text{ms},\qquad\text{swnd}^*\ge\frac{\text{RTT}}{T_b}=\frac{45{,}9}{5}=9{,}18\ \Rightarrow\ \text{swnd}^*=\mathbf{10\ \text{MSS}}.

Equivalente: BDP=2 Mbit/s⋅45,9 ms=91,8\text{BDP}=2\ \text{Mbit/s}\cdot45{,}9\ \text{ms}=91{,}8 kbit =9,18=9{,}18 MSS.

Domanda 3: 50 KB con rwnd=1\text{rwnd}=1 MB

K=50 000/1250=40K=50\,000/1250=40 segmenti. L'apertura (SYN e SYN+ACK, solo propagazione 2020 ms ciascuno) dura 4040 ms; l'ACK finale porta il primo dato.

Finestre: 1,2,4,81,2,4,8 (slow start fino a ssthresh=8\text{ssthresh}=8 MSS), poi 9,10,…9,10,\dots in congestion avoidance:

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

Inviati 2424 (le prime quattro finestre sono 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, più 99); rimangono 1616. Dalla sesta finestra swnd=10=swnd∗\text{swnd}=10=\text{swnd}^*: flusso continuo, un segmento ogni Tb=5T_b=5 ms. L'ultimo byte arriva quando l'ultimo segmento ha attraversato tutti i collegamenti (non serve aspettare l'ACK):

TTOT=40+5 RTT+(16−1) Tb+(T1+τ1+T2+τ2+T7+τ7)⏟25,9=40+229,5+75+25,9=370,4 ms.T_{\text{TOT}}=40+5\,\text{RTT}+(16-1)\,T_b+\underbrace{(T_1+\tau_1+T_2+\tau_2+T_7+\tau_7)}_{25{,}9}=40+229{,}5+75+25{,}9=\mathbf{370{,}4\ \text{ms}}. Lettura dei termini: 4040 ms l'apertura; 5 RTT5\,\text{RTT} le prime cinque finestre (1,2,4,8,91,2,4,8,9); 15 Tb15\,T_b la distanza tra il primo e l'ultimo dei 1616 segmenti in flusso continuo; 25,925{,}9 ms il viaggio dell'ultimo segmento fino a C (si chiede l'ultimo byte, quindi niente ritorno dell'ACK).

Domanda 4: rwnd=5\text{rwnd}=5 KB

rwnd=5000/1250=4\text{rwnd}=5000/1250=4 MSS. La finestra di invio è swnd=min⁡(cwnd,rwnd)\text{swnd}=\min(\text{cwnd},\text{rwnd}), quindi si ferma a 44: finestre 1,2,4,4,4,…1,2,4,4,4,\dots Poiché 4 Tb=204\,T_b=20 ms <RTT=45,9<\text{RTT}=45{,}9 ms, il mittente invia 44 segmenti, poi aspetta: ogni finestra dura un RTT.

  • Nelle prime due finestre: 1+2=31+2=3 segmenti; rimangono 40−3=3740-3=37.
  • 37=9⋅4+137=9\cdot4+1: 99 finestre complete da 44 e una finale da 11 segmento.

TTOT=40+2 RTT+9 RTT+25,9=40+11⋅45,9+25,9=570,8 ms.T_{\text{TOT}}=40+2\,\text{RTT}+9\,\text{RTT}+25{,}9=40+11\cdot45{,}9+25{,}9=\mathbf{570{,}8\ \text{ms}}.

Domanda 5: settima finestra persa

Con rwnd=4\text{rwnd}=4 le finestre sono 1,2,4,4,4,41,2,4,4,4,4 (sei finestre, 1+2+4⋅4=191+2+4\cdot4=19 segmenti consegnati) e poi la settima (44 segmenti, inviata a 40+6 RTT40+6\,\text{RTT}) è persa. Dopo RTO=3 RTT\text{RTO}=3\,\text{RTT} scatta il timeout:

  • ssthresh=swnd/2=4/2=2\text{ssthresh}=\text{swnd}/2=4/2=2 MSS, cwnd=1\text{cwnd}=1 MSS;
  • finestre dopo il timeout: 1,21,2 (si raggiunge ssthresh), 33 (congestion avoidance), poi 44 (limite di rwnd): 1+2+3=61+2+3=6 segmenti nelle prime 33 finestre.

Rimangono 40−19=2140-19=21 segmenti; dopo le tre finestre da 1,2,31,2,3 ne restano 15=3⋅4+315=3\cdot4+3: 33 finestre da 44 e una da 33.

TTOT=40+6 RTT+RTO+3 RTT+3 RTT+(25,9+2 Tb).T_{\text{TOT}}=40+6\,\text{RTT}+\text{RTO}+3\,\text{RTT}+3\,\text{RTT}+\bigl(25{,}9+2\,T_b\bigr).

L'ultima finestra ha 33 segmenti: l'ultimo esce 2 Tb2\,T_b dopo il primo. Numericamente 40+275,4+137,7+137,7+137,7+35,9=764,4 ms40+275{,}4+137{,}7+137{,}7+137{,}7+35{,}9=\mathbf{764{,}4\ \text{ms}} (i tre blocchi da 137,7=3 RTT137{,}7=3\,\text{RTT} sono, nell'ordine, il timeout, le finestre 1,2,31,2,3 e le tre finestre da 44).

Grafico interattivo: Finestra di invio (segmenti) nei round dopo l'apertura (40 ms; 1 round = 45,9 ms): domanda 3 (rwnd = 1 MB), domanda 4 (rwnd = 4 MSS) e domanda 5 (settima finestra persa, timeout dopo 3 RTT)

Confronto con la soluzione ufficiale

Domanda Mio Ufficiale
1 E: 66, 9066,\,90; D: 92, 10292,\,102; C: 254, 454254,\,454 ms uguale
2 RTT=45,9\text{RTT}=45{,}9 ms, swnd∗=10\text{swnd}^*=10 MSS uguale
3 370,4370{,}4 ms 370,4370{,}4 ms
4 570,8570{,}8 ms 570,8570{,}8 ms
5 764,4764{,}4 ms 764,4764{,}4 ms

Tutto coincide. L'ufficiale usa il tempo "fino all'ultimo byte" (non all'ultimo ACK): aggiungendo 2020 ms di ritorno dell'ACK si avrebbero 390,4390{,}4, 590,8590{,}8 e 784,4784{,}4 ms.

Errori comuni

  • Servire C2C_2 in ordine di partenza dagli host invece che di arrivo in R1: B1B_1 (1818) passa prima di E2E_2 (2626).
  • Usare T=L/CT=L/C con la stessa LL per tutti i pacchetti: qui LC,LD,LEL_C,L_D,L_E sono diverse.
  • Dimenticare che B2B_2 resta in coda in R2 per C7C_7 fino a 242242 ms.
  • Con rwnd\text{rwnd} piccola, continuare a raddoppiare la finestra oltre rwnd\text{rwnd}.
  • Dopo il timeout calcolare ssthresh\text{ssthresh} da una cwnd\text{cwnd} non limitata da rwnd: si usa la finestra effettivamente in volo (44 MSS), quindi ssthresh=2\text{ssthresh}=2.

(Verificato con Python: simulatore a eventi per la domanda 1; simulatore TCP a finestra intera per le domande 3-5, riportato all'istante dell'ultimo byte.)

Versione ripasso

Dati. T=L/CT=L/C: E (200200 kbit) C1 10C_1\,10, C2 8C_2\,8, C3 20C_3\,20, C5 16C_5\,16 ms; D (100100 kbit) 5, 4, 10, C4 85,\,4,\,10,\,C_4\,8; C (400400 kbit) C6 16C_6\,16, C2 16C_2\,16, C7 200C_7\,200. (Commutazione di circuito e di pacchettoUn nodo di commutazione (switch) può collegare ingresso e uscita in tre modi. Commutazione di circuito: si stabilisce prima un collegamento fisico dedicato (rete telefonica), tempo di consegna $T=3Nt_p+Nt_s+M/R$. Commutazione di pacchetto a datagramma: il messaggio è diviso in $K$ pacchetti con intestazione, ognuno è instradato indipendentemente con store-and-forward, $T=Nt_p+(N+K-1)\frac{M/K+H}{R}$, con $K_{ott}=\sqrt{(N-1)M/H}$. A circuito virtuale: tre fasi (setup, dati, chiusura), connessione logica dedicata ma senza risorse dedicate, identificatore locale che cambia a ogni salto.Commutazione di circuito e di pacchetto →)

Lezioni in cui compare

Teoria collegata