经典DSR路由协议分析:路由发现

(1) 产生路由请求 当源节点需要与某目的节点进行通信时,它首先在本节点维护的路由缓存中查找是否有到达该目的节点的路由。若路由缓存中已包含了到达该目的节点的有效路由,则立即使用此路由发送数据分组,否则它将向所有邻居广播RREQ(Route Request)分组,以启动一个路由发现过程来找到一条到达该目的节点的可用路由。 由handlePktWithoutSR(SRPacket& p, bool retry) getRouteForPacket(SRPacket &p, bool retry) sendOutRtReq(rrp, MAX_SR_LEN) 来完成。 (2) 节点对路由请求的处理: ①如果接收RREQ的节点是该路由请求的目的节点,则向发起RREQ的源节点返回RREP分组。将收到的RREQ分组的源节点地址、RREQ分组中携带的源路由节点地址列表和本节点的地址按顺序排列作为源路由封装在RREP(Route Reply)分组中发送给源节点,并将处理后的RREQ分组删除。 工作由handlePacketReceipt() returnSrcRouteToRequestor(p)来完成。 ②收到RREQ的节点检查自己是否已经包含在RREQ携带的源路由节点列表中,如果是则将RREQ分组丢弃。 由handleRouteRequest(SRPacket &p) ignoreRouteRequestp(SRPacket &p)来实现 ③如果协议要求使用双向链路,节点要检查前一节点是否在自己的通信范围内,如果不在则丢弃该RREQ包;如果不确定则向前一节点发送一TTL值为“1”的RREQ分组,如果收到前一节点回复的RREP这表示两节点之间是双向链路,继续处理RREQ分组,否则表示两节点之间为单向链路则将RREQ分组丢弃。 ④接收RREQ的节点必须要查找当地的路由请求表看有无发起此RREQ的源节点所对应的路由请求表入口。如果有则在当地缓存中查看有无与(此RREQ路由请求号,此RREQ目的节点IP地址)对相对应的入口,如有则将现在收到的RREQ分组丢弃。 ⑤如果接受RREQ的节点的路由请求表中没有和此RREQ对应的表项,说明以前没收接受过此RREQ,则按以下步骤处理该RREQ请求分组:利用此RREQ的(路由请求序号,目的节点IP地址)值,为此RREQ分组在节点的路由请求表中创建一入口;对此RREQ分组做一个完整的拷贝;将节点自己的IP地址追加到RREQ分组的源路由节点列表中;节点在自己的路由缓存中查找到RREQ分组中目的节点的路由,有则向发起RREQ的源节点回复一RREP分组,称为“缓存路径回复(cached Route Reply)”;如果节点在自己的路由缓存中没有找到通往RREQ目的节点的路径,则将新改好的RREQ拷贝广播发送出去。 由handleRouteRequest(SRPacket &p) (3)中间节点回复RREP分组: 在(2)中讲到如果接收RREQ的中间节点在自己的路由缓存中找到通往RREQ分组目的节点的路径则要向源节点回复一cached Route Reply分组。这种机制可以大大减小网络中因为路由发现过程所造成的开销,因为这种机制可以大大减少路由发现过程中的RREQ广播报文。下面详细叙述向源节点回复cached Route Reply的过程。①中间节点在回复RREP之前首先要检查被回复的源路由中不会出现节点重复出现的情况。即查看由RREQ原节点地址、RREQ中已经积累的节点IP地址列表、本节点路由缓存中找到的路径中的IP地址顺序排列下来的地址列表中有无重复出现的IP地址,如果有则不能继续进行缓存路径回复,而转到(2)中步骤⑤的最后一步继续执行。如不存在重复出现的IP地址就向下执行。 ②中间节点将从自己路由缓存中得到的路径cached-route追加到RREQ分组头中的源路由地址列表中,这样就得到要发给RREQ源节点的完整路由: <源节点ip地址、rreq分组头携带的节点的ip地址列表、cached-route> 。此中间节点的IP地址已经在RREQ分组头中,不需再追加。将得到的源路由封装在RREP包中发送给发起RREQ的源节点。 ③中间节点发送完路由缓存回复后,就不再继续广播RREQ分组了。此时如果RREQ数据分组头中除了已经处理过的RREQ选项外不再含有其他任何选项,并DSR选项头后面也不含有其他数据负载(TCP或UDP数据),则中间节点可将此RREQ分组丢弃。否则作如下处理:将RREQ DSR选项头中的目的节点IP地址作为RREQ IP分组的目的IP地址,即置换掉RREQ分组的广播地址;将RREQ分组中的路由请求选项移除;将从中间接点路由缓存中得到地路径作为源路由添加到新的RREQ分组头中;将重新创建的RREQ数据分组按分组头中的源路由转发出去。 (4)处理并转发路由回复: 目的节点收到RREQ分组得到完整的源节点到目的节点的路由后,将此路由封装在RREP分组中,然后发送给源节点。RREP分组可以封装成一个单独的IP分组传递给源节点,或封装在其他有数据要传输给源节点的IP分组中被捎带回源节点。 目的节点将自己的IP地址追加到RREQ携带的节点的IP地址列表中,将得到的IP地址列表作为返回给源节点的完整路由封装在RREP分组中。RREP数据分组的源IP地址设为发送RREP分组的节点的IP地址,目的IP地址设为发起RREQ的源节点的IP地址。如果使用的底层MAC协议支持双向路由,RREP数据分组可沿RREP选项中携带的源路由的逆向路由依次传输,否则目的节点为此RREP选项发起新的路由发现过程,且要将RREP选项封装在新产生的RREQ数据分组中以防止出现路由发现过程的反复进行。 (5) 有错误处理
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值