ns2入门简介知识分享.ppt_第1页
ns2入门简介知识分享.ppt_第2页
ns2入门简介知识分享.ppt_第3页
ns2入门简介知识分享.ppt_第4页
ns2入门简介知识分享.ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Network Simulator(v2) 简介,NS-2简介部分,NS-2的概貌 Tcl/Tk编程环境概述 NS-2的实现机制和类的体系结构 解释器相关类的介绍和用途 模拟器Otcl类Simulator 事件调度器的实现 NS-2的网络组件 应用层的模拟 具体开发实例,一个简单的模拟网络的实例,从用户的角度来看NS-2,NS-2的概貌,NS是面向对象的,离散事件驱动的网络环境模拟器,开发于UC Berkeley,它可以模拟各种IP网络环境。 NS实现了对许多网络协议的模拟,如TCP,UDP,和数据源发生器(traffic source)如FTP,WWW,Telnet,Web,CBR和VBR等

2、。 NS模拟了路由队列的管理机制,如Drop Tail,RED和VBR,实现了Dijkstra和其他的路由算法。 NS也实现了Multicasting和一些应用于局域网模拟的在MAC层的协议。 NS-2由C+和Otcl(加上面向对象特性的TCL脚本程序设计语言,开发于MIT)两种程序设计语言实现。,Tcl与Tk编程环境概述,Tcl与Tk是安装在Unix/Linux环境下的两个包,它们一起构成了一套开发系统应用程序和图形用户界面接口(GUI)应用程序的环境。 Tcl的全称是Tool Command Language。 Tk是Tcl在X Window环境下的扩展,它包含了Tcl的全部的C库函数,以

3、及支持X Window的窗口、控件等C库函数,为用户开发图形用户界面提供了方便。 Tcl是解释执行的脚本语言。它的实现依赖于Tcl内部的C函数库。添加新的C函数就可以扩充Tcl的命令和功能,是扩展性非常强的脚本程序设计语言。 Tcl解释器把用户输入的命令和程序语句进行初步分析,然后调用C函数库里的相应函数来执行,输出结果。 Tcl是无强制类型的脚本语言,一切变量,不论整型,浮点型等,都以字符串的形式存储。,Tcl与Tk编程环境概述,# Writing a procedure called test proc test set a 43 set b 27 set c expr $a + $b s

4、et d expr expr $a - $b * $c for set k 0 $k 10 incr k # Calling the test procedure created above test,Tcl命令和语句的执行过程,Tcl解释器分为两个主要模块,Tcl的Parser和Tcl的executer。 Tcl的Parser要执行的主要功能是:把输入的命令或者语句切割成一个一个的字符串,并在一遍扫描的过程中进行变量替换、命令结果替换和特殊字符替换。在切割过程中不对命令进行任何语意理解。 Tcl命令的基本构成是:命令名+参数+参数+ Tcl的executer的功能是:把Tcl的Parser处

5、理过的命令或语句字符串向量进行分析。由于字符串向量的第一个字符串元素是命令的名称,那么executer匹配Tcl中C库函数的函数名,当匹配到的时候,把全部参数传递给匹配到的C函数来执行命令,然后返回结果。如果匹配不到则返回错误。 返回的结果都是字符串类型的,如果没有实际意义的返回结果,则返回空的字符串。,Tcl的面向对象扩展OTcl,Otcl是Tcl的面向对象(Object Oriented)的扩展,在Otcl中加入了类的概念。 对象是类的实例,它有自己的属性(成员变量,InstVar)和自己的内部操作(成员函数,InstProc)。 对象具有继承、封装、多态性和动态绑定等性质。 面向对象机制

6、的加入使得原始的Tcl变得更加强大,更加方便使用。 虽然和C+中对象和类以及其他面向对象程序设计语言中的概念相同,但是具体实现和语法却存在很大的差别。,Tcl的面向对象扩展OTcl,Class mom mom instproc greet $self instvar age_ puts $age_ years old mom say: How are you doing? ,NS-2的实现机制和类的体系结构,为什么要用两种编程语言来实现NS?,模拟器有两方面的事情需要做 一方面,具体协议的模拟和实现:需要一种程序设计语言,它需要很有效率的处理字节(Byte),报头(Packet Header)

