AODV路由协议的路由缓存队列详解(1)


AODV路由协议的使用往往在一些复杂的程序当中。那么我们如何理解这些协议的使用和一些代码函数的含义呢?下面我们就来阐述一下这方面的问题。首先了解一下在NS2.27中,AODV路由协议主要包括以下几个组件:

1、协议实体

2、路由表

3、定时器

(1)广播定时器

(2)周期Hello报文广播定时器

(3)用于邻居管理的定时器

(4)用于路由缓存的定时器

(5)用于本地修复的定时器

(6)缓存广播ID的定时器

4、日志记录器

5、路由缓存队列

首先来看AODV路由协议从接收到一个分组开始的基本流程。

当协议接收到一个分组,即recv(Packet*, Handler*)函数被调用,函数根据分组类型调用不同的处理函数进行处理。

1、如果是协议分组,则将分组的ttl值减1,并调用recvAODV(Packet*)函数进行处理。recvAODV函数再根据分组的不同类型来调用不同的函数进行处理。

(1)如果接收到的是路由请求分组,则调用recvRequest(Packet*)函数进行处理。

如果该分组由节点自身产生或已经接收过的,会被节点丢弃,并结束处理。

否则,节点将缓存该分组的序列号,并将该分组发送来的路径添加到反向路由中,转发相应分组。然后,节点根据该分组的目的地址进行判断并调用不同函数进行处理。

如果节点自身即为目的节点,则调用sendReply(nsaddr_t, u_int32_t, nsaddr_t, u_int32_t, u_int32_t, double)函数进行响应。如果节点不是目的节点,但知道通往目的节点的路由,则调用sendReply函数进行响应,并在源和目的前驱列表中分别插入到源和目的的下一跳节点。否则,不能直接响应该请求,将跳数加1,并调用forward(AODV_rt_entry*, Packet*, double)函数转发该分组。

在sendReply函数中,节点首先查找到达目的节点(即发送路由请求分组的节点)的路由,创建并填充分组,然后调用Scheduler::instance().schedule()函数来发送该分组。

(2)如果接收到的是路由响应分组,则调用recvReply(Packet*)函数进行处理。

节点首先查询前往分组目的节点的路由,如果不存在则新增一条路由项。然后,节点更新到该目的节点的路由项,并发送所有相关分组。

如果节点为目的节点则更新路由发现延迟并发送所有相关的分组。如果节点不是目的节点,但知道通往目的节点的路由,则将跳数加1,调用forward函数转发该分组,并修改响应的前驱列表。如果节点不是目的节点,也不知道通往目的节点的路由,则丢弃该分组。

(3)如果接收到的是路由错误分组,AODV路由协议则调用recvError(Packet*)函数进行处理。


相关内容