《网络仿真和模拟设计》 - 洪泛路由协议的移植

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NS2洪泛路由协议的移植
摘要:本文详细介绍了在Linux环境下编译,安装NS2软件的方法。

并将通过在NS中添加洪泛路由协议,进行了拓展性研究与实验,最后通过使用相关工具对输出结果进行处理。

关键词:NS2;仿真;洪泛路由协议
1.引言
网络操作要求的不断变化刺激了新协议和新算法的产生和发展,网络模拟仿真是研究新协议,分析新算法的一种重要方法。

网络仿真平台NS2是一种针对网络技术的源代码公开的、免费的软件模拟平台,研究人员使用它可以很容易的进行网络技术的开发,它是目前学术界广泛使用的一种网络模拟软件,它也可作为一种辅助教学的工具,已被广泛应用在了网络技术的教学方面。

NS2具有仿真灵活、结果分析全面、易扩展、源代码共享等优点。

而在NS2上移植新协议又是拓展NS2的基础,对初学者来说其过程是非常难于掌握的,本文以洪泛路由协议为例,详细探讨了NS2协议移植的基本方法。

2.协议实现原理
洪泛路由算法是一个简单有效的路由算法,其基本思想是每个节点都使用广播转发收到的数据分组,若收到重复的分组则进行丢弃处理。

洪泛路由协议会导致数据分组以源节点为中心进行扩散,为了不造成大面积的扩散占用过多的网络资源以及使扩散收敛,需要设定一个合适的TTL值,保证数据分组只经过有限跳路由;此外为了进行分组重复检测,每个节点需要维护一个数据分组的序号SEQ和一张路由表,源节点每发送一个数据分组,则将SEQ 增加1,并将该SEQ添加到数据分组的IP头部,其余节点收到数据分组之后会将该SEQ记录到路由表并根据该SEQ进行重复分组检测。

数据分组以源节点为中心进行扩散
洪泛路由协议最大的问题是会产生大量的重复分组,占用网络资源,是路由协议和链路资源过于浪费,以致使效率很低。

但是洪泛路由算法是一个最简单最可靠的路由算法,在节
点剧烈抖动,进出网络频繁变化的场景下,全网洪泛是有效的方式,其具有极好的健壮性,可用于军事应用,也可以作为衡量标准评价其他路由算法。

洪泛路由协议具有三个基本属性:
1)在源节点与信宿节点之间所有可能的路由都被尝试过;
2)分组中至少有一个副本使用的是最小跳数路由到达信宿;
3)所有直接或间接与源节点项链的节点全部被访问到。

3.协议移植
2.1环境配置
NS2必须在UNIX/Linux平台下运行,因此一般需要安装UINX/Linux操作系统。

若要在Windows下使用Linux可以采用虚拟机或者cygwin的方式,但其操作过程都较为复杂,容易发生一些难以预测的问题。

在本文中,我们直接采用Ubuntu12.04系统编译安装NS2。

1)首先,我们需要下载Ubuntu12.04并安装,此步骤不做具体描述。

2)至官方网站下载ns-allinone-2.35.tar.gz软件包,该压缩包包含了NS2核心组件以及所有
依赖组件的源代码,需要进行编译安装。

3)将ns-allinone-2.35.tar.gz解压至任意目录下,执行./install命令进行ns以及相关依赖的
编译,如下图所示:
4)进入ns-2.35文件夹,执行./ns命令进行测试,出现下图(%符号)表示ns成功运行
至此,NS2基础环境搭建成功。

2.2NS2架构简介
NS2是由Berkeley大学研究开发的面向对象、离散事件驱动的网络模拟器,能够支持很多网络协议的模拟与仿真,并且有良好的可扩展性。

它采用分裂对象模型OTcl和C++两种语言进行设计开发,用C++语言来编写和实现,用OTcl作为一个解释器来执行用户的脚本命令。

ns2架构图
基于分裂对象的模型,NS2采用两级体系结构。

NS2的后台描述事件调度器和大部分基本的网络组件对象使用C++实现和编译,称为编译层次;NS2的前端主要功能是对模拟环境的建立和配置,用一个OTcl解释器对脚本进行解释,执行相应的操作,称为解释层次。

NS2中编译类对象通过OTcl连接建立了与之对应的解释类对象,这样用户就能够方便地对C++对象的函数进行修改与配置,从而对NS2实现拓展。

ns2中的分裂对象模型
利用NS2进行网络模拟的基本过程如下图所示。

首先,分析现有的协议模块是否满足仿真和研究要求,如果可以就直接编写OTcl脚本进行仿真分析。

如果NS2中现有的协议模块尚不能满足要求,那么就需要对NS2进行扩展,或者是对现有协议进行修改。

对NS2扩展后编写相应的OTcl脚本进行测试,完成之后做运行仿真,分析结果,进一步修改直到获得满意的结果。

本文中即对NS2拓展了一个新的协议:洪泛路由协议。

NS2网络模拟过程
2.3洪泛路由协议移植
mflood协议的原理和代码虽然相对简单,但协议移植的过程和方法大同小异。

移植的过程可以概括为添加新的源代码,修改原有NS2源代码,修改NS的makefile文件三个步骤。

