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

$ns duplex-link $n0 $n1 1Mb 10ms DropTail

création de la couche transport

set udp0 [new Agent/UDP]
$ns attach-agent $n0 $udp0

création de la couche application

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

proc 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
}

création des noeuds

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

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 trace la fenetre de congestion

set traceur [new Trace/Var]
$traceur attach $f2
$tcp0 trace cwnd_ $traceur

scheduler

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

set filetrace [open out.tr w]

function Final

proc 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
}

function Record

proc 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"
}

création des noeuds

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

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

##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]

scheduler

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

$ns run

Et le résultat



Un exemple TCP et UDP avec un agent queue monitor


Cette exemple permet de simuler un réseau de quatre noeuds.



set ns [new Simulator]

set sf [open out.tr w]
set filetrace [open q.tr w]
set namtrace [open out.nam w]

Definition de variables

set 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
}

Fonction qui permet d'avoir des resultats sur les files d'attente

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

##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

Definition du trafic

##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


##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

Parametre de liens

$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


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