免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3517 | 回复: 0
打印 上一主题 下一主题

网络模拟器NS-2及其应用分析 [复制链接]

论坛徽章:
2
羊年新春福章
日期:2015-02-04 10:37:51射手座
日期:2015-02-04 10:38:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-10 13:16 |只看该作者 |倒序浏览
摘  要  随着Internet的迅猛发展,网络模拟占有十分重要的位置。文中探讨和分析了NS-2的结构、功能及其使用方法,最后给出一个实例,具体解释了 NS-2的使用方法和用相关工具对输出结果进行处理的方法,得到了预期的模拟结果。    关键词  网络模拟;NS;应用 0  引言    随着Internet的迅猛发展,网络规模和复杂性的迅速增加,网络研究人员一方面要不断思考新的网络协议和算法,为网络发展做前瞻性的基础研究;另一方面也要研究如何利用和整合现有的网络资源,使网络达到最高效能。无论是哪一方面都需要对新的网络方案进行验证和分析。分析方法的有效性和精确性受假设的限制很大。实验方法的局限在于成本很高,实验床的规模很难做到很大,不能实现网络中的多种通信流量和拓扑的融合。而模拟方法在很大程度上可以弥补前两种方法的不足。NS-2是美国DARPA支持的项目VINT(the Virtual InterNet Tested)中的基础和核心部分。由USI/ISI, Xerox PARC, LBNL 和UC Berkeley这些美国大学和实验室合作研究开发,其目的在于建立一个网络仿真平台,为网络研究人员提供一系列的仿真工具,来实现新的网络协议的设计和实现。
1  NS-2体系结构及功能模块 1.1  NS-2简介     NS-2是面向对象的,基于离散事件驱动的网络环境模拟器。它实现了多种网络协议的模拟,如网络协议TCP、UDP,流量源行为,如FTP、Telnet、Web、CBR、VBR;实现了DropTail、RED、CBQ等几种路由器队列
管理
机制以及Dijkstra,动态路由、静态路由、组播路由等路由算法。此外,NS-2还支持组播协议SRM及部分MAC层协议。
    NS-2用C++和Otcl
语言
编写而成。它是免费的,开放源代码的,可以很方便地扩展NS-2的功能,将自己开发的新协议模块集成到NS-2环境中。
1.2  NS-2体系结构    NS-2的结构如图1所示。    NS-2采用了两级体系结构,为了提高代码的执行效率,NS-2将数据操作与控制部分的实现相分离,事件调度器和基本的网络组件使用C++编写和编译,其主要功能是实现对数据包的处理;NS-2的前端是一个Otcl解释器,主要的功能是对模拟环境的配置、建立。从图1 的左下角看,用户利用Otcl库中的模拟对象设计和运行TCL仿真,事件调度器和网络组件通过OTcl链接(tclcl类)和Otcl相关联,这样用户可以在Otcl空间能够方便地对C++对象的函数和变量进行修改与配置。

1.3  NS-2的功能模块     在NS-2中,整个模拟过程由一个名为Simulator的Tcl类来定义和控制的,Simulator类提供了一系列对模拟进行配置的接口,这其中包括选择“事件调度器(event scheduler)”的接口。进行模拟通常要首先创建一个Simulator类的实例对象,并调用该对象的一系列方法来创建节点(Node)、拓扑(Topology)等模拟所必需的对象。
    模拟器封装了许多功能模块:节点、链路、分组、代理、流量发生器、应用模拟器等。
    1) 事件调度器: NS-2是一个事件驱动的模拟器,调度器也就成为NS-2的调度中心,主要功能是处理分组(packet)的延迟和充当定时器。从所有事件中选择发生时刻最早的事件执行,调用它的handle函数,把该事件执行完毕,然后从剩余的所有事件中选择发生时刻最早的事件执行,如此反复执行。NS-2只支持单线程,如果有多于一个事件安排在同一时刻,那么会按照事件代码插入的先后次序执行。
    2) 节点(Node): 表示端节点和路由器,主要由地址分类器、端口分类器、多播分类器和复制器等模拟组件构成。分类器从逻辑上匹配一个分组,并基于匹配的结果把该分组传递给相应的对象。复制器是生成一个分组的多份拷贝,并把这些拷贝转发到各个订阅了某一多播组G的输出链路。
    3) 链路(Link): 用来连接网络节点,所有的链路都是以队列的形式来
