You are on page 1of 28

Introduction to ns-2

Noun Choi
Oct. 11, 2007

Outline
Background
ns-2 Internals
Short demo
Troubleshooting
Reference links
Q&A

History and Status

UCB REAL network simulator


VINT from LBL, PARC, UCB, & USC
ns-1
ns-2, currently maintained by USC/ISI
100K lines of C++
70K lines of OTcl
30K lines of test suite
20K lines of documentation

Platforms
Most UNIX and UNIX-like systems
- FreeBSD or *BSD
- Linux
- Sun Solaris
- HP, SGI

WINDOWS
Under Cygwin

Components of ns-2

Tcl/TK: ns-2 is an extended Tcl interpreter


OTcl: Object Tcl
TclCL: Tcl with classes library
ns-2
nam-1: Network Animator
xgraph: Plotting and Graphing
And more.

Installation
Latest version: 2.31 (Mar 10, 2007)
Download ns-allinone
http://www.isi.edu/nsnam/ns/ns-build.html#allin
one

./install will configure, compile, & install


Problem?
http://www.isi.edu/nsnam/ns/ns-problems.html

What is ns-2

Discrete-event driven network simulation


Object Oriented
ns-2 is an extended Tcl (OTcl) interpreter
ns-2 is written in C++ and OTcl
OTcl = Tcl + OO
C++ implements the code that executed
frequently
OTcl configures the system

Pros & Cons


Free
Almost all network
components are
implemented
Active contributions
from researchers
Easy to modify and/or
add new functions

Unreliable
Real Object
Oriented?
Hard to troubleshoot
Unrealistic abstraction

OTcl and C++: The Duality

C++

otcl

OTcl Linkage
set tcp [new Agent/TCP]

static class TcpClass : public TclClass {


public:
TcpClass() : TclClass("Agent/TCP") {}

Agent/TCP
init

Agent
init

TclObject
Create C++
object

TclObject* create(int, const char*const*) {


return (new TcpAgent);}
} class_tcp;

Create Otcl
shadow object

OTcl
TclObject
(C++)
constructor

parent
constructor

TcpAgent
constructor

C++

OTcl Linkage (II)


Command()
Otcl
$tcp advance 10

