ImageVerifierCode 换一换
格式:DOCX , 页数:45 ,大小:169.27KB ,
资源ID:9679722      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9679722.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(网络模拟和协议仿真课程设计报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

网络模拟和协议仿真课程设计报告.docx

1、网络模拟和协议仿真课程设计报告杭州电子科技大学网络模拟和协议仿真课程设计课程题目:基于NS-2的SDRAD路由协议的实现 人 员:*2012/9/16摘要在网络路由技术的研究中,实际网络系统的实现往往是代价很高或不现实的。利用网络仿真器NS2 对相关网络路由协议进行仿真是一种既有效又经济的研究方法,但目前的NS2 还不能支持所有网络路由协议的仿真。本文根据拓展仿真的原理和方法,对在NS2 中添加路由协议进行了研究,添加了SDRAD 路由协议。关键词:NS2;拓展仿真;路由协议;SDRAD引言在真实的网络中,设计和调试网络协议是一件困难且复杂的事情,仿真成了最佳可供选择的测试、评估和验证手段之一

2、。网络仿真是用计算机程序对通信网络进行模型化,通过程序的运行模仿通信网络的运行过程。这是一种进行网络技术研究的基本手段,不仅适用于网络模型的构造和设计、协议性能的评价与分析,还适用于网络协议的开发与研究以及真实网络的故障诊断。网络模拟器NS2(Network Simulator v2)是一种免费、源代码公开的模拟软件平台,其协议代码与真实网络应用代码很相似,仿真结果具有可靠性。NS2 是一个面向对象的离散事件驱动网络模拟器,支持多种流行的网络协议如TCP、UDP 和路由调度、拥塞控制算法等。相对于一般的离散型模拟器,NS2 的优势在于它有非常丰富的构件库,而且这些对象易于组合,易于拓展,但是对

3、用户的编程能力,实际网络协议的理解能力要求较高。本文利用NS2 已有的对象,组合所要研究的网络系统模型,在NS2 中添加了一个SDRAD1路由协议进行网络仿真。由于无线传感器网络的众多优势,如可迅速大规模部署、可进行各种环境下的长期监测、可减少人为干涉等,使得它逐步应用到各种军事和民用领域,包括环境监测、智能交通等。数据收集是无线传感器网络路由中的一种特殊情况,主要任务是通过单跳或多跳的方式将网络中传感器节点收集的数据传送给基站。在环境监测应用中。可采用数据收集的方式将数据汇集到汇聚节点再进行进一步分析。用无线传感器网络进行环境数据收集时。不同于其他对实时性要求比较高的应用,其对数据传输的延迟

4、性没有太大要求,数据传输速率也较低,对带宽也无过高要求。如何降低网络能耗、延长网络生命周期成了环境监测中数据收集的首要问题。DRAD2 路由协议可以很好地满足上面提到的要求。为了模拟DRAD的原理,对它进行了简化,形成了SDRAD协议。第一章 协议介绍先来介绍一下DRAD协议,DRAD是(a Data collection Routing algorithm based on Asynchronous Duty-cycle in Wireless Sensor Networks)的简称,是一种基于异步休眠调度、用于环境监监测应用的数据收集协议。节点定期收集环境信息汇总到基站。为了将数据传送到基

5、站,DRAD将网络描述成树状结构。节点将自身感知到的数据或者需要转发的数据通过下一跳节点向基站方向发送。但是,节点不是仅仅维护其下一跳节点的信息,而是维护所有邻居的信息。当节点的下一跳节点失效时可以采用迂回策略,使数据包最终到达基站。 网络中的节点按照一定的规律进行休眠调度,节点维护的邻居相关信息除了最小跳步数、剩余能量、链路质量等常用选路困素外,还包括计算其醒来的时间差。网络不需要全局或局部的时间同步,也不要求节点修改内部时钟。而是通过记录的与邻居节点的时间差,决定发送数据包的时刻。此外,可以通过发送的数据包和接收节点回馈的ACK进行时间差修补。对下一跳节点进行选择时,加入对邻居节点醒来先后

6、顺序的考虑。为了简单起见,路由方面借鉴经典的基于地理位置路由的选路策略,如贪婪路由、对网络空洞的处理。休眠调度也是利用简单的调度策略,实现定义节点的睡眠和活跃周期。 SDRAD 路由协议是对DRAD协议的简写,简化了的DRAD 协议。SDRAD 主要实现了建立网络结构,收集数据信息的功能3。第二章 协议设计SDRAD 协议分两个阶段:网络拓扑形成阶段和数据收集阶段。接下来将对这两个阶段进行详细说明。2.1 网络拓扑形成阶段当节点部署到网络并开启电源后,并不是立即进入数据收集。而是首先由基站发送Hello 包,节点接受到Hello 包后,更新自己的邻居节点信息,从而建立树状的网络结构。协议刚启时

7、,所有节点的跳步数都为无穷大。首先,由基站广播Hello 包,为了简单,本例中将基站固定为序列号为0 的节点。节点接收到Hello 包后,更新本节点跳步数和邻居列表,广播自身。 Hello包的分组头包类型(Packet type)跳步数(Hopcount)源节点序列号(Source node sequence)节点的分布及形成的拓扑关系:图1 结点分布如图1,网络中共有07 个节点,其中节点0 为基站,其跳步数为0。节点1,2 的跳步数为1,节点3,4,5 的跳步数为2,节点6 的跳步数为3。在网络形成阶段由基站发送Hello 包,节点1,2 接收到Hello 包,将节点0加入到它们的邻居表中

8、,同时节点1,2 重新向外发送Hello 包,被节点3,4,5接收,依次建立邻居表,形成SDRAD 的拓扑关系。结点结点0结点1结点2结点3结点4结点5结点6001212123452.2 数据收集阶段进入数据收集阶段后,当网络中某一节点接受到数据包后,该节点就会向邻居表中的某一节点发送数据收集包(collect 包),最终将接收到的数据信息发送到基站,传给应用程序进行处理。选择哪一个邻居节点呢?协议将随机选择邻居表的一个节点进行转发。图2 数据转发路径图如图2,节点6 接收到数据信息,节点6将该数据封装成Collect 包,依次传送给节点5、节点1、在到基站(节点0)。路径中结点5与结点1都是

9、随机选择的。第三章 协议实现3.1 SDRAD协议类为了实现SDRAD 协议类, 我们编写了4 个程序文件, 分别是sdrad.h、sdrad.cc(SDRAD 协议的定义和实现)、sdrad_packet.h(SDRAD 新增包头的定义)、sdrad_nbtable.h(邻居表的定义和实现)。在ns2 中,所有路由协议都是从Agent 类继承而来的,实现协议时主要关心的是节点对包的接收和发送,即recv 函数和send 函数。Recv 函数一般从Agent 类继承而来,send 函数根据需要自己编写。下面给出SDRAD 协议类的定义:class SDRAD: public Agent fri

10、end class SDRAD_Neighbor; /SDRAD_Neighbor 类是邻居表类friend class SDRAD_HelloTimer; /Hello 定时器类public:SDRAD(nsaddr_t id); /含一个参数的构造函数void recv(Packet *p, Handler*); /接收上层协议送下来的数据并处理protected:/命令处理函数,实现Tcl 和C+之间的信息交换int command(int ,const char* const*);inline int initialized() return 1 & target_; /对上层发送的数

11、据进行处理void resolve(Packet *p);/邻居表的信息维护void nb_insert(u_int32_t seqno, u_int8_t hop); /插入SDRAD_Neighbor* nb_lookup(u_int32_t seqno); /查找void nb_delete(u_int32_t seqno); /删除void nb_purge(); /清空void nb_print(); /打印,检验协议所建立的拓扑是否符合要求void forward(u_int32_t seqno,Packet *p, double delay); /转发函数void sendHel

12、lo(bool isbase); /发送Hello 包/Packet RX Routinesvoid recvHello(Packet *p); /接收Hello 包/接收SDRAD 包(包括Hello 包和Collect 包)void recvSDRAD(Packet*p);/Packet collect Routines,发送、接收Collect 包void sendCollect(u_int32_t ipdst);void recvCollect(Packet *p);/TimersSDRAD_HelloTimer htimer; /定义定时器private:/本协议中为了简化处理,将I

13、P 地址和序列号设置为同一唯一值nsaddr_t index_; /本节点的IP 地址u_int32_t seqno_; /本节点的序列号u_int8_t hop_count_; /节点跳步数protected:SDRAD_nbtable nbthead_; /定义邻居表/为调试和跟踪定义的变量Trace *logtarget_;NsObject *uptarget_;NsObject *port_dmux_;其构造函数的实现:voidSDRAD:SDRAD(nsaddr_t id):Agent(PT_SDRAD),port_dmux_(0),htimer(this)index_ = id;s

14、eqno_ = id; /hop_count_ = INFINITY; /跳步数为无穷大logtarget_ = 0;LIST_INIT(&nbthead_);length = 0; /邻居表长度3.2 数据包头现在,我们为SDRAD 协议新建包头,对应实现协议中的分组头。下述代码在sdrad_packet.h 中:/SDRAD包头:hdr_sdradstruct hdr_sdrad u_int8_t dh_type; /分组类型 static int offset_; inline static int& offset() return offset_; inline static hdr_

15、sdrad* access(const Packet* p) return (hdr_sdrad*) p-access(offset_); ;Hello包头:hdr_sdrad_hellostruct hdr_sdrad_hello u_int8_t hh_type; /分组类型 u_int8_t hh_hop_count; /跳步数 u_int32_t hh_src_seq; /源节点序列号 /计算包头大小 inline int size() int sz = 0; sz = sizeof(u_int8_t) + sizeof(u_int8_t) + sizeof(u_int32_t); r

16、eturn sz; ;Collect包头:hdr_sdrad_collectstruct hdr_sdrad_collect u_int8_t hc_type; /分组类型 u_int8_t hc_hop_count; /跳步数 u_int32_t hc_src_seq; /源节点序列号 u_int32_t hc_dst_seq; /目的节点序列号 inline int size() /计算包头大小 int sz = 0; sz = sizeof(u_int8_t) + sizeof(u_int8_t) + sizeof(u_int32_t) + sizeof(u_int32_t); retu

17、rn sz; ;/联合SDRAD 的分组头,节约空间便于使用union hdr_all_sdrad hdr_sdrad dh; hdr_sdrad_hello hh; hdr_sdrad_collect hc;3.3 邻居表在ns2 中内置了一个链表结构list(源码在ns/lib/bsd-list.h 中),在此使用这个list 结构实现邻居类(sdrad_nbtable.h):#include /包含头文件class SDRAD_Neighbor friend class SDRAD; /设置SDRAD 为友元public: SDRAD_Neighbor(u_int32_t s, u_in

18、t8_t hop) /构造函数 seqno_ = s; hop_count_ = hop; protected: /链表结构 LIST_ENTRY(SDRAD_Neighbor) nb_link; /邻居结点中的字段 u_int32_t seqno_; /序列号 u_int8_t hop_count_; /跳步数;/定义链表结构LIST_HEAD(SDRAD_nbtable, SDRAD_Neighbor); 解释类的定义和编译类的联接解释类和编译类的连接方法比较固定,对于只关心协议内容的人,可参考ns2 中同层协议的实现方法。Tcl Hooks到目前为止,我们的SDRAD 协议还不能被ns

