NS2网络仿真实验要点.pdf

上传人:tbuqq 文档编号:5197656 上传时间:2020-02-19 格式:PDF 页数:19 大小:1.27MB
返回 下载 相关 举报
NS2网络仿真实验要点.pdf_第1页
第1页 / 共19页
NS2网络仿真实验要点.pdf_第2页
第2页 / 共19页
NS2网络仿真实验要点.pdf_第3页
第3页 / 共19页
NS2网络仿真实验要点.pdf_第4页
第4页 / 共19页
NS2网络仿真实验要点.pdf_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《NS2网络仿真实验要点.pdf》由会员分享,可在线阅读,更多相关《NS2网络仿真实验要点.pdf(19页珍藏版)》请在三一文库上搜索。

1、1 移动自组织网络 实 验 报 告 NS2 网络仿真实验 何云瑞 13120073 电信研 1301班 2 1实验目的和要求 1学会 NS2的安装过程,并熟悉 NS2的环境; 2观察并解释 NAM 动画,分析 Trace文档。 3学会用 awk和gnuplot分析吞吐量、封包延迟、抖动率和封包丢失率。 2实验环境 先在 PC 上安装 VMware 虚拟机,再在虚拟机上安装Ubuntu 系统,最后再 Ubuntu 系统上安装 NS2 软件,本次实验采用的是NS-2.34 版本。 3基本概念 3.1 NS2简介 NS2 是一款开放源代码的网络模拟软件,最初由UC Berkeley 开发。它是一 种

2、面向对象的网络模拟器, 它本质上是一个离散事件模拟器,其本身有一个模拟 时钟,所有的模拟都由离散事件驱动。其采用了分裂对象模型的开发机制,采用 C+和 OTcl 两种语言进行开发。它们之间采用TclCL 进行自动连接和映射。考 虑效率和操作便利等因素, NS2将数据通道和控制通道的实现相分离。为了减少 封包和事件的处理时间,事件调度器和数据通道上的基本网络组件对象都使用 C+编写,这些对象通过TclCL 映射对 OTcl 解释器可见。 目前,NS2可以用于模拟各种不同的通信网络,它功能强大,模块丰富,已 经实现的主要模块有:网络传输协议,如TCP 和 UDP;业务源流量产生器,如 FTP、 T

3、elnet、 CBR、 Web 和 VBR; 路由队列管理机制, 如 Droptail、 RED 和 CBQ; 路由算法;以及无线网络WLAN 、移动 IP 和卫星通信网络等模块。也为进行局 域网的模拟实现了多播协议以及一些MAC 子层协议。 3.2 NS2的功能模块 NS2 仿真器封装了许多功能模块,最基本的是节点、链路、代理、数据包格 式等,下面对各个模块进行简单的介绍: (1)事件调度器:目前 NS2 提供了四种具有不同数据结构的调度器,分别 是链表、堆、日历表和实时调度器。 3 (2)节点( node):是由 TclObject 对象组成的复合组件,在NS2 中可以 表示端节点和路由器

4、。 (3)链路(link):由多个组件复合而成,用来连接网络节点。所有的链路 都是以队列的形式来管理封包的到达、离开和丢弃。 (4)代理( agent):负责网络层封包的产生和接收,也可以用在各个层次 的协议实现中。每个agent连接到一个网络节点上,由该节点给它分配一个端口 号。 (5)封包(packet):由头部和数据两部封包成。一般情况下,packet只有 头部、没有数据部分。 (6)应用层( Application ):流量产生器( Traffic generators )创建了各种 不同的概率模型来模拟产生实际网络中的业务流,它建立在UDP 代理之上;应 用模拟器( Simulate

5、d application)产生建立在 TCP代理之上的业务流。 (7)数据记录: Trace,功能是能够详细记录模拟过程,同时,用户也可以 根据自己的需要记录模拟过程中的任何一个细节,模拟结束后会产生 out.tr 文件; Monitor , NS2 中有两种监测,队列监测(Queue Monitoring) 和流量监测(Per-Flow Monitoring)。 (8)动画演示 Nam,是基于 Tcl/Tk 的动画演示工具,用来把模拟的过程用 可视化的方式呈现出来,模拟结束后会产生out.man文件。 (9)数据分析: gawk。awk 是一种程序语言。它具有一般程序语言常见的 功能。由于