具体过程如下。

1)查看/mflood/中MFlood分组头名称,此名称在下一步中会用到
2)修改/common/packet.h。

因为mflood协议用到了自己定义的分组类型PT_MFLOOD,故我们需要修改定义分组类型的头文件packet.h。

其一,需要增加mflood类型的常量:
其二,需要加入对应类型包时需要使用的字符串,注意此字符串需要和第一步中的MFlood分组头名称相同:
注意此处若不是NS2.35版本的话,可能会有所不同。

3)修改/tcl/lib/ns-packet.tcl以激活MFlood分组头,若不进行激活则会产生异常
4)修改/tcl/lib/ns-lib.tcl添加新的MFlood协议
其一,需要给出MFlood协议的初始化函数,此处指定为create-mflood-agent成员函数。

其二,需要定义create-mflood-agent成员函数
此处我们可以发现,修改NS2的系统tcl文件时,一个很有用的技巧就是参考NS中已有的文件。

5)修改Makefile文件以编译新添加的MFlood协议
6)修改MFlood源码以适应新版本ns。

该版本的洪泛协议源码较早,与新版本的NS产生一些不兼容问题,修改的方式可以从错误逐层分析得出,下面直接给出修改方法。

其一:
其二:
其三:
7)执行make命令重新编译ns
若编译过程没有出现错误,则说明协议的移植基本成功。

4.仿真验证
3.1仿真场景设计
本次选择的测试场景为一个三节点的简单无线网络拓扑。

测试场景中有三个节点A,B,
C构成一个两条拓扑,B位于中间,连接了A和B。

现在A作为发送源,C作为接收者,B 在中间进行转发。

移动节点都是出于不断运动当中的,所以整个网络的拓扑结构也会不断变动。

测试代码如下,并保存为mflood-example.tcl。

#三节点的简单无线网络拓扑
#无线节点参数
set val(chan)Channel/WirelessChannel;#物理信道类型为无线信道
set val(prop)Propagation/TwoRayGround
set val(netif)Phy/WirelessPhy
set val(mac)Mac/802_11
set val(ifq)Queue/DropTail/PriQueue
set val(ll)LL
set val(ant)Antenna/OmniAntenna
set val(ifqlen)50
set val(rp)MFlood
set val(x)400
set val(y)200
set val(stop)10.0
set val(nn)3
#建立一个模拟实例
set ns[new Simulator]
#开启Trace追踪文件和NAM显示文件
set tracefd[open mflood-example.tr w]
set namtrace[open mflood-example.nam w]
$ns trace-all$tracefd
$ns namtrace-all-wireless$namtrace$val(x)$val(y)
#建立拓扑对象,记录节点移动情况
set topo[new Topography]
$topo load_flatgrid$val(x)$val(y)
#建立God(General Operations Director)对象,存储网络状态以及节点间的连接信息
create-god$val(nn)
#建立物理信道对象
set chan_1_[new$val(chan)]
#配置无线节点,包括使用何种路由协议,MAC协议,无线信道的模型等
$ns node-config-adhocRouting$val(rp)\
-llType$val(ll)\
-macType$val(mac)\
-ifqType$val(ifq)\
-ifqLen$val(ifqlen)\
-antType$val(ant)\
-propType$val(prop)\
-phyType$val(netif)\
-channel$chan_1_\
-topoInstance$topo\
-agentTrace ON\
-routerTrace ON\
-macTrace ON\
-movementTrace OFF
#建立无线节点并设置节点位置set n(0)[$ns node]
$n(0)random-motion0
$n(0)set X_100.0
$n(0)set Y_100.0
$n(0)set Z_0.0
$ns initial_node_pos$n(0)60
set n(1)[$ns node]
$n(1)random-motion0
$n(1)set X_300.0
$n(1)set Y_100.0
$n(1)set Z_0.0
$ns initial_node_pos$n(1)60
set n(2)[$ns node]
$n(2)random-motion0
$n(2)set X_500.0
$n(2)set Y_100.0
$n(2)set Z_0.0
$ns initial_node_pos$n(2)60
#建立一个UDP代理
set udp0[new Agent/UDP]
$ns attach-agent$n(0)$udp0
set null0[new Agent/Null]
$ns attach-agent$n(2)$null0
$ns connect$udp0$null0
#在UDP代理上面建立CBR流
set cbr0[new Application/Traffic/CBR] $cbr0attach-agent$udp0
#仿真结束时重置节点
for{set i0}{$i<3}{incr i}{
$ns at10.0"$n($i)reset"
}
#启动和结束代理
$ns at0.5"$cbr0start"
$ns at9.5"$cbr0stop"
#定义结束过程,关闭Trace文件和NAM显示文件,模拟结束时调用
proc finish{}{
global ns tracefd namtrace
$ns flush-trace
close$tracefd
close$namtrace
exit0
}
#模拟结束时调用结束过程
$ns at$val(stop)"finish"
$ns at$val(stop)"puts\"NS EXISTING...\";$ns halt"
puts"Start Simulation..."
#执行模拟
$ns run
3.2仿真执行
执行仿真与验证的步骤如下:
1)执行./ns mflood-example.tcl命令进行仿真,该仿真代码为三节点的简单无线网络拓扑。

