Tarea 5 - Experimento de congestión
Hola compañeros y gente que regularmente visita mi blog, esta entrada corresponde a la tarea 5 de la materia de Redes de Telecomunicaciones. La entrada consiste en la realización de experimentos de congestión, desde la creación de una topología, generación de tráfico y realización de esquemas de control de congestión.
Bien, una de las cosas teóricas que recuerdo de la clase de transmisión de datos es el tema de windowing que consiste en evitar la pérdida de paquetes debido a al desborde del buffer del dispositivo receptor, de manera que cuando el buffer está lleno, el emisor deja de enviar paquetes, luego continua cuando se aligere la carga del mismo.
Esto además de evitar la pérdida de paquetes también podría intervenir positivamente para evitar la congestión de la red, porque se deja de enviar tráfico que no serviría de nada porque se tiraría al llegar al buffer desbordado.
Lo que yo realizé fue una especie de este feature en el ns2. Leo el número de bytes recibidos, luego con una simple comparación (simulación de buffer) de cuando el buffer está lleno, reseteo la transmisión.
El código tcl es el siguiente:
Las trazas obtenidas para las 2 instancias de tráfico son las siguientes:
out0 (solo un fragmento)
Gráfica obtenida (en color rojo tenemos las trazas del archivo out0 y en verde las trazas del archivo out1, mostradas anteriormente).
Salidas en terminal de los buffer llenos.
Esto es todo por mi parte.
Cualquier duda o aclaración pueden dejarla en comentarios.
Esto además de evitar la pérdida de paquetes también podría intervenir positivamente para evitar la congestión de la red, porque se deja de enviar tráfico que no serviría de nada porque se tiraría al llegar al buffer desbordado.
Lo que yo realizé fue una especie de este feature en el ns2. Leo el número de bytes recibidos, luego con una simple comparación (simulación de buffer) de cuando el buffer está lleno, reseteo la transmisión.
El código tcl es el siguiente:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
set ns [new Simulator] | |
#Salidas para las trazas | |
set f0 [open out0.tr w] | |
set f1 [open out1.tr w] | |
set f2 [open out2.tr w] | |
#Creacion de 5 nodos | |
set n0 [$ns node] | |
set n1 [$ns node] | |
set n2 [$ns node] | |
set n3 [$ns node] | |
set n4 [$ns node] | |
#Conexion de los nodos, todos con enlace de 1Mega | |
$ns duplex-link $n0 $n3 1Mb 100ms DropTail | |
$ns duplex-link $n1 $n3 1Mb 100ms DropTail | |
$ns duplex-link $n2 $n3 1Mb 100ms DropTail | |
$ns duplex-link $n3 $n4 1Mb 100ms DropTail | |
proc finish {} { | |
global f0 f1 f2 | |
#Cerrar los archivos de salida | |
close $f0 | |
close $f1 | |
close $f2 | |
#Llamada a xgraph para visualizar los resultados | |
exec xgraph out0.tr out1.tr out2.tr -geometry 800x600 & | |
exit 0 | |
} | |
proc agregarTrafico{ node sink size burst idle rate } { | |
#Instancia del simulador | |
set ns [Simulator instance] | |
#Agente UDP | |
set source [new Agent/UDP] | |
$ns attach-agent $node $source | |
set traffic [new Application/Traffic/Exponential] | |
$traffic set packetSize_ $size | |
$traffic set burst_time_ $burst | |
$traffic set idle_time_ $idle | |
$traffic set rate_ $rate | |
$traffic attach-agent $source | |
$ns connect $source $sink | |
return $traffic | |
} | |
proc record {} { | |
global sink0 sink1 sink2 f0 f1 f2 | |
#Instancia del simulador | |
set ns [Simulator instance] | |
set time 0.5 | |
#Bytes recibidos | |
set bw0 [$sink0 set bytes_] | |
set bw1 [$sink1 set bytes_] | |
#Tiempo actual | |
set now [$ns now] | |
puts $f0 "$now [expr $bw0]" | |
puts $f1 "$now [expr $bw1]" | |
set res1 [expr $bw0] | |
set res2 [expr $bw1] | |
if {$res1>12} { | |
puts stdout "Full buffer 1" | |
$sink0 set bytes_ 0 | |
} | |
if {$res1>12} { | |
puts stdout "Full buffer 2" | |
$sink1 set bytes_ 0 | |
} | |
$ns at [expr $now+$time] "record" | |
} | |
#Trafico agregado al nodo 4 | |
set sink0 [new Agent/LossMonitor] | |
set sink1 [new Agent/LossMonitor] | |
set sink2 [new Agent/LossMonitor] | |
$ns attach-agent $n4 $sink0 | |
$ns attach-agent $n4 $sink1 | |
$ns attach-agent $n4 $sink2 | |
#Origen de trafico | |
set source0 [agregarTrafico $n0 $sink0 200 2s 1s 100k] | |
set source1 [agregarTrafico $n1 $sink1 200 2s 1s 200k] | |
set source2 [agregarTrafico $n2 $sink2 200 2s 1s 300k] | |
#Recepcion de paquetes | |
$ns at 0.0 "record" | |
#Inicio de origen de trafico | |
$ns at 10.0 "$source0 start" | |
$ns at 10.0 "$source1 start" | |
$ns at 10.0 "$source2 start" | |
#Detener el trafico | |
$ns at 50.0 "$source0 stop" | |
$ns at 50.0 "$source1 stop" | |
$ns at 50.0 "$source2 stop" | |
#Lamada al procedure finish, 60 segundos | |
$ns at 60.0 "finish" | |
#Correr la simulacion | |
$ns run |
Las trazas obtenidas para las 2 instancias de tráfico son las siguientes:
out0 (solo un fragmento)
0 0
0.5 0
1 0
1.5 0
2 0
2.5 0
3 0
3.5 0
4 0
4.5 0
5 0
5.5 0
6 0
6.5 0
7 0
7.5 0
8 0
8.5 0
9 0
9.5 0
10 0
10.5 0
11 2600
11.5 8800
12 6200
12.5 6200
13 6400
13.5 6200
14 6200
14.5 6200
15 6400
out1 (solo un fragmento)
4.5 0
5 0
5.5 0
6 0
6.5 0
7 0
7.5 0
8 0
8.5 0
9 0
9.5 0
10 0
10.5 0
11 0
11.5 0
12 0
12.5 0
13 9000
13.5 12600
14 12400
14.5 12600
15 12400
15.5 12600
Gráfica obtenida (en color rojo tenemos las trazas del archivo out0 y en verde las trazas del archivo out1, mostradas anteriormente).
Salidas en terminal de los buffer llenos.
Esto es todo por mi parte.
Cualquier duda o aclaración pueden dejarla en comentarios.
Saludos a todos!