AODV 路由协议主要包括以下几个组件:
1、协议实体
2、路由表
3、定时器
(1)广播定时器
(2)周期 Hello 报文广播定时器
(3)用于邻居管理的定时器
(4)用于路由缓存的定时器
(5)用于本地修复的定时器
(6)缓存广播 ID 的定时器
4、日志记录器
5、路由缓存队列
首先来看协议从接收到一个分组开始的基本流程。
当协议接收到一个分组,即 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*)函数进行处理。
节点首先查询前往分组目的节点的路由,如果不存在则新增一条路由项。然后,节点更新到
该目的节点的路由项,并发送所有相关
分组。