Teoría:
Viendo un poco de teoría y buscando lo que se quiere implementar es:
Teniendo una topología entre nodos, en esta hay una transmisión de datos, suponiendo que nodo A y nodo B (servidor) hace peticiones, se tiene un flujo en el ancho de banda, en determinado momento el ancho de banda se ve congestionado ocasionando la pérdida de paquetes, para poder controlar esto lo que se puede hacer es disminuir el tiempo en el que se mandan los paquetes, reduciendo así su congestión.
Código:
Para esta entrada mediré el rendimiento que se tiene entre los nodos, teniendo variaciones en el envio de paquetes.
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
##iniciamos | |
set ns [new Simulator] | |
##declaramos el tipo de enrutamiento | |
$ns rtproto LS | |
##archivo para la simulación | |
set nf [open a.nam w] | |
set nt [open trace.tr w] | |
$ns namtrace-all $nf | |
$ns trace-all $nt | |
##Crear archivo | |
set trace [open trace.tr w] | |
$ns trace-all $trace | |
proc finish {} { | |
global ns nf nt | |
$ns flush-trace | |
close $nf | |
close $nt | |
exec nam -a a.nam & | |
exit 0 | |
} | |
##creamos 6 nodos | |
for {set i 0} {$i < 6} {incr i} { | |
set n($i) [$ns node] | |
} | |
##dos nodos centrales | |
set ruter1 [$ns node] | |
set ruter2 [$ns node] | |
##unimos los nodos 0 al 3 con el ruter 1 al igual | |
## del 3 al 6 al ruter 2 | |
for {set i 0} {$i < 3} {incr i} { | |
$ns duplex-link $ruter1 $n($i) 1Mb 10ms DropTail | |
} | |
for {set i 3} {$i < 6} {incr i} { | |
$ns duplex-link $ruter2 $n($i) 1Mb 10ms DropTail | |
} | |
# TOPOLIGIA | |
##unimos los dos nodos centrales | |
$ns duplex-link $ruter1 $ruter2 1Mb 10ms DropTail | |
## unimos nodos | |
##aqui creamos el tip de mensaje udp | |
set udp0 [new Agent/UDP] | |
$ns attach-agent $n(4) $udp0 | |
# set udp0 flowid to 1 | |
$udp0 set fid_ 1 | |
##creamos el tamaño del los paquetes | |
## el intervalo de envio | |
set cbr0 [new Application/Traffic/CBR] | |
$cbr0 set packetSize_ 500 | |
$cbr0 set interval_ 0.005 | |
$cbr0 attach-agent $udp0 | |
set sinknode1 [new Agent/LossMonitor] | |
$ns attach-agent $ruter1 $sinknode1 | |
# Connect the UDP traffic source to Null sink | |
$ns connect $udp0 $sinknode1 | |
##Creamos otra conexion udp | |
set udp1 [new Agent/UDP] | |
$ns attach-agent $n(3) $udp1 | |
##creamos el tamaño del los paqueres | |
## el intervalo de envio | |
set cbr1 [new Application/Traffic/CBR] | |
$cbr1 set packetSize_ 500 | |
$cbr1 set interval_ 0.005 | |
$cbr1 attach-agent $udp1 | |
##aqui decidimos cual sera el destino | |
##final de nuestros paqueres | |
set null0 [new Agent/Null] | |
$ns attach-agent $n(1) $null0 | |
$ns connect $udp0 $null0 | |
$ns connect $udp1 $null0 | |
$ns at 0.5 "$cbr0 start" | |
$ns at 0.5 "$cbr1 start" | |
$ns at 4.5 "$cbr0 stop" | |
$ns at 4.5 "$cbr1 stop" | |
#finalizamos | |
$ns at 5.0 "finish" | |
$ns run |
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 INCREMENT 0.2 | |
set PacketSize_ 1024 | |
proc check {} { | |
global cbr1 cbr0 ns nf | |
global INCREMENT | |
set cbrBW1 [$cbr0 set ack_] | |
set cbrBW0 [$cbr1 set ack_] | |
set now [$ns now] | |
set d [expr $now - 0.1] | |
set resultado [expr $cbrBW1/$d * 8 * [$tcp1 set packetSize_]/1024] | |
set r2 [expr $cbrBW0/$d * 8 * [$tcp3 set packetSize_]/1024] | |
puts "$now $resultado $r2" | |
puts $nf "$now $resultado $r2" | |
$ns at [expr $now + $INCREMENT] "check" | |
} |
Resultados:
En los resultados obtenidos tuve un ligero problema, ya que me monstró error en el parseo, para poder obtener el rendimiento se empleó una fórmula que viene más abajo de referencia donde el paquete saliente es divido por el incremento que va teniendo éste por 8 que es una constante por el tamaño del paquete y todo esto dividido en 1024, que el es limite máximo que puede tener nuestro paquete.
Notas:
Faltó realizar u obtener una simulación en gráfica, ya que los resultados obtenidos no son del todo satisfactorios.
Referencias:
http://web.mst.edu/~bckd2/CpE401/project/NS2%20simulations/special_study%20on%20TCP.pdf
http://www2.ensc.sfu.ca/~ljilja/ENSC835/Spring02/Projects/bian_zhang.hilary/Hilary_and_Bian_Report.pdf
http://www.profesores.frc.utn.edu.ar/sistemas/ingsanchez/Redes/Archivos/CCong.asp
Esta tarea no era para _medir_ el desempeño (ya tuvimos una tarea anterior sobre ese tema), sino para tomar acciones que afectan el desempeño con la finalidad de evitar congestión. Tu parte experimental no coincide con tu párrafo teórico. 1 pt por por lo menos mencionar qué es congestión y cómo se podría evitar.
ResponderEliminar