Simulator Network 2 NS-2 Dans ce paragraphe nous allons donner les bases du langage Tcl, les principes de l'otcl et les explications sur le mécanisme qui permet à un programme C d'utiliser un interpréteur Tcl. Pour écrire un programme en NS-2 on peut utiliser un éditeur de texte de notre choix (vim, emacs, joe,...). NS-2 est basé sur le langage TCL. On doit donc donner une extension.tcl à nos fichiers. Quand on a écrit un programme simu.tcl, on peut faire partir la simulation en tapant ns simu.tcl. Si notre simulation génère des traces, on peut les regarder à l aide d un éditeur de texte. Si notre simulation génère un fichier nom.nam, on peut l ouvrir en tapant nam nom.nam. Tcl est un langage de commande comme le shell UNIX mais qui sert à contrôler les applications. Son nom signifie Tool Command Language. Tcl offre des structures de programmation telles que les boucles, les procédures ou les notions de variables. Il y a deux principales façons de se servir de Tcl: comme un langage autonome interprété ou comme une interface applicative d'un programme classique écrit en C ou C++. En pratique, l'interpréteur Tcl se présente sous la forme d'une bibliothèque de procédures C qui peut être facilement incorporée dans une application. Cette application peut alors utiliser les fonctions standards du langage Tcl mais également ajouter des commandes à l'interpréteur. Type et structures de contrôle du langage (O)Tcl - La fin de ligne est le délimiteur d'instructions - le seul type de données est le type chaîne de caractères (ou liste de chaînes) - Les commentaires commencent par # et finissent à la fin de ligne - La valeur d'une variable a est $a - Le tableau suivant décrit les principales instructions. Création d'un scénario Pour décrire un réseau et son trafic, il faut définir dans l'ordre : 1. la topologie du réseau : les noeuds et les arcs 2. la couche transport (UDP, TCP,...) entre des pairs de noeuds 3. la couche application qui va fournir les données 4. des temporisateurs précisant les instants auxquels les transferts vont démarrer La couche réseau correspond à IP et est gérée par ns-2. Dans un fichier otcl, on commence par créer un simulateur Session 2009 Page 1 sur 5
set ns [new Simulator] Pour conserver l'historique de la simulation (notamment pour la visualiser avec nam), on peut indiquer les deux fichiers vers lesquels seront dirigés les deux historiques : set f [open out.tr w] $ns trace-all $f set nf [open out.nam w] $ns namtrace-all $nf f et nf sont des descripteurs de fichier préalablement ouverts. Topologie Ensuite, on crée les noeuds du réseau, puis les liens qui les relient avec leur débit et leur latence, et la politique de rejet des paquets en trop (ici DropTail mais il y en a d'autres). On peut aussi préciser le nombre limite de paquets dans la file d'attente. set n1 [$ns node] set n2 [$ns node] $ns duplex-link $n1 $n2 1Mb 250ms DropTail $ns queue-limit $n1 $n2 100 Transport Il faut créer les agents de transport, les attacher aux noeuds et les connecter entre eux. Parmi les agents disponibles, on trouve Agent/Null, Agent/UDP, Agent/TCP et Agent/TCPSink. Le code est par exemple: set udp [new Agent/UDP] set trappe [new Agent/Null] $ns attach-agent $n1 $udp $ns attach-agent $n2 $trappe $ns connect $udp $trappe # crée une source UDP # crée un puits d'information # attache la source à un noeud # attache la destination à un autre # associe la paire origine/destination Noter qu'il n'est pas nécessaire de spécifier quelle est la route suivie par les paquets d'une paire d'agents : c'est le simulateur qui calcule les routes les plus courtes. Pour un trafic TCP, il faut un émetteur et un puits : set tcp [new Agent/TCP] $tcp set fid_ 1 ;# Color it's packages red set sink [new Agent/TCPSink] Session 2009 Page 2 sur 5
$ns attach-agent $n1 $tcp $ns attach-agent $n2 $sink $ns connect $tcp $sink Application Enfin, on crée les sources de trafic, c'est-à-dire des applications. Ici, nous n'allons considérer que deux types d'application : CBR (Constant Bit Rate) et FTP. Tous ont comme attributs packetsize_ (taille des paquets, qui sera constante) et rate_ (débit en octets/s). Classe (<A>=Application) description paramètres <A>/Traffic/CBR source débit constant interval_ intervalle entre paquets <A>/FTP émule une application FTP maxpkts_ nombre max de paquets Il faut enfin attacher l'application à l'agent de transport : set app [new Application/Traffic/CBR] $app attach-agent $udp Pour démarrer et arrêter une source src, on a : $src start et $src stop Temporisateurs Il est possible de programmer des évènements qui seront exécutés à des dates précises de la simulation. Par exemple: $ns at 1.0 "$truc start" # démarre l'application $truc à t=1.0 $ns at 5.0 "$truc stop" # l'arrête à t=5.0 $ns at 10.0 "finish" # invoque la procédure finish à t=10.0 Typiquement, la fin de la simulation se fera par l'invocation d'une procédure chargée du traitement final des statistiques. Exemple: proc finish { } { Session 2009 Page 3 sur 5
global ns f nf stat puts "C'est fini" close $f # fermeture du fichier de trace (s'il y a) close $nf # fermeture du fichier de trace animation puts "Débit = $stat(debit)" # impression d'une statistique } Test : Nous avons générés un programme en.tcl (test-suite-simple.tcl) qui nous a permis d observer les performances via «xgraph». «xgraphe» Voici quelques exemples de programme par défauts que nous avons pus tester : - /home/vanet/bureau/ns-allinone-2.31/ns-2.31/tcl/ex# ns simple-dyn.tcl c est une démonstration illustrant un problème de communication et de récupération ne prévoyant pas de routage dynamique. Session 2009 Page 4 sur 5
Indique si le lien est désactivé (down) ou activée (up) - /home/vanet/bureau/ns-allinone-2.31/ns-2.31/tcl/ex# ns simple-rtg.tcl c est une démonstration de routage dynamique. notre simulation génère des traces, on peut les regarder à l aide d un éditeur de texte. Ici on voit bien la génération du fichier.nam - /home/vanet/bureau/ns-allinone-2.31/ns-2.31/tcl/ex# ns simple-eqp1.tcl c est une demonstration du cout du chemin sur une topologie dynamique. Session 2009 Page 5 sur 5