You are on page 1of 24

TNK092: Network Simulation/Ntverkssimulering Network Simulation---ns2

Lecture 2

An Example with all weve seen so far.


set ns [new Simulator] #Define different colors #for data flows (for NAM) $ns color 1 Blue $ns color 2 Red #Open the NAMtrace 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 #Give links 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 #Set Queue Size of link (n2-n3) to 10 $ns queue-limit $n2 $n3 10 #Monitor the queue for link (n2-n3). (for NAM) $ns duplex-link-op $n2 $n3 queuePos 0.5

n1 n0 n0 n2 n1 n2 n3

n3

An Example with all weve seen so far..


#Setup TCP connection set ns a[new Simulator] set tcp [new Agent/TCP] #Define different colors $ns attach-agent $tcp #for data flows $n0 (for NAM) set sink [new Agent/TCPSink] $ns color 1 Blue $ns attach-agent $n3 $sink $ns color 2 Red $ns connect $tcp $sink $tcp set fid_ 1 #Schedule events for the CBR and FTP agents #Create four nodes set at n00.1 [$ns node] $ns "$cbr start" set at n11.0 [$ns node] $ns "$ftp start" set at n24.0 [$ns node] $ns "$ftp stop" set n3 [$ns node] $ns at 4.5 "$cbr stop" #Detach tcp and sink (not so necessary) $ns duplex-link $n0agents $n2 2Mb 10ms DropTail $ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns duplex-link $n1 $n2 2Mb 10ms DropTail in the SAME line $n2 $ns $n3 detach-agent $n3DropTail $sink" $ns duplex-link 1.7Mb 20ms #Call finish procedure after 5 #Givethe links position (for NAM) #seconds of simulation time $ns duplex-link-op $n0 $n2 orient right-down $ns 5.0 "finish $n1 $n2 orient right-up $ns at duplex-link-op

#Create links between the nodes

#Open the NAMtrace file set nf [open out.nam w] #Setup an FTP over TCP connection $ns namtrace-all $nf
set ftp [new Application/FTP] $ftp attach-agent $tcp #Open the Trace file $ftp set type_ FTP

set tf [open out.tr w] $ns trace-all $tf #Setup a UDP connection


set udp [new Agent/UDP] #Define a 'finish' $ns attach-agent $n1 procedure $udp proc finish { set null [new {} Agent/Null] global ns tf $ns attach-agent $n3nf $null $ns connect $null $ns$udp flush-trace $udp set #Close fid_ 2 the NAM trace file

$ns duplex-link-op $n2 $n3 orient right


#Print CBR packet size and interval puts packet = [$cbr set packet_size_]" #Set "CBR Queue Size size of link (n2-n3) to 10 $ns queue-limit $n2 $n3 10 puts "CBR interval = [$cbr set interval_]" #Run the simulation #Monitor the queue for link (n2-n3). (for NAM) $ns run duplex-link-op $n2 $n3 queuePos $ns ftp0.5

cbr

close $nf #Setup a CBR over UDP connection #Close the Trace file set cbr [new Application/Traffic/CBR] close $tf $cbr attach-agent $udp #Execute $cbr set type_ CBR NAM on the trace file nam out.nam $cbr set exec packet_size_ 1000 & $cbr set exit rate_ 01mb $cbr set random_ false }

ftp tcp n0 cbr upd n1

0 0.1 1.0

4.0 4.5

sec

sink n2 n3 null 3

An Example with all weve seen so far... epimyth

To create agents or traffic sources, a user should know the class names these objects (Agent/TCP, Agnet/TCPSink, Application/FTP and so on). Remember to look at look at the /tcl/libs/ns-default.tcl file.

This file contains the default configurable parameter value settings for available network objects.
Hint: a good indicator of what kind of network objects are available in NS and what are their configurable parameters.
cbr ftp ftp tcp n0 cbr upd n1 4 sink n2 n3 null
0 0.1 1.0 4.0 4.5 sec

Tracing

Besides the NAM trace ns2 can provide an ASCII trace file.

At every link a packet is

Trace Enabled Simple NS Simulation Script

About Awk
AWK is a tool that allows simple data manipulation on trace files.

Sample AWK code:


BEGIN {sum+=$2; array[N]=$2} END { for(i=1;i<=N;i++) { sumsq+=((array[i]-(sum/N))^2); } print sqrt(sumsq/N) }
_______________________________________________________________________________________________________________________

To run use:
awk -f Average.awk out.tr

