martes, 30 de abril de 2013

Control de Congestion

Para esta entrada se nos encargó simular control de congestion en ns-2.

Para lograr esto, se reciclaron conocimientos de tareas anteriores para crear las topologías y para simular el tráfico. Ahora lo nuevo fue integrar una fórmula para calcular el ancho de banda de la red. En base a este ancho de banda conocido, decidimos si aumentamos o disminuimos la cantidad de paquetes que se envían.

Las fórmulas usadas en el código, y cómo graficar en xgraph se encontró en este enlace.

El código:

//
set ns [new Simulator]
#Protocolo de Ruteo LINK-STATE
$ns rtproto LS
set nf [open a.nam w]
set nt [open trace.tr w]
set bytes [open out1.tr w]
set perdidos [open out2.tr w]
$ns namtrace-all $nf
$ns trace-all $nt
proc finish {} {
global ns nf nt bytes perdidos
$ns flush-trace
close $nf
close $nt
close $bytes
close $perdidos
exec xgraph out0.tr out2.tr -geometry 800x400 &
exec nam -a a.nam &
exit 0
}
puts stdout "Cuantos nodos: "
gets stdin x
for {set i 0} {$i < $x} {incr i} {
set n($i) [$ns node]
$n($i) color blue
}
#nodo central
set n0 [$ns node]
set size 500
$n0 color red
#Se unen los nodos extras con el nodo central
for {set i 0} {$i < $x} {incr i} {
$ns duplex-link $n0 $n($i) 1Mb 10ms DropTail
}
for {set i 0} {$i < $x} {incr i} {
set udp($i) [new Agent/UDP]
$ns attach-agent $n0 $udp($i)
$udp($i) set fid_ 1
}
for {set i 0} {$i < $x} {incr i} {
set cbr($i) [new Application/Traffic/CBR]
$cbr($i) set packetSize_ 500
$cbr($i) set interval_ 0.001
$cbr($i) attach-agent $udp($i)
}
for {set i 0} {$i < $x} {incr i} {
set null($i) [new Agent/LossMonitor]
$ns attach-agent $n($i) $null($i)
$ns connect $udp($i) $null($i)
}
proc calculos {} {
global cbr null x cbr1 null1 n bytes perdidos
set ns [Simulator instance]
set time 0.05
#paquetes recibidos
set bits [$null(0) set bytes_]
#paquetes perdidos
set nbits [$null(0) set nlost_]
#calcula ancho de banda
set ba [expr $bits/$time*8/1000000]
#calcula tiempo actual de simulacion
set now [$ns now]
puts $bytes "$now $bits"
puts $perdidos "$now $nbits"
#si ancho de banda esta congestionado...
if {$ba>1} {
#disminuir tamano de paquetes y tiempo entre paquetes
for {set i 0} {$i < $x} {incr i} {
$cbr($i) set packetSize_ 100
$cbr($i) set interval_ 0.5
}
}
#si ancho de banda no esta congestionado...
if {$ba<0.2} {
#aumentar tamano de paquetes y tiempo entre paquetes
for {set i 0} {$i < $x} {incr i} {
$cbr($i) set packetSize_ 500
$cbr($i) set interval_ 0.001
}
}
$ns at [expr $now+$time] "calculos"
}
$ns at 0.0 "calculos"
for {set i 0} {$i < $x} {incr i} {
$ns at 0.5 "$cbr($i) start"
}
$ns at 40.0 "finish"
$ns run
view raw Congestion.tcl hosted with ❤ by GitHub
//

El resultado:

La línea verde muestra que la cantidad de paquetes perdidos es poca, esto debido a la poca congestión de la red.

Referencias:
Tutorial de xgraph: http://www.isi.edu/nsnam/ns/tutorial/

1 comentario:

  1. Explicación mínima, esencialmente un sólo mecanismo, experimentación extremadamente limitada. 2 pts.

    ResponderEliminar