目的:决定从源到目的地通过网络的“好的路径”(一般指最小费用的路径)。

根据算法是静态的还是动态的进行分类:

静态:

①路由随时间缓慢变化。

②手工配置

动态:

①路由更快地变化(周期的更新,适应链路费用和网络拓扑变化)。

根据算法是全局式的还是分散式的来加以区分:

LS(Link State,链路状态算法)

全局的

所有路由器具有完全的拓扑、链路费用信息。

具有全局状态信息的算法常被称作链路状态算法,因为该算法必须知道网络中每条链路的费用。

使用Dijkstra算法。

所有节点知道网络拓扑、链路费用

1)经“链路状态广播”完成

2)所有节点具有相同信息

从一个节点到所有其他节点计算最低费用路径

1)给出对这些节点的转发表

k次迭代后,得到k个目的地的最低费用路径。

算法:

①维护一个集合N',初始时将起点u放入其中,维护一个数组D,其中D(v)代表u到v的距离,初始时,所以与u相邻的节点的数组D赋为u到其的距离,非相邻结点赋为∞。

②找出不在集合N'中的w且使得D(w)最小,将w加入集合N’。

③对于w的所有不在N’中的邻居v,更新D(v),即D(v)=min(D(v), D(w)+c(w,v))。知道所有节点都在N’中

具体例子1

ps:p(v)从源到v沿着当前最低费用路径的前一节点

解题步骤:

步骤 N' D(v),p(v) D(w),p(w) D(x),p(x) D(y),p(y) D(z),p(z)
0 u 2,u 5,u 1,u
1 ux 2,u 4,x 2,x
2 uxy 2,u 3,y 4,y
3 uxyv 3,y 4,y
4 uxyvw 4,y
5 uxyvwz

具体例子2

计算从x到所有网络结点的最短路径。

解题步骤:

步骤 N’ D(t),p(t) D(u),p(u) D(v),p(v) D(w),p(w) D(y),p(y) D(z),p(z)
0 x 3,x 6,x 6,x 8,x
1 xv 7,v 6,v 6,x 6,x 8,x
2 xvu 7,v 6,x 6,x 8,x
3 xvuw 7,v 6,x 8,x
4 xvuwy 7,v 8,x
5 xvuwyt 8,x
6 xvuwytz

算法复杂性:n个节点

1)每次迭代:需要检查不在N’中的所有节点w

2)n(n+1)/2对比:O(n^2)

3)更有效的实现是可能的:O(nlogn)

可能震荡(由于链路流量变化,导致链路费用变化,所以需要重计算)

DV(Distance-Vector,距离矢量算法)

分散的

一开始,路由仅有与其直接相连链路的费用信息。

计算的迭代过程,与邻居交换信息。

之所以叫做DV算法,是因为每个结点维护到网络中所有其他结点的费用估计的向量。

使用Bellman-Ford方程(动态规划)

定义:dx(y)代表从x到y最低费用路径的费用;c(x,v)是x到直接邻居v的费用;minv对x的所有直接邻居取最小值。

dx(y)=minv{c(x,v)+dv(y)}

简单例子:

已知dv(z)=5,dx(z)=3,dw(z)=3

基本思想:

1)每个节点周期性的发送它自己的距离矢量DV给邻居。

2)当节点x接受到来自邻居的新DV估计,它使用B-F方程更新其自己的DV:

Dx(y) minv{c(x,v) + Dv(y)}    for each node y N

在规模较小、正常的条件下,估计值Dx(y)收敛在实际最小费用dx(y)。

异步迭代:

每次本地迭代由下列引起:

1)本地链路费用改变c(x,v)

2)DV从邻居更新报文d(v,y)

分布式:

1)每个节点仅当其DV改变时通知邻居。

2)如果必要,邻居则通知它们的邻居

每个节点的流程如下:

具体例子

假设每个结点初始时知道到它的每个邻居的费用。考虑距离向量算法,并显示在结点z中的距离表表项。

无穷计算问题

例子阐述现象

只关注y与z到目的地x的距离表中的有关表项。

在链路变化之前Dy(x)=4,Dy(z)=1,Dz(y)=1,Dz(x)=5。

若t0时刻,y检测到费用从4变为60,则Dy(x)=min{60+0,1+5}=6。(其实明显不存在1+5这条路,但是结点x仅有的信息是,它到x的直接费用是60,且z上次告诉它,z能以5费用到达x)。

这样出现了一个问题,即选择环路。y到达x,y通过路由z,z又通过路由y。这样就像一个黑洞,目的地为x的分组会在y和z结点间反复。

t1时刻,Dy(x)更新,所以又通知给z,则Dz(x)=min{50+0,1+6}=7。此时又会通知y,就这样类似进行下去。直到z最终算出它经过y的路径费用>50为止。这样才知道z直接到x是最低费用,y经过z再到x是最低费用。所以坏消息传播得很慢。

毒性逆转

思想:如果z通过y路由选择到目的地x,则z将通告y,z到x的距离是无穷大。即z将通告y Dz(x)=∞(即使实际上Dz(x)不是∞)。这样的话就可以保证只要z继续经y路由到x,则y就永远不会试图经由z到x(因为在其认知里,Dz(x)=∞)

例子阐述现象:

继续上图中的例子进行阐述。

由于使用毒性逆转,则对于y来说,Dz(x)=∞,所以t0时刻,Dy(x)=min{60+0,1+∞}=60。

通知给z,Dz(x)=min{50+0,1+60}=50,通知给y,则Dy(x)=min{60+0,1+50}=51。此时y又通知z Dy(x)=∞。以此来毒化了从z到x的逆向路径(比如z直接到y,y再经由z到x)。

然而当涉及到3个或更多结点的环路将无法用毒性逆转技术检测到。

那么可以定义最大度量来解决无穷计数的问题。

比如定义一个最大的有效费用值,如15跳步,16跳步表示∞。

LS与DV算法的比较

报文复杂性

LS:对n个节点,E条链路,发送O(nE)报文。

DV:仅在邻居之间交换(收敛时间变化)

收敛速度

LS:O(n^2)算法要求O(nE)报文(可能具有振荡)

DV:收敛时间变化(可能有选路环路,计数到无穷问题)

健壮性

若路由器异常,将发生什么现象

LS:①节点可能通告不正确的链路费用。②每个节点仅计算自己的表。

意味着其路由计算在某种程度上是分离的,提供了一定程度的健壮性。

DV:①DV节点通告不正确的路径费用。②每个节点能由其他人使用(差错通过网络传播)

因此DV算法中一个不正确的结点计算值可能扩散到整个网络。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