一、背景
环境:vmware下安装ubuntu18.04虚拟机,ns版本2.35
洪泛(mflood)算法是一个简单有效的路由算法,其基本思想是每个节点都使用广播转发收到的数据分组,若收到重复分组则进行丢弃处理。
移植过程参照《NS网络模拟和协议仿真》,黄化吉、冯穗力著。
二、移植过程
1.在NS中新建文件夹放置协议的代码文件。
与mflood协议相关的文件共有5个:mflood.h,mflood.cc,mflood-packet.h,mflood-seqtable.h,mflood-seqtable.cc。这五个文件下载后放在ns-allinone-2.35/ns-2.35目录下新建的mflood文件夹下。协议相关的文件可以通过邮电出版社的官方网址搜索下载,我这里也分享一下(有把注释掉的代码修改一点点)。
mflood协议+移植测试例程下载:https://download.csdn.net/download/hshiya0412/12120596
2.修改ns相关文件。
(1)ns-2.35/common/packet.h
因为mflood协议用到自己定义的分组类型:PT_MFLOOD,我们需要修改定义分组类型的头文件packet.h,添加mflood定义的分组类型,有下面两处改动:
一是:在PT_NTYPE前添加PT_MFLOOD;如图,PT_NTYPE必须是最后一个元素,在它之前添加我们所需的分组类型,后面的数字依次顺延就可以了。
二是:在initName中,相应位置加入name_[PT_MFLOOD]="MFlood",在这里添加的是对应分组类型PT_MFLOOD的字符串,这是在trace文件中打印PT_MFLOOD类型的包时需要使用的字符串。
(2)ns-2.35/tcl/lib/ns-packet.tcl
mflood协议定义了自己的分组头部,该分组头部必须被激活,否则将产生异常。所以我们需要修改定义分组头部的ns-paket.tcl文件,添加mflood的分组头部。(这里我的代码和我网上找到的其他资料有点不一样,这样添加是可以成功运行的)
(3)ns-2.35/tcl/lib/ns-lib.tcl
这个文件也需要修改两处地方。【这个文件要千万注意:空格和制表符的使用,不然就会报错,建议直接复制差不多的,然后修改相应位置】
一是:在ns-lib.tcl中定义了Simulator类的创建节点函数,在这个函数下加入新的洪泛路由协议。
二是:当节点使用MFlood路由协议时,将会调用create-mflood-agent函数来进行初始化,所以我们还要在ns-lib.tcl中定义create-mflood-agent函数。这个函数创建了一个Agent/MFlood的一个对象,这个对象最后将和某一个移动节点$node绑定在一起。
3. 修改Makefile文件。
在Makefile文件中的OBJ_CC变量的定义中增加下面这一行: mflood/mflood.o mflood/mflood-seqtable.o \
注意空格和斜杠方向。
保存后,回到ns-2.35目录下,执行make命令重新编译NS,先使用make clean命令清除之前编译的文件,然后使用make重新编译,最后使用sudo make install。如果遇到错误,那么重新修改步骤2的文件或者步骤3的makefile文件然后再重新编译。
三、验证
接下来验证一下移植是否成功,验证的例子和mflood的协议代码一并上传了,需要的可以下载,名字为mflood-3node.tcl。
该例程是无线网络模型,3个节点形成一字拓扑,路由协议使用MFlood,节点0向节点2发送恒定速率(CBR)的数据流,它们不在相互的信号覆盖范围,但它们可以通过节点1的中继实现相互间的通信。
然后在放mflood-3node.tcl文件的文件夹下使用ns mflood-3node.tcl命令运行仿真,如果出现如下的结果,则代表运行成功。
num_nodes is set 3
INITIALIZE THE LIST xListHead
Start Simulation...
channel.cc:sendUp - Calc highestAntennaZ_ and distCST_
highestAntennaZ_ = 1.5, distCST_ = 550.0
SORTING LISTS ...DONE!
完成后会生成一个Trace跟踪文件和一个nam显示文件,可通过这两个文件查看模拟过程。