C++
int Agent::command(int argc, const char*const* argv)
{
if (argc == 3) {
if (strcmp(argv[1], advance") == 0) {
int newswq = atoi(argv[2]);
return (TCL_OK);
}
}
return (Agent::command(argc, argv);
}

OTcl Linkage (III)


bind(): link C++ member variables to Otcl
object variables
C++
TcpAgent::TcpAgent() {
bind(window_, &wnd_);
}
// bind_time(), bind_bool(), bind_bw()

Otcl
$tcp set window_ 200

You must setting the


initial values of variants
in ~ns/tcl/lib/nsdefault.tcl

OTcl Linkage (IV)


Invoking Otcl procedure and obtaining its results
Tcl::instance().evalf("%s Lookup_CIP_RT %d", name(), iph>dst().addr_);
nextHop = Tcl::instance().result();
Classifier/Addr/Cip instproc Lookup_CIP_RT { m_addr }
{ return }

Passing a results string to Otcl


Tcl::instance().result()

Buffer

How ns-2 works


Register Event
Event Queue

Target object
Event (Packet)
Time

Deque

Dispatch

Object A

Scheduler
Dispatch

Object B

Source code in Scheduler.cc


void Scheduler::schedule(Handler* h, Event* e, double delay) {
e->uid_ = uid_++;
e->handler_ = h;
double t = clock_ + delay;
e->time_ = t;
insert(e);
}
void Scheduler::run() {
instance_ = this;
Event *p;
while (!halted_ && (p = deque())) {
dispatch(p, p->time_);
}
}
void Scheduler::dispatch(Event* p, double t) {
clock_ = t;
p->uid_ = -p->uid_;
// being dispatched
p->handler_->handle(p);
// dispatch
}

An Example
A

CBR

CBR Sink

Transport

Transport

Network

Network

LL

LL

IFQ

Scheduler

IFQ

MAC

MAC

NetIF

NetIF

Wireless Channel

Demonstration
MobileNode

Wireless
Wired

Wired
BaseStation

MobileNode

MobileNode

Demonstration (Contd.)

set opt(chan)
Channel/WirelessChannel
;# channel type
set opt(prop)
Propagation/TwoRayGround
;# radio-propagation model
set opt(netif)
Phy/WirelessPhy
;# network interface type
set opt(mac)
Mac/802_11
;# MAC type
set opt(ifq)
Queue/DropTail/PriQueue
;# interface queue type
set opt(ll)
LL
;# link layer type
set opt(ant)
Antenna/OmniAntenna
;# antenna model
set opt(ifqlen)
50
;# max packet in ifq
set opt(adhocRouting)
DSDV
;# routing protocol

set opt(cp)
set opt(sc)

set opt(x)
670
set opt(y)
670
set opt(seed) 0.0
set opt(stop) 250

set opt(ftp1-start)
set opt(ftp2-start)

set num_wired_nodes
set num_bs_nodes

""
"./scen/scen-3-test"

;# connection pattern file


;# node movement file.
;# x coordinate of topology
;# y coordinate of topology
;# seed for random number gen.
;# time to stop simulation

100
150
2
1

Demonstration (Contd.)

#
================================================================
# accpet input parameter
set opt(nn)
[lindex $argv 0]
set outfile_ [lindex $argv 1]

#
================================================================
# check for boundary parameters and random seed
if { $opt(x) == 0 || $opt(y) == 0 } {
puts "No X-Y boundary values given for wireless topology\n"
}

if {$opt(seed) > 0} {
puts "Seeding Random number generator with $opt(seed)\n"
ns-random $opt(seed)
}

Demonstration (Contd.)

# create simulator instance


set ns_ [new Simulator]

# set up for hierarchical routing


$ns_ node-config -addressType hierarchical
AddrParams set domain_num_ 2
;# number of domains
lappend cluster_num 2 1
;# number of clusters in each domain
AddrParams set cluster_num_ $cluster_num
lappend eilastlevel 1 1 4
;# number of nodes in each cluster
AddrParams set nodes_num_ $eilastlevel ;# of each domain

set tracefd [open $outfile_.tr w]


set namtrace [open $outfile_.nam w]
$ns_ trace-all $tracefd
$ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y)

Demonstration (Contd.)

# Create topography object


set topo [new Topography]

# define topology
$topo load_flatgrid $opt(x) $opt(y)

# create God
create-god [expr $opt(nn) + $num_bs_nodes]

#create wired nodes


set temp {0.0.0 0.1.0}
;# hierarchical addresses for wired
domain
for {set i 0} {$i < $num_wired_nodes} {incr i} {

set W($i) [$ns_ node [lindex $temp $i]]


}

Demonstration (Contd.)

# configure for base-station node


$ns_ node-config -adhocRouting $opt(adhocRouting) \
-llType $opt(ll) \
-macType $opt(mac) \
-ifqType $opt(ifq) \
-ifqLen $opt(ifqlen) \
-antType $opt(ant) \
-propType $opt(prop) \
-phyType $opt(netif) \
-channelType $opt(chan) \
-topoInstance $topo \
-wiredRouting ON \
-agentTrace OFF \
-routerTrace OFF \
-macTrace OFF

#create base-station node


set temp {1.0.0 1.0.1 1.0.2 1.0.3} ;# hier address to be used for wireless
;# domain
set BS(0) [$ns_ node [lindex $temp 0]]
$BS(0) random-motion 0
;# disable random motion

#provide some co-ord (fixed) to base station node


$BS(0) set X_ 1.0
$BS(0) set Y_ 2.0
$BS(0) set Z_ 0.0

Demonstration (Contd.)

#configure for mobilenodes


$ns_ node-config -wiredRouting OFF

for {set j 0} {$j < $opt(nn)} {incr j} {


set node_($j) [ $ns_ node [lindex $temp \
[expr $j+1]] ]
$node_($j) base-station [AddrParams addr2id \
[$BS(0) node-addr]]
}

#create links between wired and BS nodes

$ns_ duplex-link $W(0) $W(1) 5Mb 2ms DropTail


$ns_ duplex-link $W(1) $BS(0) 5Mb 2ms DropTail

$ns_ duplex-link-op $W(0) $W(1) orient down


$ns_ duplex-link-op $W(1) $BS(0) orient left-down

Demonstration (Contd.)

# setup TCP connections


set tcp1 [new Agent/TCP]
$tcp1 set class_ 2
set sink1 [new Agent/TCPSink]
$ns_ attach-agent $node_(0) $tcp1
$ns_ attach-agent $W(0) $sink1
$ns_ connect $tcp1 $sink1
set ftp1 [new Application/FTP]
$ftp1 attach-agent $tcp1
$ns_ at $opt(ftp1-start) "$ftp1 start"

set tcp2 [new Agent/TCP]


$tcp2 set class_ 2
set sink2 [new Agent/TCPSink]
$ns_ attach-agent $W(1) $tcp2
$ns_ attach-agent $node_(2) $sink2
$ns_ connect $tcp2 $sink2
set ftp2 [new Application/FTP]
$ftp2 attach-agent $tcp2
$ns_ at $opt(ftp2-start) "$ftp2 start"

Demonstration (Contd.)

# Tell all nodes when the simulation ends


for {set i } {$i < $opt(nn) } {incr i} {
$ns_ at $opt(stop).0 "$node_($i) reset";
}
$ns_ at $opt(stop).0 "$BS(0) reset";

$ns_ at $opt(stop).0002 "puts \"NS EXITING...\" ; $ns_ halt"


$ns_ at $opt(stop).0001 "stop"
proc stop {} {
global ns_ tracefd namtrace
# $ns_ flush-trace
close $tracefd
close $namtrace
}

puts "Starting Simulation..."


$ns_ run

Trace File Format


Event

Abbreviation

Type

Value

%g %d %d %s %d %s %d %d.%d %d.%d %d
%d

Normal Event

r: Receive
d: Drop
e: Error
+: Enque
-: Deque

double

Time

Int

Source Node

int

Destination Node

string

Packet Name

int

Packet Size

string

Flags

Int

Flow ID

Int

Source Address

Int

Destination Address

Int

Sequence Number

Int

Unique Packet ID

Troubleshooting
Problem while installing
Compiler may complain
http://www.isi.edu/nsnam/ns/ns-problems.html

Program crashes
Use gdb

Unexpected results
Hidden problem
Slice & dice the trace log

Reference Links

http://www.isi.edu/nsnam/ns/
Manual & Tutorial
http://www.isi.edu/nsnam/ns/ns-documentation.html
http://www.isi.edu/nsnam/ns/tutorial/index.html
http://www-sop.inria.fr/maestro/personnel/Eitan.Altman/COURS-NS/n3.p
df

Mailing List

http://www.isi.edu/nsnam/ns/ns-lists.html

Tcl
http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html

OTcl
http://bmrc.berkeley.edu/research/cmt/cmtdoc/otcl/tutorial.html

tclCL
http://www.openmash.org/lxr/source/tclcl/tclcl.tcl?c=tutorials

You might also like