6、 awk 语言具有使用直译器 (Interpreter)不需先行编译; 变量无型别之分 (Typeless) ,可使用文字当数组的注标(Associative Array)等特色,所以使用awk 撰写程序比起使用其它语言更简洁便利且节省时间。awk 还具有一些内建功能, 使得 awk 擅于处理具资料列 (Record),字段 (Field)型态的资料。此外, awk 内建 有 pipe的功能,可将处理中的资料传送给外部的Shell 命令加以处理, 再将 Shell 命令处理后的资料传回awk 程序,这个特点也使得awk 程序很容易使用系统资 源。而 gawk 是 GNU 所开发的 awk,最初

7、在 1986年完成,之后不断改进和更新, gawk 包含 awk 的所有功能。 3.3 Trace文件的格式 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) 4 Event Time From node To node Pkt type Pkt size Flags Fid Src addr Dst addr Seq num Pkt id (1)Event 发生的事件类型。 + 表示封包进入链路队列( Enqueue ) - 表示封包离开链路队列 (Dequeue) r 表示目的队列接受( receive )事件 d 表示队列丢弃 (dro

8、p)封包事件 (2)time 表示事件发生的时间 (3)From node表示封包发送节点的id (4)From node表示封包传送目的节点的id (5)Pkt type表示封包类型 (6)Pkt size表示封包的大小 (7)Flags表示标志项 (8)Fid 为 Flow id 的简写,流标识符 (9)Src addr表示源地址,格式为: node.port。node为封包发送节点的id, port 代表发送封包节点的端口号。 (10)Dst addr表示目的地址,格式为: node.port。node为封包接收节点的 id,port 代表接收封包节点的端口号。 (11)Seq num封

9、包的序列号 (12)Pkt id 封包的唯一标识符,表示封包的id。 3.4 CBR 和 FTP 简介 CBR:Constant Bit Rate,固定传输速率。这是一个用来形容通信服务质量 (Quality of Service,QoS)的术语。和该词相对应的词是可变码率或可变比特 率(Variable Bit Rate,缩写 VBR) 。当形容编解码器的时候, CBR 编码指的是编 码器的输出码率(或者解码器的输入码率)应该是固定制(常数)。当在一个带 宽受限的信道中进行多媒体通信的时候CBR 是非常有用的,因为这时候受限的 是最高码率, CBR 可以更好的易用这样的信道。但是CBR 不适

10、合进行存储,因 为 CBR 将导致没有足够的码率对复杂的内容部分进行编码(从而导致质量下降 ), 同时在简单的内容部分会浪费一些码率。 5 FTP:File Transfer Protocol,文件传输协议,中文简称为“ 文传协议 ” ,用于 Internet 上的控制文件的双向传输。同时,它也是一个应用程序(Application) 。 用户可以通过它把自己的PC 与世界各地所有运行FTP 的服务器相连,访问服务 器上的大量程序和信息。 FTP 的主要作用,就是让用户连接上一个远程计算机 (这 些计算机上运行着FTP 服务器程序)查看远程计算机有哪些文件,然后把文件 从远程计算机上复制到本地

11、计算机,或把本地计算机的文件送到远程计算机去。 3.5 其他概念 (1)丢包率:是一个比率,表示在单位时间内未收到的数据封包数与发送 的数据封包数的比率, 由于信号衰减、 网络质量等诸多因素的影响,可能产生数 据封包的丢失。 (2)端到端时延:是由各种因素引起的,包括打包和解包时延,以及网络 传送时延,本文中主要讨论的是网络传输时延。 (3)吞吐量:单位时间内某个节点发送和接受的数据量,单位一般为b/s。 (4)抖动率:网络延迟的变化量,它是由同一应用的任意两个相邻数据包 在传输路由中经过网络延迟而产生的,由相邻数据包延迟时间差除以数据包序号 差得到。 4实验步骤 4.1 NS2的安装 本文N