19、所认可,还需要其它定义。下面部分是不可缺少的,而且通常只需要按照这个典型模式实现。其中AgentSDRAD 指定了C+中的SDRAD 类和Tcl 部分中的Agent/SDRAD 绑定在了一起。/sdrad.cc 文件中:/TCL Hooksstatic class SDRADclass : public TclClass public: SDRADclass():TclClass(Agent/SDRAD) TclObject* create(int argc,const char* const* argv) assert(argc = 5); return(new SDRAD(u_int32_

20、t)atoi(argv4); class_rtProtoSDRAD;3.4 SDRAD协议类的实现3.4.1 邻居表管理本部分功能实现对邻居表的增删查改等,方便代理类的使用。1 插入新建一个邻居节点,插入nbtable 中。void SDRAD:nb_insert(u_int32_t seqno, u_int8_t hop) 2 查找查找序列号为seqno 的节点SDRAD_Neighbor* SDRAD:nb_lookup(u_int32_t seqno)3 删除删除序列号为seqno 的节点void SDRAD:nb_delete(u_int32_t seqno) 4 清空清空邻居表voi

21、d SDRAD:nb_purge() 5 打印输出邻居表的跳步数和序列号void SDRAD:nb_print() 3.4.2 SDRAD路由协议中的关键函数1 command 函数 int SDRAD:command(int argc,const char*const*argv)command 函数的写法固定,主要实现Otcl 和C+的交互,对Otcl 命令进行解析。用来解析模拟器类create-sdrad-agent 函数中的命令。Simulator instproc create-sdrad-agent node #Create SDRAD routing agentset ragent

22、 new Agent/SDRAD $node idputs =$node id= ;#测试$self at 0.0 $ragent start ;# 在0.0s 启动协议$node set ragent_ $ragentreturn $ragent2 recv函数void SDRAD:recv(Packet*p,Handler*)新协议类重载recv 函数,判别分组包类型,并对其进行转发、更新、丢弃、重发等处理,来实现具体协议所要求的内容。3 sendHello函数void SDRAD:sendHello(bool isbase)发送hello数据包。基站只处理发送一次Hello 包,非基站节

23、点根据自身信息新建Hello 包,广播。4 recvHello函数void SDRAD:recvHello(Packet*p)基站接收到Hello 包,丢弃;节点接收到自身广播的Hello 包,丢弃;节点接收到有效Hello 包,更新本节点的跳步数,将上一跳节点信息加入邻居表,并广播自身;丢弃重复邻居Hello 包和非邻居包。5 HelloTimer定时器运行一段时间的网络会不稳定(包括网络中有新结点加入,节点寿命结束,能量用尽等),用HelloTimer 定时器定时发送Hello 包,更新邻居信息,建立新的树状网络结构。sdrad.h 中HelloTimer 的定义:class SDRAD_

24、HelloTimer : public Handler public:SDRAD_HelloTimer(SDRAD* a) : agent(a) void handle(Event*);private:SDRAD *agent;Event intr;重写handle 函数,使基站发送Hello 包,建立新的网络结构:void SDRAD_HelloTimer:handle(Event*) agent-nb_purge(); /清楚邻居表agent-sendHello(true); /基站发送Hello 包/该定时器每个50s 调度一次Scheduler:instance().schedule(

25、this, &intr, 50);6 Resolve函数void SDRAD:resolve(Packet *p) 节点通过第一节点建立好网络结构后,就进入数据收集阶段,此协议通过将有用数据处理成Collect 包在网络之间传送。在recv函数中节点在接收到有用数据后,通过resolve 函数将其处理成collect 包后转发给邻居节点。7 下一跳函数u_int32_t SDRAD:nexthop_random() 随机选择邻居表中节点编号8 转发函数forwardvoid SDRAD:forward(u_int32_t seqno,Packet *p, double delay) 9 发送c

26、ollect包函数void SDRAD:sendCollect(u_int32_t ipdst) 节点根据参数ipdst 确定下一跳目的地,发送collect包。10 接收collect包函数void SDRAD:recvCollect(Packet *p) 节点随机选择下一跳,发送collect 包。 基站处理数据,丢弃废包。3.5 将SDRAD整合到NS-2.35中3.5.1 建立协议文件本协议程序共五个文件,分别是: sdrad_packet.h、sdrad_nbtable.h、sdrad.h 和sdrad.cc。在目录下建立sdrad 文件夹,将上述这5 个文件放进去。3.5.2 修改

27、NS-2.35源码 需要改五个文件:ns-2.35/common/packet.hns-2.35/tcl/lib/ns-lib.tcl ns-2.35/tcl/lib/ns-packet.tcl ns-2.35/Makefile1 ns-2.35/common/packet.h文件中找到如下位置,添加红色标记的一行。static const packet_t PT_PROTONAME = 73; / insert new packet types herestatic packet_t PT_NTYPE = 75; / This MUST be the LAST one 找到如下位置,添加红色

28、标记的一行。name_PT_DCCP_RESET=DCCP_Reset; name_PT_PROTONAME= protoname;name_PT_SDRAD=SDRAD;name_PT_NTYPE= undefined;2 在ns-2.35/tcl/lib/ns-lib.tcl文件中找到如下位置,添加红色标记的一段代码。 AODV set ragent $self create-aodv-agent $nodeSDRAD set ragent $self create-sdrad-agent $nodeAOMDV set ragent $self create-aomdv-agent $no

29、de在合适的位置加入如下代码:Simulator instproc create-sdrad-agent node #Create SDRAD routing agentset ragent new Agent/SDRAD $node idputs =$node id= ;#测试$self at 0.0 $ragent start ;# 在0.0s 启动协议$node set ragent_ $ragentreturn $ragent3 在ns-2.35/tcl/lib/ns-packet.tcl 文件中找到如下位置,添加红色标记部分。 MDART # routing protocol for

30、 ad-hoc networks # AOMDV patch AOMDV Protoname SDRAD#4 在ns-2.35/Makefile文件中找到如下位置,添加红色标记部分wpan/p802_15_4trace.o wpan/p802_15_4transac.o apps/pbc.o protoname/protoname.o protoname/protoname_rtable.o sdrad/sdrad.o $(OBJ_STL)3.5.3 编译NS-2.35源文件 在cygwin中运行如下命令完成源文件的编译。hugerhuger-PC /ns-allinone-2.35$ cd n

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1