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:
//
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] | |
#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 |
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/