370 likes | 591 Views
网络仿真器 NS2 剖析 Network Simulator V2. —— 功能、使用及源代码. 指导老师:华蓓 答辩人:黄瑾瑜. 一、背景 二、 NS 各模块及功能 三、运行环境 四、 NS 使用 五、 NS 主代码简析 —— 基类 六、 NS 主代码简析 —— 功能模块 七、扩展方法. 一、背景. 局域网仿真是局域网设计的重要环节,也是网络性能分析的关键 需要一个与操作系统无关的平台,它可以屏蔽掉对操作系统的实际的访问,且能近乎真实地模拟网络环境,让我们可以在各个层次上模拟网络的运行 UC Berkeley 改进过的 NS2. 二、运行环境.
E N D
网络仿真器NS2剖析Network Simulator V2 ——功能、使用及源代码 指导老师:华蓓 答辩人:黄瑾瑜
一、背景 • 二、NS各模块及功能 • 三、运行环境 • 四、NS使用 • 五、NS主代码简析——基类 • 六、NS主代码简析——功能模块 • 七、扩展方法
一、背景 • 局域网仿真是局域网设计的重要环节,也是网络性能分析的关键 • 需要一个与操作系统无关的平台,它可以屏蔽掉对操作系统的实际的访问,且能近乎真实地模拟网络环境,让我们可以在各个层次上模拟网络的运行 • UC Berkeley改进过的NS2
二、运行环境 • 平台:Windows、Linux、Unix、machitosh,还要求系统装有C++编译器 • 两种语言:C++、OTcl,
NS2包含的几个小工具 • Nam • Xgraph • 拓扑图生成器:Gt-itm • 节点移动生成器:Setdest • 传输事件生成器:cbrgen.tcl tcpgen.tcl
Nam与Xgraph • 图形显示工具 • Nam <filename.out>:动态显示网络仿真过程。如:包的传输等等 • Xgraph <filename.tr>:显示仿真过程的数值特征。如:流量/时间图等
四、NS2的使用 • 命令行方式:敲入一个命令,返回一个结果 输入命令: %/ns-version 返回版本号: ns /2.0a12 • 脚本方式:指定一个脚本文件(*.tcl文件),让NS执行 输入命令: %/ns <example.tcl>
五、主代码简析——基类 • Tcl类:C++代码与Tcl代码之间的接口 • TclObject类:所有仿真对象的基类 • TclClass类:定义了解释类的类层次,并允许用户实例化TclObject,与TclObject一一对应 • TclCommand类:封装了C++代码和Tcl代码相互调用命令的方法 • EmbeddedTcl类:封装了装载更高级别的内置命令的方法 • InstVar类:访问C++成员变量,如Otcl变量方法
Tcl类 • 获得访问Tcl实例的入口 • 通过解释器调用Otcl过程 • 与解释器交换结果 • 报告出错状况,并以统一方式退出 • 存储、查找TclObject类对象 • 取解释器的句柄
TclObject类 TclObject类封装了网络实体 • 生成和释放“ 对象对” • 变量的绑定(bindding) • 变量的跟踪(Trace) • 命令方法的定义和调用 • 流程图
TclClass类 • 定义了解释类的类层次,并允许用户实例化TclObject,与TclObject一一对应。 • 类TclClass是一个纯虚类,从它派生的子类需实现两个成员函数:其一是构造函数,构造解释类层次来镜像编译类层次;其二是生成函数,生成与之相对应的TclObjects对象 。 • 流程图
TclCommand类 • 类TclCommond的作用就在为解释器提供全局命令 • 由TclCommand的定义知道,它是一个虚基类,必须派生子类,才能工作。 • 例子,派生类MyCommand,它的命令名为say。
EmbededTcl类 • 用户对通过对文件~tclcl/tcl-object.tcl进行修改,或是修改、增加tcl/lib的文件来对ns进行扩展。 • 对于新文件的装载是由类EmbeddedTcl的对象来完成的。 • Tcl脚本其实就是由char类型数据组成的文本文件,所以类Embedded的构造函数可以用char*型指针指向脚本代码,并将此指针值赋与成员变量 code_。
InstVar类 • 类InstVar定义了实现绑定机制的方法: 隐式,当创建新解释对象时,构造函数创建与其对应的编译对象,编译对象的构造函数将它的成员变量与解释对象的实例变量绑定; 显式,定义一个实现绑定变量的命令,然后通过方法cmd调用。 • 基类InstVar派生五个子类:InstVarReal,InstVarTime,InstVarBandwidth,InstVarInt,InstVarBool。分别用来绑定real型,time型,bandwidth型,integer型,和boolean型变量。
六、主代码简析——功能模块 • NS对网络实体的仿真和各种功能模块都封装在派生类中。 • 重要的派生类有simulator、node、link、 LAN等等。
Class simulator • 仿真器类是一个解释类,没有相应的编译类。但仿真器类是由许多更小的类构成的,这些类有相应的编译类。 • 它封装了节点、链路、代理、数据包格式等。 • 从ns外部看来,整个仿真过程可以看成对仿真器类对象的操作。因此,我们的工作从创建一个仿真器的实例对象开始,之后,通过这个仿真器调用各种方法生成节点,进而构造拓扑图,对仿真的各个方面进行配置,定义事件,然后,根据定义的事件,模拟整个网络活动的过程。
Class classifier • Base classifier是一虚基类 • address classifier:支持独播,通过位移和掩码将包的目的地址转化成槽的号码。 • multicast classifier:保持一个哈希链表,匹配地址对,取到槽的号码。如为未知地址对,则加入表中。 • multipath classifier:支持等价多路转发。 • hash classifier:使用哈希表,将包分发给“流”。 • replicator:拷贝数据包,转发给表中的所有对象,支持广播
Class link • 由Connecter、Quere、Delay • 一个简单的链路对象是由一些连接器(connector)组成的。 • 由Connecter、Quere、Delay
Class Quere • drop-tail:FIFO队列 • FQ:公平队列 • SFQ:实现随机公平队列 • DRR(deficit round robin):不同流之间调度 • CBQ:实现了基于类的队列 • CBQ/WRR:是CBQ的子类,实现了同一优先级上不同的类间的带权的循环调度。
Agent • Agent可以在不同层上实现各种协议。对某些协议(如UDP),包的大小、发送时间取决于应用程序,而对另一些较低层的协议,以上参数取决于agent本身。 • Agent可用Otcl语句创建,其内部状态可以用Tcl的set命令修改。 • 注:某些agent的状态变量只存在于Otcl,用C++代码不可访问。
数据包 • 类Packet是仿真对象间交换数据的基础单元,它提供了足够的信息,可以将一个包联入一个列表,可以查询数据包头缓冲,可以查询包数据缓冲。不同的协议采用不同的数据包格式,因此报头会不一样。要引入新的数据报头,需要根据数据包的格式定义一个C++结构,定义一个静态类来提供与Otcl的连接,然后修改仿真器的初始化代码。
区别服务 • 区别服务(Differentiated Services),简称DiffServ,通过标注包的类型,并对不同的包采取不同的处理,实现了IP QoS。 • Diffserv 模块分三个主要子模块:policy,edge router,core router。
局域网 • 局域网(LAN)与那些由多条点-点链简单构成网络大不一样,有共享、竞争等特性。为了模仿真正的LAN,ns又定义了新的节点——LanNode。
其他 • NS还实现了其他的模型,如、卫星网络模型、无线传播模型 、能量模型
七、简单的扩展 • 扩展ns最简单的方法是在~tclcl/tcl-object.tcl中加入Otcl代码,或在目录~ns/tcl/lib下加入新Tcl脚本。 • 若是在~ns/tcl/lib下加入新脚本,则必须在~ns/tcl/lib/ns-lib.tcl中加入对脚本的引用,语句为: source tcl/<filemame> • 在启动ns时,~ns/tcl/lib/ns-lib.tcl自动引用这个新脚本,类似于C程序中的“#include “filename” ”
进一步扩展 • 首先,将脚本转为类EmbeddedTcl对象: tclsh bin/tcl-expand.tcl tcl/lib/ns-lib.tcl | \ ../Tcl/tcl2c++ et_ns_lib > gen/ns_tclsh.cc • ~ns/ns_tclsh.cc中的Tcl_AppInit函数通过Tcl::Init()调用~ns/tcl/lib/ns-lib.tcl,实现装载的语句是: et_ns_lib.load();