12、S2的安装参照博文: http:/ 最终运行 NS2自带simple.tcl得到图 1,以示成功: 6 图1 NS2安装成功 4.2 Tcl脚本运行 本实验中编写的脚本 simulator.tcl见附录一。实际模拟的网络结构图如图2所 示。包含 4个node ,各节点之间都是以全双工的链路相连。n0和n2之间链路的带 宽为2Mbps,延迟为10ms,为DropTail队列方式; n1和n2之间链路带宽为 2Mbps, 延迟为 10ms,也为 DropTail队列方式; n2和n3之间链路的带宽为 1.7Mbps,延迟 为20ms,也为 DropTail方式。 n0处有一个 FTP的TCP流量产

13、生器, n1处为CBR的 UDP流量产生器, n3有一个接收 TCP的sink和接收 UDP的NULL 。 图2 网络结构图 7 仿真结束后,会产生两个档案,一个是out.nam,这是给 NAM 用的,用来把 仿真的过程用可视化的方式呈现出来,这可以让我们很直观的方式去了解封包传 送是如何从来源端送到接收端。另一个档案是out.tr,这个档案记录了仿真过程 中封包 传送 中所 有的 事件, 例如 第一 笔记 录是一 个 CBR的封 包 ,长度为 1000bytes ,在时间 0.1秒的时候,从 n1传送到 n2。 4.3 吞吐量、封包延迟、抖动率和封包丢失率 4.3.1 封包延迟 测量 CBR

14、 封包端点到端点间延迟时间的程序写在measure-delay.awk中。 measure-delay.awk的具体代码查看附录。 在终端输入如下命令: gawk -f measure-delay.awk out.tr cbr_delay 此指令将运行结果存储到cbr_delay文件中,以便进行绘图。 接着输入 gnuplot,得到下图 接着按下图输入,为接下来要画的时延图做标识: 8 运行上图最后一条指令后得到图3: 图 3 封包延迟随时间的变化 4.3.2 抖动率 抖动率就是延迟时间变化量delay variance ,由于网络的状态随时都在变化, 有时候流量大, 有时候流量小, 当流量大

15、的时候, 许多封包就必需在节点的队列 中等待被传送, 因此每个封包从传送端到目的地端的时间不一定会相同,而这个 不同的差异就是所谓的Jitter。Jitter 越大,则表示网络越不稳定。 量测 CBR flow 抖动率的代码写在measure-jitter.awk内,具体见附录。 运行方法仿照 4.3.1,可得下图 4: 9 图 4 抖动率随封包序列的变化 4.3.3 封包丢失率 测量 CBR 封包丢失率的代码写在measure-drop.awk内,具体见附录。 运行 awk -f measure-drop.awk out.tr cbr_drop后,可在 cbr_drop中找到如下 信息: 其

16、中第一行表示 CBR 总共送出了 550 个封包,丢失了 8 个。第二行表示总 的丢包率为 0.014545。接下来的几行中,第一列表示时间,第二列表示丢包率。 仿照上两例,只不不过为了利用gnuplot,要把先把前两行删除。最终可得 10 丢包率随时间的变化如图5 所示: 图 5 封包丢失率随时间的变化 4.3.4 吞吐量 量测CBR吞吐量的代码写在 measure-throughput.awk 内,具体见附录。 图 6 吞吐量随时间的变化 11 5实验结果分析 从丢包率、时延、吞吐量和抖动率的变化图中,可以看出当丢包率增加时, 端到端之间的时延也在增加, 而吞吐量则下降, 丢包率、 时延和

17、吞吐量在表示网 络性能的好坏时有一定的关系。 在时延的变化图中,在一刚开始的时候,由于只有CBR 的封包,所以端到 端时延都是固定的,但在1.0 秒后,网络多了FTP 的封包,这使得CBR 封包和 FTP 封包必须互相的抢夺网络的资源,因此端到端时延变得不在固定,但等到 FTP 传输结束后, CBR 封包的端到端时延又变成是固定值了。 在抖动率的变化图中, 抖动率产生变化的原因同时延变化的原因相同,都是 由于 FTP 封包的加入才使得端到端时延产生变化。 6附录 6.1 网络拓扑仿真脚本 simulator.tcl: # 有线场景,四个节点, FTT+TCP 用蓝色表示, CBR+UDP 用红

18、色表示 set ns new Simulator #设置颜色 $ns color 1 Blue $ns color 2 Red set tracefd open out.tr w $ns trace-all $tracefd set namtracefd open out.nam w $ns namtrace-all $namtracefd proc finish global ns tracefd namtracefd $ns flush-trace close $tracefd 12 close $namtracefd exec nam out.nam $ns detach-agent $

19、n3 $sink“ $ns at 5.0 “finish“ puts “CBR packet size=$cbr set packet_size_“ puts “CBR interval=$cbr set interval_“ $ns run 14 6.2 丢包率 awk处理脚本 measure-drop.awk: BEGIN dropNum = 0; totalNum = 0 i= 0 ; lossratei = 0; timeArri = 0; event = $1; time = $2; fromNode = $3; toNode = $4; pktType = $5; pktSize

20、= $6; flags = $7; fid = $8; srcAddr = $9; stAddr = $10; seqNum = $11; pktId = $12; if(fromNode=1 timeArri=time; lossratei=(float)(dropNum/totalNum); i+; if(fid=2 END printf(“#number of packet sent:%d,lost:%dn“, totalNum, dropNum); printf(“#lost rate of packets:%fn“, dropNum/totalNum); printf(“%ft%fn

21、“, timeArrj, lossratej); 6.3 处理时延的 awk脚本 measure-delay.awk: BEGIN #程序初始化,设定一变量以记录目前最高处理封包的ID。 highest_packet_id = 0; action = $1; time = $2; node_1 = $3; node_2 = $4; type = $5; 16 flow_id = $8; node_1_address = $9; node_2_address = $10; seq_no = $11; packet_id = $12; #记录目前最高的 packet ID if ( packet_

22、id highest_packet_id ) highest_packet_id = packet_id; #记录封包的传送时间 if ( start_timepacket_id = 0 ) start_timepacket_id = time; #记录CBR (flow_id=2) 的接收时间 if ( flow_id = 2 else #把不是 flow_id=2 的封包或者是 flow_id=2 但此封包被 drop 的时间设为 -1 end_timepacket_id = -1; END #当资料列全部读取完后,开始计算有效封包的端点到端点延迟时间 for ( packet_id =

23、0; packet_id = highest_packet_id; packet_id+ ) start = start_timepacket_id; end = end_timepacket_id; 17 packet_duration = end - start; #只把接收时间大于传送时间的记录列出来 if ( start end ) printf(“%f %fn“, start, packet_duration); 6.4 吞吐量 awk代码 measure-throughput.awk: BEGIN init=0; i=0; action = $1; time = $2; node_

24、1 = $3; node_2 = $4; src = $5; pktsize = $6; flow_id = $8; node_1_address = $9; node_2_address = $10; seq_no = $11; packet_id = $12; if(action=“r“ if(init=0) start_time = time; init = 1; end_timei = time; 18 i = i+1; END #为了画图好看,把第一笔记录的throughput 设为零,以表示传输开始 printf(“%.2ft%.2fn“, end_time0, 0); for(j

25、=1 ; ji ; j+) th = pkt_byte_sumj / (end_timej - start_time)*8/1000; printf(“%.2ft%.2fn“, end_timej, th); #为了画图好看,把第后一笔记录的throughput 再设为零,以表示传输结束 printf(“%.2ft%.2fn“, end_timei-1, 0); 6.5 抖动率 awk代码 measure-jitter.awk: BEGIN #程序初始化 old_time=0; old_seq_no=0; i=0; action = $1; time = $2; node_1 = $3; no

26、de_2 = $4; type = $5; flow_id = $8; node_1_address = $9; 19 node_2_address = $10; seq_no = $11; packet_id = $12; #判断是否为 n2 传送到 n3,且封包型态为 cbr,动作为接受封包 if(node_1=2 #处理第一个接收封包 if(dif=0) dif=1; #求出 jitter jitteri=(time-old_time)/dif; seqi=seq_no; i=i+1; old_seq_no=seq_no; old_time=time; END for (j=1; j i ;j+) printf(“%dt%fn“,seqj,jitterj);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1