End to end delay (measure-delay.awk)


BEGIN { #initial the highest packet id highest_packet_id = 0; } { event = $1; time = $2; from = $3; to = $4; type = $5; pktsize = $6; flow_id = $8; src = $9; dst = $10; seq_no = $11; packet_id = $12;

END { for (packet_id=0; packet_id<=highest_packet_id; packet_id++ ) { start = start_time[packet_id]; end = end_time[packet_id]; packet_duration = end - start; if ( start < end ) printf("%f %f\n", start, packet_duration); } }

if ( packet_id > highest_packet_id ) highest_packet_id = packet_id; if ( start_time[packet_id] == 0 ) start_time[packet_id] = time; if ( flow_id == 2 && action != "d" ) { if ( event == "r" ) { end_time[packet_id] = time; } } else { end_time[packet_id] = -1; } }

Remember . . .

awk -f measure-delay.awk out.tr > cbr-delay 8

Plotting with gnuplot


Gnuplot(http://www.gnuplot.info/;http://www.gnuplot.info/documentation.html)

#plotdelay.plot set term png medium #000000 set output "cbr-delay.png" set ylabel "End-to-End delay(sec)" set xlabel "Start transmission time(sec)" set xrang [0:5] set xtics 0, 0.5, 5 set yrang [0:0.1] set ytics 0, 0.01, 0.1 set title "CBR end-to-end delay" plot "cbr-delay" title "CBR" with linespoints lt -1 pt 8

gnuplot>load plotdelay.plot

xgraph
xgraph cbr-delay

10

Jitter (awk codes)


#cbr-jitter.awk BEGIN { old_time=0; old_seq_no=0; i=0; } { action = $1; time = $2; node_1 = $3; node_2 = $4; type = $5; flow_id = $8; node_1_address = $9; node_2_address = $10; seq_no = $11; packet_id = $12; END { for (j=1; j <i ;j++) printf("%d\t%f\n",seq[j],jitter[j]); }

awk f cbr-jitter.awk out.tr > cbr-jitter

if(node_1==2 && node_2==3 && type=="cbr" && action=="r") { dif=seq_no-old_seq_no; if(dif==0) dif=1; jitter[i]=(time-old_time)/dif; seq[i]=seq_no; i=i+1; old_seq_no=seq_no; old_time=time; } } 11

Jitter (...more awk codes)


#cbr-jitter2.awk END { BEGIN { last_seqno = 0; highest_packet_id = 0; last_delay = 0; }{ seqno_diff = 0; action = $1; for ( packet_id = 0; time = $2; packet_id <= highest_packet_id; packet_id++ ) { node_1 = $3; start = start_time[packet_id]; node_2 = $4; end =end_time[packet_id]; type = $5; packet_duration = end - start; flow_id = $8; if ( start < end ) { node_1_address = $9; seqno_diff = pkt_seqno[packet_id]- last_seqno; node_2_address = $10; delay_diff = packet_duration - last_delay; seq_no = $11; if (seqno_diff == 0) { packet_id = $12; jitter =0; if ( packet_id > highest_packet_id ) } else { { jitter = delay_diff/seqno_diff; highest_packet_id = packet_id; } } printf("%f %f\n", start, jitter); if ( start_time[packet_id] == 0 ) { last_seqno = pkt_seqno[packet_id]; pkt_seqno[packet_id] = seq_no; last_delay = packet_duration; start_time[packet_id] = time; } } } if ( flow_id == 2 && action != "d" ) } { if ( action == "r" ) { $awk f cbr-jitter2.awk out.tr > cbr-jitter end_time[packet_id] = time; } } else { end_time[packet_id] = -1; } 12 }

Packet loss (awk codes)


# cbr-loss.awk BEGIN { fsDrops = 0; numFs = 0; } { action = $1; time = $2; node_1 = $3; node_2 = $4; src = $5; flow_id = $8; node_1_address = $9; node_2_address = $10; seq_no = $11; packet_id = $12; if (node_1==1 && node_2==2 && action == "+") numFs++; if (flow_id==2 && action == "d") fsDrops++; } END { printf("number of packets sent:%d lost:%d\n", numFs, fsDrops); }

13

Throughput (awk codes)


