【从 DV 到 DSDV】
对于传统的距离矢量路由协议 DV,其基于 Bellman-Ford 算法,利用距离向量来进行路由表的更新,每个结点都维持一张路由表,定期的将路由表发给所有邻居
关于 DV 算法,详见:路由算法与路由选择协议
如下图,是一个使用 DV 协议的路由表传播过程
但 DV 协议存在无法发现路由回路从而导致无穷计算的问题,并不适用于 Ad-Hoc 网络,因此,在距离矢量协议 DV 的基础上出现了其改进算法:目的节点序列距离矢量协议 DSDV
DSDV 协议保持了 DV 协议的简单性,通过对新出现的路由表带有目的地序列标号,能够确保无路由回路,同时,当路由表发生重大变化时,立即启动路由通告(Route Advertisement),以保证对拓扑变化做出快速反应
DSDV 协议非常简单,几乎和 DV 协议一致,只是通过目的地赋予序号值来防止出现路由回环,其不存在路由发现带来的延迟,但使用该协议会使得没有节点睡眠,同时多数路由信息几乎从不使用,开销过大
【DSDV 路由表】
在 DV 协议中,路由表包含三项:所有可达目的地 Dest
、到目的地的下一跳 Next
、到目的地的跳计数 Metric
DSDV 的路由表在 DV 路由表的基础上添加了三项:
- 序列号
Seq.no
:Sequence Number,由目的端确定,用来保证不出现路由回环 - 创建时间
Install Time
:记录该路由表的创建时间,以用来删除表中过时路由信息 - 稳定数据
Stable Data
:指向其他表的指针,包含有关路由如何稳定的信息,用于缓解路由波动
【路由通告】
路由选择
在一个节点收到路由表时,会将收到的路由更新信息与自己的路由表进行比较
为确保使用的总是来自目的地的最新路由信息,会选择目的地序号大的路由,如果目的地序号相同,则选择具有较好 metric
值的路由
路由通告
当路由表发生重大变化时,会进行路由通告(Route Advertisement),以快速应对网络拓扑变化
该操作会向每个邻居通告自己的路由信息,包括:目的地址 Dest
、到目的地的跳数 Metric
、目的地序列号 Seq.no
在告知路由信息时,设置序列号 Seq.no
时会遵循如下规则:
- 每次通告将自己的序号递增 $2$,且要求只用偶数值
- 若一个节点不再可达(timeout),则将该节点的序号递增 $1$(奇数值),并置跳数
metric
为无穷
在网络拓扑结构发生变化时,路由会做出如下的响应:
- 立即通告:有关新路由、链路中断、
metric
变化的信息立刻传播给邻居 - 更新:发送路由表的路由信息
- 完全更新:发送自己路由表的全部路由信息
- 增量更新:仅发送路由表中有变化的表项,使用一个分组即可完成更新
如下两图,是增加一个新结点 $D$ 后的路由变化
当网络拓扑变化时,得益于 DSDV 协议的立即通告,其能够很好的解决回环和无穷计算问题
【路由波动】
当任一节点更新路由,会导致不必要的路由通告,即路由表的波动,这是由序列号带来的
例如:$A$ 收到来自 $P$ 路由的更新消息 (D, 15, D-102)
,也收到来自 $Q$ 路由的更新信息 (D, 14, D-102)
,这就造成了不必要的路由通告 (D, 15, D-102)
为减缓路由波动,常采用的方法是记录不同表中给定序号值的路由过时数据,以及最近设置时间 rec.Setting Time
和平均设置时间 avg.Setting Time
,其中,设置时间 Setting Time
为第一条路由和最好路由的到达时间间隔
这样,当在新序号第一条路由到达时更新路由表,但延迟广播该条路由,推迟的时间为 $2$ 倍的平均设置时间 avg.Setting Time