Upload
xuan
View
36
Download
0
Embed Size (px)
DESCRIPTION
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/ - PowerPoint PPT Presentation
Citation preview
Introduction to ns2
Network Simulation and Simulator Internals潘仁義
[email protected] from Su Wen’s ns2 ppt
[email protected]& Padmaparna Haldar’s
The Network Simulator - ns-2
http://www.isi.edu/nsnam/ns/ The source code and documentation is currently mai
ntained 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 Core100K lines of C++70K lines of OTcl30K lines of test suite20K lines of documentation
Other ComponentsTcl/TK 8.x, OTcl, TclCL, nam-1Tcl-debug, GT-ITM, xgraph, …
ns Directory Structure
TK8.0 OTcl tclclTcl8.0 ns-2 nam-1
tcl
ex test lib
...
...
examples validation tests
C++ code
OTcl code
ns-allinone
mcast
simple.tcl
Running simulations with ns
Compile the simulator core (“ns”)Write a simulation script in Otcl
e.g. my-test.tcl
Running the simulatore.g. ns my-test.tcl
Hello World
simple.tclset 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 eventsSimulator has list of eventsProcess: take next one, run it, until doneEach 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 nodeson an Ethernet:
A B
simplequeuingmodel:
t=1, A enqueues pkt on LANt=1.01, LAN dequeues pkt
and triggers B
detailedCSMA/CDmodel:
t=1.0: A sends pkt to NICA’s NIC starts carrier sense
t=1.005: A’s NIC concludes cs,starts tx
t=1.006: B’s NIC begins reciving pktt=1.01: B’s NIC concludes pkt
B’s NIC passes pkt to app
ns-2 EnvironmentSimulation Scenario
Tcl Script
C++ Implementation
1 2
set ns_ [new Simulator]
set node_(0) [$ns_ node]
set node_(1) [$ns_ node]
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 imple
mentationRun time speed is importantTurn around time (run simulation, find bug, fix bug, rec
ompile, re-run) is slowerTcl: Simulation of slightly varying parameters or c
onfigurationsquickly exploring a number of scenariositeration time (change the model and re-run) is more im
portant
C++ and OTcl Separation
“data” / control separationC++ for “data”:
per packet processing, core of ns fast to run, detailed, complete control
OTcl for control:Simulation scenario configurationsPeriodic or triggered actionManipulating existing C++ objects fast to write and change
+ running vs. writing speed– Learning and debugging (two languages)
Using ns
Problem
Simulationmodel
Setup/run simulation
with ns
Resultanalysis
Modifyns
Summary: Generic Script Structure
set ns [new Simulator]set ns [new Simulator]
# [Turn on tracing]# [Turn on tracing]
# Create topology# Create topology
# Setup packet loss, link dynamics# Setup packet loss, link dynamics
# Create routing agents# Create routing agents
# Create: # Create:
# - multicast groups# - multicast groups
# - protocol agents# - protocol agents
# - application and/or setup traffic sources# - application and/or setup traffic sources
# Post-processing procs# Post-processing procs
# Start simulation# Start simulation
Basic Tcl
variables:set x 10puts “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 $xincr 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 otclClass 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?”
}
# subclass:Class Kid -superclass PersonKid 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)
Person a 45; Kid b 15a greet; b greetPerson info instancesa info class; a info vars
Otcl and C++: The Duality
OTcl (object variant of Tcl) and C++ share class hierarchy
TclCL is glue library that makes it easy to share functions, variables, etc
C++
otcl
C++/OTcl split object
s
C++ and OTcl Linkage
Class Tcl: instance of OTcl interpreterTcl& tcl = Tcl::instance();
tcl.evalc(“puts stdout hello world”);
tcl.result() and tcl.error()
Class TclObject and TclClassVariable 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() methodConnector: has target() and drop()BiConnector: uptarget() & downtarget()
目前悟性不夠
TclObject: Hierarchy and Shadowing
TclObject
Agent
Agent/TCP/JS
Agent/TCP/JS OTcl shadow object
_o123Agent/TCP/JS C++
object
*tcp
TclObject
Agent
JSTcpAgent
OTcl classhierarchy
C++ classhierarchy
static JSTcpClass : public TclClass {public:JSTcpClass():TclClass("Agent/TCP/JS"){} TclObject* create(int,const char*const*) { return (new JSTcpAgent());}};
C++
OTcl
TclObject: Creation and Deletion
invoke parentconstructor
Agent/TCP/JSconstructor
Agent/TCP constructor
invoke parentconstructor
TclObjectconstructor
create C++object
JSTCPAgentconstructor
invoke parentconstructordo nothing,
return
TclObject (C++)constructor
bind variablesand return
bind variablesand return
create OTclshadow object
complete initialization
complete initialization
which C++ object to create? – TclClass
invoke parentconstructor
parent (Agent)constructor
Class Hierarchy in ns
TclObject
NsObject
Connector Classifier
Delay AddrClassifierAgent McastClasifierQueue Trace
DropTail RED TCP Enq Deq Drop
Reno SACK JS
TCP Jump Start – Step 1
New file: tcp-js.h
class JSTcpAgent : public TcpAgent {class JSTcpAgent : public TcpAgent {
public:public:
virtual void set_initial_window() {virtual void set_initial_window() {
cwnd_ = MAXWIN_;cwnd_ = MAXWIN_;
}}
JSTcpAgent();JSTcpAgent();
private:private:
int MAXWIN_;int MAXWIN_;
};};
TCP Jump Start – Step 2
New file: tcp-js.cc#include “tcp.h”#include “tcp-js.h”
static class 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)
OTclset tcp [new Agent/TCP]set tcp [new Agent/TCP]$tcp set window_ 200$tcp set window_ 200
Initialization of Bound Variables
Initialization through OTcl class variablesAgent/TCP set Agent/TCP set window_window_ 50 50
Do all initialization of bound variables in ~ns/lib/ns-default.tclOtherwise a warning will be issued when the
shadow object is createdAfter modifying, remember to make ns2
Calling C++ functions from Otcl
OTclset 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 TclObject::unknown{} $tcp cmd sendno suchprocedure
TcpAgent::command()
match “send”?
Invoke parent: return Agent::command()
process and return
Yes No
OTcl space
C++ space
Calling Otcl functions from C++
OTclAgent/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 workstcl2c++tcl2c++: provided by TclCL, converts tcl script
s into a C++ static character arrayMakefile.in:tclsh8.0 bin/tcl-expand.tcl tcl/lib/ns-litclsh8.0 bin/tcl-expand.tcl tcl/lib/ns-lib.tcl | tcl2c++ et_ns_lib > gen/ns_tcl.b.tcl | tcl2c++ et_ns_lib > gen/ns_tcl.cccc
Summary
TclObjectUnified interpreted (OTcl) and compiled (C++)
class hierarchiesSeamless access (procedure call and variable
access) between OTcl and C++TclClass
The mechanism that makes TclObject workTcl: 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
TK8.0 OTcl tclclTcl8.0 ns-2 nam-1
tcl
ex test lib
...
...
examples validation tests
C++ code
OTcl code
ns-allinone
mcastmysrc
msg.tcl
Add Your Changes into ns
source your changes in your sim scripts
Or add to tcl/lib/ns-lib.tcl
……source ../mysrc/msg.tclsource ../mysrc/msg.tcl
Change MakefileNS_TCL_LIB = \NS_TCL_LIB = \
tcl/mysrc/msg.tcl \tcl/mysrc/msg.tcl \……
Recompile
Scalability vs Flexibility
It’s tempting to write all-OTcl simulationBenefit: quick prototypingCost: memory + runtime
SolutionControl the granularity of your split object by migra
ting methods from OTcl to C++
Conventional Wisdom:C++ for “data”
Per packet action
OTcl for controlPeriodic or triggered action
THE Merit of OTcl
Program size, complexity
C/C++ OTcl
Smoothly adjust the granularity of scripting to balance extensibility and performance
With complete compatibility with existing simulation scripts
high low
split objects
Object Granularity Tips
FunctionalityPer-packet processing C++Hooks, frequently changing code OTcl
Data managementComplex/large data structure C++One-time configuration variables OTcl
Memory Conservation Tips
Avoid trace-alltrace-all
Use arrays for a sequence of variablesInstead of n$in$i, say n($i)n($i)
Avoid OTcl temporary variablesUse dynamic binding
delay_bind()delay_bind() instead of bind()bind()See object.{h,cc}
Memory Leaks
Purify or dmalloc, but be careful about split objects:for {set i 0} {$i < 500} {incr i} {for {set i 0} {$i < 500} {incr i} {
set a [new RandomVariable/Constanset a [new RandomVariable/Constant]t]
}}It leaks memory, but can’t be detected!
SolutionExplicitly delete EVERY split object that was n
ew-ed
Backup slide
OTcl Linkage
OTcl Linkage 是 c++ 和 OTcl 的一個介面。
C++ code
OLcl Linkake
OTcl code
描述 名稱 繼承C++ object
classMyAgent Agent
Linkage object
MyAgent
CLass
TCL CLass
OTcl object
Agent/MyAgentOtcl
OTcl Linkage
如何使用 OTcl linkage Export C++ class variables to OTcl
- 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 變數 C++ 變數
如何使用 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 "ns-2" 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 ex-linkage.tcl".
如何使用 OTcl linkage
如何使用 OTcl linkage
C++ Guidelines
Decide position in class hierarchyi.e., which class to derive from?
Create new packet header (if necessary)Create C++ class, fill in methodsDefine 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".