NS-2 Tutorial

Download Report

Transcript NS-2 Tutorial

NS-2 Tutorial
CS556
Jan 22th, 2004
Figure 1:Simplified User's View of
NS
OTCL
C++ and OTcl: The Duality
Export C++ class to OTcl
Reference:
http://nile.wpi.edu/NS/linkage.html
Export C++ Object Control Commands to OTcl.
For a complete NS class hierarchy, visit http://wwwsop.inria.fr/rodeo/personnel/Antoine.Clerget/ns.
#Create a simulator object
set ns [new Simulator]
#Define different colors for data flows (for NAM)
$ns color 1 Blue
$ns color 2 Red
#Open the NAM trace file
set nf [open out.nam w]
$ns namtrace-all $nf
#Open the Trace file
set tf [open out.tr w]
$ns trace-all $tf
#Define a 'finish' procedure
proc finish {} {
global ns nf tf
$ns flush-trace
#Close the NAM trace file
close $nf
#Close the Trace file
close $tf
#Execute NAM on the trace file
exec nam out.nam &
exit 0
}
#Create four nodes
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
#Create links between the nodes
$ns duplex-link $n0 $n2 2Mb 10ms DropTail
$ns duplex-link $n1 $n2 2Mb 10ms DropTail
$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail
#Set Queue Size of link (n2-n3) to 10
$ns queue-limit $n2 $n3 10
#Give node position (for NAM)
$ns duplex-link-op $n0 $n2 orient right-down
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n2 $n3 orient right
#Monitor the queue for link (n2-n3). (for NAM)
$ns duplex-link-op $n2 $n3 queuePos 0.5
#Setup a TCP connection
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
$tcp set fid_ 1
#Setup a FTP over TCP connection
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP
#Setup a UDP connection
set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null
$ns connect $udp $null
$udp set fid_ 2
#Setup a CBR over UDP connection
set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false
#Schedule events for the CBR and FTP agents
$ns at 0.1 "$cbr start"
$ns at 1.0 "$ftp start"
$ns at 4.0 "$ftp stop"
$ns at 4.5 "$cbr stop"
#Detach tcp and sink agents (not really necessary)
$ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent
$n3 $sink"
#Call the finish procedure after 5 seconds of simulation time
$ns at 5.0 "finish"
#Print CBR packet size and interval
puts "CBR packet size = [$cbr set packet_size_]"
puts "CBR interval = [$cbr set interval_]"
#Run the simulation
$ns run
Trace File Format
#script: myflowcalcall.awk
# a general script for computing throughput
#Script: computeall
#compute throughput so far for a certain flow
BEGIN {
arguments = 2;
if (ARGC < arguments || ARGC > arguments || flowtype == 0) {
printf("error: wrong number of arguments.\nawk:
usage - awk -f flowcalc.awk [-v graphgran=value] [-v fidfrom=value] [-v
fidto=value] [-v fid=value] -v flowtype=\"type\" -v
outdata_file=\"filename\" indata_file\n--%d",ARGC);
exit;
}
measure_interval = 0.5;
bits = 0;
first_time = graphgran;
}
awk -f myflowcalcall.awk -v graphgran=0 -v fidfrom=2 -v fidto=3 -v fid=1 -v
flowtype="tcp" -v outdata_file="nothing" out.tr >thr1
echo "Compute flow1 throughput all and output to thr1"
awk -f myflowcalcall.awk -v graphgran=0 -v fidfrom=2 -v fidto=3 -v fid=2 -v
flowtype="cbr" -v outdata_file="nothing" out.tr >thr2
echo "Compute flow2 throughput all and output to thr2"
{
if (($1 == "r") &&
((fidfrom == 0 && fidto ==0) || (($8 == fid) && ($3 ==
fidfrom) && ($4 == fidto))) &&
(flowtype == "all" || flowtype == $5)) {
if (($2 - first_time) > measure_interval) {
first_time = first_time + measure_interval;
rate = (bits/1000000)/first_time;
print filename first_time, rate;
}
bits = bits + $6 * 8;
}
}
END {
measure_interval = 0.5;
first_time = first_time + measure_interval;
rate = (bits/1000000)/first_time;
print filename first_time, rate;
}
gnuplot
One CBR Competes with One FTP
2
CBR Flow
TCP Flow
1.5
1
0.5
0
0
1
2
3
4
5
Time in second
#Filename: saveplot
#Before loading this file
#gnuplot>set out myfig.ps (output file)
# File name: saveplot - saves a plot as
#a PostScript file
# to save the current plot as a
#postscript file issue the commands:
# gnuplot> set out 'plotfile.ps'
# gnuplot> load 'saveplot'
set size 1.0, 0.4
set terminal postscript portrait \
enhanced mono lw 2 "Helvetica" 14
replot
set terminal x11
set size 1,1
#Filename: gscript
# Before loading this file,
# gnuplot>set term windows (x11 for unix)
# Gnuplot script file for plotting data
# in file "force.dat"
# Gnuplot script file for plotting data in files
# This file is called force.p
set title "One CBR Competes with One FTP"
set xlabel "Time in second"
set ylabel "Throughput in Mbps"
set key 3,1.8
# set label "Yield Point" at 0.003,260
# set arrow from 0.0028,250 to 0.003,280
set xr [0:5]
set yr [0:2]
plot "thr1" using 1:2 title 'CBR Flow' with
lines, \
"thr2" using 1:2 title 'TCP Flow' with lines
Build NS
http://www.isi.edu/nsnam/ns/ns-build.html
Linux: first build and instal the source packages of tcl, tk and otcl. Then
download a snapshot of ns-2 and build it.
I used to try ns-allinone but failed.
Cygwin: download the allinone package for Cygwin and build it.
Reference: (where most of my materials come from)
http://nile.wpi.edu/NS/
http://nile.wpi.edu/NS/Example/ns-simple-trace.tcl
Good to look at ~/ns-2-root/tcl/lib/ns-default.tcl, which is the init file for
ns.