logo资料库

ns2使用教程与具体操作实例.doc

第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
资料共30页,剩余部分请下载后查看
awk是一种程序语言。它具有一般程序语言常见的功能。因awk语言具有某些特点,如:使用直译器(In
对于使用网络仿真软件来做网络效能分析的人而言,步骤通常是先设计出符合自己需要的网络仿真 环境,设定其不同的参数,执行仿真,收集结果数据,最后把数据使用图片或表格把结果呈现出来以方 便分析实验。一般而言,对于 ns2 的初学者而言,总是会遇到一个问题,就是网络仿真程序跑完后,接 下来该如何分析。这是非常重要的一个过程,所以希望 ns2 的初学者能好好的研究此章节的内容,相信 一定会对大家的研究有相当的帮助。 本节打算以一个简单的网络环境为范例,介绍如何使用一些工具来分析和呈现模拟结果,这包含了 如何去量测 End-to-End Delay、Jitter、Packet Loss、和 Throughput。而采用的方法是去分析 traffic trace 档案 的方式,这种方法的优点是简单且不需要去修改到 ns2 核心的部份,但缺点是若是仿真数据若是太多, traffic trace 的档案会太大,这样会增加分析所需要的时间。另外一种方法,是去更改 ns2 核心,增加或 修改一些档案,把所需要量测的参数直接记录下来,这种方法的优点是模拟结束后,所需要量测的数据 已经完全记录下来,但缺点是要动到 ns2 核心的部分,对于初学者而言,这是一个很大的门坎,这个方 法笔者留到后面的章节在做介绍。 笔者先对要模拟的环境做一个简单的介绍。这个网络的环境包含了四个网络节点(n0,n1,n2,n3), 如下图所示。网络节点 n0 到节点 n2 之间,和节点 n1 到节点 n2 之间的网络频宽(bandwidth)是 2Mbps,延 迟时间(propagation delay)是 10ms。网络拓朴中的频宽瓶颈是在节点 n2 到节点 n3 之间,频宽为 1.7Mbps, 延迟的时间为 20ms。每个网络节都是采用 DropTail queue 的方式,且在节点 n2 到节点 n3 之间的最大队 列长度是 10 个封包的长度。在节点 n0 到 n3 之间会有一条 FTP 的联机,FTP 应用程序是架构在 TCP 之 上,所以在写仿真环境的描述语言的时候,必需先建立一条 TCP 的联机,在来源端 n0 上使用 TCP agent 产生”tcp”来发送 TCP 的封包;在目的地端 n3 使用 TCPsink agent 产生”sink”来接受 TCP 的数据、并 产生回复封包(ACK)回传送端、最后把接收的 TCP 封包释放。最后要把这两个 agent 连起来(connect),联 机才能建立。若是没有额外的参数设定,TCP 封包的长度为 1Kbytes。在这里顺便补充说明一下,对于 ns2 模拟参数内定值设定是在 ns-allinone-2.27\ns-2.27\tcl\lib 目录下的 ns-default.tcl,有想要进一步了解的人, 可以去查看此档。另外,在节点 n1 到 n3 之间有一条固定的传输速率的联机(Constant Bit Rate,CBR),CBR 应用程序是架构在 UDP 之上,因此必需在 n1 使用 UDP agent 来产生”udp”用来发送 UDP 封包,在 n3 上使用 Null agent 来产生”sink”以接收由 n1 传送过来的 UDP 封包,然后把接收的封包释放。CBR 的传 送速度为 1Mbps,每一个封包大小为 1Kbytes。CBR 是在 0.1 秒开始传送,在 4.5 秒结束传输;FTP 是在 1.0 秒开始传送,4.0 秒结束传输。 [Simulation Topology] [Tcl Script]
# 产生一个仿真的对象 set ns [new Simulator] #针对不同的数据流定义不同的颜色,这是要给 NAM 用的 $ns color 1 Blue $ns color 2 Red #开启一个 NAM trace file set nf [open out.nam w] $ns namtrace-all $nf #开启一个 trace file,用来记录封包传送的过程 set nd [open out.tr w] $ns trace-all $nd #定义一个结束的程序 proc finish {} { global ns nf nd $ns flush-trace close $nf close $nd #以背景执行的方式去执行 NAM exec nam out.nam & exit 0 }
#产生四个网络节点 set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node] #把节点连接起来 $ns duplex-link $n0 $n2 2Mb 10ms DropTail $ns duplex-link $n1 $n2 2Mb 10ms DropTail $ns duplex-link $n2 $n3 1.7Mb 20ms DropTail #设定 ns2 到 n3 之间的 Queue Size 为 10 个封包大小 $ns queue-limit $n2 $n3 10 #设定节点的位置,这是要给 NAM 用的 $ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n1 $n2 orient right-up $ns duplex-link-op $n2 $n3 orient right #观测 n2 到 n3 之间 queue 的变化,这是要给 NAM 用的 $ns duplex-link-op $n2 $n3 queuePos 0.5 #建立一条 TCP 的联机 set tcp [new Agent/TCP]
$tcp set class_ 2 $ns attach-agent $n0 $tcp set sink [new Agent/TCPSink] $ns attach-agent $n3 $sink $ns connect $tcp $sink #在 NAM 中,TCP 的联机会以蓝色表示 $tcp set fid_ 1 #在 TCP 联机之上建立 FTP 应用程序 set ftp [new Application/FTP] $ftp attach-agent $tcp $ftp set type_ FTP #建立一条 UDP 的联机 set udp [new Agent/UDP] $ns attach-agent $n1 $udp set null [new Agent/Null] $ns attach-agent $n3 $null $ns connect $udp $null #在 NAM 中,UDP 的联机会以红色表示 $udp set fid_ 2 #在 UDP 联机之上建立 CBR 应用程序 set cbr [new Application/Traffic/CBR] $cbr attach-agent $udp
$cbr set type_ CBR $cbr set packet_size_ 1000 $cbr set rate_ 1mb $cbr set random_ false #设定 FTP 和 CBR 数据传送开始和结束时间 $ns at 0.1 "$cbr start" $ns at 1.0 "$ftp start" $ns at 4.0 "$ftp stop" $ns at 4.5 "$cbr stop" #结束 TCP 的联机(不一定需要写下面的程序代码来实际结束联机) $ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink" #在模拟环境中,5 秒后去呼叫 finish 来结束模拟(这样要注意模拟环境中 #的 5 秒并不一定等于实际模拟的时间 $ns at 5.0 "finish" #执行模拟 $ns run
模拟结束后,会产生两个档案,一个是 out.nam,这是给 NAM 用的,用来把模拟的过程用可视化的 方式呈现出来,这可以让使用者用”看”的方式去了解封包传送是如何从来源端送到接收端。另一个档 案是 out.tr,这个档案记录了仿真过程中封包传送中所有的事件,例如第一笔记录是一个 CBR 的封包, 长度为 1000bytes,在时间 0.1 秒的时候,从 n1 传送到 n2。这个档案对我们做效能分析很重要,所以要 先对这个档案的格式做仔细的介绍。 + 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 - 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 - 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 r 0.114 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0 - 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2 - 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2 r 0.122 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 + 0.122 2 3 cbr 1000 ------- 2 1.0 3.1 1 1 .................................................................
每一笔记录的开始都是封包事件发生的原因,若是 r 则表示封包被某个节点所接收,若是+则表示进 入了队列,若是-则表示离开队列,若是 d 则表示封包被队列所丢弃。接着的第二个字段表示的是事件发 生的时间;字段三和字段四表示事件发生的地点(从 from node 到 to node);字段五表示封包的型态;字段 六是封包的大小,字段七是封包的旗标标注;字段八表示封包是属于那一个资料流;字段九和字段十是 表示封包的来源端和目的端,这两个字段的格式是 a.b,a 代表节点编号,b 表示埠号(port number);字段 十一表示封包的序号;最后字段十二表示封包的 id。以前面 trace file 的第一笔为例,意思就是说有一个 封包 pakcet id 为 0,资料流 id 为 2,序号为 0,长度为 1000 bytes,型态为 CBR,它是从来源端 1.0 要到 目的地 3.1,在时间 0.1 秒的时候,从节点 1 进入了节点 2 的队列中。 接下来,笔者先简单介绍 awk,然后如何使用 awk 去分析 trace file,以得到 Throughput、Delay、Jitter、 和 Loss Rate。 [awk] A.简介 awk 是一种程序语言。它具有一般程序语言常见的功能。因 awk 语言具有某些特点,如:使用直译 器(Interpreter)不需先行编译;变量无型别之分(Typeless),可使用文字当数组的注标(Associative Array)等特 色。因此,使用 awk 撰写程序比起使用其它语言更简洁便利且节省时间。awk 还具有一些内建功能,使 得 awk 擅于处理具数据列(Record),字段(Field)型态的数据;此外, awk 内建有 pipe 的功能,可将处理 中的数据传送给外部的 Shell 命令加以处理, 再将 Shell 命令处理后的数据传回 awk 程序,这个特点也 使得 awk 程序很容易使用系统资源。 B. awk 是如何运作的 为便于解释 awk 程序架构,以及相关的术语,笔者就以上面 trace file 为例,来加以介绍。 a.名词定义: 1. 资料列:awk 从数据文件上读取的基本单位,以 trace file 为例,awk 读入的 第一笔资料列为 ”+ 0.1 1 2 cbr 1000 ------- 第二笔资料列为 “- 0.1 1 2 cbr 1000 ------- 一般而言,一笔数据列相当于数据文件上的一行资料。 2 1.0 3.1 0 0” 2 1.0 3.1 0 0” 2. 字段(Field):为数据列上被分隔开的子字符串。 以资料列”+ 0.1 1 2 cbr 1000 ------- 一 二 三 四 五 六 七 + 2 1.0 3.1 0 0”为例, 八 九 十 十一 十二 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 一般而言是以空格符来分隔相邻的字段。 当 awk 读入数据列后,会把每个字段的值存入字段变量。 字段变量 意义 $0 为一字符串, 其内容为目前 awk 所读入的资料列.
$1 $2 代表 $0 上第一个字段的数据. 代表 $0 上第二栏个位的资料. …… …… b.程序主要节构: { Actions1 } { Actions2 } Pattern1 Pattern2 …………………………… Pattern3 { Actions3 } 一般常用”关系判断式”来当成 Pattern。例如: x > 3 用来判断变量 x 是否大于 3 x == 5 用来判断变量 x 是否等于 5 awk 提供 c 语言常见的关系操作数,如:>、<、>=、<=、==、!=等等 Actions 是由许多 awk 指令所构成,而 awk 的指令与 c 语言中的指令非常类似。 IO 指令:print 、 printf( ) 、getline ...... 流程控制指令 : if ( ...) {...} else {…}、 while(…){…} …… 在 awk 程序的流程为先判断 Pattern 的结果,若为真 True 则执行相对应的 Actions,若为假 False 则不执行 相对的 Actions。若是处理的过程中没有 Pattern,awk 会无条件的去执行 Actions。 c.工作流程: 执行 awk 时, 它会反复进行下列四步骤。 1. 自动从指定的数据文件中读取一笔数据列。 2. 自动更新(Update)相关的内建变量之值。 3. 逐次执行程序中 所有 的 Pattern { Actions } 指令。 4. 当执行完程序中所有 Pattern { Actions }时,若数据文件中还有未读取的料,则反复执行步骤 1 到步骤 4。 awk 会自动重复进行上述的四个步骤,所以使用者不须在程序中写这个循环。 [End-to-End Delay] 笔者把量测 CBR 封包端点到端点间延迟时间的 awk 程序,写在档案 measure-delay.awk 档案中,读者可以 参考此范例,修改成符合读者需求的程序。 BEGIN { #程序初始化,设定一变量以记录目前最高处理封包的 ID。 highest_packet_id = 0; } { action = $1; time = $2; node_1 = $3; node_2 = $4; type = $5; flow_id = $8; node_1_address = $9;
分享到:
收藏