7、等信息,需要应用合适的算法在大量的数据集合上进行操作。为了实现这个任务,程序内部模块的运行速度(run-time speed)是非常重要的,而运行模拟环境的时间、寻找和修复bug的时间,重新编译和运行的时间(run-around time)就显得不是很重要了。 另一方面,许多网络中的研究工作都围绕着网络组件和环境的具体参数的设置和改变而进行的,需要在短时间内快速的开发和模拟出所需要的网络环境(scenarios),并且方便修改和发现、修复程序中的Bug。在这种任务中,run-around time就显得很重要了,因为模拟环境的建立和参数信息的配置只需要运行一次。,为什么是C+和OTCL来实现?

8、,为了满足以上两种不同任务的需要,NS的设计实现使用了两种程序设计语言,C+和Otcl。 这两种程序设计语言都是面向对象(object oriented)的程序设计语言 。 C+程序模块的运行速度非常快,是强制类型的程序设计语言(变量严格定义整型,浮点型和字符、字符串类型),容易实现精确的、复杂的算法,但是修改和发现、修正bug所花费的时间要长一些,因为它比较复杂。该特性正好用于解决第一个方面的问题。 Otcl是脚本程序编写语言,是无强制类型的,比较简单,容易实现和修改,容易发现和修正bug,虽然它的运行速度和C+的模块相比要慢很多。该特性正好用于解决第二方面的问题。,什么时候用C+,什么时候

9、用Otcl?,最基本的,用OTcl来实现: 对模拟环境的配置、建立和在模拟中只运行一次的地方。 如果可能,用Otcl脚本来随意操作已经存在的C+对象。 最基本的,用C+来实现: 如果你需要在模拟中对每一或大量数据包进行处理。 如果你想修改已存在的C+对象的属性和功能。,NS-2的C+和Otcl类对应示意图,NS-2的总体体系结构,NS-2的类体系结构(部分),解释器相关类的介绍和用途(C+),和解释器相关的C+类是实现与解释器交互和实现类影射的基础 Tcl类 TclObject类 TclClass类 TclCommand类,Tcl类简介及功能实现,获得Tcl解释器的引用,来调用解释器的功能。

10、用来调用Otcl命令函数 传递/获得Otcl命令运行的结果 报告错误/退出模拟器的运行 在解释器内部的用来保存生成对象地址的哈西表 获得Tcl解释器的句柄,来对解释器进行直接访问。,用来调用Otcl命令函数,可以在获得了Tcl解释器的引用之后,通过这个引用来调用Otcl中的控制台命令。 tcl.eval(char* s);执行字符串s,并在tcl的结果变量中保存执行结果。 tcl.evalc(char* s);首先把s存储进tcl中的命令缓冲区中,然后再执行该s命令,并且在结果变量中返回结果。 tcl.eval();执行已经存储进tcl命令缓冲区中的命令,并且在结果变量中返回结果。 tcl.e

11、valf(const char* s,);该函数类似于c语言中的printf命令,可以进行字符串的过滤,执行同eval()。 tcl.buffer()返回tcl中的命令缓冲区。,传递/获得Otcl命令运行的结果,当Tcl解释器执行用户指定的控制台字符串命令之后,解释器在自己内部的结果字符串变量中保存命令的执行结果。 可以通过tcl.result(const char* s);命令来修改命令执行后的结果。 也可以通过tcl.result();命令来获得命令执行后的结果字符串。,解释器内部的保存生成对象地址的哈西表,在Ns-2中的Tcl命令解释器里保存了一个存储对象地址的哈西表。 Ns-2为每一个

12、在模拟过程中生成的TclObjet类及派生类的对象在该哈西表中保存了一个指针,方便访问。 Tcl.enter(TclObjet* o);在哈西表中加入一个对象。 Tcl.lookup(char* s);在哈西表中查询名字为s的对象并返回。 Tcl.remove(TclObjet* o);在哈西表中删除该对象的地址。,TclObject类的功能和实现,创建/清除模拟器组件的对象。 实现从C+类成员变量到OTcl类成员变量的绑定(Binding)。 实现变量的跟踪(Tracing)。 实现从C+类的成员函数到Otcl类的成员函数之间的一一对应(通过该类的command()函数)。,创建/清除模拟器

