目录
1 DSDV协议的先导协议: DV协议的困境
对DV协议有研究的小伙伴可能都了解过DV协议的计数到无穷(count-to-infinity)问题。举个简单的例子,如图1所示,A、B、C和D四个节点分别通过一条边与邻节点相连,每条链路的权重都为1。在正常情况下,节点A能通过中间节点分别正确到达节点B、C和D,且节点A到达节点B、C和D经过的距离分别为1、2和3。
图1 DV的计数到无穷困境示意图v1
但是假设节点A和节点B之间的链路断了,情况就会变得糟糕起来,如图2所示。
图2 DV的计数到无穷困境示意图v2
当B检测到它与节点A之间断开的链路后,它会更新自己的路由表,将从B到A的距离值修改为无穷大。但是节点C并不知道节点A和B之间的链路已断开,它会仍然认为它自身到节点A的距离为2,即建立了一条从C到A权值为2的不存在的虚拟链路,如图3所示,且在路由信息更新后节点C会广播其路由信息。
图3 DV的计数到无穷困境示意图v3
当节点B收到来自C的路由信息,它会认为从节点C到节点A产生了一条新的链路且距离值为2,所以根据DV算法,节点B会修改自己到节点A的距离值为3,即是节点B到节点C的距离加上节点C到节点A的距离,如图4所示。
图4 DV的计数到无穷困境示意图v4
之后,节点B又会广播错误的路由信息,节点C会接收到,如图5所示。
图5 DV的计数到无穷困境示意图v5
因为从节点C到节点A的路径原本是C-B-A的,当节点C收到这条来自B的路由信息后会认为节点A和B之间的距离增加到3了,就会修改自身到节点A的距离值为4(1+3),如图6所示。
图6 DV的计数到无穷困境示意图v6
这个过程会重复多次,直至最后网络不再更新。
2 解决DV协议计数到无穷的困境
2.1 毒性反转 (Poisoned reverse)
解决计数到无穷的困境的方法之一叫做毒性反转,其意味着当一个路由器收到从某个网关接口(port)传入的来自其邻节点的路由信息后,其会从该网关发回给这个邻节点路由信息,信息中两节点之间的距离值被设置为无穷大,如图7所示。毒性反转在有线网络中很有效,一般多用在RIP协议中。
图7 毒性反转
但是毒性反转在Ad hoc网络中并不适用,因为在Ad hoc网络中的设备(节点)是通过无线信道与其他设备通信的,即只有一个无线port。
2.2 增加序列号
DSDV协议是在DV协议的基础上,通过提出序列号(sequence number)解决DV的计数到无穷问题,具体过程见第3部分。
3 DSDV协议
3.1 基本流程
在DSDV协议中,每个节点的路由表包括4部分:目的节点,下一跳节点,度量值(距离值)和目的节点的序列号。目的节点的序列号由目的节点自己分配,当前节点根据目的节点的序列号来决定是否继续转发更新这条路由,以此来防止路由环路的产生。
当从某一个邻节点来的路由是有效,这代表这这条路由中的所有链路都正常工作,目的节点的序列号将保持为一个偶数。一旦网络中出现错误,序列号将被设置为一个奇数(一般是原有偶数加一)。
举个例子,如图8所示,在正常情况下,节点A能正确到达节点B、C和D,且距离分别是1、2和3。节点A、B和C的路由表中,所有目的节点对应的序列号都被设置为偶数。
图8 DSDV的路由表
在某些情况下,节点A和B之间的链路突然断开了,如图9所示。对节点B而言,它会检测到这条链路已断开,随即会修改从它自己到节点A的距离,从1修改为无穷大,同时目的节点A对应的序列号Seq.也会增加到101。(注:对于节点A而言,它也会检测到与B之间的链路断开,同样会修改它的路由表,但这里因为节点A已不再右侧的网络中,故图中不显示节点A中的路由信息修改情况。)
图 9 A和B链路断开
但是对于节点C而言,它并没有意识到A和B之间的链路已断开,所以它仍然会向邻节点B广播其更新过后的路由信息,其中节点C到节点A的距离值为2,目的节点A对应的序列号仍是100,如图10所示。
图10 C广播路由信息
当节点B收到来自C的路由信息后,它发现这条信息中节点A对应的序列号小于它自身路由表中节点A对应的序列号,所以节点B会直接扔掉这条信息,保持最新的路由信息,如图11所示。
图11 B扔掉C的路由信息
实际上节点B也有可能在检测到它与A之间链路断开之前就收到来自C的路由更新信息,对此节点B检查并更新自身路由表。但它会定期检测自身链路情况,当之后检测到与A之间断开的链路,节点B就会按照上文所说的修改自身的路由表,这与检测到链路断开后再收到C的路由信息产生的结果是一样的。
当节点B修改了路由表后,会向邻节点广播更新后的路由信息,如图12所示。节点C就会收到来自B的更新,并修改自己的路由信息,如图13所示。一次次广播后,路由状态的更新就会扩展到整个网络。因此可以看到利用序列号,DV协议计数到无穷的问题可以被有效避免。
图12 B广播路由信息
图13 C更新路由信息
3.2 广播机制
3.2.1 交换路由信息的两个时刻
- 在DSDV协议中,每个节点必须周期性的与邻节点交换路由信息。
- 当某个节点的路由信息更新后,也会与邻节点交换更新后的路由信息。
3.2.2 交换路由信息的两种方式
- 完全更新(full update/ full dump):拓扑更新信息包括整个路由表的所有项(所有目的节点),多用在网络快速变化的情况下。
- 部分更新 ( partial update/ incremental update):路由更新信息只包括改变项,多用在缓慢的网络拓扑变化环境中。
3.2.3 序列号不同如何选择
如例子所示,所有节点都会优先使用有最高序列号的路由,保证最新的路由状态。
3.2.4 序列号相同如何选择
有时某节点收到几条不同的路由,其序列号可能相同,在这种情况下,该节点会选择其中的最优路由(保证跳数最少,但距离值不一定最短)。也就是说DSDV协议只提供当前节点与其他目的节点之间的单条路由方式。
3.3 波动问题 (Fluctuations)
3.3.1 什么是波动?
对于采用DSDV协议的Ad hoc网络,即使网络中的拓扑结构没有改变,路由选择也可能发生频繁变化。
3.3.2 为什么会产生波动?
假设从源节点S到目的节点D有两条路由,如图14所示,一条是从P经过12跳到达D,另一条是从Q经过11跳到达D。同时假设目的节点发送路由更新消息后,通过节点P到达源节点S比通过节点Q更快(跳数不代表实际距离值)。
每当目的节点更新其序列号(比如从D-100变为D-102)后,都会向邻节点广播新的路由信息。源节点S会先收到来自节点P的路由更新信息,因为新的序列号大于旧的最优路由的序列号,所以对于S而言,到达D的路由由原来的(下一跳:Q, 共x跳, 序列号:100)变为(下一跳:P, 共x+1跳, 序列号:102)。随后很快,来自Q的路由更新信息也到达S,其带来的序列号也是102,此时源节点S会优先采用跳数更小的路由,再次修改自己到达D的路由信息为(下一跳:Q, 共x跳, 序列号:102)。这就使得源节点S的路由表产生了一次波动才找到最佳的路由。
而在Ad hoc网络中,由于节点多具有移动性,链路连接状况可能会发送频繁变化,同时从源节点到目的节点可能会存在不止两条路由的情况,路由中任何一个节点的序列号发生更新修改,都会向源节点发送路由更新信息。很可能源节点修改了一次路由表后没多久,新的路由更新信息就到达,源节点会再次根据优先级再次修改路由表,它的路由表会发生频繁的变化,不能保证路由表中始终保存的是最新的最优路由。
图14 波动
3.3.3 解决办法
通过引入稳定时间(settling time)和延迟广播可以避免DSDV协议中的波动。稳定时间是在某个给定的序列号下,某节点收到第一条路由和最佳路由的时间差,即表示该节点找到最佳路由的稳定时间。为避免路由表发生频繁波动,当一个节点收到一条路由信息,它会根据情况更新自己的路由表,但不会立即广播本次更新,而是会等一段时间。这个等待时间被定义为平均稳定时间的两倍值。
这种机制可以杜绝不必要的广播,节约带宽,从而在大规模网络中避免波动。
3.4 DSDV协议中的参数
如果一个网络采用DSDV协议,需要选择以下一系列参数:
- 周期性更新周期
- 最大稳定时间
- 路由失败间隔
这些参数的选择取决于路由效率和网络通信开销的折中考量。
3.5 DSDV协议性能分析
3.5.1 优点
- 如上文所说的,DSDV协议解决了传统DV协议中的计数到无穷问题,增强了网络的稳定性和鲁棒性。
- DSDV协议是一类表驱动路由协议,每个节点都维护着整个网络的路由信息。当一个数据报需要传输时,会被立刻发送,就是说,当一个数据报需要发出时其时延是很低的。因此DSDV协议很适合用于要求高实时性的服务和网络环境。
- DSDV协议保持了DV协议的简单性,仅在原有路由表中增加了序列号,将DV协议改进应用于Ad hoc网络中。
3.5.2 缺点
- 正是由于DSDV协议是一类表驱动路由协议,网络中的每个节点都需要维护最新的路由信息,这会增加网络的开销,且需要根据频繁变化的拓扑结构不停更新路由信息。这样会占用很大带宽甚至导致整个网络不可用。同时随着网络规模的扩大和节点数量的增多,每个节点需要维护一张相当大的路由表,这会快速消耗节点的能力,但在Ad hoc网络中,受限于移动节点的尺寸、重量和功率,大多数节点都是能量受限的。
- 如果网络拓扑发生变化,整个网络需要一定时间来完成所有节点的路由信息更新(达到聚合状态),这会对数据报发送产生额外的时延。
由于上述特性,DSDV协议主要用于规模不是很大且拓扑变化相对不那么频繁的网络。
3.5.3 如何应对拓扑结构快速变化的网络
(1)泛洪
路由请求消息头部包含有目的节点的地址,源节点向所有邻节点发送消息,收到消息的每个中间节点会根据目的节点的地址判断是否接着转发该消息。
在某些情况下,网络拓扑结构频繁变化,路由发现和路由维护的开销很大时,采用泛洪法可能会比其他路由协议更高效,数据传输的可靠速率会更高。但泛洪转发路由请求会使得网络中很多非合法路由中的节点参与到消息转发中来,可能增大网络的开销。
(2)靶向泛洪
在Ad hoc网络的其他路由协议中,只泛洪控制报文,控制报文用于路由发现过程。当路由决定后,源节点才会按照已发现的路由发送数据报文。诸如这样的操作可以减小在整个数据传输过程中网络多次泛洪的影响,这也是按需路由协议的核心思想。(按需路由是源节点有数据要发送才进行一次路由发现,表驱动路由是整个网络中的节点要实时维护网络的拓扑信息)