Introduction à NS-2 (Network Simulator)
Menu
NS-2
Ou trouver NS-2
Example de simulation avec un transfert UDP
Example de simulation avec un transfert TCP
Exemple TCP avec un agent monitor et un lien avec erreurs
Exemple TCP et UDP avec un agent queue monitor
Réferences
NS-2
NS-2 est un logiciel de simulation de réseaux informatique développé lors d'un projet de la DARPA. Le simulateur se compose d'une interface de programmation en tcl et d'un noyau ecrit en C++ dans lequel la plupart des protocoles réseaux ont été implémentés :
- Couche MAC CSMA, CDMA, 802,X, Token ring, MPLS, liens satéllite
- Couche Réseaux IP, routage dans les réseaux ad hoc (aodv, dsr , dsdv, tora, amodv), routage dans les réseaux filaire (Link state, Distance vector), les réseaux multicast, IntServ, DiffServ
- Couche Transport TCP, UDP
- Traffic parreto, ON/OFF, CBR, FTP, telnet
Ou trouver NS-2
La version de NS-2 la plus à jour actuellement est la version 2.27 disponible en téléchargement sur le site officielle de NS mais pour plus de confort pour l'utilisateur il est conseillé d'installer la version all-in-one. La version all-in-one regroupe tous les utilitaires et les plugin nécessaire à la compilation et au fonctionnement de de NS.
liens:
Site Web de NS-2
Site Web de NS-3
Un outils d'analyse de trace de simulation (tracegraph)
Un outils d'analyse de trace en ligne de commande (trace2stats)
RPI ns-2 Graphing and Statistics Package
Un exemple UDP
Cet exemple permet de simuler un lien bidirectionnel entre deux noeuds.

Création de l'instance de simulation
set ns [new Simulator]
création des fichiers de trace
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
}
création des noeuds
set n0 [$ns node]
set n1 [$ns node]
création du lien entre les deux noeuds
création de la couche transport$ns duplex-link $n0 $n1 1Mb 10ms DropTail
création de la couche applicationset udp0 [new Agent/UDP]
$ns attach-agent $n0 $udp0
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ 1500
$cbr0 set rate_ 100Kb
$cbr0 attach-agent $udp0
set null0 [new Agent/Null]
$ns attach-agent $n1 $null0
$ns connect $udp0 $null0
scheduler
$ns at 0.5 "$cbr0 start"
$ns at 4.5 "$cbr0 stop"
$ns at 5.0 "finish"
lancement de la simulation
$ns run
Un exemple TCP
Cet exemple(fichier gnuplot) permet de simuler un lien bidirectionnel entre deux noeuds.

création de l'instance de simulation
set ns [new Simulator]
création des fichiers de trace
set nf [open out.nam w]
set f2 [open out.cwnd w]
$ns namtrace-all $nf
function Final
création des noeudsproc finish {} {
global ns nf f2
set awkCode {
{
time = $2;
cwnd = $5;
split(time, Tabtime, "t");
split(cwnd, Tabcwnd, "v");
print Tabtime[2], Tabcwnd[2] >> "out.plot";
}
}
$ns flush-trace
close $nf
close $f2
exec awk $awkCode out.cwnd
exec gnuplot plot
exec eog cwnd.png
#exec nam out.nam &
exit 0
}
set n0 [$ns node]
set n1 [$ns node]
création du lien entre les deux noeuds
$ns duplex-link $n0 $n1 50.0Mb 200.0ms DropTail
$ns queue-limit $n0 $n1 20
création de la couche transport
On trace la fenetre de congestionset tcp0 [new Agent/TCP]
$tcp0 set packetSize_ 125
$ns attach-agent $n0 $tcp0
set null0 [new Agent/TCPSink]
$ns attach-agent $n1 $null0
$ns connect $tcp0 $null0
schedulerset traceur [new Trace/Var]
$traceur attach $f2
$tcp0 trace cwnd_ $traceur
puts "On envoie le fichier de 300Ko"
$ns at 0.0 "$tcp0 send 300000"
$ns at 100.0 "finish"
lancement de la simulation
$ns run
Un exemple TCP avec un agent monitor et un lien avec erreurs
Cet exemple permet de simuler un lien bidirectionnel entre deux noeuds.