13、组件的对象,在TclObject的对象名空间里获取一个新创建对象的唯一的句柄。 执行该新建对象的构造函数。在此过程中,该对象的构造函数会首先调用其基类的构造函数。所有最终基类为TclObject的类的对象最终都会执行TclObject类的构造函数,这个构造函数创建一个内部的C+对象(Shadow Object),完成变量绑定、成员函数和命令的对应。 当内部的C+对象创建完毕后,ns调用所有派生类的构造函数,来进一步完成变量的绑定和命令的对应,完成对象的初始化工作。 当对象创建完毕后,ns把对象的指针添加到TclObject类中的对象哈希表中。 把cmd函数设置为对应的Otcl对象中的一个成员函

14、数。,从C+类成员变量到OTcl类成员变量的绑定,变量绑定的目的,是用户通过修改和设置脚本中的Otcl对象中的成员变量时,该对象对应的“影子”C+对象中的成员变量也相应的变化,保持一直。变量绑定是TclObjet类中的成员函数。变量绑定在构造函数中完成。 ASRMAgent:ASRMAgent() bind(“pdistance_”, ,两种对象成员函数之间的一一对应,类似于变量绑定,Otcl对象中也要创建相应的成员函数,来达到调用对应的C+对象中的成员函数的目的。 这种让成员函数之间一一对应的机制,是通过在该对象中的command()函数来实现的。由于command()是TclObjet的成

15、员函数,所以它的派生类每个对象都可以重写该函数。 Int ASRMAgent:command(int argc,const char* const* argv) Tcl ,TclClass类的功能和实现,这是一个纯虚基类,只能生成派生类后才能使用。 这个类的作用是实现从C+类的对象到Otcl类的对象之间的桥梁。这个类一般被声明为static类型,并且声明该类后就创建该类的一个对象。 每一个Otcl类和它对应的“影子”C+类之间,都存在一个TclClass类的派生类,来完成对象之间的通信桥梁工作。所以,TclClass类和它的派生类又叫做ns中的Linkage。 Static class Ren

16、oTcpClass:public TclClass Public: RenoTcpClass:TclClass(“Agent/Tcp/Reno”) TclObjet* create(int argc,const char* const* argv) return (new RenoTcpAgent(); class_reno;,TclCommand类,是创建能够被Tcl命令解释器解释执行的普通命令的类。其作用是创建新的(不存在原始Tcl命令库中的)Tcl命令,通过继承该类,重写该类的command()函数而实现新命令的创建。 具体创建新的Tcl命令的过程,举例: 在控制台上输入:% hi th

17、is is ns ns-version 在控制台上输出:Hello world,this is ns 2.0a12 下面谈谈具体创建新Tcl命令的方法。,TclCommand类,1、从TclCommand类中派生新的命令类。 Class say_hello : public TclCommand Public: say_hello(); /构造函数 int command(int argc,const char* const* argv); /核心命令函数 ; 2、执行基类的构造函数,以新命令名为参数传入。 say_hello() : TclCommand(“hi”) ,TclCommand类

18、,3、重写基类的Command()函数,来实现具体要完成的命令操作。 #include Int say_hello : command(int argc,const char* const* argv) cout“hello,world:”; for(int i=1;iargc;i+) cout argvI; coutn; return TCL_OK; ,TclCommand类,4、在init_misc(void)函数中实例化该类: new say_hello; 通过以上4个步骤,就创建了新的命令“hi”。在控制台上输入“hi”回车,就可以得到期望的执行效果了。 命令的实例化都在init_mi

19、sc(void)函数中,该函数的位置是ns/misc.cc。 Init_misc(void)在ns初始化的时候被Tcl_AppInit(void)函数所调用。,模拟器Otcl类Simulator,模拟器Otcl类Simulator,通常情况下,模拟器模拟工作的开始,就是通过创建一个Simulator类的实例后开始的。 一个Simulator类的实例表示了一个模拟的环境(拓扑结构,事件的发生顺序,需要模拟的功能等)。这是一个Otcl类,没有对应的C+类。 Simulator类中定义了大量的配置网络模拟环境、创建拓扑结构、安排模拟事件的函数,用于脚本模拟网络的环境。 同时,Simulator类中还

20、保存了生成的拓扑结点(Node)的列表,用户每生成一个结点就在该列表中添加该结点的一个地址,方便访问。 在创建模拟器对象时,在构造函数中同时也创建一个该模拟器的事件调度器(Event Scheduler)。,事件调度器的实现,事件调度器的实现,事件调度程序的用户主要是模拟数据包处理、数据包传输延迟的网络组件和需要定时器(Timer)的网络组件。 生成事件的网络组件往往就是在这个事件到来的时候处理(handle)该事件的组件。 通常,数据包在网络拓扑组件中通过send(Packet* p)和recv(Packet* p,Handler* h)函数来传递。 事件调度器分为2种,真实时间调度器和非真

21、实时间调度器。真实时间调度器是为了实现模拟器和真实的网络之间进行通信所设计的,目前正在开发中,有试用版。 非真实时间调度器有三种,分别通过三种不同的数据结构来实现。简单链表、堆和日历。其中日历事件调度器是默认的调度器。,事件调度器的图示,NS-2的网络组件,NS-2的网络组件,网络组件分为简单网络组件和复合网络组件。 NsObject是所有基本网络组件的父类,而它本身的父类是TclObject类。这个类的对象有一个基本的功能,就是处理数据包(Packet)。 所有的基本网络组件可以划分为2类,分类器(Classifier)和连接器(Connector)。它们都是NsObject的直接子类,也是

22、所有基本网络组建的父类。 分类器(Classifier)的派生类组件对象包括地址分类器(AddrClassifier)和多播分类器(McastClassifier)等。 连接器(Connector)的派生类组件对象包括队列(Queue),延迟(Delay),各种代理(Agent),和追踪对象类(Trace)。,Ns-2的组件体系结构,组件的一个大类分类器,分类器classifier是Ns-2基本网络组件的一个大类。它的基本派生类有地址分类器(AddrClassifier)和多播分类器(McastClassifier)等。 分类器的特点,是基于分类器的基本网络组件具有1个或多个可能的数据输出路径

23、,属于交换(Switch)设备(对应来说,连接器Connector只有一个数据的输出路径)。 复合组建(比如Node和Link),它们不是TclObject类的派生类,而是在ns-2中独立的类。它们属于复合组件 拓扑结点(Node)是由一个结点入口对象和若干个分类器(Classifier)组成的一个符合对象。,一个Unicast和Multicast对象的图示,组件的另一个大类Connector,连接器Connector是Ns-2基本网络组件中的另一个大类。它的基本派生类对象包括缓冲队列(Queue)、延迟(Delay)、各种产生和处理数据包的代理(Agent)和对象的跟踪器(Trace)。 连

24、接器的特点,是基于连接器的基本网络组件只有一个可能数据输出的路径,即(单进单出的管道,所以叫Connector),和分类器有1个或多个可能的数据输出路径(Switch)是不同的。 拓扑结点连接类(Link)是Ns-2中另一个主要的复合组件对象。一个结点和另一个结点之间的简单连接(simplex-link)是单向的。一个最基本的简单连接由一个连接入口、包缓冲队列、延迟处理对象、废弃处理对象和时间处理对象(TTL)组成。 一个结点的输出队列,是通过和这个结点相连的Link中的缓冲队列来实现的。,一个拓扑简单单向连接(Link),拓扑简单连接Link,一个简单的拓扑结构中的2个结点之间的连接是单向的

25、。 通过Simulator对象中的dublex-link成员函数可以在两个结点之间的2条互相的单向简单连接。 一个结点或交换设备在一个输出路径上的输出队列,是由在该路径上的简单连接(simplex-link)中的数据缓冲队列来实现的。 在Link中从数据缓冲队列(queue)中被弹出(dequeue)的包被传递到延迟处理对象(Delay)中进行延迟的模拟。 在Link中从数据缓冲队列(queue)中掉出(Dropped)的包,被送到废弃处理对象(一个Null Agent)中被释放。 TTL对象计算包在Link中被处理时的相关的时间参数。,加入Trace和Monitor的连接对象,一个结点间数据

26、包通信的实例,包(Packet)类的结构和说明,在Ns-2中,一个“包”是由一个报头(Header)堆栈(Stack)和一个可选择的数据空间构成。 报头的格式,在模拟器对象(Simulator)创建的过程中创建好,同时,所有注册过的报头,比如一般的属性说明、IP报头,Tcp报头,RTP报头,都在包的报头堆栈中存储。 通过不同报头在包的报头堆栈中的偏移量(Offset),网络组件可以根据需要,来访问包中的不同报头。这就符合上面的机制,在报头格式创建的时候,无论这个注册过的报头是否需要,都被加到报头堆栈中。 通常,一个包只含有报头堆栈部分,而没有数据空间。这是因为,在模拟的环境中,传输实际的数据是没有意义的。,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论