DSDV协议

上一篇用毒性逆转技术仍然无法识别三个以上的路由环路问题。现在,我们来介绍一种专门用以解决计数到无穷问题的协议:DSDV协议。

基本思想


总体来讲,DSDV协议是对传统的DV协议的一种拓展。它的拓展包括:
  • 给每条路径增加了一个序列号码
  • 每个目的节点会定期广播一个单调递增的偶数序列号号码
  • 当一个节点发现它到某个目的节点的路径断开时,它把到这个节点的距离设为,并且将这条路径的序列号加1(此时为奇数),然后向网络中广播这个更新包。当这条路径修复时,它又将序列号加1然后广播出去
换另一种方式来说,每个节点都保持着一张路由表,路由表中的每一项记录了它到目的节点的距离和序列号,也就是(s,d)。我们假设有一目的节点为D,当以下任何一情况发生时,都会发送更新:
  • D定期将自己的序列号加2并广播出去,即(S,0)
  • 如果节点X要通过Y到达节点D,当X和Y之间的连接断开后,X将到D的路径的序列号加1,同时将路径值设为∞,然后将信息发送给邻居。

更新


我们假设节点A向节点B发送了一个信息(Sa,Da),B在更新前的状态是(Sb,Db)。在收到信息后,B将按照如下方式进行更新:

如果Sa > Sb

更新序列号Sb = Sa。如果Da = ,那么更新Db =∞;否则 Db = Da + d(A, B)。
也就是说,如果收到的序列号比自己大,那么一切以这个较大的序列号中的信息为准。

如果Sa == Sb

比较Db 和 Da + d(A, B) ,选择较小的值作为新的Db。如果需要经过A到达目的节点,将设置A为下一跳。

消除循环


首先,我们先来弄清楚什么是一个循环。
循环定义:在某个全局时间下,一个循环是指一个全局状态(包括所有节点的的局部状态),这个状态下存在节点A、B、C、……E使得A自认为B是下一层,B以为C是下一层,……E又以为A是下一层。
那又是什么造成了循环的形成呢?
当初始化时,因为只有一个节点,所以无所谓循环问题。

但当一个节点产生更新时,往往会发生矛盾。例如上图,当A接收到来自B的一个更新时,A决定使用B作为下一跳,从而形成了循环。

全局不变量


现在,我们来考虑对于每个节点的状态,是否存在一些全局不变量?
考虑任何一个节点B。对于某个特定的目的节点,它的状态是(Sb,Db)。
它的全部不变量有:
  • Sb是一个单调递增的序列
  • 对于同一个序列号Sb,Db是递减的
现在再考虑,如果一个节点A把节点B当做自己的下一跳,它们之间有哪些全部不变量。我们有(Sa,Da)和(Sb,Db)

  • Sa是一个偶数,并且Da不等于∞
  • Sb≥ Sa
    • 这是因为Sa是由B发来的,但是B在发送完更新信息后,可能再次增加了自己的序列号
    • 如果Sb == Sa ,那么 Db < Da这是因为,Da是在Db的基础上得来的,又因为所有的连接耗费都是正数,因此有Db < Da ;除此之外,由于B在向A发送更新后,可能再次更新自己的路径信息,从而又减少了Db的值

DSDV不存在循环


在一开头我们就说过,DSDV协议是专门针对网络中的循环问题提出来的,但为什么利用DSDV不存在循环问题呢?

我们考虑一个临界时刻:当A认为B是它的下一跳时,就会形成一个循环。
这种情况会在DSDV中出现吗?
为了证明DSDV中不存在循环,我们可以先假设会存在,然后再推出矛盾即可。
如果DSDV中存在这样一个循环,我们考虑循环中的任意一个连接(从节点X到节点Y):
  • 若Sy > Sx,那么我们最终会推出Sx > Sx,这是矛盾的。
  • 若所有的节点的序列号都相等,那么由Dx > Dy,我们最后会推出Dx > Dx。这也是矛盾的。
由此证明,DSDV中是不存在循环问题的。




你可能感兴趣的:(DSDV协议)