création de l'instance de simulation
set ns [new Simulator]
création des fichiers de trace du monitor
function Finalset filetrace [open out.tr w]
function Recordproc finish {} {
global ns flowmon fcl filetrace
#On ferme le fichier de trace du monitor
close $filetrace
#On lance le programme Xgraph]
exec xgraph out.tr -geometry 800x400 &
#on termine le programme NS
exit 0
}
création des noeudsproc record {} {
global ns flowmon bwOld filetrace
set fid 1 #Set the time after which the procedure should be called again
set time 0.5
#How many bytes have been received by the traffic sinks?
set flow [[$flowmon classifier] lookup auto 0 0 $fid]
set bw [$flow set bdepartures_]
#Get the current time
set now [$ns now]
#Calculate the bandwidth (in MBit/s) and write it to the files
puts $filetrace "$now [expr ($bw-$bwOld)/$time*8/1000000]"
#extra information
if {$flow != "" } {
set bytes [$flow set bdepartures_]
puts "class: $fid per-link pkts [$flow set pdepartures_]"
puts "Kbytes [expr $bytes / 1000]"
puts "drops [$flow set pdrops_]"
puts "marks [$flow set pmarks_]"
}
set bwOld $bw
#Re-schedule the procedure
$ns at [expr $now+$time] "record"
}
set n0 [$ns node]
set n1 [$ns node]
création du lien entre les deux noeuds
création de la couche transport$ns duplex-link $n0 $n1 50.0Mb 200.0ms DropTail
$ns queue-limit $n0 $n1 20
set tcp0 [new Agent/TCP]
$tcp0 set packetSize_ 125
$ns attach-agent $n0 $tcp0
set null0 [new Agent/TCPSink]
$ns attach-agent $n1 $null0
$ns connect $tcp0 $null0
on initialise le flow monitor
#flow monitor
set flowmon [$ns makeflowmon Fid]
#Attache le monitor au lien
set lien [$ns link $n0 $n1]
$ns attach-fmon $lien $flowmon
On initialise le model erreur
scheduler##Loss Model
set lossModel [new ErrorModel]]
$lossModel unit packet]
$lossModel set rate_ 0.1]
$lossModel ranvar [new RandomVariable/Uniform]]
$lossModel drop-target [new Agent/Null]]
$ns lossmodel $lossModel $n0 $n1]
puts "On envoie le fichier de 3000Ko"
$ns at 10.0 "$tcp0 send 3000000"
$ns at 11.0 "record"
$ns at 100.0 "finish"
lancement de la simulation
Et le résultat$ns run

Un exemple TCP et UDP avec un agent queue monitor
Cette exemple permet de simuler un réseau de quatre noeuds.

