DV算法是一个迭代的、异步的和分布式的算法,而LS算法是一种使用全局信息的算法。
DV算法和Bellman-Ford方程相关
d x ( y ) = m i n x { c ( x , y ) + d v ( x , y ) } d_x(y) = min_x\{c(x,y) + d_v(x,y)\} dx(y)=minx{ c(x,y)+dv(x,y)}
m i n v min_v minv是对于所有邻居的, 从x到v遍历之后,如果接下来取从v到y的最低开销路径,该路径开销将会是 c ( x , y ) + d v ( y ) c(x,y)+d_v(y) c(x,y)+dv(y)。。从x到y的最低开销会是对所有邻居v的 c ( x , y ) + d v ( y ) c(x,y) + d_v(y) c(x,y)+dv(y)的最小值。
举个例子
x没有收到y和z的路由器信息, y和z也没有收到邻居的信息
ps:inf是无穷大的意思,也就是当
节点x在t0时刻的表
x | y | z | |
---|---|---|---|
x | 0 | 2 | 7 |
y | inf | inf | inf |
z | inf | inf | inf |
y在t0时刻的表
x | y | z | |
---|---|---|---|
x | inf | inf | inf |
y | 2 | 0 | 1 |
z | inf | inf | inf |
z在t0时刻的表
x | y | z | |
---|---|---|---|
x | inf | inf | inf |
y | inf | inf | inf |
z | 7 | 1 | 0 |
在t1时刻,结点y和z给x发来它们自己的邻居的信息
D x ( x ) = 0 D_x(x) = 0 Dx(x)=0
D x ( y ) = m i n { c ( x , y ) + D y ( y ) , c ( x , z ) + D z ( y ) } = m i n { 2 + 0 , 7 + 1 } D_x(y) = min\{c(x,y)+D_y(y), c(x,z)+D_z(y)\} = min\{2+0, 7+1\} Dx(y)=min{ c(x,y)+Dy(y),c(x,z)+Dz(y)}=min{ 2+0,7+1}
D x ( z ) = m i n { c ( x , y ) + D y ( z ) , c ( x , z ) + D z ( y ) } = m i n { 2 + 1 , 7 + 0 } D_x(z) = min\{c(x,y)+D_y(z), c(x,z)+D_z(y)\} = min\{2+1, 7+0\} Dx(z)=min{ c(x,y)+Dy(z),c(x,z)+Dz(y)}=min{ 2+1,7+0}
此时 D x ( z ) D_x(z) Dx(z)从7变成了3
x | y | z | |
---|---|---|---|
x | 0 | 2 | 3 |
y | 2 | 0 | 1 |
z | 7 | 1 | 0 |
DV算法通过异步性,就是t1时刻的转发表是根据邻居的t0时刻的转发表做决策的,不会引发LS那种在同时间更新转发表而导致的振荡。
经过更新之后得到最后y的转发表,并设此时的时间为t0
x | y | z | |
---|---|---|---|
x | 0 | 4 | 5 |
y | 4 | 0 | 1 |
z | 5 | 1 | 0 |
然后x到y的通路突然变到了60,那么y在t1时刻的转发表变成了
x | y | z | |
---|---|---|---|
x | 0 | 4 | 5 |
y | 60 | 0 | 1 |
z | 5 | 1 | 0 |
然后根据计算得到
x | y | z | |
---|---|---|---|
x | 0 | 4 | 5 |
y | 6 | 0 | 1 |
z | 5 | 1 | 0 |
可以看到x发给y的转发路径并没有更改,而是根据上个时间t0的表, 那么这么来看,可以发现y到x的最短路径可以从z出发,1+5=6,而事实上,z到x的这个5是根据y到x没有发生变化之前的数值。,因为z到x的最短路径为5是以y为中介点4+1=5计算来的,但是现在y到x不是4了,而是60.
这种情况称为选择环路
因为结点y计算出到x的新的最新开销, 4——>6, 所以z的表也需要更新,从5变成6+1 = 7。
然后y又收到了z的更新,从而又去更新到x的cost,以此反复需要经过44此迭代,直到z最终算出它经由y的路径大于50为止,这是z确定它到x的最短路径为它到x的直接连接。
可以直到关于链路增加的坏消息,DV算法传播得很慢。
如果z通过y路由到达目的地x,则z将通告y,它到x的距离为无穷大,那么y就不会试图从经过z路由到达x。
看看毒性逆转如何解决该问题
y的距离表指示了 D z ( x ) = i n f D_z(x) = inf Dz(x)=inf,当(x,y)链路的开销从4变为60时,在下一个时刻通知z, 即 D y ( x ) = 60 D_y(x)=60 Dy(x)=60,z收到更新后,将立刻到x的路径切换为直接路径,因为z不再经过y到达x, 那么此时z可以通知y D z ( x ) = 50 D_z(x) = 50 Dz(x)=50, 然后y便利用更新 D y ( x ) = 51 D_y(x)=51 Dy(x)=51,不过通知z是 D y ( x ) = i n f D_y(x)=inf Dy(x)=inf,但是毒性逆转没有解决一般的无穷计数问题,当涉及到3个或更多结点的环路无法被毒性逆转技术检测到。