Esercitazione 2 • Studio dei meccanismi TCP per il controllo della congestione • Analisi del comportamento della finestra in presenza di: – Algoritmo di Slow Start – Algoritmo di Congestion Avoidance – Algoritmi di Fast Retransmit e Fast Recovery • Confronto delle prestazioni dei diversi algoritmi • Grandezze da monitorare in funzione del tempo – andamento della finestra di trasmissione – valore della soglia di Slow Start – andamento del numero di sequenza dei pacchetti N. 1 Meccanismi di incremento della finestra • Slow start: – Si applica inizialmente, W cresce di 1 per ogni ACK ricevuto – cwnd= cwnd + 1; – Consente un incremento rapido della finestra (esponenziale) e quindi del throughput – L’ampiezza della finestra raddoppia ad ogni RTT • Congestion avoidance: – Dopo aver raggiunto la soglia, W si incrementa di 1/W ogni ACK (1 ogni RTT) – Evita di saturare la banda disponibile • Assenza di Slow Start: – La finestra si apre subito al massimo – cwnd=wnd N. 2 Evento di perdita • Il TCP riconosce la perdita di pacchetto mediante – Presenza di 3 ACK duplicati – Scadere del time out di ritrasmissione • Il TCP reagisce diversamente nei due casi – diverso meccanismo di recupero della perdita – diverso aggiornamento del valore della finestra a valle della perdita – diversa attività della sorgente in trasmissione N. 3 Scenari di rete per la simulazione • Topologia 1: analisi SS e CA Router Nodo Destinazione Nodo Sorgente • Topologia 2: analisi Fast Retr./Fast Rec. Router Nodo Sorgente Nodo Destinazione N. 4 Classe Agent/TCP/RFC793edu • Variabili membro della classe e valori di default (SS+CA) (CA) (SS) N. 5 Script caso 1 • Possibilità di lanciare la simulazione fornendo come parametri di ingresso: – dimensione della coda del router – tipo di algoritmo di gestione della congestione • Algoritmi selezionabili: – Solo Slow Start – Assenza di Slow Start (valore fisso della finestra) – Solo Congestion Avoidance – Slow Start e Congestion Avoidance • Valore massimo dell’advertised window = 20 N. 6 Script caso 1: step 1 • Istanza al simulatore • Apertura in scrittura dei file per registrare i dati utili all’analisi della simulazione set set set set set set $ns $ns ns [new Simulator] trace_nam [open $sim.nam w] trace_all [open $sim.tr w] trace_swnd [open wnd.$sim w] numseq [open sn.$sim w] loss [open loss.$sim w] namtrace-all $trace_nam trace-all $trace_all N. 7 Script caso 1: step 2 • Definizione della topologia # nodo di trasmissione set n0 [$ns node] # router centrale set n1 [$ns node] # nodo di ricezione set n2 [$ns node] # caratterizzazione dei link $ns duplex-link $n0 $n1 10Mb 100ms DropTail $ns duplex-link $n1 $n2 256Kb 100ms DropTail N. 8 Script caso 1: step 3 • • • • • Impostazione della dimensione max della coda del router Monitor del riempimento della coda Definizione dell’agent Impostazione della dimensione della finestra Definizione del tipo di applicazione $ns queue-limit $n1 $n2 $dim_coda_router1 set qmon [$ns monitor-queue $n1 $n2 1 2] set tcp1 [$ns create-connection TCP/RFC793edu $n0 TCPSink $n2 1] #equivale a 5 istruzioni singole: #set tcp1 [new Agent/TCP/RFC793edu] #set tcp2 [new Agent/TCPSink] #$ns attach-agent $n0 $tcp1 Valore massimo #$ns attach-agent $n2 $tcp2 dell’advertised #$ns connect $tcp1 $tcp2 window $tcp1 set window_ 20 Traffico trasferimento dati set ftp1 [new Application/FTP] Sfrutta tuttta la banda $ftp1 attach-agent $tcp1 N. 9 Script caso 1: step 4 • Procedura “standard” per il monitoraggio della finestra proc sampleswnd { interval } { global ns trace_swnd tcp1 set now [$ns now] set curr_cwnd [$tcp1 set cwnd_] set curr_wnd [$tcp1 set window_] if { $curr_wnd < $curr_cwnd } { set swnd $curr_wnd swnd=min(cwnd,wnd) } else { set swnd $curr_cwnd } puts $trace_swnd "$now $swnd" $ns at [expr $now + $interval] "sampleswnd $interval" } N. 10 Script caso 1: step 5 • Procedura per il monitoraggio della perdita proc LossMon { interval } { global ns qmon loss set now [$ns now] set curr_loss [$qmon set pdrops_] puts $loss "$now $curr_loss" $ns at [expr $now + $interval] "LossMon $interval" } N. 11 Script caso 1: step 8 • Procedura per il monitoraggio dei numeri di sequenza e del valore di ssthresh proc altri_tcp_var { step } { global ns tcp1 numseq set now [$ns now] set seqno [$tcp1 set t_seqno_ ] set sst [$tcp1 set ssthresh_ ] puts $numseq "$now $seqno $sst" $ns at [expr $now+$step] "altri_tcp_var $step" } N. 12 Script caso 1: step 8 • Procedura di fine simulazione proc finish {} { global ns loss trace_nam trace_all trace_swnd numseq $ns flush-trace close $trace_nam close $trace_all close $trace_swnd close $numseq close $loss exit 0 } N. 13 Script caso 1: step 9 • Scheduling della simulazione $ns $ns $ns $ns $ns $ns at 0.0 "sampleswnd 0.05" at 0.0 "altri_tcp_var 0.05" at 0.0 "LossMon 0.05" at 0.1 "$ftp1 start" at 12.0 "finish" run N. 14 Esecuzione dello script 1 Sink 0 1 2 Comando per eseguire lo script: ns es2_acronimo_alg.tcl acronimo_alg dim_buffer ss, noss, ca 18 ssca 8 N. 15 Analisi dei risultati (1/2) Comandi per analizzare i risultati delle simulazioni: Animazione con NAM ./nam “nome_file.nam” Grafici con Gnuplot gnuplot plot “wnd.acronimo_alg” w l plot “sn.acronimo_alg” w l exit with lines uscire da gnuplot N. 16 Analisi dei risultati (2/2) Comandi per salvare il grafico in formato eps: gnuplot set terminal postscript eps set output “wnd.acronimo_alg.eps” plot “wnd.acronimo_alg” w l exit Per visualizzare il grafico: gv file.eps Nb: per visualizzare i file .eps in windows occorrono ghostview e ghostscript N. 17 Gnuplot: confronto finestre tra ss e noss • Aprire gnuplot con wgnuplot.exe nella certella esercitazione • set style data linespoints • set yrange[0:28] • set xrange[0:4] • set xlabel “tempo di simulazione (s)” • set ylabel “finestra di trasmissione (segmenti)” • plot wnd.ss title “con Slow Start”, wnd.noss “Senza Slow Start” N. 18 Risultati: andamento della finestra • L’apertura graduale della finestra con lo SS evita la trasmissione contemporanea di un numero di segmenti maggiori di quelli memorizzabili dal buffer Finestra di trasmissione (segmenti) 28 26 24 RTO: chiusura della finestra ad 1 SS: presente SS: assente 22 20 18 16 14 12 10 8 6 4 2 0 0 0.5 1 1.5 2 tempo (s) 2.5 3 3.5 4 N. 19 Gnuplot: confronto numero sequenza tra ss e noss • Aprire gnuplot con wgnuplot.exe nella certella esercitazione • set style data linespoints • set yrange[0:100] • set xrange[0:4] • set xlabel “tempo di simulazione (s)” • set ylabel “numero di sequenza dei segmenti” • plot sn.ss title “con Slow Start”, sn.noss “Senza Slow Start” N. 20 Risultati: evoluzione del numero di sequenza • Maggior numero di segmenti nuovi trasmessi in presenza di SS (>90 in 4 sec) • Senza SS presenza di ritrasmissioni (fasi decrescenti per il sequence number) 100 SS: presente SS: assente 90 Numero di sequenza 80 70 60 50 40 30 20 10 0 0 0.5 1 1.5 2 2.5 3 3.5 4 tempo (sec) N. 21 Gnuplot: confronto finestre tra ss e noss • Una volta aperto Gnuplot: • set style data linespoints • set yrange[0:28] • set xrange[0:4] • set xlabel “tempo di simulazione (s)” • set ylabel “finestra di trasmissione (segmenti)” • plot wnd.ss title “con Slow Start”, wnd.noss “Senza Slow Start” N. 22 Risultati: crescita exp. (SS) e lineare (CA) Finestra di trasmissione (segmenti) • Apertura lenta della finestra nel caso di crescita lineare (utile in prossimità di situazioni di possibile congestione) • Assenza di perdita in entrambi i casi 28 26 24 22 20 18 16 14 12 10 8 6 4 SS CA 2 0 0 0.5 1 1.5 2 2.5 tempo (sec) 3 3.5 4 N. 23 Gnuplot: confronto numero sequenza tra ss e noss • Aprire gnuplot con wgnuplot.exe nella certella esercitazione • set style data linespoints • set yrange[0:100] • set xrange[0:4] • set xlabel “tempo di simulazione (s)” • set ylabel “numero di sequenza dei segmenti” • plot sn.ss title “con Slow Start”, sn.noss “Senza Slow Start” N. 24 Risultati: evoluzione del numero di sequenza • Una crescita lenta della finestra comporta una minore efficienza nell’utilizzo della risorse di rete – minor quantità di informazione trasmessa a parità di tempo di riferimento 100 SS CA 90 Seqeunce Number (segmenti) 80 70 60 50 40 30 20 10 0 0 0.5 1 1.5 2 2.5 3 3.5 4 tempo (sec) N. 25 Algoritmo di congestion avoidance • cwnd<ssthresh: regime di Slow Start. • cwnd>ssthresh: regime di Congestion Avoidance. • Valore iniziale della ssthresh molto alto, nella simulazione pari al cwnd. • Stima automatica della capacità della rete e aggiornamento dinamico della ssthresh grazie al meccanismo di perdita del TCP. • La coda di n1 è scelta molto piccola (8) per “favorire” le perdite nella simulazione. N. 26 Risultati: SS e CA “CWND_ssca" Sliding Window (segments) 25 time out Slow Start geometrica 20 15 ssthresh 10 5 Congestion Avoidance lineare Slow Start 0 0 2 4 6 8 10 Simulation Time (s) • t = 2.12 perdita del pacchetto • t = 2.63 arrivo dell’ACK duplicato, il nodo sorgente smette ti trasmettere • t = 3.46 scade il Time-Out, si riprende in regime di Slow Start N. 27 Script caso 2 Studio dell’algoritmo di Fast Retransmit • Parametro d’ingresso: algoritmo • Casi possibili: – Presenza di Fast Retransmit (fret) – Assenza di Fast Retransmit (nofret) • Parametri TCP di set-up: – Valore della finestra di trasmissione: 20 segmenti – Dimensione del buffer del router: 19 segmenti (in modo tale da perdere esattamente un pacchetto). N. 28 Script caso 2: Step 1 • Istanza al simulatore • Apertura in scrittura dei file per registrare i dati utili all’analisi della simulazione # Creazione dell’oggetto simulator set ns [new Simulator] # Apertura dei file dei risultati in “w” set trace_nam [open $sim.nam w] set trace_wnd [open wnd.$sim w] set trace_seq [open sn.$sim w] $ns namtrace-all $trace_nam N. 29 Esecuzione dello script 2 Sink 0 1 2 9 Comando per eseguire lo script: ns es2_acronimo_alg.tcl acronimo_alg: fret, nofret Per l’analisi dei risultati vedere la slide relativa dello script 1 N. 30 Risultati: finestra di trasmissione (no-FRet) 22 20 Finestra di trasmissione (segmenti) Fast Retr.: Assente Perdita Time out 18 16 14 12 10 8 6 4 2 Wmax=20; Buffer_size=19 0 0 • • • 5 10 15 Tempo (s) 20 25 30 3.11 sec < t 6.28 sec: – tx di un nuovo pacchetto per ogni ACK relativo ai pacchetti precedente al perso t=6.28 sec: rx di un DACK; non si trasmette. Si deve attendere lo scadere del RTO t=10.31 sec: scade il RTO, Chiusura della finestra ad 1 ed inizio della fase N. 31 di SS Risultati: finestra di trasmissione (FRet) Perdita • t=6.61 sec: ricezione del terzo DACK • Ritrasmissione del pacchetto perso: • t=9.1 sec: ricezione del primo ACK non duplicato relativo al segmento ritrasmesso • Anticipo la reazione del TCP ad un evento di perdita N. 32 Risultati: evoluzione del numero di sequenza 250 Fast Retr. No Fast Retr. 225 204 197 Numero di sequenza 200 175 150 125 100 75 50 25 0 0 5 10 15 20 25 30 Tempo (sec) L’algoritmo di FRet consente di trasmettere un maggior numero di nuovi pacchetti nello stesso intervallo di tempo N. 33 Script caso 3 • Studio dell’algoritmo di Fast Recovery (C’è ovviamente anche il Fast Retransmit). • Si usa la versione FullTCP che implementa il TCP Reno in maniera bidirezionale. • Si attiva alla ricezione del 3° DACK. 5 passi: 1. ssthresh=cwnd/2 2. ritrasmetto il segmento “mancante” (fast retransmit) 3. cwnd=ssthresh+3 4. Per ogni DACK ricevuto incremento la finestra di 1 e se ammesso trasmetto un nuovo segmento 5. Alla ricezione dell’ACK per il segmento ritrasmesso: • cwnd=ssthresh • la sorgente riparte a trasmettere in fase di CA N. 34 Esecuzione dello script 3 Sink 0 1 2 9 Comando per eseguire lo script: ./ns es2_frec.tcl N. 35 Risultati: finestra di trasmissione (Frec) Finestra di Trasmissione (segmenti) 20 15 10 5 0 0 2 4 6 8 10 12 Tempo (sec) 14 16 18 20 • t=1.88 sec: evento di perdita di un pacchetto • 1.88 sec < t < 3.89 sec – buffer non vuoto (19 pacchetti da smaltire) – ad ogni nuovo ACK si ha la trasmissione di un nuovo pacchetto – il 20° riscontro è il primo DACK • t=3.89 sec: ricezione di 3 DACK; ritrasmissione fast, N. 36 aggiornamento finestra Risultati: finestra di trasmissione (Frec) • 3.89 sec < t < 5.46 sec: per ogni DACK incremento di 1 il valore della finestra – in tal caso però la sorgente non trasmette, avendo già trasmesso tutti i pacchetti permessi dal valore della finestra • t=5.46 sec: ricezione del riscontro del pacchetto ritrasmesso fast – si tratta di un riscontro cumulativo che riscontra anche tutti i pacchetti ricevuti • Sorgente TCP abilitata a trasmettere con finestra pari al valore di ssthresh (cwnd/2= 10) N. 37