Definition de variablesset ns [new Simulator]
set sf [open out.tr w]
set filetrace [open q.tr w]
set namtrace [open out.nam w]
Fonction qui permet d'avoir des resultats sur les files d'attenteset interval 100.0
set myPacketSize 1500 ;# in Bytes
set queuelimit 40 ;# in kBytes
set queuesize [expr $queuelimit * 1000 / $myPacketSize]
set rate 20
#Define color index
$ns color 0 red
$ns color 1 yellow
$ns color 2 blue
$ns color 3 green
$ns color 4 black
$ns color 5 chocolate
$ns color 6 brown
$ns color 7 tan
$ns color 8 gold
$ns namtrace-all $namtrace
proc finish {} {
global ns flowmon fcl sf filetrace namtrace
close $sf
close $filetrace
close $namtrace
exec nam out.nam &
exec xgraph q.tr -geometry 800x400 &
exit 0
}
proc write-stats-info {node myqmon mysamples} {
global sf interval
puts $sf "Node: $node"
puts $sf "---------------packet------------------"
puts $sf "# of packet arrivals = [
expr [$myqmon set parrivals_]/$interval]/seconds"
puts $sf "# of packet departures =
[expr [$myqmon set pdepartures_]/$interval]/seconds"
puts $sf "# of packet drops = [$myqmon set pdrops_]"
puts $sf "# of packets in queue when ended = [$myqmon set pkts_]"
set pktint [$myqmon get-pkts-integrator]
puts $sf "Integral queue size = [$pktint set sum_]"
puts $sf "---------------bytes-------------------"
puts $sf "# of bytes arrival =
[expr [$myqmon set barrivals_]/$interval]/seconds"
puts $sf "# of bytes departure =
[expr [$myqmon set bdepartures_]/$interval]/seconds"
puts $sf "# of bytes drop = [$myqmon set bdrops_]"
puts $sf "# of bytes in queue when ended = [$myqmon set size_]"
set byteint [$myqmon get-bytes-integrator]
puts $sf "Integral queue size = [$byteint set sum_]"
puts $sf ""
puts $sf "Average queue delay = [$mysamples mean]"
puts $sf ""
puts $sf ""
}
Fonction qui enregistre l'evolution de la taile de la file d'attente
proc record {} {
global ns flowmon fcl filetrace qmon queuesize
#Set the time after which the procedure should be called again
set time 0.5
#Get the current time
set now [$ns now]
puts $filetrace "$now [$qmon set pkts_]"
#Re-schedule the procedure
$ns at [expr $now+$time] "record"
}
Definition de la topologie
Definition du trafic##Création des noeuds
set noeudSrc1 [$ns node]
set noeudSrc2 [$ns node]
set noeudCentre [$ns node]
set noeudDest [$ns node]
$noeudSrc1 label "noeud Src1"
$noeudSrc2 label "noeud Src1"
$noeudDest label "noeud Dest"
$noeudCentre label "noeud Centre"
$noeudCentre shape "box"
##Init du lien duplex
$ns duplex-link $noeudSrc1 $noeudCentre 10.0kb 200.0ms DropTail
$ns duplex-link $noeudSrc2 $noeudCentre 20.0kb 200.0ms DropTail
$ns duplex-link $noeudCentre $noeudDest 20.0kb 200.0ms DropTail
##Init de la connexion UDP
set udp0 [new Agent/UDP]
$ns attach-agent $noeudSrc2 $udp0
$udp0 set class_ 1
set null1 [new Agent/Null]
$ns attach-agent $noeudDest $null1
$ns connect $udp0 $null1
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ $myPacketSize
$cbr0 set rate_ [append rate "kb"]
$cbr0 attach-agent $udp0
Parametre de liens##Init de la connexion TCP
set tcp0 [new Agent/TCP]
#Parametre du flux TCP
$tcp0 set packetSize_ $myPacketSize
$tcp0 set fid_ 1
$tcp0 set class_ 2
$ns attach-agent $noeudSrc1 $tcp0
set null0 [new Agent/TCPSink]
$ns attach-agent $noeudDest $null0
$ns connect $tcp0 $null0
$ns queue-limit $noeudCentre $noeudDest $queuesize
$ns duplex-link-op $noeudCentre $noeudDest queuePos 0.5
definition du monitor-queue
set qmon [$ns monitor-queue $noeudCentre $noeudDest $filetrace]
set samples [new Samples]
$qmon set-delay-samples $samples
Scheduler
puts "On envoie le fichier de 3000Ko"
$ns at 10.0 "$cbr0 start"
$ns at 10.0 "$tcp0 send 3000000"
$ns at 10.0 "record"
$ns at [expr $interval +1.0] "write-stats-info noeudDest $qmon $samples"
$ns at [expr $interval +2.0] "finish"
$ns run
Et le résultat

Exemple de Code NS2
- Simulation d'une file /M/M/1
- Simulation d'une file /M/M/1/K
- Simulation d'un LAN
- Simulation d'un réseau DiffServ
- Simulation d'un réseau avec des routeurs RED
- Simulation d'un réseaux ad hoc
- Simulation d'une liaison statéllite
Réferences
Projet
Projets Master Paris 6
Documentations
NS2
Documentation NS2
Documentation NS2 for beginer
Wiki NS/NAM
Exemples de métriques mesurable dans NS-2
Métriques dans NS-2
Support de cours
Support de cour NS2 Master Paris 6
NS-2: Principes de conception et d'utilisation
Cour de l'inria sur NS
Cour d'Emmanuel Michion (PS)
Cour de l'enst sur NS
Cour de Chadi Barakat
Ensemble de Tips pour NS
Exemples
NS Marc Greis tutorial
Models NS
Exemple de Simulation sous NS
TP Lirmm
Introduction NS ENST
Cour sur Gnuplot
Documentation sur Gnuplot
Contribution en dehors de la version officielle de NS-2
Contributed Code