1,Simulator类 在NS-2中,每个模拟过程需要一个类对整个过程进行控制和管理。这个类就是simulator类。这个类封装了节点(note),链路(link),代理(agent),数据分组格式等。整个模拟过程通过创建一个模拟类对象开始,通过调用这个对象的各个过程实现创建节点,构建拓扑结构图,对模拟的各个方面进行配置,定义事件,根据定义的事件模拟整个网络的运行等。 创建一个模拟器类对象的格式为:
Set ns [new simulator]
2,NS-2是一个事件驱动的模拟器,通常包括两部分:事件的触发时间和用来处理时间的功能函数的句柄。NS-2中模拟内部at过程的主要功能是在特定的时间调度事件处理函数处理事件。 Set ns [new simulator] $ns at 5.0 “handle_fun” $ns run Proc handle_dun{}{puts”this is the event handle function”} 目前事件调度程序有四种事件调度器,分别为:链式,堆式,时间队列式,和实时,其中时间队列式为默认的。 本节相关概念为: Set ns [new simulator] Set now[$ns now] $ns halt $ns run $ns at <time> <event>
3,节点note
在网络中将分布在不同地理位置的主机,交换机,路由器等网络设备在NS-2中统统抽象为一个节点,本节将介绍NS-2中节点的创建和配置方法。 根据网络节点之间通信方式的不同,分组的传输方式有两类,单播和多播。 单播节点的配置: Set ns [ new simulator] Set n0 [$ns node] 一个单播节点是由地址分类器和端口分类器两个tcl对象组成的。 地址分类器主要判断分组的地址和转发分组到下一个接收器。节点的地址模拟网络中的ip地址,有两种类型,默认为flat类型的,分类器中有一张shot表模拟网络中的路由表,一个shot码和一个节点地址相对应。 端口分类器的主要功能是按照分组的目的端口进行匹配,将分组传递给相应的agent对象。 多播节点的配置: 多播节点的配置,首先要把 Multicast属性值设置为: on,然后调用node过程创建多播节点。 创建一个多播节点的方法: Set ns [new Simulator -Multicast on] Set n1 [$ns node] 注意多播结构是一对多的通信,一个多播分组在转发时,分组需要被转发给多个目标对象,这就要求多播节点能够生成该分组的多个拷贝,多播节点包含复制器(Replicator)对象,并使用其生成分组的拷贝。 多播节点主要是由多播分类器和复制器组成。多播分类器根据源地址,和目的地址,将分组分类,富欧泊分类器内部保存了一张链式hash表,表的每一项包含源地址,多播目的地址,和slot码。
3.1节点的配置。 无线网了中的节点是移动节点,拥有不同于有限节点的各种特性。所谓节点的配置就是在节点创建之前设定节点的各项属性,可是使用模拟器对象ns的内部过程node-config{}来配置节点的属性。包括,所有节点的属性,无线节点的属性和卫星节点的配置。 与节点有关的命令 $ns node[<hier_addr>] 配置节点的类型 ,默认为没有分层的flat类型。 $node id 此命令是返回节点的id号。 $node node -addr 此命令是返回节点的地址。 $node reset 此命令重新设置绑定于节点的代理。 $node detach <agent> <null_agent> 将代理从这个节点上删除,然后在这个端口上绑定一个空代理。 $node attach <agent><optional:port_num> 节点自动为其分配一个端口号,并将该代理绑定到节点上。
3.2链路 (link) 链路层负责对物理层上传输的数据进行检错和纠错。NS-2中的数据链路层同时实现了物理层,数据链路层和部分网络层的功能。 本节主要讲述如何将不同的节点连接起来。完成整个网络拓扑的结构的构建。因此,一个完整的网络拓扑包括节点的创建和节点的连接(用链路)两个部分,即节点和链路是组成网络哟拓扑的两个要素。 网络设备见的通信方式可以分为单工,半双工和拳双工三种方式。单工是数据只能沿一个方向传输。任何时候都不能改变数据传输的方向,在NS-2中我们采用创建简单的单向链路simplex-link来进行模拟这种通信方式。 半双工通信方式中,数据可以单向传输,但必须交替进行。不常用。 全双工通信放式中,数据可以同时双向传输。在NS-2中我们通过创建双向链路duplex-link来进行模拟。 创建单向链路 Set ns [new simulstor] $ns simples-link <node1> <node2><bandwidth><delay><queue_type> 上述代码创建了一条node1到node2的单向链路,并且定义了链路的一下各项特性。 <bandwidth> 创建链路的带宽。<delay> 延时<queue_type>队列类型 创建双向链路 Set ns [new simulstor] $ns duplex-link <node1> <node2><bandwidth><delay><queue_type> 等价于 Set ns [new simulstor] $ns simples-link <node1> <node2><bandwidth><delay><queue_type> $ns simples-link <node2> <node1><bandwidth><delay><queue_type> 本节相关命令: $ns simples-link <node1> <node2><bandwidth><delay><queue_type> $ns duplex-link <node1> <node2><bandwidth><delay><queue_type> $ns simples-link <node1> <node2><option><args> $ns duplex-link <node1> <node2><option><args> 以上两个命令主要设置链路的属性,主要包括:方向,颜色,标签和队列的位置。设置这些主要用于nam的动画显示。
4.代理 agent NS-2中通过创建节点和链路来构建网络拓扑结构,然后就可以在各个节点间和链路上产生业务流。而NS-2中采用定义路由,代理和网络应用层来模拟实际的业务流。 代理可以构建和销毁网络层的分组,是网络层的起点和终点,同时,代理还可以实现各种不同层的网络协议。NS-2中采用“/”作为类名的分割符的。 Agent类是有c++和otcl共同实现的。 Udp和tcp是tcl/tp协议族在传输层主要的两个协议。Udp协议 无连接,但传输速度快。Tcp基于三次握手协议但传输速度没有udp速度快。 Udp代理 agent/udp类agent类的一个子类,模拟了udp协议的主要功能。NS-2中创建和设置udp代理可以分为以下几个步骤。 步骤一:创建一个agent/udp对象并将其绑定到相应的节点上作为分组的发送器。 步骤二:设置agent/udp的部分内部变量。 步骤三:创建一个agent/null对象并将其绑定到相应的节点上作为分组的接受器。 步骤四:在两个发送和接受代理之间创建connection连接。 以下tcl代码具体显示了如何创建。Udp代理,激射节点n0和n1,以及模拟器对象已建立。 Set udp0[new Agent/UDP] $ns attach-agent $n0 $udp0 $udp0 set packetsize_536 Set null0[new Agent/NULL] $attch – agent $n1 $ null0 $ns connect $udp0 $null0 TCP代理 TCP代理分为单向代理和双向代理,这里主要是单向代理。 agent/TCPSink类为例。NS-2中创建和设置TCP代理可以分为以下几个步骤。 步骤一:创建一个agent/TCP对象,作为分组的发送器。 步骤二:设置Agent/TCP对象的部分内部变量。 步骤三:创建一个agent/TCPSink对象,作为分组的接受器。 步骤四:在两个发送和接受代理之间创建connection连接。 以下tcl代码具体显示了如何创建TCP代理,激射节点n0和n1,以及模拟器对象已建立。 Set tcp[new Agent/TCP] $ns attach-agent $n0 $tcp $tcp set fid_1 $tcp set window_20 Set sink[new Agent/TCPSink] $attch – agent $n1 $ sink $ns connect $tcp $sink 与Agent相关的一些命令 Set agent [new Agent/agent type] $ns attach-agent<node><agent> $agent port $agent dst –port $agent attach –app <s_type> $ns connection<src><dst> $ns create-connect<srctype><src><dsttype><dst><pktclass> $agent attach-trace<file>
5应用层 在NS-2中,应用层建立在传输层之上。分为两大类。流量产生器(traffic generator)和应用模拟器(simolated application) 流量产生器一般用在udp代理之上。应用模拟器代理一般在tcp代理之上。 流量产生器: 一般有四种udp代理:指数分布流量代理器,pareto分布流量产生器。固定比率流量产生器。Trace文件流量产生器。 下面是一个例子说明流量产生器的使用,本节配置的是固定比率cbr流量发生器 步骤一:创建代理层对象并将传输层代理绑定到相应的节点上。创建 绑定 连接 Set src[new Agent/UDP] Set sinl[new Agent/NULL] $ns attach-agent $n0 $src $ns attach-agent $n0 $link $ns connect $src $sink 步骤二:创建流量产生器对象,设置对象属性,并将其与传输层的源代理绑定 可以通过调用application类的方法,也可以使用agent类中的方法 Set e[new Application/traffic/cbr] $e set packetsize_300 $e set rate_32kb $e set random_On $e attach-agent $src 或: Set e[new Application/traffic/cbr] $e set packetsize_300 $e set rate_32kb $e set random_true $e attach-app $e 步骤三:启动和停止流量产生器 $ns at “$e start” $ns at 5.0 “$e stop” 应用模拟器: 主要介绍ftp应用模拟器和telnet应用模拟器。 ftp模拟器:对应的Otcl类为:Application/FTP,主要用来模拟大量数据的传送。 telnet应用模拟器:telnet对象有两种分组的方法,如果interval_为零,那么分组发送的时间间隔均值为interval_ 的指数分布,如果为零,那么分组的发送时间间隔的选择按住奥tcplib经验分布,下面以tcp为例 set src[new Agent/TCP] ;#创建一个TCP源代理,作为tcp分组的发送者。 set sink[new Agent/TCPSink] ;#创建一个tcpsink对象,作为tcp分组的接受者 $ns attach-agent $no $src ;#绑定节点 $ns attach-agent $n1 $sink ;#绑定节点 $ns connection $src $sink ;#连接 Set ftp1[new Application/FTP] ;#;创建 $ftp attach-agent $src ;#绑定代理 $ns at 0.5 “ftp start” ;#启动
|