[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ns] Queue Monitoring : an example script ... A Flow Monitoring script would be nice to have too ;-)



OK as L. suggested here's a little script to do some queue monitoring.

This script monitores 2 things :
(i) various queue statistics (queue size, drops, link utilization) on the
link n1 - n3
(ii)does some tcp round-trip-time measurement

Everything is plotted in xgraph

I'm sorry because there might be inaccuracies and its annotated in French

<--snip-->

if {$argc == 1} {
set tick       [lindex $argv 0]
} else {
puts "  Usage: ns $argv0 TCPTick_in_seconds (real)"
puts "      n0"
puts "        \\"
puts "5Mb,10ms \\   1.5Mb,10ms"
puts "          n1 ---------- n3"
puts "5Mb,10ms /"
puts "        /"
puts "      n2"
puts "  TCPTick_ determine la precision que l'on veut dans la mesure du RTT"
puts "  TCPTick_ a 0.5 => un rtt de 0.20 devient un rtt de 0 et un rtt de
0.78 devient un rtt de 1"
puts "  TCPTick_ a 0.01 => un rt de 0.20 reste un rtt de 0.20 !"
puts ""
exit 1
}

#Create a simulator object
set ns [new Simulator]

#On definit les codes couleurs
$ns color 0 red
$ns color 1 blue

#On cree un fichier ouvert en ecriture pour enregistrer l'animation NAM
set namf [open queue.nam w]
#On cree un fichier ouvert en ecriture pour enregistrer l'animation Ns
set nsf [open queue.ns w]
$ns namtrace-all $namf
$ns trace-all $nsf
#On cree divers fichiers ouverts en ecriture afin que la procedure record
puisse y ecrire les infos utiles relatives a la file d'att
set qsize [open queuesize.tr w]
set qbw [open queuebw.tr w]
set qlost [open queuelost.tr w]
#On cree un fichier pour mesurer le Round-trip-time
set trace_rtt0 [open rtt0.rtt w]
set trace_rtt1 [open rtt1.rtt w]

#On cree les noeuds
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]

#On annote les noeuds
$n1 label "Switch (25)"

#On cree la procedure de fin
proc finish {} {
global ns namf qsize qbw qlost trace_rtt0 trace_rtt1
$ns flush-trace
close $qsize
close $qbw
close $qlost
close $trace_rtt0
close $trace_rtt1
#On execute NAM
exec nam queue.nam &
#On execute xgraph pour grapher les statistiques sur la file d'attente
exec xgraph queuesize.tr -geometry 800x400 & -t "Taille de la fille
d'attente entre n1 - n3" & -x "secondes" & -y "# paquets" & -fg
exec xgraph queuebw.tr -geometry 800x400 -t "Bande Passante consommee sur le
lien n1 - n3" & -x "secondes" & -y "Kbps" & -fg white &
exec xgraph queuelost.tr -geometry 800x400 -t "# Paquets Perdus sur le lien
n1 n3" & -x "secondes" & -y "paquets" & -fg white & -bg
#On execute xgraph pour grapher le RTT
exec xgraph rtt0.rtt rtt1.rtt -geometry 1000x500 & -t "Estimation du Round
Trip Time pour une connexion TCP" & -x "Temps" & -y "RTT
}

#On cree la procedure d'enregistrement
proc record {} {
global ns namf qmon_size qmon_bw qmon_lost qsize qbw qlost n0 n1 n2 n3 tcp0
tcp1 trace_rtt0 trace_rtt1
set ns [Simulator instance]
set time 0.05
set now [$ns now]
#On obtient les valeurs des rtt pour les sources et on les ecrit dans des
fichiers associes
set curr_rtt0 [expr [$tcp0 set rtt_] * [$tcp0 set tcpTick_]]
set curr_rtt1 [expr [$tcp1 set rtt_] * [$tcp1 set tcpTick_]]
puts $trace_rtt0 "$now $curr_rtt0"
puts $trace_rtt1 "$now $curr_rtt1"
#On obtient les valeurs des variables liees aux files d'attente et on ecrit
ces valeurs dans les fichiers associes
$qmon_size instvar size_ pkts_ barrivals_ bdepartures_ parrivals_
pdepartures_ bdrops_ pdrops_ bytesInt_ pktsInt_
puts $qsize "$now [expr $parrivals_-$pdepartures_-$pdrops_]"
$qmon_bw instvar size_ pkts_ barrivals_ bdepartures_ parrivals_ pdepartures_
bdrops_ pdrops_ bytesInt_ pktsInt_
puts $qbw "$now [expr $bdepartures_*8/1024/$time]"
set bdepartures_ 0
$qmon_lost instvar size_ pkts_ barrivals_ bdepartures_ parrivals_
pdepartures_ bdrops_ pdrops_ bytesInt_ pktsInt_
puts $qlost "$now [expr $pdrops_/$time]"
$ns at [expr $now+$time] "record"
}

#On cree les liens
$ns duplex-link $n1 $n3 1.5Mb 10ms DropTail
$ns duplex-link $n0 $n1 5Mb 10ms DropTail
$ns duplex-link $n2 $n1 5Mb 10ms DropTail
$ns duplex-link-op $n1 $n3 orient right
$ns duplex-link-op $n0 $n1 orient right-down
$ns duplex-link-op $n2 $n1 orient right-up
$ns duplex-link-op $n1 $n3 queuePos 0.5
$ns queue-limit $n1 $n3 25

set tcp0 [$ns create-connection TCP $n0 TCPSink $n3 0]
$tcp0 set packetSize_ 1460
$tcp0 set tcpTick_ $tick
$tcp0 set fid_ 0
#Create a CBR traffic source and attach it to tcp0
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ 1460
$cbr0 set rate_ 1200k
$cbr0 attach-agent $tcp0

set tcp1 [$ns create-connection TCP $n2 TCPSink $n3 1]
$tcp1 set packetSize_ 1460
$tcp1 set tcpTick_ $tick
$tcp1 set fid_ 1
#Create a CBR traffic source and attach it to tcp1
set cbr1 [new Application/Traffic/CBR]
$cbr1 set packetSize_ 1460
$cbr1 set rate_ 1200k
$cbr1 attach-agent $tcp1

####################
# QUEUE MONiTORiNG #
####################
#Il faut un monitor-queue par variable a mesurer (taille de la file, bande
passante)

set qf_size [open queue.size w]
set qmon_size [$ns monitor-queue $n1 $n3 $qf_size 0.05]
set qf_bw [open queue.bw w]
set qmon_bw [$ns monitor-queue $n1 $n3 $qf_bw 0.05]
set qf_lost [open queue.lost w]
set qmon_lost [$ns monitor-queue $n1 $n3 $qf_lost 0.05]

#On demarre la simulation
$ns at 0.0 "record"
$ns at 0.1 "$cbr0 start"
$ns at 0.5 "$cbr1 start"
$ns at 2.1 "$cbr0 stop"
$ns at 2.5 "$cbr1 stop"
#Call the finish procedure after 5 seconds of simulation time
$ns at 3.0 "finish"

#Run the simulation
$ns run

queue_rtt.tcl