Introduction to ns2

Post on 13-Jan-2016

33 views 0 download

description

Introduction to ns2. Network Simulation and Simulator Internals 潘仁義 jypan@comm.ccu.edu.tw. Modified from Su Wen ’ s ns2 ppt suwen@dcs.uky.edu & Padmaparna Haldar ’ s haldar@isi.edu. The Network Simulator - ns-2. http://www.isi.edu/nsnam/ns/ - PowerPoint PPT Presentation

Transcript of Introduction to ns2

Introduction to ns2

Network Simulation and Simulator Internals潘仁義

jypan@comm.ccu.edu.twModified from Su Wen’s ns2 ppt

suwen@dcs.uky.edu& Padmaparna Haldar’s

haldar@isi.edu

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