Esercizio - Messaggio da 225 KB con UDP e con TCP Reno, anche con il terzo segmento perso
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 |
|---|---|---|---|
| A – R1 | Mbit/s | ms | |
| B – R1 | Mbit/s | ms | |
| C – R1 | Mbit/s | ms | |
| R1 – R2 | Mbit/s | ms | |
| R2 – D | Mbit/s | ms | |
| R2 – E | Mbit/s | ms | |
| R2 – R3 | Mbit/s | ms | |
| R3 – F | Mbit/s | ms | |
| R3 – G | Mbit/s | 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 KB da A a D (cammino ).
- Tempo totale con UDP, pacchetti massimi di B, senza intestazioni né elaborazione.
- Con TCP Reno, B, apertura e ACK trascurabili, B all'inizio, B, MB: tempo totale dall'apertura all'ultimo ACK, con i dati che partono appena possibile.
- Con KB: stesso calcolo se il terzo segmento è perso e il timeout è 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
B bit; numero di segmenti . Tempi di trasmissione sul cammino A→D:
| Collegamento | |||
|---|---|---|---|
| ms | ms | ms | |
| ms | ms | ms |
Il collo di bottiglia è : ms.
- Andata di un segmento: ms.
- Ritorno dell'ACK (trascurabile): ms.
- ms; kbit MSS, quindi MSS.
Domanda 2: UDP
Nessun ACK né attese; i segmenti escono dal collo di bottiglia uno ogni ms. L'ultimo (-esimo) arriva a
Domanda 3: TCP Reno, nessuna perdita
Apertura. SYN e SYN+ACK di lunghezza trascurabile: solo propagazione, ms per ciascuno, ms in totale; l'ACK finale porta il primo segmento di dati, che parte a ms.
Crescita della finestra. MSS. In slow start la finestra raddoppia ogni RTT (); a inizia la congestion avoidance con MSS per RTT ().
| RTT | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| finestra |
Segmenti inviati: (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 →: ; poi ). Poiché , finché la finestra è il mittente aspetta un RTT per finestra; dalla settima finestra : flusso continuo per i segmenti restanti.
Il termine finale è il ritorno dell'ACK dell'ultimo segmento (dal suo invio): in totale ms dall'inizio dell'apertura all'ultimo ACK. Lettura dei termini: ms l'handshake; ms le prime sei finestre, ciascuna lunga un RTT perché (con segmenti: ms); ms il flusso continuo (il primo dei segmenti parte all'inizio della settima finestra, l'ultimo dopo).
Domanda 4: KB, terzo segmento perso
MSS: la finestra di invio è , quindi cresce fino a e lì si ferma. Poiché ms ms, il mittente è limitato dalla finestra: segmenti per RTT.
Fino alla perdita.
- ms: parte il segmento ; il suo ACK torna a ms, .
- ms: partono i segmenti e ; il comincia a essere trasmesso a ms ed è perso. Il segmento arriva, il suo ACK () permette di inviare i segmenti , che arrivano fuori ordine e sono scartati: niente ACK nuovi.
- Il timeout scade ms dopo l'invio del segmento : a ms.
Dopo il timeout. MSS (almeno MSS) e . Si ritrasmette dal segmento (consegnati finora: e ; restano ). Finestre: (si raggiunge ssthresh), poi per RTT: (limite di rwnd): in RTT si inviano segmenti (somma dei primi numeri naturali1 + 2 + ... + n = n(n+1)/2Sommatorie →: ); ne restano :
- finestre da (ognuna dura un RTT, perché );
- una finestra finale da segmenti.
L'ultimo segmento parte dopo il primo della finestra finale, e il suo ACK torna dopo un RTT:
Lettura dei termini: ms è l'istante del timeout (dall'inizio dell'apertura); le nove finestre dopo il timeout; le undici finestre da ; la serializzazione dei segmenti dell'ultima finestra; 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 | ms | ms |
| 3 | ms | ms |
| 4 | ms | 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 ms; contandolo dalla fine della sua trasmissione si avrebbero ms in più.
Errori comuni
- Mettere nel conto la finestra di MSS come se fosse ancora in congestion avoidance a per RTT: dalla settima finestra il collegamento è saturo e il tempo cresce solo di per segmento.
- Con MSS dimenticare che la finestra si ferma a (non a ): il collegamento resta non saturo.
- Contare come consegnato il segmento o i successivi (scartati perché fuori sequenza).
- Prendere : si usa la finestra effettiva al momento della perdita.
(Verificato con Python: simulatore TCP a finestra intera con ACK cumulativi e timeout: ms e ms; UDP ms con il simulatore a eventi a coda.)
Versione ripasso
- UDP: ms.
- TCP: finestre ( seg.), poi continuo: ms.
- MSS, 3° segmento perso: timeout a ms; ; finestre ( seg.), restano : ms.
- Errore tipico: finestra oltre rwnd; contare consegnati i segmenti fuori sequenza.