管理
分组的到达、离开和丢弃。主要由DelayLink、Queues和TTLChcker等连接器(Connector)构成。DelayLink构造链路带宽和延迟特征;Queues构造和模拟与该链路相连的路由器的输出缓冲;TTLChcker对该链路的数据包的TTL字段减1操作,并丢弃TTL值为0的数据包。(图2)

图2 链路    4) 分组(Packet):是对象间交互的基本单元。由一系列分组头和一个可选的数据空间组成。分组头的结构在Simulator对象创建时就被初始化了,同时每个分组头相对于分组的起始地址的偏移量也被记录下来,提供用户来存取各个头部所包含的信息。
    5)代理(Agent):代表了网络层分组的起点和终点,并被用于实现如TCP和UDP等网络协议。Agent类支持分组的产生和接收,C++的Agent包含一系列的内部状态变量来表示分组的各个域。Agent可以实现多个层次的协议,对于一些运输层的协议,分组的大小和发送时间通常由Agen提供的应用程序接口(API)来控制,对于在低层使用的Agent(路由Agent),分组的大小和发送时间通常由Agent自己控制。
    6)流量发生器(traffic generator)、应用模拟器(simulated application): 是构建在运输层代理之上,流量发生器是模拟应用程序产生网络通信量,有四类:(1)EXPOO_Traffic、(2) POO_Traffic、(3)CBR_Traffic、(4)TafficTrace,它们一般用在UDP代理之上,应用模拟器有FTP,Telnet,一般用在TCP代理之上。
2 用NS-2进行网络模拟    进行模拟之前,首先要分析模拟涉及哪个层次。NS模拟分两个层次:一个是基于Otcl编程的层次,利用NS已有的网络元素实现模拟,无需对NS本身进行任何修改,只要编写Otcl脚本,另一个层次是基于C++和Otcl编程的层次,如果NS中没有所需的网络对象,就需要对NS扩展,利用Otcl和NS的接口类实现NS的更新,然后再编写Otcl脚本。整个模拟的过程如图3所示:

图3 利用NS-2进行网络模拟的过程2.1  Otcl实现模拟的一般过程    (1)         建立network model: 描述模拟网络拓扑结构,确定链路的基本特性,如延迟、带宽和丢失策略等。    (2)         建立traffic model: 包括端设备的协议绑定和通信业务量模型的建立,配置业务量模型的参数,从而确定网络上的业务量分布。
    (3)         设置Trace对象。Trace对象能够把模拟过程中发生的特定类型的事件记录在Trace文件中。NS通过Trace文件来保存整个模拟过程。模拟完成后,用户可以对Trace文件进行分析研究。
    (4)         编写其他的辅助过程,设定模拟开始/结束时间,运行Otcl脚本仿真。
    (5)         追踪分析结果:对Trace文件进行分析,利用gawk、xgraph、gnuplot得出有用的数据曲线,或者用Nam观看网络模拟运行过程。
2.2  C + + 建立新协议或修改已有网络对象进行扩展要考虑的问题     如果模拟只要求对现有的协议进行简单修改即可完成,无需建立新的协议代理,则找到相应的待修改协议代码进行预期的修改,然后直接编译生成新的NS。然而,当建立新协议时一般需要考虑以下问题:
    (1)         首先定义头文件,包括数据结构和决定新代理的继承结构,并建立恰当的类定义。    (2)         定义C++代码和Otcl代码之间的接口连接,即定义OTcl 连接函数。    (3)         至少定义接收函数recv( )和命令函数command( )。    (4)         新协议代码完成后,要对相关文件进行改动。例如,如果定义了一个新分组头,要改动NS目录下packet.h文件的enum packet_t{ }和class p_info{ }相应部分;改动tcl/lib/ns-default.tcl文件,定义Tcl对象的缺省值;改动tcl/lib/ns-packet.tcl文件,在该文件中为新的分组增加一个入口;改动Makefile文件,将*.o文件加入到该文件NS对象文件列表中。    (5)         在NS目录下运行Make Depend和Make,重新编译NS,至此生成了新的NS。
