Ce document constitue une introduction au simulateur ns dont l'utilisation permettra de réaliser les travaux pratiques du cours "Structure des réseaux informatiques et multimédia"".
Les travaux seront effectués à l'aide du simulateur ns. Ce simulateur a été conçu pour la recherche dans l'environnement Internet. Donc les simulations concernant ATM n'y sont pas disponibles. Les résultats des simulations ns peuvent être visualisés à l'aide de l'outil d'animation nam, ainsi que des programmes tels que xgraph ou gnuplot pour les graphiques.
Ns et nam sont installés sur le réseau 8 sur moon. Il vous suffit
sous tcsh de faire un source /app/NS-simulator/.tcshrc-ns
pour mettre à jour vos variables d'environnement.
Gnuplot remplace xgraph qui n'est pas disponible.
Ils sont également installés sur le serveur ms800 et sont donc disponibles sur les nouvelles machines. Il faut faire sous tcsh un source /usr/server/net-sim/.tcshrc-ns.
Ensuite ns se lance en tapant ns et nam se lance en tapant nam -a ce_que_vous_voulez nam_file.
L'option -a fait que nam crée une nouvelle instance et donc évite de se connecter à une instance déjà existante, ce qui avait pour effet de faire apparaître votre fenêtre nam sur l'écran de quelqu'un d'autre. Le numero de port utilisé par nam pour une machine donnée est dans le fichier ~/.nam-port
.
Comme pour la plupart des logiciels libres, la meilleure documentation sur ns est son propre source code en C++ et tcl... Cependant, pour les débutants, mieux vaut commencer par le tutoriel de Marc Greis (en anglais). Celui-ci possèdent de nombreux liens vers des documentations supplémentaires. Pour ceux qui préfèrent un tutoriel en français, le TP de Romain VINOT et Vu Anh NGUYEN peut être utile.
Le développement de ns suit une approche orientée objet où deux languages de programmation sont utilisés: C++ et tcl. Les modules de base du simulateur et les protocoles sont implantés en C++ avec une couche tcl au-dessus, qui fournit une interface flexible et facile à utiliser.
Pour ces travaux pratiques, il ne sera pas nécessaire de programmer en C++ directement, puisqu'on ne prévoit pas la création de nouveaux protocoles. Une connaissance moyenne de tcl est pourtant indispensable.
Voici quelques liens utiles:
Un manuel de référence sur ns est aussi disponible, pour ceux qui souhaitent mieux connaître le simulateur et son fonctionnement interne. Attention: ce document n'est pas forcément à jour (même si la dernière version date d'hier) et est loin d'être un tutoriel.
proc build_cbr { agent_from agent_to packet_size startTime interval } { global ns set src [new Application/Traffic/CBR] $src set packet_size_ $packet_size $src set rate_ [expr $packet_size * 8 / [$ns delay_parse $interval]] $src attach-agent $agent_from $ns at $startTime "$src start" return $src }
proc modify_rate_interval { src starttime endtime interval } { global ns set old_rate [$src set rate_] # set old_interval [$src set interval_] # $ns at $starttime "$src set interval_ $interval" $ns at $starttime "$src set rate_ [expr [$src set packet_size_] * 8 / [$ns delay_parse $interval]]" if {[string compare [string index $endtime 0] "+"] == 0} { $ns at [expr $starttime + [$ns delay_parse [string range $endtime 1 end]]] "$src set rate_ $old_rate" } else { $ns at $endtime "$src set rate_ $old_rate" # $ns at $endtime "$src set interval_ $old_interval" } }Les
#
indiquent une alternative pour changer le débit.
Queue set limit_ 15
$ns queue-limit $node0 $node3 20
/app/NS-simulator/ns-2.1b6/tcl/ex
out.tr
.
Une ligne de ce fichier a le format suivant:
<what> <time> <link source> <link dest> <name> <size> <flags> <flow id> <src node>.<port> <dest node>.<port> <sequence number> <unique id>
où
grep "\-\ .*\ 0\ 3\ tcp.*" out.tr | cut -d" " -f11 | sort -n | uniq | wc
.
Il est bien sûr possible de réaliser la même chose en Perl, en C (pattern matching dans la librairie gnu libc. Documentation
en dvi et en postscript à /locapp/bin/NS-simulator/doc
) ou en Tcl.set grfile [open out.gr w]
set recinterval 0.01
$ns at 0.0 "record"
close $grfile
proc record {} { global ns grfile recinterval tcp set now [$ns now] puts $grfile "$now [$tcp set window_] [$tcp set cwnd_]" $ns at [expr $now+$recinterval] "record" }Cet exemple est tiré du tutoriel de Marc Greis.
Last modified: Wed Mar 21 11:05:03 CET 2001