该命令将会生成mflood-example.nam和mflood-example.tr仿真结果。

2)执行nam mflood-example.nam命令查看仿真过程
由上图可以看出,在洪泛的实现过程中,1节点收到来自于0节点的数据副本后转发给它的每一个邻居节点,即2节点,数据报路由表现符合洪泛路由协议的基本特征。

查看仿真文件mflood-example.tr,检验MFlood协议。

从trace文件中可以看出,CBR数据分组的转发特征满足洪泛路由协议。

5.实验结果分析
通过NS2的模拟,得到的实验结果主要为tr文件和man文件,本小结将着重介绍trace 文件的含义以及分析上节中提到的trace文件,通过跟踪分组的调度情况,证明实验结果正确,协议移植有效。

4.1Trace文件简介
trace文件是在模拟过程中生成的记录模拟每一个分组调度的文件,一次模拟生成的信息基本全体现在trace文件中。

trace文件包含了很多有用的可供分析的数据,我们需要从中选择出我们关注的数据进行分析。

无线trace文件中每一列的含义如下表:
列名含义备注
Event事件的类型s,r,d,f表示发送,接收,丢弃转发
Time事件发生的时间
Node时间发生的节点ID
Layer事件发生的层MAC物理层,AGT代理层,RTR路由层
Flags标志
Pkt id分组ID
Pkt type分组类型
Pkt size分组大小
MAC层信息四项分别为期望时间,源地址,目的地址,分组类型[Mac Layer
Info]
[IP Info]IP层信息四项分别为源地址,目的地址,TTL值,跳数
4.2Trace文件分析
因为Trace文件数据量庞大,在此截取其中一个数据报的转发调度过程,验证试验结果。

1)节点0发送0号分组,路由层的目的地址为节点2,在MAC层以广播形式发出
s0.500000000_0_AGT---0cbr210[0000]-------[0:02:0320][0]00
r0.500000000_0_RTR---0cbr210[0000]-------[0:02:0320][0]00
s0.500000000_0_RTR---0cbr230[0000]-------[0:02:0300][0]00
s0.500535000_0_MAC---0cbr288[0ffffffff0800]-------[0:02:0300][0]00
2)节点1收到节点0发出的0号分组
r0.502839667_1_MAC---0cbr230[0ffffffff0800]-------[0:02:0300][0]10
r0.502864667_1_RTR---0cbr230[0ffffffff0800]-------[0:02:0300][0]10
f0.503148760_1_RTR---0cbr230[0ffffffff0800]-------[0:02:0290][0]10
3)节点1发送0号分组,路由层的目的地址为节点2,在MAC层同样以广播形式发出
s0.503523760_1_MAC---0cbr288[0ffffffff1800]-------[0:02:0290][0]10 ..........
4)节点0收到节点1广播发出的0号分组
r0.505828427_0_MAC---0cbr230[0ffffffff1800]-------[0:02:0290][0]20
节点0收到的广播分组,为重复分组,不进行广播,丢弃
r0.505853427_0_RTR---0cbr230[0ffffffff1800]-------[0:02:0290][0]20
D0.505853427_0_RTR LOOP0cbr230[0ffffffff1800]-------[0:02:0290][0]20
5)节点2收到节点1广播发出的0号分组
r0.505828427_2_MAC---0cbr230[0ffffffff1800]-------[0:02:0290][0]20
节点2的业务层接受节点1发出的0号广播分组
r0.505853427_2_AGT---0cbr230[0ffffffff1800]-------[0:02:0290][0]20
从上节仿真结果可以看出,洪泛协议的移植正确有效。

但可以发现在洪泛的实现过程中,每个节点都需要转发报文,存在大量的资源浪费,使整个网络都受到影响。

4总结
网络模拟是进行网络技术研究的一种基本手段,在新技术的研究中,出于各种原因,实际的网络系统的实验往往很不现实,因此模拟也就成为了最佳的选择测试,评估和验证的手段之一。

NS2作为一个事件驱动的模拟实验床,可以提供各种复杂网络的仿真,还适用于网络协议的开发与研究以及网络故障诊断。

在本次实验中,我们选择了较为简单的现成协议代码进行移植。

虽然没有对协议进行开发,但是我们还是对NS2的体系结构,以及在NS2上进行协议移植与协议拓展开发有了更加深入的认识。

同时我们还了解了平时并不多见的洪泛路由协议,通过实验结果我们也发现该协议存在比较严重的资源浪费。

在协议移植的过程中,出现了一些意料之外的问题,需要对NS2或移植协议的源代码进行修改,这也提高了我们C++代码编写与阅读的能力,同时巩固了新学习的TCL语言。

5参考文献
[1]黄化吉,冯穗力,秦丽姣,陆宏治.NS网络模拟和协议仿真[M].北京:人民邮电出版社,2010.
[2]陈瑶,朱志祥,杨峰.洪泛路由协议的仿真分析与改进[J].西安邮电学院学报,2011,16(4):56-58。

相关文档
最新文档