3  应用实例    本例将介绍如何使用一些工具来分析和呈现模拟结果,主要是测量端到端的延迟,而采用的方法一是去分析Trace文件,方法二是去修改NS核心,把所需要测量的数据直接记录下来,限于篇幅我们不在此进一步介绍方法二。模拟场景如图4所示,包含四个节点(n0,n1,n2,n3),假设n0,n2和n1,n2之间链路带宽2Mbps,延迟为10ms;n2和n3之间链路带宽1.7Mbps,延迟为20ms;每个链路用DropTail策略;n2和n3之间链路最大队列长度为10;n0,n3之间有一条建立在TCP上的FTP连接,n1,n3之间有一条建立在UDP上CBR连接;CBR是在0.1秒开始发送,在4.5秒结束,FTP是在1.0秒开始发送,在4.0秒结束。

图4 模拟场景 3.1  建立Otcl模拟代码文件#创建一个模拟对象转载于
论文
联盟 http://www.lwlm.netset ns [new Simulator]#为数据流定义不同的颜色,供NAM用$ns color 1 Blue$ns color 2 Red#打开一个 NAM trace fileset 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        #关闭 NAM trace file        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#设定n2和n3之间最大队列长度为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间的队列位置,供NAM用$ns duplex-link-op $n2 $n3 queuePos 0.5#建立一条TCP连接set tcp [new Agent/TCP]$tcp set class_ 2$ns attach-agent $n0 $tcpset 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 $udpset 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"#在5.0秒调用finish过程结束模拟$ns at 5.0 "finish"#执行模拟$ns run本例子在FedoraCore4,ns-2.29下测试通过,模拟结束后,产生两个文件,一个是out.nam,这是供NAM用的,用来可视化整个模拟过程;另一个是out.tr,记录了模拟过程中数据包传送中的所有事件,这是我们分析的重点。
3.2  利用awk提取out.tr文件中的数据    awk是一种程序
语言
,可以使用很短的代码轻易地完成对文本档案做修改、分析、提取和比较等处理。根据Trace文件格式,我们很容易写出测量CBR数据包端到端延迟时间的awk程序delay.awk:#测量CBR数据包端到端延迟时间BEGIN {     highest_packet_id = 0;}{   action = $1;   time = $2;   from = $3;to = $4;   type = $5;   pktsize = $6;   flow_id = $8;   src = $9;   dst = $10;   seq_no = $11;   packet_id = $12;   if ( packet_id > highest_packet_id )          highest_packet_id = packet_id;   if ( start_time[packet_id] == 0 )          start_time[packet_id] = time;   if ( flow_id == 2 && action != "d" ) {      if ( action == "r" ) {         end_time[packet_id] = time;      }   } else {      end_time[packet_id] = -1;   }}                                                                END {    for ( packet_id = 0; packet_id        start = start_time[packet_id];       end = end_time[packet_id];       packet_duration = end - start;       if ( start    }}    本例执行并把结果重定向到cbr_delay文件中:$awk –f delay.awk out.tr>cbr_delay
3.3 利用Xgraph绘出图形    Xgraph是ns-allinone包中自带的一个小巧的绘图工具,它可以根据数据文件里的数据绘制出相应的图形。本例执行:$xgraph cbr_delay,结果如图5所示:

图5  cbr_delay图    由图可以看出:在一刚开始的时候,由于只有CBR的数据包,所以端到端的延迟是固定的,但在1.0秒后,FTP数据包参与争夺网络资源,因此,端到端的延迟变得不固定,但等到FTP传输结束后,CBR数据包的端到端的延迟又变得固定了。4  结论    网络模拟日益成为分析、研究、设计和改善网络性能的强大工具,NS-2便是其中功能强大且可以免费得到的一种。本文详细讨论了NS-2的结构、功能及其使用方法,并给出一个实例具体解释 NS-2的使用及使用相关工具对输出结果进行处理。总的来说,NS-2结构复杂,有一个相对陡峭的学习曲线,希望本文对学习NS-2能有所裨益。 参考文献 
[1] http://www.isi.edu/nsnam/NS DB.
[2] http://nile.wpi.edu/NS DB.
[3] 刘俊,徐昌彪,隆克平. 基于NS的网络仿真探讨J.
计算机
应用研究,2002
[4] http://140.116.72.80/~smallko/ns2/ns2.htm DB
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/20223/showart_1896331.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP