TRAVAUX PRATIQUES : NS‐2
SIMULATION DE RESEAUX
BENJAMIN GHIS
MATTHIEU CHARPENTIER
T2 ‐ TELECOM, S4, MARS 2008, ENSEIRB
Professeur : N. MBAREK
ghis@enseirb.fr | charpenm@enseirb.fr
Sommaire des figures
Figure 1 : Réseau à simuler................................................................................................................. 3
Figure 2 : Trafic CBR entre N0 et N1 ................................................................................................... 4
Figure 3 : Lien Full‐duplex entre les nœuds N1 et N2......................................................................... 5
Figure 4 : Utilisation de NAM ............................................................................................................. 5
Figure 5 : Figure à simuler .................................................................................................................. 6
Figure 6 : Traffic CBR et TCP ............................................................................................................... 8
Figure 7 : Perte de paquet lors de l’émission de paquets .................................................................. 8
Figure 8 : Trafic TCP avec accusé de réception................................................................................... 9
Figure 9 : Réseau à simuler................................................................................................................. 9
Figure 10 : perte de trafic entre les nœuds N2, N4 et N7 ................................................................ 11
Figure 11 : Redirection du flux.......................................................................................................... 11
Figure 12 : Flux normal du trafic....................................................................................................... 12
Figure 13 : Rupture du lien entre les nœuds N4 et N7 ..................................................................... 12
Figure 14 : Reprise du cours normal du trafic................................................................................... 13
Figure 15 : Réseau à simuler............................................................................................................. 13
Figure 16 : Temps d’enregistrement de 0.1 seconde ....................................................................... 15
Figure 17 : Temps d’enregistrement de 0.5 seconde ....................................................................... 15
Figure 18 : Temps d’enregistrement de 1 seconde .......................................................................... 16
But du TP :
Se familiariser avec le simulateur de réseaux NS‐2 en découvrant les fonctionnalités
qu’offre ce dernier à travers l’étude et l’élaboration de scripts qui font appel à des outils comme
« nam » qui visualise la simulation ou encore « xgraph » qui permet de représenter les traces de la
simulation sous forme de courbes.
I. Exercice 1 :
I.1. Enoncé :
Dans cet exercice on se propose de simuler le réseau suivant :
Figure 1 : Réseau à simuler
I.2. Réalisation
#creation d'un instance de l'objet simulator
set ns [new Simulator]
#ouvrir le fichier trace pour nam
set nf [open out.nam w]
$ns namtrace‐all $nf
#definir la procedure de terminaison de la simulation
proc finish {} {
global ns nf
$ns flush‐trace
#fermer le fichier trace
close $nf
#executer le nam avec en entree le fichier trace
exec nam out.nam &
exit 0
}
#creation des neouds n0 et n1
set n0 [$ns node]
set n1 [$ns node]
#link des noeuds
$ns duplex‐link $n0 $n1 1Mb 10ms DropTail
#creation des agents
set transp0 [new Agent/UDP]
$ns attach‐agent $n0 $transp0
#source de traffic
set cbr [new Application/Traffic/CBR]
$cbr set packetSize_ 500
$cbr set interval_ 0.005
#connection de CBR avec UDP
$cbr attach‐agent $transp0
#creation de l'agent NULL
set transp1 [new Agent/Null]
$ns attach‐agent $n1 $transp1
#connexion NULL et UDP
$ns connect $transp0 $transp1
#debut de simulation
$ns at 1 "$cbr start"
#fin de simulation
$ns at 4.5 "$cbr stop"
#appeler la procedure de terminaison apres un temps t
$ns at 5.0 "finish"
#executer la simulation
$ns run
I.3. Observation
A 1 seconde, le trafic CBR apparait entre le nœud N0 et N1.
Figure 2 : Trafic CBR entre N0 et N1
On observe un trafic sans perte entre les deux nœuds. La simulation se termine
normalement après 5 secondes.
I.4. Explication
On utilise un lien duplex de capacité 1Mb et on fait transiter des paquets de 500 octets.
Figure 3 : Lien Full‐duplex entre les nœuds N1 et N2
Il n’y a donc pas de problème de congestion dans le réseau simulé. L’utilisation de l’outil
« nam » est assez intuitive, le logiciel se lance par la commande « ns » :
Figure 4 : Utilisation de NAM
Pour construire le scénario sans utiliser de script, il a fallu utiliser les outils offerts par
« nam » : Construction de nœuds, de liens, d’agents … Les paramètres sont entrés à l’aide d’un clic
droit directement sur les objets. A noter, que ce logiciel est assez bugée malgré que son
maniement soit assez intuitif.
II. Exercice 2 :
II.1. Enoncé :
Dans cet exercice on se propose de simuler le réseau suivant :
Figure 5 : Figure à simuler
II.2. Réalisation
#creation d'un instance de l'objet simulator
set ns [new Simulator]
#ouvrir le fichier trace pour nam
set nf [open out.nam w]
$ns namtrace‐all $nf
#definir la procedure de terminaison de la simulation
proc finish {} {
global ns nf
$ns flush‐trace
#fermer le fichier trace
close $nf
#executer le nam avec en entree le fichier trace
exec nam out.nam &
exit 0
}
#creation des noeuds n0 a n3
set NodeNb 3
set i 0
for {set i 0} {$i <= $NodeNb} {set i [expr $i+1]} {set n($i) [$ns node]}
#link des noeuds
$ns duplex‐link $n(0) $n(2) 2Mb 10ms DropTail
$ns duplex‐link $n(1) $n(2) 2Mb 10ms DropTail
$ns duplex‐link $n(2) $n(3) 1.7Mb 20ms DropTail
#creation des agents
set transp0 [new Agent/TCP]
$ns attach‐agent $n(0) $transp0
set transp1 [new Agent/UDP]
$ns attach‐agent $n(1) $transp1
set transp31 [new Agent/TCPSink]
$ns attach‐agent $n(3) $transp31
set transp32 [new Agent/Null]
$ns attach‐agent $n(3) $transp32
#source de traffic
set cbr [new Application/Traffic/CBR]
$cbr set packetSize_ 1000
$cbr set rate_ 1Mb
set ftp [new Application/FTP]
#connection de CBR avec UDP
$cbr attach‐agent $transp1
#connection de FTP avec TCP
$ftp attach‐agent $transp0
#connexion NULL et UDP
$ns connect $transp32 $transp1
#connexion TCP et Sink
$ns connect $transp0 $transp31
#taille de buffer entre n2 et n3
$ns queue‐limit $n(2) $n(3) 10
#Positionnement des noeuds
$ns duplex‐link‐op $n(0) $n(2) orient right‐down
$ns duplex‐link‐op $n(2) $n(1) orient left‐down
$ns duplex‐link‐op $n(2) $n(3) orient right
#Coloration des flux
$ns color 1 Blue
$transp1 set class_ 1
$ns color 2 Red
$transp0 set class_ 2
#debut de simulation
$ns at 0.1 "$cbr start"
#fin de simulation
$ns at 4.5 "$cbr stop"
#debut de simulation
$ns at 1 "$ftp start"
#fin de simulation
$ns at 4.0 "$ftp stop"
#appeler la procedure de terminaison apres un temps t
$ns at 5.0 "finish"
#executer la simulation
$ns run
II.3. Observation
A 0.1 seconde, le trafic CBR apparait entre le nœud N1 et le nœud N3. Puis au bout de 1s,
c’est le trafic du ftp qui apparait.
Figure 6 : Traffic CBR et TCP
Cependant, on remarque une perte de paquets à un instant donné quand les deux trafics
ont lieu simultanément.
Figure 7 : Perte de paquet lors de l’émission de paquets
Puis le trafic reprend normalement avant de s’interrompre définitivement au bout de 4
secondes puis de 4.5 secondes.
II.4. Explication
On utilise un trafic de type TCP Sink entre les nœuds N0 et N3. Il y a donc régulièrement
des accusés de réception.
Figure 8 : Trafic TCP avec accusé de réception
Dans le protocole TCP, une fenêtre d’émission est utilisée. Quand les paquets sont reçus
correctement, la taille de cette fenêtre est multipliée par deux. Lorsqu’un acquittement n’est pas
réceptionné, la taille de la fenêtre revient à celle de départ : l’algorithme‘’ Slow Start ‘’ est utilisé
ici. On observe bien ce phénomène dans notre exercice. A un instant donné, il n’y a plus réception
des paquets à cause d’un problème de congestion. Les paquets alors sur le réseau sont perdus et
on revient alors à une fenêtre d’émission moins importante.
III. Exercice 3 :
III.1. Enoncé :
Dans cet exercice on se propose de créer le réseau suivant :
Figure 9 : Réseau à simuler
III.2. Réalisation :
set ns [new Simulator]
set nf [ open out.nam w]
$ns namtrace‐all $nf
proc finish {} {
global ns nf
$ns flush‐trace
close $nf
exec nam out.nam &
exit 0
}
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
set n5 [$ns node]
set n6 [$ns node]
set n7 [$ns node]
$ns duplex‐link $n0 $n2 10Mb 10ms DropTail
$ns duplex‐link $n1 $n2 10Mb 10ms DropTail
$ns duplex‐link $n2 $n4 10Mb 10ms DropTail
$ns duplex‐link $n2 $n3 10Mb 10ms DropTail
$ns duplex‐link $n3 $n5 10Mb 10ms DropTail
$ns duplex‐link $n5 $n6 10Mb 10ms DropTail
$ns duplex‐link $n6 $n7 10Mb 10ms DropTail
$ns duplex‐link $n7 $n4 10Mb 10ms DropTail
set transp0 [new Agent/UDP]
$ns attach‐agent $n0 $transp0
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ 500
$cbr0 set interval_ 0.005
$cbr0 attach‐agent $transp0
set transp1 [new Agent/UDP]
$ns attach‐agent $n1 $transp1
set cbr1 [new Application/Traffic/CBR]
$cbr1 set packetSize_ 500
$cbr1 set interval_ 0.005
$cbr1 attach‐agent $transp1
set transpnul [new Agent/Null]
$ns attach‐agent $n7 $transpnul
$ns connect $transp1 $transpnul
$ns connect $transp0 $transpnul
$ns color 0 Blue
$ns color 1 Red
$transp0 set class_ 0
$transp1 set class_ 1
$ns rtproto DV
$ns rtmodel‐at 4.0 down $n4 $n7
$ns rtmodel‐at 5.0 up $n4 $n7
$ns at 1 "$cbr0 start"
$ns at 7 "$cbr0 stop"
$ns at 2 "$cbr1 start"
$ns at 6 "$cbr1 stop"
$ns at 8 "finish"
$ns run
III.3. Observation :
Au départ apparait le trafic entre le nœud N0 et N7 à 1s, puis le trafic entre les nœuds N1
et N7apparait. Le trafic des paquets passe au départ entre le nœud N4. Cependant, on remarque
une perte de paquets lors de la rupture du lien entre les nœuds N4 et N7.
Figure 10 : perte de trafic entre les nœuds N2, N4 et N7
Le flux des paquets va alors passer par les nœuds N3, N5, N6 et N7.
Figure 11 : Redirection du flux
On retrouvera ensuite un flux passant par le nœud N4 lors du rétablissement du lien entre
les nœuds N4 et N7.
III.4. Explication
Le routage utilisé dans cet exercice est un routage dynamique. Il y a donc diffusion
périodique sur le réseau des informations de routage. Les équipements échangent leurs
informations de routage et les tables de routage sont constamment misent à jour. Au départ, le
trafic passe par le nœud N4 car c’est le plus court chemin pour arriver à destination du nœud N7.
Figure 12 : Flux normal du trafic
Lors de la rupture du lien entre les nœuds N4 et N7, l’information sur la rupture est
transmise à tous les nœuds et donc il y a changement de chemin du trafic.
Figure 13 : Rupture du lien entre les nœuds N4 et N7
Seuls les paquets qui se trouvaient déjà entre les nœuds N2, N4 et N7 seront perdus. Enfin
au rétablissement du lien, l’information est de nouveau transmise est le trafic reprend son court
normal par le nœud N4.
Figure 14 : Reprise du cours normal du trafic
IV. Exercice 4 :
IV.1. Enoncé :
Dans cet exercice on se propose de créer le réseau suivant :
Figure 15 : Réseau à simuler
IV.2. Réalisation
set ns [new Simulator]
set f0 [open out0.tr w]
set f1 [open out1.tr w]
set f2 [open out2.tr w]
set nf [open out.nam w]
$ns namtrace‐all $nf
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
$ns duplex‐link $n0 $n3 1Mb 100ms DropTail
$ns duplex‐link $n1 $n3 1Mb 100ms DropTail
$ns duplex‐link $n2 $n3 1Mb 100ms DropTail
$ns duplex‐link $n3 $n4 1Mb 100ms DropTail
proc finish {} {
global f0 f1 f2 nf ns
$ns flush‐trace
close $nf
close $f0
close $f1
close $f2
exec nam out.nam &
exit 0
}
proc attach‐expoo‐traffic { node sink size burst idle rate } {
set ns [Simulator instance]
set source [new Agent/UDP]
$ns attach‐agent $node $source
set traffic [new Application/Traffic/Exponential]
$traffic set packetSize_ $size
$traffic set burst_time_ $burst
$traffic set idle_time_ $idle
$traffic set rate_ $rate
$traffic attach‐agent $source
$ns connect $source $sink
return $traffic
}
proc record {} {
global sink0 sink1 sink2 f0 f1 f2
set ns [Simulator instance]
set time 0.5
set bw0 [$sink0 set bytes_]
set bw1 [$sink1 set bytes_]
set bw2 [$sink2 set bytes_]
set now [$ns now]
puts $f0 "$now [expr $bw0/$time*8/1000000]"
puts $f1 "$now [expr $bw1/$time*8/1000000]"
puts $f2 "$now [expr $bw2/$time*8/1000000]"
$sink0 set bytes_ 0
$sink1 set bytes_ 0
$sink2 set bytes_ 0
$ns at [expr $now+$time] "record"
}
set sink0 [new Agent/LossMonitor]
set sink1 [new Agent/LossMonitor]
set sink2 [new Agent/LossMonitor]
$ns attach‐agent $n4 $sink0
$ns attach‐agent $n4 $sink1
$ns attach‐agent $n4 $sink2
$ns color 0 Blue
$sink0 set class_ 0
$ns color 1 Red
$sink1 set class_ 1
$ns color 2 Green
$sink2 set class_ 2
set source0 [attach‐expoo‐traffic $n0 $sink0 200 2s 1s 100k]
set source1 [attach‐expoo‐traffic $n1 $sink1 200 2s 1s 200k]
set source2 [attach‐expoo‐traffic $n2 $sink2 200 2s 1s 300k]
$ns at 0.0 "record"
$ns at 10.0 "$source0 start"
$ns at 10.0 "$source1 start"
$ns at 10.0 "$source2 start"
$ns at 50.0 "$source0 stop"
$ns at 50.0 "$source1 stop"
$ns at 50.0 "$source2 stop"
$ns at 60.0 "finish"
$ns run
IV.3. Observation
Un trafic apparait au bout de 10s entre les nœuds N0, N1, N2 et N4. A l’aide du logiciel
« xgraph », on remarque des retours à zéro plus fréquent quand on a un temps d’enregistrement
de 0.1s par rapport à des temps d’enregistrement de 1s. De plus le tracé du graphe est plus précis
pour des faibles temps d’enregistrement.
Figure 16 : Temps d’enregistrement de 0.1 seconde
Figure 17 : Temps d’enregistrement de 0.5 seconde
Figure 18 : Temps d’enregistrement de 1 seconde
IV.4. Explication du code
Trois fonctions sont définies : « finish », « attach‐expoo‐traffic » et « record ». La première
fonction sert à terminer le programme. La deuxième sert à créer des agents UDP sur les nœuds
N0, N1 et N2 et de les paramétrer avec : packetSize_ la taille des paquets, burst_time_ le temps
moyen d’envoi des paquets, idel_time_ le temps moyen durant lequel aucun paquet n’est envoyé,
et rate pour le débit. Elle sert également à connecter les agents UDP et les agents LossMonitor.
Enfin la dernière fonction «record« sert à paramétrer l’enregistrement du trafic entre les
différents nœuds : « set time » est l’intervalle de temps entre chaque prise de mesure sur le trafic,
[expr $now+$time] « record » permet de rappeler la fonction record sur l’intervalle de temps
suivant et ainsi de suite.
La fin du programme correspond à un « main » du langage C en permettant d’appeler les
fonctions précédemment mentionnées et de débuter la simulation. A noter qu’un agent de type
« LossMonitor » est une sorte de moniteur paramétrable qui permet de mesurer le trafic.
IV.5. Explication de l’observation
Quand nous utilisons un intervalle de temps d’1 seconde, nous avons beaucoup moins de
retour à zéro que dans le cas d’0.1 seconde. L’intervalle de temps entre chaque prise de mesure
est très long et il peut y avoir eut une reprise de trafic sur le réseau entre temps, on ne voit alors
pas le retour à zéro. Au contraire sur un intervalle d’0.1 seconde, on a le temps d’apercevoir les
remises à zéros.
La variable ‘’time’’ joue en fait sur la précision de la mesure. Celle‐ci sera plus précise pour
une valeur de 0.1s qu’une valeur d’1s. Pourtant avoir une précision très importante n’est pas très
utile car elle plus longue à obtenir. On peut donc décider de prendre le juste milieu avec une
valeur de 0.5s par exemple. A noter que le temps de « burst » étant supérieur au temps d’idle, on
obtient des intervalles de temps d’envoi de paquets plus important que des intervalles de silence
sur le réseau.