Processing math: 100%

April 30, 2013

Control de congestión

Para esta semana se nos pidió realizar un algoritmo de control de congestión, platicando con mis compañeros Alejandro Avendaño y Eduardo Triana comentamos que una forma sencilla sería medir la banda ancha del nodo al que llega el tráfico y si el tráfico que llega es mayor tomar alguna medida.

Bueno lo que hice al igual que mis compañeros (creo) fue que cuando la banda o en este caso es un buffer pues resetear toda la transmisión de paquetes y así de esta manera evitar que se tiren los paquetes por no tener cupo en el enlace.

En el código genero tráfico de manera exponencial y utilizó tres archivos distintos para tres ejemplos en este caso

Después para obtener cuánto se está consumiendo del enlace o el total de paquetes que ya hay en la cola se hace con la siguiente instrucción:

set bw0 [$sink0 set bytes_]


Código

set ns [new Simulator]
set f0 [open f0.tr w]
set f1 [open f1.tr w]
set f2 [open f2.tr w]
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
#Conexiones
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
close $f0
close $f1
close $f2
exec xgraph out0.tr out1.tr out2.tr -geometry 800x600 &
exit 0
}
proc generador { node sink size burst idle rate } {
set ns [Simulator instance]
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 congestion {} {
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 band1 [expr $bw0]
set band2 [expr $bw1]
if {$band1>12} {
puts stdout "Hay congestion!!"
$sink0 set bytes_ 0
}
if {$band1>12} {
puts stdout "Hay congestion!!"
$sink1 set bytes_ 0
}
ns at [expr now+$time] "congestion"
}
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
#Genera trafico
set source0 [generador n0 sink0 200 2s 1s 50k]
set source1 [generador n1 sink1 200 2s 1s 150k]
set source2 [generador n2 sink2 200 2s 1s 400k]
$ns at 0.0 "congestion"
#Inicio de origen de trafico
ns at 6.0 "source0 start"
ns at 6.0 "source1 start"
ns at 6.0 "source2 start"
ns at 30.0 "source0 stop"
ns at 30.0 "source1 stop"
ns at 30.0 "source2 stop"
$ns at 40.0 "finish"
$ns run
view raw congestion.tcl hosted with ❤ by GitHub





Como se puede apreciar en la gráfica hay momentos donde se vuelve a realizar la transmisión (comienza desde 0), que es cuando hay congestión de tráfico.

No comments:

Post a Comment