Introduction to ns2
Download
Report
Transcript Introduction to ns2
Introduction to ns2
Network Simulation and Simulator
Internals
潘仁義
[email protected]
Modified from Su Wen’s ns2 ppt
[email protected]
& Padmaparna Haldar’s
[email protected]
The Network Simulator - ns-2
http://www.isi.edu/nsnam/ns/
The source code and documentation is currently
maintained by VINT project at ISI
http://nsnam.isi.edu/nsnam/index.php/Main_Page
Sept 3, 2007: ns-2.32 released.
Mar 10, 2007: ns-2.31 released.
July 2, 2006: ns-3 project announced.
NS2 is a discrete event simulator targeted at networking
research
NS2 is an object oriented simulator, written in C++, with
an OTcl interpreter as a frontend
抽考: ns2安
裝
ns-2 Overview
Collection of various protocols at multiple layers
TCP(reno, tahoe, vegas, sack)
MAC(802.11, 802.3, TDMA)
Ad-hoc Routing (DSDV, DSR, AODV, TORA)
Sensor Network (diffusion, gaf)
Multicast protocols, Satellite protocols, and many others
Codes are contributed from multiple research
communities
Good: Large set of simulation modules
Bad: Level of support and documentation varies
The source code and documentation is currently
maintained by VINT project at ISI
Documentation
introductory: Marc Greis's tutorial
reference: Ns Manual (formerly called "ns
Notes and Documentation")
ns by Example
Practical Programming in Tcl and Tk
(http://www.beedub.com/book/)
http://hpds.ee.ncku.edu.tw/~smallko/ns2/n
s2.htm
Current Status
ns-2 (2.1b6) Simulator Core
100K lines of C++
70K lines of OTcl
30K lines of test suite
20K lines of documentation
Other Components
Tcl/TK 8.x, OTcl, TclCL, nam-1
Tcl-debug, GT-ITM, xgraph, …
ns Directory Structure
ns-allinone
Tcl8.0
TK8.0
OTcl
tclcl
...
tcl
ex
examples
simple.tcl
test
validation tests
ns-2
lib
nam-1
C++ code
mcast
OTcl code
...
Running simulations with ns
Compile the simulator core (“ns”)
Write a simulation script in Otcl
e.g. my-test.tcl
Running the simulator
e.g. ns my-test.tcl
Hello World
simple.tcl
set sim [new Simulator]
$sim at 1 “puts \“Hello World!\””
$sim at 1.5 “exit”
$sim run
arches 74% ns simple.tcl
Hello World!
arches 75%
Discrete Event Simulation
Model world as events
Simulator has list of events
Process: take next one, run it, until done
Each event happens in an instant of virtual
(simulated) time, but takes an arbitrary amount of
real time
Ns uses simple model: single thread of
control => no locking or race conditions to
worry about (very easy)
Discrete Event Examples
Consider two nodes
on an Ethernet:
A
B
simple
queuing
model:
t=1, A enqueues pkt on LAN
t=1.01, LAN dequeues pkt
and triggers B
t=1.0: A sends pkt to NIC
A’s NIC starts carrier sense
detailed
t=1.005: A’s NIC concludes cs,
CSMA/CD
starts tx
model:
t=1.006: B’s NIC begins reciving pkt
t=1.01: B’s NIC concludes pkt
B’s NIC passes pkt to app
ns-2 Environment
Simulation
Scenario
1
2
set ns_ [new Simulator]
Tcl Script
set node_(0) [$ns_ node]
set node_(1) [$ns_ node]
C++
Implementation
class MobileNode : public Node
{
friend class PositionHandler;
public:
MobileNode();
•
•
}
Why two languages? (Tcl & C++)
C++: Detailed protocol simulations require
systems programming language
byte manipulation, packet processing, algorithm
implementation
Run time speed is important
Turn around time (run simulation, find bug, fix bug,
recompile, re-run) is slower
Tcl: Simulation of slightly varying parameters or
configurations
quickly exploring a number of scenarios
iteration time (change the model and re-run) is more
important
C++ and OTcl Separation
“data” / control separation
C++ for “data”:
per packet processing, core of ns
fast to run, detailed, complete control
OTcl for control:
Simulation scenario configurations
Periodic or triggered action
Manipulating existing C++ objects
fast to write and change
+ running vs. writing speed
– Learning and debugging (two languages)
Using ns
Problem
Result
analysis
Simulation
model
Setup/run
simulation
with ns
Modify
ns
Summary: Generic Script
Structure
set ns [new Simulator]
# [Turn on tracing]
# Create topology
# Setup packet loss, link dynamics
# Create routing agents
# Create:
#
- multicast groups
#
- protocol agents
#
- application and/or setup traffic sources
# Post-processing procs
# Start simulation
Basic Tcl
variables:
set x 10
puts “x is $x”
functions and expressions:
set y [pow x 2]
set y [expr x*x]
control flow:
if {$x > 0} { return $x } else {
return [expr -$x] }
while { $x > 0 } {
puts $x
incr x –1
}
procedures:
proc pow {x n} {
if {$n == 1} { return $x }
set part [pow x [expr $n-1]]
return [expr $x*$part]
}
Also lists, associative arrays,
etc.
=> can use a real
programming language to
build network topologies,
traffic models, etc.
Basic otcl
Class Person
# constructor:
Person instproc init {age} {
$self instvar age_
set age_ $age
}
# method:
Person instproc greet {} {
$self instvar age_
puts “$age_ years old: How
are you doing?”
}
Person a 45
Kid b 15
a greet
b greet
# subclass:
Class Kid -superclass Person
Kid instproc greet {} {
$self instvar age_
puts “$age_ years old kid:
What’s up, dude?”
}
set a [new Person 45]
set b [new Kid 15]
$a greet
$b greet
# “new” in ns2 only
=> can easily make variations of existing things (TCP, TCP/Reno)
Otcl and C++: The Duality
C++
C++/OTcl
split objects
otcl
OTcl (object variant of Tcl) and C++ share class
hierarchy
TclCL is glue library that makes it easy to share
functions, variables, etc
C++ and OTcl Linkage
Class Tcl: instance of OTcl interpreter
Tcl& tcl = Tcl::instance();
tcl.evalc(“puts stdout hello world”);
tcl.result() and tcl.error()
Class TclObject and TclClass
Variable bindings
bind(“rtt_”, &t_rtt_)
Invoking command method in shadow class
$tcp advanceby 10
C++ and Otcl linkage II
Some important objects:
NsObject: has recv() method
Connector: has target() and drop()
BiConnector: uptarget() & downtarget()
目前悟性不夠
TclObject: Hierarchy and Shadowing
TclObject OTcl class
hierarchy
Agent
C++ class
hierarchy
TclObject
static JSTcpClass : public TclClass {
public:
JSTcpClass():TclClass("Agent/TCP/JS"){}
TclObject*
create(int,const char*const*)
{ return (new JSTcpAgent());}
};
Agent
JSTcpAgent
Agent/TCP/JS
_o123
Agent/TCP/JS OTcl
shadow object
*tcp
Agent/TCP/JS C++
object
TclObject: Creation and Deletion
Agent/TCP/JS
constructor
invoke parent
constructor
complete
initialization
Agent/TCP
constructor
invoke parent
constructor
complete
which
C++
initialization
object
to create?
TclObject
constructor
create C++
object
create OTcl
shadow object
– TclClass
TclObject (C++)
constructor
parent (Agent)
constructor
JSTCPAgent
constructor
do nothing,
return
invoke parent
constructor
bind variables
and return
invoke parent
constructor
bind variables
and return
OTcl
C++
Class Hierarchy in ns
TclObject
NsObject
Connector
Queue
Delay Agent
DropTail RED
TCP
Reno
SACK
Classifier
Trace
AddrClassifier McastClasifier
Enq Deq
JS
Drop
TCP Jump Start – Step 1
New file: tcp-js.h
class JSTcpAgent : public TcpAgent {
public:
virtual void set_initial_window() {
cwnd_ = MAXWIN_;
}
JSTcpAgent();
private:
int MAXWIN_;
};
TCP Jump Start – Step 2
New file: tcp-js.cc
#include “tcp.h”
#include “tcp-js.h”
static JSTcpClass : public TclClass {
public:
JSTcpClass() : TclClass("Agent/TCP/JS") {}
TclObject* create(int, const char*const*) {
return (new JSTcpAgent());
}
}class_jstcp;
JSTcpAgent::JSTcpAgent() {
bind(“MAXWIN_”, &MAXWIN_);
}
TclObject::bind()
Link C++ member variables to OTcl object
variables
C++
TcpAgent::TcpAgent() {
bind(“window_”, &wnd_);
… …
}
bind_time(), bind_bool(), bind_bw() (set with unit)
OTcl
set tcp [new Agent/TCP]
$tcp set window_ 200
Initialization of Bound Variables
Initialization through OTcl class variables
Agent/TCP set window_ 50
Do all initialization of bound variables in
~ns/lib/ns-default.tcl
Otherwise a warning will be issued when the
shadow object is created
After modifying, remember to make ns2
Calling C++ functions from Otcl
OTcl
set tcp [new Agent/TCP]
$tcp advance 10
C++
int TcpAgent::command(int argc,
const char*const* argv) {
if (argc == 3) {
if (strcmp(argv[1], “advance”) == 0) {
int newseq = atoi(argv[2]);
……
return(TCL_OK);
}
}
return (Agent::command(argc, argv);
}
TclObject::command()
$tcp send
OTcl space
no such
procedure
TclObject::unknown{}
$tcp cmd send
C++ space
TcpAgent::command()
Yes
process and return
match
“send”?
No
Invoke parent:
return Agent::command()
Calling Otcl functions from C++
OTcl
Agent/TCP instproc advance {num} {
set window_ [expr $window_ + $num]
return $window_
}
C++
Tcl& tcl = Tcl::instance();
char *result;
tcl.evalf(“%s advance %d”, name_, size);
result = tcl.result();
wnd_ = atoi(result);
EmbeddedTcl
How it works
tcl2c++: provided by TclCL, converts tcl
scripts into a C++ static character array
Makefile.in:
tclsh8.0 bin/tcl-expand.tcl tcl/lib/nslib.tcl | tcl2c++ et_ns_lib >
gen/ns_tcl.cc
Summary
TclObject
Unified interpreted (OTcl) and compiled (C++)
class hierarchies
Seamless access (procedure call and variable
access) between OTcl and C++
TclClass
The mechanism that makes TclObject work
Tcl: primitives to access Tcl interpreter
Event Scheduler
Create event scheduler
set ns [new Simulator]
Schedule events
$ns at <time> <event>
<event>: any legitimate ns/tcl commands
$ns at 0.1 “$ftp start”
$ns at 4.0 “$ftp stop”
$ns at 5.0 “finish”
Start scheduler
$ns run
ns/common/scheduler.cc
Scheduler::command() “now”, “at”
ns/link/delay.cc
LinkDelay::recv() “s.schedule()”
Extending ns in OTcl
ns-allinone
Tcl8.0
TK8.0
OTcl
tclcl
...
tcl
ex
examples
test
validation tests
mysrc
msg.tcl
ns-2
lib
nam-1
C++ code
mcast
OTcl code
...
Add Your Changes into ns
source your changes in your sim scripts
Or
add to tcl/lib/ns-lib.tcl
…
source ../mysrc/msg.tcl
Change Makefile
NS_TCL_LIB = \
tcl/mysrc/msg.tcl \
…
Recompile
Scalability vs Flexibility
It’s tempting to write all-OTcl simulation
Benefit: quick prototyping
Cost: memory + runtime
Solution
Control the granularity of your split object by
migrating methods from OTcl to C++
Conventional Wisdom:
C++ for “data”
Per packet action
OTcl for control
Periodic or triggered action
THE Merit of OTcl
high
Program size, complexity
low
OTcl
C/C++
split objects
Smoothly adjust the granularity of scripting to
balance extensibility and performance
With complete compatibility with existing
simulation scripts
Object Granularity Tips
Functionality
Per-packet processing C++
Hooks, frequently changing code OTcl
Data management
Complex/large data structure C++
One-time configuration variables OTcl
Memory Conservation Tips
Avoid trace-all
Use arrays for a sequence of variables
Instead of n$i, say n($i)
Avoid OTcl temporary variables
Use dynamic binding
delay_bind() instead of bind()
See object.{h,cc}
Memory Leaks
Purify or dmalloc, but be careful about split
objects:
for {set i 0} {$i < 500} {incr i} {
set a [new RandomVariable/Constant]
}
It leaks memory, but can’t be detected!
Solution
Explicitly delete EVERY split object that was
new-ed
Backup slide
OTcl Linkage
OTcl Linkage是c++和OTcl 的一個介面。
C++ code
OLcl Linkake
OTcl code
描述
名稱
繼承
C++ object
class
Linkage
object
MyAgent
Agent
MyAgent TCL CLass
CLass
OTcl object Agent/MyA
gentOtcl
OTcl Linkage
如何使用OTcl linkage
Export C++ class variables to OTcl
OTcl變數
C++變數
- bind(): real or integer variables
- bind_time(): time variable
- bind_bw(): bandwidth variable
- bind_bool(): boolean variable
請在ns-2/tcl/lib/ns-lib.tcl 設預設值,否則會有警告
message
如何使用OTcl linkage
Export C++ Object Control Commands to OTcl
This is done by defining a "command" member
function of your C++ object, which works as an OTcl
command interpreter.
When OTcl object( is created and the user tries to call a member
function of that object (i.e. $myagent call-my-priv-func), OTcl
searches for the given member function name in the OTcl object. If
the given member function name cannot be found, then it invokes the
"MyAgent::command" passing the invoked OTcl member function
name and arguments in argc/argv format.
如何使用OTcl linkage
Export C++ Object Control Commands to OTcl
-
如何使用OTcl linkage
Execute an OTcl command from C++.
makes an OTcl interpreter print out the value in
"my_var1" and "my_var2" private member
variables
To execute an OTcl command from C++, you
should get a reference to "Tcl::instance()"
如何使用OTcl linkage
Compile, run and test "MyAgent“
put "ex-linkage.cc" file, and save it under the "ns2" directory.
Open "Makefile", add "ex-linkage.o" at the end of
object file list.
Re-compile NS using the "make" command.
Run the OTcl script using command "ns exlinkage.tcl".
如何使用OTcl linkage
如何使用OTcl linkage
C++ Guidelines
Decide position in class hierarchy
i.e., which class to derive from?
Create new packet header (if necessary)
Create C++ class, fill in methods
Define OTcl linkage (if any)
Write OTcl code (if any)
Build (and debug)
Where to Find What?
Where to Find What?
ns-lib.tcl: The simulator class and most of its
member function definitions except for LAN, Web,
and Multicast related ones are located here.
ns-default.tcl: The default values for configurable
parameters for various network components are
located here. the parameters are actually C++
variables made available to OTcl via an OTcl linkage
function
bind(C++_variable_name, OTcl_variable_name)
Where to Find What?
ns-packet.tcl: The packet header format initialization
implementation is located here. When you create a
new packet header, you should register the header
in this file to make the packet header initialization
process and give you the offset of your header in the
stack.
other OTcl files: Other OTcl files in this directory, The
FTP application is entirely implemented in OTcl and
the source code is located in "ns-source.tcl".