一、DSDV(Destination Sequenced Distance Vector)
就是DVR的变种,整体还是一样
1.定时和邻居交换路由表,可以有Full Dump也就是全交换,也可以有Incremental Updates也就是只交换新的信息。
2.在拓扑变动时立即跟邻居更新信息。
3.给每个节点维护一个序号,这个序号大小代表了关于这个节点的信息是否为最新的,序号越大代表这个信息越新。
4.拓扑变动例子

5.总结
优点:
(1)由于事先建好了路由表,要发信息的时候就会有低延迟
缺点
(1)在建表的时候会有很大的overhead
(2)不新鲜的路由表有时会导致路由错误
二、AODV(Ad hoc On-Demand Distance Vector Routing)
这是一个on-demand的路由协议,只有在某个节点想要发包时才会初始化链路
1.当一个节点想要给目的节点发包时,他会flooding一个RREQ消息,这个消息包含了源和目的地址,一个broadcastID,源和目的节点的序列号。
(1)源地址和broadcastID可以唯一的识别一个RREQ,每次源想要发一个新的RREQ,他都要给这个broadcastID加一,因为中间节点收到同样的RREQ(源地址和broadcastID一致)就会丢弃。
(2)源和目的的序列号是为了看状态的,看信息是否最新,下面考虑这样一个例子
S想给M发包,
第一种情况:这时候S传了一个RREQ给他的邻居,RREQ给到E的时候,M移动到了F边上,这时J开始和他的邻居交换信息,更新了M的序号,说M断开了,不可达,F得知了这个信息,更新了M的序号,这时M到了他边上,跟他交换了信息,F得知了M的最新位置,知道了M的新序号,收到RREQ后发现M是我邻居,就把RREQ给了M,M这时开始发RREP包,里面是自己最新的序号,传给F传回S,成功。
第二种情况:这时候S传了一个RREQ给他的邻居,RREQ给到E的时候,M移动到了F边上,这时J开始和他的邻居交换信息,更新了M的序号,说M断开了,不可达,F得知了这个信息,更新了M的序号,但这时M还没到他边上跟他交换信息,他这时继续给他的邻居广播RREQ,G收到了C给的RREQ,他会直接丢弃F的,E同理,只有J会收到,J继续广播,广播到后面,大家都收到了RREQ但是在收到RREQ之前都没有到达M,那这次RREQ就失败了,S设置的定时器超时后,会增加broadcastID,重传。
2、取决于想要什么样的路由,如果是要最快的路由,那么目的节点收到RREQ之后,就不会再管别的RREQ了,他会顺着RREQ来时候建立的reverse path把RREP送回去。
3、如果中间节点有到目的节点的路,他只有在 他这个链路信息的目的节点的序列号 大于或等于 RREQ中目的节点序列号 时,才会回复RREP
4、RREP往回走的过程,由于是要最快的路,中间节点只会收到一个RREP,那么他收到RREP就相当于确认建立链路了,他一定会往回转发RREP到源。
5、现在考虑什么时候会更新序列号
(1)周期的hallo包会更新序列号
(2)RREQ经过中间节点时,会更新源的序列号,那如果RREQ的序列号小于这个节点本身数据库里源节点的序列号要小,我觉得还是要转发,这种情况发生于hallo包传播的比RREQ快(会发生吗?),节点在RREQ到达之前就更新了序列号。
(3)RREP经过中间节点时,会更新目的的序列号。
(4)拓扑发生变化时,变化会泛洪
6、链路发生错误时,断开点靠近源一边的节点会侦测到并给源发送RERR,这时源收到RERR会重新发RREQ。收到RERR的包会自动释放消耗的资源,链路断开点另一侧的节点会根据之前设置的定时器,自动释放资源。
三、ABR(Associativity Based Routing )
这个路由协议想要选择的路是最稳定的路。
1、路稳不稳定基于邻居之间定期交换的信标,这个信标积累的越多说明这一跳就越稳定。
2、根据一个链路的associativity tick判断其是否稳定,如果他的associativity ticks大于一个门槛,那么就视他为稳定的路。
3、较低的associativity ticks就意味着节点的移动性较高
4、ABR有两个前提假设:(1)尽管adhoc网络节点总会移动,但还是假设他在经历一次移动之后,会保持一个稳定的时间。(2)高associativity ticks就意味着稳定,低associativity ticks就意味着不稳定。
5、选路阶段
(1)这里举一个例子来阐述ABR的选路,这里src要想dest发包
(2)src产生一个BQ包,这个包包含了SRC到他所有邻居的associativity ticks,广播给他所有的邻居
(3)他所有的邻居收到这个BQ之后,会首先删掉与自己无关的信息,例如IS1收到之后,就会先删掉C1,C2,C3的信息,然后再把自己到他所有邻居的associativity ticks加上,广播给他所有的邻居。
(4)整个网络中所有的节点收到BQ包之后都会重复这个过程,那如何确保节点不会处理相同的信息呢,每个节点收到相同ID的BQ包之后,会检查以下自己是否在这个BQ包里出现过,如果出现过那说明自己处理过这个包了,就会自动丢弃。
(5)持续这个过程直到DEST收到BQ包,dest收到第一个BQ包之后就会设置一个定时器,等待接下来一段时间内所有的BQ包,等时间一过,就会停止收包,计算这些包的稳定性,选择最稳定的那一条路,给他回REPLY
(6)relpy包
这个包首先要有type来暗示这是reply包,然后源和目的ID,然后是所有中间节点的ID,最后还有一个链路质量总结,这个总结里必须包括路长,因为在链路断开时的局部修复时,会需要路长来判断是否局部修复。
(7)每个节点收到reply包之后,会先检查自己在包中的位置,并且把这个包传给他前面那个节点,并且根据他位置后面那个节点,得知自己收到信息之后要给的下一跳是谁。这个reply包应该是单播,但是老师说因为是无线传输,所有节点都会收到这个reply,无关的节点看自己不在这个源和目的通信的这条路里,就会释放掉之前BQ传来时候留的资源,可收到这个包丢掉与否,不应该是链路层的工作,如果这个节点不是单播的对象,那他的网络层应该不能知道自己收到了包,从而把空间释放掉,如果他能收到,那不就是广播了么
6、传包时的ACK机制
(1)隐式ACK:点对点传输时,A给B发包,B再给C发包,B给C发包的时候由于是无线通信,所以A也会收到B给C发的包,这时候A就能通过这个判断B收到了他发的包。这同样会产生上面说的那个问题。
(2)显式ACK:有一种情况没法使用隐式ACK,就是目的地收到包之后,他不会在转发了,前一个节点就没法知道他是否收到,这时目的地节点就必须发一个ACK,来显式的通知他前一个节点他收到了包。
7、链路错误,重建阶段
ABR采取局部修复的方式来应对链路错误。
(1)第一种情况,中间节点没了:那断开节点的前一个节点(pivot node)就会产生一个Local Quray(LQ),并且带有一个他到目的地的跳数,来寻找一个新的相同跳数的路到目的节点,以寻求局部修复,目的节点收到第一个LQ之后开始计时,时间一过挑出来一个最稳定的路,来返回一个Local Reply(LP)给pivot node,机制和先前建立链路时的机制类似。如果没找到新的路,他就会进行下面这种情况描述的,发RN。
(2)第二种情况,目的节点没了:那他前一个节点会感知到他没了,同第一种情况一样,发一个LQ[1],但是没找到,他这时候就会给他前一个节点发Route Notification(RN),这里是RN[0],0代表这个RN是往src传的,这时需要由他前一个节点来发LQ[2],要是还是找不到,就接着重复这个过程,直到找到,或者一半节点都找不到,那就不找了,就认为是目的节点跑太远了,这时最后一个进行LQ的节点会给源发RN,告诉源你重新发BQ把,LQ不成。
(3)第三种情况,源节点走了:那他后一个节点就会发一个RN[1],往目的地传,所有收到这个的节点会删除这个路得信息。源移走之后,如果他还有包要发,那他就会重新发BQ重新建链路。
(4)多个节点同时断开:
8、链路删除
(1)硬删除:源节点发送一个Route Deletion(RD)给目的节点,所有收到这个消息的节点释放掉资源,删除旧的路。
(2)软删除:每个链路都会有一个定时器,一旦一段时间都没有发消息了,那就认为这个链路已经不活跃了,就把这个链路的相关资源释放掉。