本文目录:
本文是对AODV路由协议的原理描述,作者同时在android平台对AODV路由协议做了代码实现,有需要的可以自行下载https://download.csdn.net/download/qq_36267931/12589470
“Ad Hoc”一词起源于拉丁语,可以翻译为“for this purpose only”,意译为“特别的,临时的网络”。
移动Ad Hoc网络(Mobile Adhoc Network,MANET)专指用于移动无线设备的Ad Hoc网络,用于其它用途的Ad Hoc网络有无线网状网络(wireless mesh network,WMN)和无线传感器网络(wirelss sensors networks,WSN)等。
移动Ad Hoc网络中的节点一般是可以通过无线方式与其它设备进行数据接收和转发的移动设备,比如手机和手提笔记本。每一个节点既是接收数据的主机,也是负责转发数据的路由器。因为节点的路由器身份,移动Ad Hoc允许在没有无线访问接入点(wireless access point)的情况下节点之间的数据双向传输,网络中的数据可能需要经过节点的多跳传输才能到达目的节点。
移动Ad Hoc网络允许节点动态地进入和离开网络,网络拓扑动态的变化所可能造成的路由失效,可以通过修复路由或重新发现新路由等办法解决。
总结一下,移动Ad Hoc网络具有以下特点:
(1)自组织,无需无线访问接入点即可通信,每个节点都充当路由器。
(2)自适应,允许网络拓扑的动态变化,可以进行路由的重新发现与修正。
(3)易部署,无需部署无线访问接入点即可实现节点之间的通信。
(4)网络控制频繁,由于网络拓扑可能经常变化,移动Ad Hoc网络需要大量的网络控制信息来维护路由。
(5)安全性与可靠性待加强,由于网络通过无线的方式传输,对比有线方式可靠性较差,且容易受到攻击与窃听。移动Ad Hoc网络中节点需要相互信任,因为数据可能会经过中间节点转发到目的节点,这也需要一定的机制检验节点的安全性。
由于移动Ad Hoc网络的以上特点,传统的路由协议如RIP(Routing Information Protocol,路由信息协议)和OSPF(Open Shortest Path First,开放式最短路径优先协议)无法很好的在移动Ad Hoc网络上运行。目前常见的应用于移动Ad Hoc网络的路由 Routing)、DSR(Dynamic Source Routing)、AODV(Ad Hoc On-Demand Distance Vector)和ZRP(Zone Routing Protocol)等。本文将会使用AODV路由协议作为移动Ad Hoc网络的路由协议。
AODV路由协议是为Ad Hoc网络中的节点(移动设备)进行相互数据传输而设计的,它是一个按需路由协议,按需指节点不会存储网络中所有节点的路由信息,只有在需要向目的节点传输数据时,才会检查路由表,如果没有路由,则会向网络广播发送路由请求,这是路由发现过程,是为了来获取到目的节点的路由。
路由请求(RREQ)、路由回复(RREP)、路由错误(RERR)和活跃路由检测(HELLO)是AODV路由协议定义的四种信息类型。这些信息用UDP进行传输,所以可以使用IP协议的地址,比如可以使用节点自身的IP地址作为RREQ信息中的源地址,可以使用255.255.255.255进行全域的广播。当源节点要与目的节点通信但双方还没有建立连接时,或者连接已经建立但路由过期或者失效,源节点向地址255.255.255.255发送RREQ消息寻求到目的节点的路由,收到RREQ消息的节点如果自身是目的节点,或者路由表中存在到目的节点的合法路由,则产生RREP消息单播到源节点,停止广播RREQ消息;如果收到RREQ消息的节点不是目的节点和有到目的节点路由的中间节点,则把RREQ消息继续广播到除了接收端外的所有接口。当网络检测到链路故障,会发送RERR给特定节点,通知其他节点更新路由。HELLO信息是RREP信息的一个特例,通过广播HELLO信息可以检测节点与其直连节点之间的连接情况。
一旦源节点与目的节点成功建立连接,并且网络拓扑结构无变化和无链路故障发生,AODV路由协议就停止发挥作用。当源节点需要跟新目的节点进行通信时,重复发送RREQ的过程来发现到新目的节点的路由。
路由循环(routing loops)和计数到无穷(count to infinity)是基于距离向量算法的路由协议都需要解决的问题,AODV路由协议采用递增的序列号来解决上述问题。RREQ、RREP、RERR信息报文中都含有序列号字段。使用序列号可以让节点分辨信息报文的新旧情况,方便节点用新的信息报文来更新路由表中由旧信息报文产生的路由信息。
AODV路由协议支持在小规模的网络中运行,节点数目范围在数十到数千,而且要求相互通信的节点之间需要完全信任,因为数据在传输到目的节点的过程中可能会需要其他中间节点分析数据和转发。
总的来说,AODV路由协议具有以下的优点:
(1)不需要实时维护路由表,只有需要时才寻求路由和更新路由表。
(2)支持组播,扩展性里良好
(3)中间节点可以代替目的节点回复,减少了路由发现过程的延时,提高了收敛速度
(4)所有节点和信息报文中都有序列号,避免了路由循环和计数到无穷的问题
(5)被国内外广泛研究,有许多基于AODV路由协议的改进协议
(6)但与此同时也存在一些缺点:
(7)路由发现过程需要广播报文,对网络资源消耗较大
(8)安全性问题,网络中每个节点必须互相信任,到目的节点的消息能被转发的中间节点明文接收,有一定的安全隐患
这一节将会介绍AODV路由协议所定义的三种消息–RREQ、RREP、REER的数据格式。HELLO消息为设定了特殊值的RREP消息,会在RREP的介绍中进行描述。最后还会对另外一种特殊的消息RREP-ACK做一个简要描述。
当节点需要与某个目的节点传输数据,但没有目的节点的合法路由,可以向全网广播RREQ消息,向网络寻求到目的节点的路由,并且在约定的时间内等待携带有到目的节点路由信息的RREP消息回来,若规定时间内无收到RREP回复,则重发RREQ消息,直到达到最大发送次数。其他节点根据收到RREQ消息的接口建立从当前节点到源节点的反向路由。表1是RREQ的消息格式介绍,介绍了每个字段的名称与比特数。表2是对RREQ各个字段的解释。
RREP消息用于单播回复RREQ消息,目的是为了告知发送RREQ消息的源节点到目的节点的路由。通过RREP消息可以建立从收到RREP消息的节点到RREP消息中的目的节点的正向路由,用于以后发送数据到目的节点。表3介绍了RREP的消息格式,给出了每个字段的位置与比特数。表4是对RREP部分字段的解释。
Hello消息用于活跃节点向所有邻近节点广播自身的存在,当一个节点处于正在使用的路由中时,需要定时向邻近节点广播Hello消息,若邻近节点收到Hello消息,则更新路由表中对应节点的生存时间。
Hello消息是一种特殊的RREP消息,其特殊之处在于为某些字段设置了特殊值,描述如表5
当链路发生故障导致一个或者多个目的节点不可达时,RERR消息就会被发送,设计RERR消息是为了能通知网络中其他节点哪些目的节点因为故障导致不可访问,表6是RERR消息的格式,表7是对RERR消息中部分字段的解释。
RREP-ACK消息格式用于回复标志位A设为1的RREP消息。这经常发生于节点怀疑链路不可靠或者只能单向传播,RREP-ACK意义在于告知发送RREP的节点目的节点已经收到RREP消息,并且暗示了链路是双向传播和可靠的。
表8是RREP-ACK消息格式的介绍,可以看到RREP-ACK消息中只有两个字段,较为简单。表9是对RREP-ACK消息中两个字段的解释。
每一个节点都需要维护自己的路由表,每一个路由表条目字段见表10。
每一个路由表条目负责到一个目的IP地址的路由,为了保证路由的及时更新,路由表需要对目的序列号进行维护,以便过期或受损的路由能及时被发现。
每一个节点的路由表条目中都必须维护到目的节点的序列号,在三种情况下节点会更新路由表中的序列号:
(1)目的IP地址为自己的路由表条目。节点发送RREQ消息(见2.3.2)前,自身序列号加一,以便通知其他节点路由需要重新搜索。另外在发送回复RREQ消息的RREP消息前,把自身序列号更新为旧的序列号和RREQ中目的序列号中两者的最大值。
(2)节点收到AODV控制消息,即RREQ、RREP和RERR。若控制消息中的序列号比路由表中的大,即控制消息中的路由更新,此时用大的序列号更新路由表序列号;若两个序列号相等,但路由表中的跳数字段比控制消息中的跳数字段+1要大,即控制消息中的路由更短,此时用控制消息更新路由表中的相关字段,如下一跳,网络接口。
(3)到目的节点的路径过期或者损坏。在没有收到下一节点回复的RREP-ACK或者链路层通知发生链路损坏时,需要把所有受链路影响不可达的路由表条目中的目的序列号都加一,并设置标志位不合法,这样可以避免后续该节点重新使用损坏的链路。
源节点发送RREQ消息是为了向网络寻求到目的节点的路由。发送RREQ消息的过程见图 1。
图1中可以看到,发送RREQ消息的起因是源节点无法找到到目的节点的合法路由,若存在到目的节点的合法路由,则整个过程结束。无合法路由时,源节点开启定时器,构建好RREQ消息后,向IP地址255.255.255.255发送RREQ消息,在发送RREQ消息后,在规定等待时间NET_TRAVERSAL_TIME毫秒内等待相关节点回复RREP消息,如果及时收到回复,则过程结束,如果超时仍未收到回复,则采用二进制指数退避的方法更新等待时间,重新开启定时器计时和发送RREQ消息,直到发送次数超过RREQ_RETRIES或者收到RREP回复,则结束,数据会被丢弃,并通知上层协议无法建立到目的节点的路由。
RREQ消息的构建过程具体如下:RREQ消息中的目的IP地址字段为目的节点IP地址,如果源节点路由表中有目的节点的序列号(但已过期),则填进序列号字段,如果没有,则消息中的U标志位设为1。每个节点维护自己的唯一的RREQ ID,每次发送RREQ消息,则给RREQ ID加一,然后再填入RREQ中的字段。跳数字段设为0。
二进制指数退避方法设置等待时间的过程如下,第一次等待时间为NET_TRAVERSAL_TIME毫秒,第二次为NET_TRAVERSAL_TIME2毫秒,第三次为NET_TRAVERSAL_TIME2*2毫秒,每一次的等待时间都是上一次的两倍,这是为了避免网络堵塞。
RREQ消息使用广播发送,所以可能会造成网络中存在大量的RREQ消息。为了控制RREQ消息的传输范围,我们可以修改IP头部中的TTL字段,避免每一次RREQ消息都被网络中所有节点接收。举个例子,一开始TTL设置为1,则RREQ消息只能发送到源节点的邻近节点,如果目的节点不在这些邻近节点中,则再次发送RREQ消息,此时TTL设置为2,则收到RREQ消息的节点就会更多,当最终源节点收到RREP回复时,可能有的节点还没有收到过源节点发送的RREQ消息,这样就有效的避免了大量的RREQ消息在网络中传播。
图2 是处理和转发RREQ消息的过程。当节点收到RREQ消息,它会判断在过去的PATH_DISCOVERY_TIME内是否有收到具有相同源IP地址和RREQ ID的RREQ消息,如果有,则丢弃新收到的RREQ消息,过程结束。这个判断的原因是节点可能从不同的邻接节点处收到相同的RREQ消息(因为RREQ消息为广播转发),而收到的第一个RREQ消息暗示着一条从源节点到该节点的最短路径,所以保留第一条RREQ消息,而后面相同的RREQ消息则丢弃,避免重复处理。
下面讨论RREQ消息是第一次收到的情况。
首先,搜索是否存在到源IP地址的反向路由,如果没有则建立反向路由。反向路由即当前节点到源IP地址所在的节点的路由,具体来说是当前节点知道通过哪个接口把数据转发到源节点。反向路由的建立过程和更新过程具体如下:
(1)RREQ中的源节点序列号跟路由表中目的IP是源节点的表项的序列号进行比较,路由表中个更新为两者最大值
(2)路由表对应表项合法目的序列号标志位设为1
(3)路由表对应表项中的下一跳字段设为收到RREQ消息的上一个节点的IP地址,这个地址可以在IP头部获取到,一般跟RREQ消息中的源IP地址不同
(4)路由表对应表项中的跳数字段从RREQ中复制
更新或创建反向路由后,判断自身是否为目的节点或者有到目的节点的路由,如果是目的节点,则向源节点发送RREP消息,过程结束;如果有到目的节点的路由,则除了向源节点发送RREP消息外,可能还需要向目的节点发送免费RREP消息,具体过程见2.3.4 。
如果节点不是目的节点和没有到目的节点的路由,而且IP头部中的TTL大于1,节点就把IP头部TTL减一,RREQ中的跳数加一,最后把RREQ消息广播到255.255.255.255地址,过程结束,若TTL等于1,则无需广播转发,直接丢弃RREQ消息。
节点在两种情况下会产生RREP。
第一种情况节点是RREQ指向的目的节点,如果自身维护的序列号加一后跟RREQ中的目的序列号相等,则加一,然后新的值复制进RREP消息中的目的序列号字段,并把跳数字段设为0.,最后把RREP通过反向路由单播发送消息回发送RREQ的源节点。
第二种情况是RREQ消息中D标志位(Destination Only)为0,节点为中间节点,拥有到目的节点的路由,且路由活跃不过期,具体来说就是路由表中对应目的序列号大于等于RREQ中的序列号。节点把路由表中目的节点相关表项的目的序列号填进RREP的目的序列号字段中,并通过RREQ消息所在的IP头部更新到发送RREQ消息的源节点的路由,进而建立反向路由。RREP中的Hop Count字段设置为中间节点路由表中到目的节点的Hop Count字段,RREP中的lifetime字段设置为路由表中到目的节点的表项中的expire time减去当前时间,即该RREP在路由表表项过期后也同时过期,上述更新完RREP消息后,即可单播到发送RREQ消息的源节点。
如果RREQ中的G标志位(免费路由标志)设为1,在发送RREP给源节点之后,还需要发送一个免费RREP(gratuitous RREP)到目的节点,免费RREP也是RREP消息,部分字段设置如下:
(1)跳数字段设置为中间节点到源节点的跳数
(2)目的IP地址字段设置为发送RREQ的源节点的IP地址
(3)源IP地址字段设置为RREQ中的目的IP地址字段
(4)生存时间字段设置为中间节点路由表中维护的到发送RREQ源节点的生存时间
设置完成后免费RREP会根据路由表选择到目的节点的下一跳发送到目的节点。
发送免费RREP消息的目的在于假设目的节点发送了一个RREQ到源节点,然后这个免费RREP就是中间节点代替源节点来回复这一不存在的RREQ消息,这样目的节点就可以建立到源节点的反向路由。如果不发送免费RREP消息,目的节点可能不知道RREQ消息的存在,也无法建立到源节点的路由,而只有中间节点具有到源节点的路由,使得后续目的节点与源节点的双向传输无法进行。
图3是接收和转发RREP消息的过程。当一个节点收到RREP消息,它根据RREP中的目的IP地址字段判断自己是否为RREP消息目的节点(即发送RREQ的源节点),如果是RREP目的节点,则根据RREP的进入接口更新路由,建立从RREQ源节点到RREQ目的节点的正向路由,用于以后从源节点到RREQ目的节点的数据传输。如果节点不是RREP消息目的节点,则判断是否存在到RREQ目的节点的正向路由,如果不存在,则创建一个无序列号的到RREQ目的节点的路由,如果有,跟存在的正向路由做比较,及时调整和更新正向路由。以下几种情况所存正向路由会被更新:
(1)路由表中对应表项的序列号标记为非法
(2)RREP中的目的序列号比路由表中对应选项的合法的目的序列号要大
(3)两个序列号相等,但路由表中序列号标记为不活跃
(4)两个序列号相等,但RREP中的跳数表项加一小于路由表中对应表项的跳数
到RREQ目的节点的路由表表项被创建或者更新后,该表项会被标记为活跃路由,目的序列号设为合法,下一跳设定为收到RREP消息的IP头部的IP地址,跳数设置为RREP中的跳数加一,过期时间设置为当前时间加上RREP消息中的生存时间字段,最后把序列号改为RREP消息中的目的序列号,随后RREP消息会根据之前已经建立好的反向路由发送到下一个节点,至此整个接收和转发RREP的过程结束。
正向路由更新后,后续RREQ源节点可以通过每一个中间节点的正向路由与目的节点进行数据传输。
链路中可能存在一些单向链路,RREQ广播时无法发现,但RREP单播回复RREQ时,可能会因为单向链路导致传输失败,此时若不处理单向链路,源节点因为收不到RREP回复会多次发送RREQ,直到超时。所以如果链路中可能存在单向链路,下一跳节点可以采用发送RREP-ACK或者链路层确认机制来通知上一个节点链路失败,然后上一个节点会把下一跳节点拉入黑名单,在BLACKLIST_TIMEOUT时间段内忽视所有从下一跳发送来的RREQ消息,此时源节点因为收不到RREP消息,选择再次发送RREQ,因为是广播发送,所以上一个节点可能会从其他节点收到该RREQ消息,虽然路由距离可能比已经在黑名单的节点要长,但可以作为单向链路的一个替代。
当需要下一跳节点发送RREP-ACK消息,RREP消息中A标志位必须设为1。
当节点处于一条活跃路由中时,需要通过向邻近的节点广播Hello消息来通知邻近节点自身的存活。Hello消息发送过程见图4。首先节点判断自己是否处于活跃路由中,如果是,则开启定时器,每过HELLO_INTERVAL毫秒,节点检查自己过去HELLO_INTERVAL毫秒内是否送过广播(Hello消息或者RREQ),如果没有,则广播Hello消息。当节点判断自己不再处于活跃路由中,则可以结束Hello消息发送过程。
节点可以通过监听在一段时间内是否收到邻近节点的消息来判断与邻近节点的连接是否正常。Hello消息处理过程见图5。如果在过去的DELETE_PERIOD时间内,已经从邻近节点收到Hello消息,然后接下来的ALLOWED_HELLO_LOSS * HELLO_INTERVAL内都没有从邻近节点收到任何消息,那么节点就会假设与该邻近节点的链路已断开,此时应该发送RERR消息,当节点收到Hello消息,且存在反向路由,则更新到发送Hello消息节点的路由的生存时间,并且用Hello中的目的序列号更新路由表中对应序列号,若不存在反向路由,则丢弃Hello消息。
发送和处理RERR消息统称为路由修复过程,路由修复过程发生于检测到链路故障或者收到无法处理的数据时。
RERR消息可以广播发送也可以单播发送,一个节点一秒不能发送超过RERR_RATELIMIT 条RERR。
(1)生成RERR消息
RERR消息可以广播发送也可以单播发送,一个节点一秒不能发送超过RERR_RATELIMIT 条RERR。
节点在三种情况下会发送RERR消息,第一种是路由表中存在的活跃路由的下一跳节点发生链路故障;第二种是收到一个数据包指向某个目的节点,但路由表中无在修复的或活跃的指向目的节点的路由;第三种是从邻近节点收到RERR消息。
下面分情况讨论RERR消息的产生。
第一种情况中,把路由表中所有以故障节点为下一跳的条目中的目的IP地址放入RERR消息中的不可达目的IP地址字段或者额外的不可达目的IP地址字段,然后把路由表中对应目的序列号+1,并填入RERR消息中。
第二种情况中,只有一个目的节点不可达,把它的目的IP地址复制入RERR消息中,路由表中序列号+1后也放入RERR消息中。
第三种情况中,假设节点从邻近节点A收到RERR消息,则路由表中所有下一跳为A的条目中所有的目的IP地址都复制到新的RERR消息中,并且把路由表中对应目的序列号+1,并填入新RERR消息中。
(2)更新自身路由表
在发送RERR消息前需要更新路由表,除了对应目的序列号+1,还有以下操作,先把把指向RERR中目的节点的路由入口设为无效,随后路由表生存时间字段设置为当前时间+DELETE_PERIOD,最后在超过生存时间后才执行删除路由入口的操作。
(3)决定转发节点
在生成了RERR消息和更新自身路由表后,节点需要决定把RERR消息转发到哪些邻近节点。路由表中因为RERR消息导致无效的路由条目中,有一个上游节点列表(list of precursors),里面存放着使用这条路由的上游节点,其中有的是邻近节点,而这些节点就是RERR消息需要转发到的节点。
(4)路由修复过程
当链路发生故障,所有直接使用该链路的邻接点都产生一个RERR消息,然后这些节点会将RERR消息转发到其他节点,其他节点也一样处理,直到所有受影响的节点都收到RERR消息。无论是源节点还是中间节点,当链路故障后需要再次发送数据到受影响的目的节点,则需要再次发送RREQ消息来发现到目的节点的路由,在重新建立路由之前的数据都需要缓存起来。
主要对AODV路由协议进行了详细的介绍,在对AODV协议做了一个总体概述后,详细的介绍了AODV的控制消息RREQ、RREP、RERR、RREP-ACK和Hello的消息格式和用途,并对部分消息字段做出了解释,接着分小结介绍了每一种控制消息的发送和处理过程。