BEGIN { init=0; i=0; } { action = $1; time = $2; from = $3; to = $4; type = $5; pktsize = $6; flow_id = $8; src = $9; dst = $10; seq_no = $11; packet_id = $12; if(action=="r" && from==2 && to==3 && flow_id==2) { pkt_byte_sum[i+1]=pkt_byte_sum[i]+ pktsize; if(init==0) { start_time = time; init = 1; } end_time[i] = time; i = i+1; } } END { printf("%.2f\t%.2f\n", end_time[0], 0); for(j=1 ; j<i ; j++){ th = pkt_byte_sum[j] / (end_time[j] start_time)*8/1000; printf("%.2f\t%.2f\n", end_time[j], th); } printf("%.2f\t%.2f\n", end_time[i-1], 0); }

14

Packet loss (awk codes)


BEGIN { fsDrops = 0; numFs = 0; } { action = $1; time = $2; from = $3; to = $4; type = $5; pktsize = $6; flow_id = $8; src = $9; dst = $10; seq_no = $11; packet_id = $12; if (from==1 && to==2 && action == "+") numFs++;
if (flow_id==2 && action == "d") fsDrops++; } END { printf("number of packets sent:%d lost:%d\n", numFs, fsDrops); }

15

Some basic ns2 structuring


In /ns-2.34/tcl/lib: ns-lib.tcl:

The actial simulator class, most of its member function definitions are here default values for configurable parameters for various network components, configure the parameter in otcl which actually take effect through C++ Packet header initialization & implementation, where you register your own packet type

ns-default.tcl:

ns-packet.tcl:

16

Adding your own modules...

You will develop NS2 modules in one the following file types:
File type
C++ code Header definitions Tcl code

Example

myNewMod.cc myNewMod.h myNewMod.tcl

What you would like to do is to incorporate these files into NS2 how?

17

Working assumption...
Assume that we wanted to build a multimedia application that runs over a UDP connection. Lets say that this application implements a "five rate media scaling" which can respond to network congestion to some extent by changing encoding and transmission policy pairs associated with scale parameter values

18

Adding modules Step by step...


STEP 1: Register the new application header, by modifying the files: /common/packet.h and /tcl/lib/ns-packet.tcl 1. In packet.h A. Look for: // insert new packet types here Static packet_t PT_NTYPE = 62; // This MUST be the LAST one And insert new packet types between those 2 lines, eg: static const packet_t PT_Multimedia = 70; B. Look for: class p_info { In public: In static void initName() in the long list of name_ add: name_[PT_Multimedia] = "Multimedia"; 2. In ns-packet.tcl - Look for: foreach prot { And in the list of protocols add: Multimedia
19

Adding modules Step by step...


STEP 2: Add new methods to the Agent and Application classes, by modifying the files: /common/agent.h and /apps/app.h 1. In agent.h -look for: class Agent : public Connector { public: Agent(packet_t pktType); And insert new agent methods as e.g.: virtual int supportMM() {return 0;} virtual void enableMM() {} 2. In app.h -look for: class Application : public Process { public: Application(); And in that list also insert your application methods defintions as e.g.: virtual void recv_msg(int nbytes, const char *msg = 0){}
20

Adding modules Step by step...


STEP 3: Set defaults for the new configurable parameters, in /tcl/lib/ns-default.tcl add
...... Application/MmApp Application/MmApp Application/MmApp Application/MmApp Application/MmApp Application/MmApp Application/MmApp ...... set set set set set set set rate0_ 0.3mb rate1_ 0.6mb rate2_ 0.9mb rate3_ 1.2mb rate4_ 1.5mb pktsize_ 1000 random_ false

21

Adding modules Step by step...


STEP 4: Modify the Makefile Assuming that you have all three .h, .cc and .tcl file types you must make the following modifications (if not, reduce steps accordingly). Note: the Makefile lies in the /ns-2.23 directory Lets assume your files are in /ns-2.34/myWork You will have to modify three places in the Makefile 1. OBJ_CC 2. NS_TCL_LIB 3. INCLUDE As follows:

File type C++ code Header definitions

Example

myNewMod.cc myNewMod.h myNewMod.tcl

1. Look for

Tcl code

OBJ_CC = \ And add: myDir/myNewMod.o \ To one line below


22

Adding modules Step by step...


2. Look for

File type C++ code Header definitions Tcl code

Example

myNewMod.cc myNewMod.h myNewMod.tcl

NS_TCL_LIB = \ And add:

myDir/myfile.tcl \
To one line below

3. (OPTIONAL) Look for

INCLUDES = \ And add:

-I. /myWorks \
To one line below

23

Adding modules Step by step...


STEP 6: Recompile the software ./make

Note: These will be key instruction steps for Lab Assignment 2


24

You might also like