在NS2中新添协议

在NS2下进行新协议开发的一般流程

由于NS2使用分裂对象模型,所以在协议开发的过程中,总是从C++和Tcl两个类入手。流程说明如下:

1、定义新的路由协议:在aodv.h中定义class AODV:public Agent{}。在NS2中,所有路由协议都是从Agent类继承而来的。其中,recv()函数和command()函数是从Agent类继承下来的。recv()是Agent在接收分组时的入口,源节点在

发送一个分组时会调用目标节点的相应Agent的recv()函数。它是路由层收到数据包的处理函数,包括来自上层协议和下层协议的数据包;command()是命令处理函数。要在Otcl对象中调用对应的C++对象的方法,NS是通过command()函数实现的。对于每个TclObject,NS2为其Otcl中的解释对象建立一个实例过程,cmd{}。过程cmd{}调用影像对象的方法command(),并将cmd{}的参数作为一个参数组传递给command()方法。此外,具体协议所用到的其它函数也在AODV类中定义。

2、定义一个TclClass类的子类:定义的新的路由协议需要被NS所接纳并且可以在Tcl代码中使用,需要在aodv.cc文件进行如下定义:

static class AODVclass:public TclClass{}。

TclClass是一个纯虚类,从这个基类继承出来的类提供两个功能:构造和编译类结构互为镜像的解释类结构以及提供初始化新的TclObject的方法。每个从TclClass继承出来的类都和编译类结构中的一个TclObject的子类相关联,并能初始化所关联的类的新对象。在其构造函数中调用基类的构造函数AODVclass():TclClass(“Agent/AODV”),其中Agent/AODV指定了C++中的AODV类和Tcl部分中的Agent/AODV绑定在了一起,在编写的Tcl代码中指定路由协议时就应该用Agent/AODV。

3、修改ns/tcl/lib/ns-lib.tcl文件:在NS2中运行Tcl中指定路由协议时只会用到路由协议的名称,因此,我们需要修改NS的系统Tcl代码,使得当设定路由协议为AODV时会调用我们新增加的Agent/AODV类(也就是C++下的AODV类)。这需要在ns/tcl/lib/ns-lib.tcl文件中的Simulator类的create-wireless-node成员函数中增加如下代码:

switch-exact $routingAgent_{

AODV{

set ragent [$self create-aodv-agent $node];

}

}

然后在ns/tcl/lib/ns-lib.tcl文件中定义成员函数create-aodv-agent(参照已有的路由协议)。

4、定义包头:为了进行重复包检测,路由协议需要定义自己的包头,将各种序列号、分组标识等存在这个包头中。首先在AODV-packet.h文件中定义一个结构体 struct hdr_aodv{},其中offset和access都是系统要求的,我们只需要作相应的修改。静态变量offset_是rtp头在NS2分组中的字节偏移量;packet::access()返回用于储存包头的缓冲区的第一个字节的地址。然后我们需要在ns/tcl/lib/ns-packet.tcl文件中添加包头的名字foreach prot{······AODV······}。

为了和NS2中的Tcl代码相结合,我们还需要在aodv.cc文件中定义一个PacketHeadeaClass类的子类:

static class AODVHeaderClass:public PacketHeaderClass{}。

它是各种分组头的基类,在此类中使得Tcl中的PacketHeader/AODV类与C++中的hdr_aodv绑定在一起。如果RTP头在配置时被激活,RTPHeaderClass类的静态对象class_rtphdr提供了到Otcl的连接。当模拟正在执行时,这个静态对象以“PacketHeader/RTP”和“sizeof{hdr_rt}”作为参数,调用PacketHeaderClass的构造函数。这会使RTP头的大小被储存下来,然后被PacketHeadeaManager类的对象使用。另外,bind_offest()必须在RTPHeaderClass类的构造函数中被调用,这样,PacketHeadeaManager的对象就知道这个头的偏移量(offset)储存在哪里了。

5、创建包头类型:修改ns/common/packet.h文件。首先在enum packet_t中增加一项来表示我们新增加的包的类型,定义为PT_AODV,然后在class p_info类的p_info()构造函数中增加一行给出新增包类型的名字:name_[PT_AODV]=“aodv”。

6、在AODV类的构造函数定义时将新创建的包的类型传递给Agent类的构造函数,在aodv.cc中定义此构造函数AODV::AODV():Agent(PT_AODV)。

7、编译代码:在完成了协议的定义和实现后,我们要对新增加的文件进行编译并链接到NS2中去,这需要修改ns/Makefile文件里,增加对新类的编译。我们的文件放在ns/aodv目录下,在Makefile文件里OBJ_CC变量的定义中增加下面这行:

aodv/aodv.o aodv/······

将所有将要生成的的.o文件放在此处。然后依次执行:

./configure, make depend, make命令来重新编译NS2。

8、初步测试,首先编写一个tcl文件aodv.tcl 来验证程序的正确性。(场景设定部分可以只取简单的几个节点即可)。

9、生成随机场景:

./setdest –n 30 –p 10 –M 20 –t 500 –x 1000 –y 1000 >scene-30n-10p-20M-500t-1000-1000。(必须在setdest工具所在的目录下执行此命令)并将生成的文件放在和aodv.tcl文件相同的目录(ns/aodv)下。这样下一步的source命令才能找到场景文件,否则需要指定相对或绝对路径。

10、使用source “scene-30n-10p-20M-500t-1000-1000”命令替换刚才的测试文件tcl文件中的场景设定部分。此外还要相应地改变测试文件aodv.tcl文件中的拓扑大小及节点数等,使之与生成场景时的参数保持一致,否则运行ns时会出错。

11、生成随机数据流:

ns cbrgen.tcl –type tcp –nn 30 –seed 1 –mc 5 –rate 1.0 > cbr-30n-5c-lp

(必须在cbrgen.tcl所在的目录ns/indep-utils/cmu-scen-gen下执行)。并将生成的文件也放在和aodv.tcl文件相同的目录下(ns/aodv)。这样下一步的source命令才能找到场景文件,否则需要指定相对或绝对路径。

12、使用source “cbr-30n-5c-lp” 命令替换刚才的测试tcl文件中的数据流设定部分。

13、在ns/aodv下重新执行ns aodv.tcl命令。在tcl脚本中定义了如下代码: set tracefd [open aodv.tr w]

$ns trace-all $tracefd

它们用于打开一个名为aodv.tr的文件,用来记录模拟过程的trace数据,变量tracefd指向该文件。

而如下代码:

set namtracefd [open aodv.nam w]

$ns namtrace-all $namtracefd

用于打开一个名为aodv.nam的文件,用来记录nam的trace文件,并调用nam程序. 

14、编写awk脚本:把评价路由协议的性能指标如吞吐量、平均时延等,通过awk程序语言编写后缀为.awk的文件,然后运行gawk命令得到相应的数据文件。

15、使用gnuplot工具进行画图分析:在NS2下进行协议仿真时常用gnuplot工具的第二种工作方式,即首先编写一个plot脚本文件xx.plot。在其中可以设置生成图片的格式、x轴、y轴及title等,最后用plot “xx.data”画图。写好plot脚本后,调用gnuplot xx.plot画图。

16、使用nam工具直观地查看网络模拟过程。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值