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".