Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 合同模板 > 第五章--路由协议,动态路由协议

第五章--路由协议,动态路由协议

收藏

本作品内容为第五章--路由协议,格式为 docx ,大小 524853 KB ,页数为 25页

第五章--路由协议


('第五章路由协议路由协议主要负责建立源节点与目的节点之间的一条消息传输路径,即实现路由功能。路由协议包含了两个方面功能:寻找源节点-目的节点间的最优路径,并将数据分组沿该路径正确转发。传统的Adhoc网络、无线局域网等网络的首要目标是提高服务质量和公平高效地利用网络带宽资源。这些网络路由协议的优化目标通常是网络延时最小化,而能量问题通常不作为一个最主要的优化目标。而在陆地无线传感器网络中,由于节点能量有限,因此路由协议需要高效利用能量,同时,由于传感器网络规模一般较大,节点通常不具有全网拓扑信息,因此传感器网络的路由协议需要在已知局部网络信息的基础上选择合适的路径。但是,当前陆地网络的路由协议由于受到种种方面的限制,均不能有效地直接应用于水下网络中,复杂的水下环境给网络层路由协议的设计带来了全新的挑战。水下传感器节点通信半径和覆盖面积相对于整个网络的规模较小,同时由于水声链路的高度时空动态特性,事先在源节点和目的节点之间建立一条完整且固定的通信路径是不现实的,因此水下传感器网络一方面主要采用多跳传输的路由机制,另一方面路由表需要以一定的频率更新以适应网络的动态变化。多跳传输方式需要借助中继节点转发信息,该方式要求多个节点共同协作完成消息从源节点到目的节点的传输,这就涉及中间节点选择的问题,如何选择中间节点从而有效降低传输延迟、提高数据传输率是路由协议主要解决的问题。此外,水下後感器显络迪路由协议还要具备以下特性:①可扩展性,由于水下传感器网络中的节点受部署环境的影响造成部分节点或部分链路失效,因此能有效地检测和处理节点失效或移动造成的链路中断,适应不断变化的网络柘朴是水下一隹感器网络路由协议需要解决的一个主要问题;②节能性,在水下传感器网络中,节点大都是以电池供电的,电量十分有限,且电池的更换耗时耗力,同时水声信号发射功率相对较大,因此,提高能量效率是对水下传感器网络设计的另一主要目标;③容错性和鲁棒性,在水下感器网络中,节点的失效是很难避免的,造成节点失效的原因主要包括环境因素,此外,水声信道的通信质量也很难保证,这就要求路由协议具有较好的鲁棒性,能有效避免部分节点的失效或链路的中断给整个网络造成影响;④快速收敛特性,由于水下传感器网络的拓扑结构动态变化,节点能量和水声频谱带宽资源严重受限,因此要求路由算法可以做到快速收敛,以适应网络拓扑结构的动态变化,减小通信协议开销,提高信息传输效率。5.1水下传感器网络路由协议分类与陆地多跳传感器网络类似,水下网络的路由协议也可分为主动路由和按需路由。对于主动路由协议,在这种路由协议中,网络中每个节点都要建立并维护一个路由表,记录该节点到网络中其他所有节点的路由信息,并根据网络当前状态实时进行更新,所以又称为表驱动(table-driven)路由。这些路由信息(如距离向量)主要是从基站周期性广播的控制包中获得的。这种路由协议在路由第一次建立以及由于节点移动或节点失效导致路由重新建立是会造成较大的网络开销,这是因为基站需要广播最新的拓扑信息给每一个节点。主动路由协议主要包括DSDV(destinationsequenceddistancevector),WRP(wirelessroutingprotocol)和OLSR(optimizedlinkstaterouting)等协议。这种协议实现起来较为简单,传输质量较高,能有效地避免网络拥塞。但是路由表的建立和维护会造成巨大的网络开销,节点的频繁移动、网络拓扑的动态变化更是会加剧这种状况,这对于资源有限的水下传感器网络来说是不现实的。当这些协议应用于水下环境时,水下网络的动态拓扑结构使得路由开销相当巨大。而按需路由协议不同于主动路由协议,网络节点无需建立并维护去往其他节点的路由信息,而是根据通信需要临时建立路由,所以又称为被动(反应)式路由。只有当源节点要向目的节点发送消息时,源节点才进行路由的查找和建立。路由建立之后,将由一个专门的路由维护程序[1,2]进行维护,直至该路由失去作用。按需路由协议主要包括DSR,AODV和TORA等协议。在按需路由协议中,路由表根据通信需要临时建立,基站不需要周期性的广播路由信息,此外,建立好的路由会保存在缓存中供后续通信使用,而无需节点维护,这大大降低了网络开销,减少了网络资源的浪费,相较于主动路由更适用于拓扑动态变化的网络。但是,路由发现和建立的过程是不可预知的,这使得路由延迟更加多变和难以预测。按需路由都对消息泛洪有一定程度的依赖,这在大规模网络中的开销也十分巨大,过大的路由开销对于水下的有限带宽是一个严峻的挑战。此外,研宄表明,这两种路由协议在上下行通信链路对称的网络中性能较好,而水下传感器网络由于水声信道的频率依赖特性往往并不满足这一点。1.基于地理信息路由在传感器网络中,节点通常需要获取自身的位置信息,这样它釆集的数据才有意义。地理位置路由假设节点知道自己的路由信息及目的节点的地理信息,依靠网络中节点的地理位置信息来建立[3]。GFG[4]和PTKF(partialtopologyknowledgeforwarding)[5]是两种常见的基于地理位置的路由协议。目前,节点的定位技术主要有三种:全球定位系统(GPS)、基于测距的定位和基于非测距的定位。源节点在获得了目的节点的地理位置后,可以轻松地选择最优的邻居节点作为下一跳,有效避免消息泛洪带来的网络开销,提高消息传输的效率。但是,对于不能使用GPS的水下传感器网络,要对节点进行精确定位是很困难的,如何获取水下节点位置信息是建立地理路由的关键。2.能量感知路由水下网络路由协议需要考虑的首要因素是能量受限,能量路由是最早针对传感器网络提出的路由机制之一。它根据节点的可用能量或传输路径上的能量需求选择转发路径。节点的可用能量就是节点的当前剩余能量。能量感知路由协议包括路径建立、数据传播和路由维护三个过程,其中路径建立是核心。每个节点需要知道到达目的节点的所有下一跳节点,并计算选择每个下一跳节点的数据传输的“代价”。因为每个节点到达目的节点的路径有可能不止一条,所以该“代价值”是各个路径的加权平均值。Shah等[6]提出了一种能量多径路由方案,通过在源节点和目的节点之间建立多条路径,根据路径上节点的通信消耗和节点能量剩余情况,给每条路径赋予选择概率,使数据传输均衡消耗整个网络能量。文献[7]针对UWSN中一些关键节点能量过早耗尽的问题,提出一种动态路由控制新方法。它通过周期性预测出节点的信息产生率,同时根据节点当前剩余能量,估计出釆用不同路由时节点的生命值;以网络节点的最小生命值为目标函数,通过遗传算法周期寻找与最大目标函数对应的路由。该路由算法可以做到平衡各节点能量。3.基于轨迹路由协议将Adhoc网络中的源路由与笛卡儿转发算法相结合,Niculescu等提出了TBF路由算法[8],在TBF算法中,转发路径称为轨迹。这个轨迹可以表示成函数或方程。轨迹路由是一种针对传感器网络特点提出的路由方案,但对于应用在UWSN中,有两个主要的问题需要解决:①轨迹相关的计算十分复杂,而水下传感器节点计算能量有限;②表示轨迹的开销很大,占用了过多的带宽资源。5.2水下网络路由协议研宄现状5.2.1基于矢量转发路由协议VBF在VBF协议中,每一个数据包中携带了源节点、目的节点和转发节点的位置信息。转发路径是由源节点和目的节点连线构成的矢量。一旦某一个节点收到数据包,它首先计算它与转发节点之间的距离以及信号的到达角度(AoA)。同理,所有接收到数据包的节点都计算各自位置。如果某个节点通过计算发现其离路由矢量足够近(小于某个预先设定门限),它就将自己位置写入数据包中并转发该数据包;否则对数据包做丢弃处理。通过这种方式,所有参与转发该数据包的节点构成“路由管道”,图5.1展示了VBF路由的基本思想。图中s1是源节点,s0是目的节点,矢量s1-s0为路由矢量,图中路由管道半径为预设的W,所有在该管道内的节点参与转发。图5.1VBF路由思想从上述描述可以看出,VBF是一个源路由协议,每一个转发节点仅需要维护简单的路由信息。但是仅通过上述转发策略,那么VBF在大规模筒密度布放的网络场景中的应用会面临过多转发节点参与转发的问题。过多节点参与转发不仅造成不必要的能耗而且也会导致网络中冲突增加,降低网络容量与效率。为解决上述问题,在VBF协议中,XiePeng设计了一种自适应选择节点的方法。该方法利用不同位置节点在转发数据时等候时间的区别实现了最优位置节点最快转发及尽量少的节点参与路由的结果。本书给出了关键参数desirablenessfactor的定义:α=p/W+(r-d×cosθ)/R式中,R是节点的信号传播距离,W是虚拟通道半径,d是两跳节点间距p和θ分别是下一条节点与路由矢量的距离和夹角(图5.2)。有了α参数就可以定义前传节点的等待时间:Tadaption=√α×Tdelay+R−d/v0式中,Tdelay为两点间传播延时,v0为声信号传播速度。通过本书中的仿真数据可以看出VBF能较好地支持中低速(1〜3m/s)节点移动的同时已经能做到较好的节能。相对于简单泛洪协议,VBF显著减小网络中的业务流因此减小了能耗,同时其也对网络动态变化有较好鲁棒性,并且协议的计算开销较小。但是,VBF协议也面临如下两个主要缺点:①由于VBF协议严重依赖源节点与目的节点的路由矢量,协议中虚拟路由管道的建立对不同节点布放密度有很大影响。如果某区域的节点布放较为稀疏,有可能管道内没有节点参与转发,造成路由空洞。②协议性能受到管道半径设置影响,不同管道半径设置对协议影响较大。针对不同网络场景需要建立合适的管道半径。该结论不利于真实网络场景的应用。距离矢量远的节点不参与转发图5.2VBF转发算法示意图此后,在VBF的基础上,研究人员提出进一步改进方案以完善其性能。其中Hop-by-hopVBF(HHVBF)便是其中之一。与VBF不同,HHVBF在每一跳过程中建立一个虚拟路由管道。该管道建立依赖的路由矢量为当前转发节点到目的节点。通过该方式,HHVBF建立了自适应的路由通道。该路由协议的主要优势有如下两点:①由于每个节点有自身对应的路由管道,因此最大管道半径可以设置为最大传输距离。换而言之,该协议没有必要为了增强协议性能而设置一个大于最大传输距离的管道半径。②在稀疏网络中,尽管可以用于中继的节点较少,但是如果网络中存在这样一个可用中继节点,HHVBF总能将其找到。因此,相对于VBF,HHVBF增加了数据包投递率。图5.3示意了HHVBF的工作过程。从图中可以看到,如果使用VBF协议,则节点在C是无法将数据包传至目的节点,而HHVBF则可以顺利完成。图5.3HHVBF路由机制在VBF中,路径被指定为一个矢量,靠近路由矢量的节点将转发数据包。算法具有开销少、能量有效传输成功率高和端到端传输延时低等特点。但是算法需要事先确定一个路由“管道”半径。为此,哈尔滨工程大学的孙桂芝和桑恩方提出的PVBF路由协议[9],PVBF是一个基于矢量距离的转发协议。在WWSource(s1)Sink(s0)DFABPVBF中不需要事先确定路径轨迹,所以,没有额外的开销用于表示轨迹。与矢量距离有关的计算简单,适用于计算能力有限的水声传感器节点,节点根据自己的信息转发价值来决定是否转发信息包。在PVBF中节点不需要维持路由状态信息,只需要知道数据的目的地和当前转发节点。在水声网络中,传感器节点通常是由电池供电,而且在很多情况下电池是不能再充电或更换的,所以能量有效是一个非常重要的问题。除了能量问题,水下传感器节点有时存在着一定的移动性,因此,路由算法还必须能够有效地处理节点的移动问题。PVBF协议成功地满足了这些要求。在PVBF协议中每个数据包都承载着源节点位置、目的节点位置和当前转发节点位置。当收到这个数据包的节点决定自己更接近于目的节点时,它把当前转发节点位置替换为自己的位置,继续转发此数据包;否则,它丢弃这个数据包。因为PVBF协议不需要节点的状态信息,所以它可扩展到大规模网络。而且在PVBF协议中,只有满足一定条件的节点才进行数据转发,所以协议具有能量有效性。5.2.2FBR由于没有先验的位置信息,类似VBF这样的协议往往需要大量广播数据包,因此增加了网络负担。为减小不必要的泛洪,研宄人员提出了FBR协议。该协议假设网络中的节点已知自身位置信息,并且每节点知道最终目的节点的位置信息。除此之外,网络中其他节点的位置信息是未知的。路由是在传递过程中动态建立的。图5.4示意了FBR的工作过程,A为源节点,D为目的节点,当A有数据需要发送时,它首先广播发一个RTS包,这个包中包含了A的位置信息与其最终的目的节点的ID。最开始阶段,这个广播包的发送能量被设置为最低。该能量逐步增大,直到发现下一跳节点。当收到RTS包后,中继节点会计算自身与连线AD的相对位置,并判定其是否处于如图5.4所示的θ构成的锥形内。如果处于该锥体内,则该中继会对该RTS作出答复。图5.4FBR路由示意图但是,FBR的应用也面临如下一些问题:①当网络中的节点运动变得稀疏\uf071CCDBDDADBCBCABA时,有可能由于没有节点处于锥体内而造成路由空洞。但此时位于锥体外仍可能存在适合转发的节点。②该协议假设目的节点的位置是固定的并且位置信息可知。该假设大大降低了网络的灵活性。尽管通过不断改进VBF,可以获得更优的网络性能,但是所有这类协议都假设节点位置信息已知。然而,当前对水下节点的定位仍面临严峻挑战。因此,研究人员开始转向研宄不依赖位置信息的路由协议。为了避免使用GPS获取三维地理坐标信息,Yan等提出了基于深度信息的DBR路由协议[10],该路由协议在深度方向上进行寻址,基于深度差进行路由调度,较好地延长了整个网络的生存期,适用于较密集的网络。DBR路由方式本质上是一种基于贪婪算法的路由协议(greedymethod),与VBF类似,最优的节点即深度差最大的节点优先前传数据。如图5.5所示,在网络中,水面上布放了若干装备RF天线和水声Modem的sink节点(sinknode)。由于这些水面节点装备了RFModem,它们可以直接高效地交换信息。因此,当水下的数据包到达任一个水面sink节点时,本书假设它即完成了数据传输。进一步,本书假设,水中传感器节点(sensornode)通过深度传感器已知深度信息。图5.5DBR路由示意图DBR是一种基于贪婪算法的路由协议。在整个转发过程中,转发节点的深度不断减小,最终实现到达水面的目的(如果没有路由空洞发生)。在DBR协议中,传感器节点分布式对转发与否做出决策,决策的依据是自身的深度与前一条节点的深度比较,这也是DBR协议设计的关键。在该协议中,当某一节点收到数据包,它将首先解析上一个转发节点的深度信息dp,然后请该深度与自身深度之进行比较,若dcrtable_;priority_queue,Compare〉routerQueue;priority_queue,Compare〉routerNotRouteQueue;};从MicroStaticRouting的定义来看,它是继承自BiConnector类,所以MicroStaticRouting也能把数据传递给上一层和下一层的组件对象。所谓静态路由,就是从一个写好的路由表文件中读入路由表信息,然后有数据要路由时,查找这个路由表来路由。voidreadRouteTableO就是从路由表文件中读入路由信息,它的实现如下。voidMicroStaticRouting::readRouteTable(void){FILEstream=fopen(route_file/"r");intcurrent_node,dst_node,nxt_hop;…while(!feof(stream))fscanf(stream,"%d:%d:%d\\nn,¤t_node,&dst_node,&nxt_hop);intmyNodeld=MY_ADDRESS;if(myNodeld==current_node)rtable_[dst_node]=nxt_hop;}fclose(stream);}readRouteTable函数比较简单,就是从路由表文件中读入数据,文件中的一行数据是一条路由表,格式是“源节点:目的节点:下一跳节点”,并把路由信息保存进路由的map数据结构中。像其他组件对象一样,路由也有一个重要的函数voidMicroStaticRouting::recv(Packetpkt,Handlerh),它也是上层发数据给路由层或是MAC层收到数据后交付给路由层的时候所调用的入口函数。voidMicroStaticRouting::recv(Packetpkt,Handlerh){if(cmh->direction()==hdr_cmn::DOWN){if(micro_hdr->data.position_or_nodeid==Oxffff)micro_hdr->destination_node_id=hdr_micro_anp_mac::IP_BROADCAST;else{if(rtable_.count(micro_hdr->data.position_or_nodeid)!=0)micro_hdr->destination_node_id=rtable_[micro_hdr->data.position_or_nodeid];}…if(traceSendTarget)traceSendTarget->recv(pkt,"Send");//Scheduler::instance().schedule(downtarget(),pkt,0.0);downtarget()->recv(pkt);}elseif(cmh->direction()==hdr_cmn::UP){if(traceRecvTarget)traceRecvTarget->recv(pkt,"Receive");if(micro_hdr->data.direction==hdr_micro_anp_mac::DOWN){if((u_int8_t)micro_hdr->destination_node_id==hdr_micro_anp_mac::IP_BROADCASTmicro_hdr->destination_node_id==MY_ADDRESS{//thispacketformeif(micro_hdr->data.position_or_nodeid==MY_ADDRESStmicro_hdr->data.position_or_nodeid==Oxffff){sendUp(pkt,(Handler)NULL);return;}else//it1snotforme,wemustforward{cmh->direction()=hdr_cmn::DOWN;micro_hdr->node_level=node->nodeLevel();recv(pkt,h);}}}elseif(micro-hdr->data.direction==hdr_micro_anp_mac::UP){if((u_int8_t)micro_hdr->destination_node_id==hdr_micro_anp_mac::IP_BROADCASTmicro_hdr->destination_node_id==MY_ADDRESS){//thispacketformeif(micro_hdr->data.sink_id==MY_ADDRESSmicro_hdr->data.sink_id==Oxffff){sendUp(pkt,(Handler)NULL);return;}else//it\'snotforme,wemustforward{cmh->direction()=hdr_cmn::DOWN;micro_hdr->node_level=node_->nodeLevel();recv(pkt,h);}}}}}从voidMicroStaticRouting::recv(Packetpkt,Handlerh)的实现可以看出,函数先对数据包进行方向的判断。(1)如果数据包向下发送,则先判断该分组数据包是否为广播包。如果是广播包则把下一跳设置为hdr_micro_anp_mac::IP_BROADCAST广播地址;如果不是广播包则从路由表中找出下一跳的节点,代码micro_hdr->destination_node_id=rtable_[micro_hdr->data.position_or_nodeid]实现找路由的功能。然后把分组数据包记录进Trace文件,最后调用downtarget()->recv(pkt)把数据包发送给MAC层。(2)如果数据包向上发送,则先把分组数据包记录进Trace文件。分组数据数据不是由sink节点向下游发送的就是由下游节点向sink节点发送的,都先判断该分组数据包是否发给本节点,如果是发给本节点的数据,则调用sendUp(pkt,(Handler)NULL)函数把数据包发送给节点的应用层;如果不是发送给本节点的,则修改数据包的一些信息后,再调用recv函数,把该数据包转发出去。5.4.2LB-AGR路由协议与实现MicroAnpRouting类的定义如下。classMicroAnpRouting:publicBiConnector{voidStartHello(u_int8_ttype=0);voidSendHello(Packetpkt);voidReceiveHello(Packet);voidRefreshRoutingTable()///刷新路由表int16_tGetRouting(Nodeldposition_or—nodeid,Nodeldsource——node_id,boolbDown);int16_tGetRoutingSameLevelDown(Nodeldposition_or_nodeid,Nodeldsource_node_id);EnergyModelem(){returnnode_->energy_model();}…voidrecv(Packet,Handler);…private:listrtable_;priority_queue,Compare>routerQueue;priority_queue,Compare>routerNoRouteQueue;};从MicroAnpRouting的定义看出,它是继承自BiConnector类,所以MicroAnpRouting同样也能把数据传递给上一层和下一层的组件对象。先从MicroAnpRouting类的其他重要函数开始讲解,最后再来介绍recv函数。voidMicroAnpRouting::RefreshRoutingTable(){for(list::iteratorit=rtable_.begin();it!=rtable_.end();it++){if((it)->expireTime>0)(it)->expireTime--;if((it)->status>1&&(it)->status<5)(it)->status--;}microAnp_RefreshRouteTableTimer.resched(1);}VoidMicroAnpRouting::RefreshRoutingTable()函数是路由表的老化函数,该函数每秒钟调用一次,每调用一次它的老化时间就减1,直到老化时间为0,则该路由失效。Int16_tGetRouting(NodeIdposition_or_nodeid,Nodeldsource_node_id,boolbDown)这个函数是依据目的节点、当前结节和数据方向来查找路由即查找下一跳节点。因为数据包由sink发给普通节点的下行路由和普通节点发送数据给sink节点的路由算法不一样,所以有bDown这个参数,GetRouting函数把下行数据和上行数据的路由都实现了。intl6_tGetRoutingSameLevelDown(NodeIdposition_or_nodeid,Nodeldsource_node_id),这个函数Ì在节点层次相同的节点上查找路由。GetRouting函数与GetRoutingSameLevelDown函数的计算公式在第3章有详细说明,我们主要是关心的是Micro-ANP通信协议架构的实现,而不是具体的讲解某个具体的算法,所以这里就不详细讲解路由算法了。路由协议需要定时的发送hello包,来看MicroAnpRouting是如何实现的。VoidMicroAnpRouting::StartHello(u_int8_ttype){MakeAndSendHelloPacket(type);microAnp_HelloTimer.resched(hello_interval);}StartHello成员函数先是调用MakeAndSendHelloPacket函数生成并发送一个hello包,并启动一个定时器定时调用StartHello函数来发送hello包。VoidMicroAnpRouting::MakeAndSendHelloPacket(u_int8_ttype){Packetpkt=Packet::alloc();initpkt(pkt);…cmh->direction()=hdrcmn::DOWN;cmh->size()=0;microh->node_level=node_->nodeLevel();microh->source_node_id=MY_ADDRESS;microh->data.packet_id=MicroAnpRouting::getHellowPacketld();microh->data.payload_length=0;…microh->fcs=0;SendHello(pkt);}MakeAndSendHelloPacket函数先创建一个packet数据包并初始化该数据包,最后调用SendHello(pkt)来发送数据包。VoidMicroAnpRouting::SendHello(Packetpkt){…cmh->codeIndex()=node_->codeIndex();item.codeindex=node_->codeIndex();micro_hello->trans_items[i++]=item;for(list::iteratorit=rtable_.begin();it!=rtable_.end();it++){if((it)->neighbor_node_id_==(it)->hop_)//onlytransonehop{item.neighbor_node_id_=(it)->neighbor_node_id_;item.codeindex=(it)->codeIndex;item.minReceivePower=(it)->minReceivePower;…micro_hello->trans_items[i++]=item;}}…cmh->size()+=hdr_micro_anp_hello::size();cmh->size()+=micro_he11o->neighbor_numtrans_routing—table一item::size();downtarget()->recv(pkt);}SendHello函数先设置分组数据包的扩频码,再把当前节点的信息和当前节点的所有一级邻居结点信息都放入hello包中,最后调用downtarget()->recv(pkt)把hello数据包发送给MAC层处理。当某一节点收到hello数据包时,我们一般要更新处理邻居表等操作,下面是ReceiveHello的函数实现。VoidMicroAnpRouting::ReceiveHello(Packetpkt){if(traceRecvTarget)traceRecvTarget->recv(pkt,"ReceiveHello");…for(inti=0;itrans_items[i];…(it)->hop_=src;(it)->expireTime=refreshRoutingTableExpire;(it)->codeIndex=item.codeindex;(it)->status=1;(it)->minReceivePower=item.minReceivePower;break;}if(bForward){cmh->size()=0;cmh->direction()=hdr_cmn::DOWN;micro_hdr->node_level=node_->nodeLevel();…micro_hdr->data.payload_length=0;SendHello(pkt);}}ReceiveHello函数先把分组数据包写入Trace文件,然后从hello数据包中读入邻居信息并更新自己的邻居表,如果需要转发(当前节点的级别比上一跳节点的级别要大时转发),则调用SendHello(pkt)转发一个hello数据包。最后来看最关键的函数recv的实现。VoidMicroAnpRouting::recv(Packetpkt,Handlerh){…if(cmh_>direction()==hdrcmn::DOWN){…SendHello(pkt);…nodeId=GetRouting(destination)_node,micro_hdr->source_node_id,bDown);micro_hdr->destination_node_id=nodeld;…if(traceSendTarget)traceSendTarget->recv(pkt,"Send");downtarget()->recv(pkt);}elseif(cmh->direction()==hdr_cmn::UP){ReceiveHello(pkt);if(traceRecvTarget)traceRecvTarget->recv(pkt,"Receive11);…sendUp(pkt,(Handler)NULL);cmh->direction()=hdr_cmn::DOWN;cmh->codeIndex()=node_->codeIndex();micro_hdr->node_level=node_->nodeLevel();recv(pkt,h);}if(micro_hdr->data.direction==hdr_micro_anp_mac::UP){…sendUp(pkt,(Handler)NULL);recv(pkt,h);}}VoidMicroAnpRouting::recv(Packetpkt,Handlerh)函数先判断数据是向下层发送还是向上层发送。(1)向下层发送数据。如果分组数据包是hello包,则调用SendHdlo(pkt)函数发送hello包;如果是数据包则调用GetRouting路由函数找到下一跳的节点,再调用downtarget()->recv(pkt)函数把数据发送给了MAC层的recv函数。(2)向上层发送数据。如果分组数据包是hello包,则调用ReceiveHello(pkt)函数刷新路由表等处理;如果是数据包而且目的地址是本节点,则调用SendUp(pkt,(Handler)NULL)把数据发送给应用层接收处理;如果是数据包目的地址不是本节点,则把分组数据包改成向下层发送后再调用recv函数实现数据包的转发。参考文献[1]LinT.Aframeworkforwirelessadhocroutingprotocol[C].WirelessCommunicationsandNetworkingCommunications,NewOrleans,2003:1162-1167.[2]FooKY,AtkinsPR,CollinsT,etal.ARoutingandchannelaccessapproachforanadhocunderwateracousticnetwork[C].ProceedingsofIEEEOCEANS,NewYork,2004:789-795.[3]ChandrasekharV,SeahWK,ChooYS,etal.Localizationinunderwatersensornetworks:Surveyandchallenges[C].Proceedingsofthe1stACMInternationalWorkshoponUnderwaterNetworks,NewYork,2006:33-40.[4]BoseP,MorinP,StojmenovicI,etal.Routingwithguaranteeddeliveryinadhocwirelessnetworks[J].ACMWirelessNetworks,2009,7(6):609-616.[5]MelodiaT,PompiliD,AkyildizIF.Ontheinterdependenceofdistributedtopologycontrolandgeographicalroutinginadhocandsensornetworks[J].JournalofSelectedAreasinCommunications,2005,23(3):520-532.[6]ShahRC,RabaeyJM.Energyawareroutingforlowenergyadhocsensornetworks[C].ProceedingsofIEEEWirelessCommunicationsandNetworkingConference(WCNC2002),Orlando,2002:350-355.[7]张宏涛,姜卫东,童峰,等.水声通信网中基于能量平衡的动态路由控制[J].应用科学学报,2005,23(4):336-340.[8]NiculescuD,NathB.Trajectorybasedforwardinganditsapplication[C].ACMInternationalConferenceonMobileComputingandNetworking(MOBICOM’03),SanDiego,2003:260-272.[9]孙桂芝,桑恩方.一种能量高效的水下传感器网络路由协议[J].声学技术,2007,26(1):134-136.[10]YanH,ShiZ,CuiJ.Dbr:Depth-basedroutingforunderwatersensornetworks[J].IFIPNetworking,2008:72-86.[11]RavelomananaV.Extremalpropertiesofthree-dimensionalsensornetworkswithapplications[J].IEEETransactionsonMobileComputing,2004,3(3):246-257.[12]康文静,刘功亮,李亚星.基于深度和距离感知的三维水下传感器网络路由算法[J].科学技术与工程,2011,11(35):8780-8784.',)


  • 编号:1700684486
  • 分类:合同模板
  • 软件: wps,office word
  • 大小:25页
  • 格式:docx
  • 风格:商务
  • PPT页数:524853 KB
  • 标签:

广告位推荐

相关合同模板更多>