计算机网络之链路状态路由选择算法(LS)

一、准备知识

        链路状态路路由选择算法是一种全局式路由选择算法。在此算法中,我们是假设所有网络拓扑和链路费用都是已知的(实践中通常是通过让每个结点向网络中所有其他节点广播链路状态分组来完成的)【OSPF协议】,通过节点广播使所有结点具备了该网络等同的完整视图。获得视图之后,通过LS算法可以计算出从源节点到网络任意结点的最低费用路径。
.
        我们下面给出的链路状态路由选择算法叫做Dijkstra算法,在了解此算法之前,我们首先明白以下几个记号:

D(v):表示从源节点到目标结点v的最低费用路径的费用
p(x):从源结点到目标节点v(最低费用路径)的前一个结点(v的邻居)
N':如果从源到v的最低费用路径已知,那么可以将v加入N'集合中
w:可被加入到N' 中结点,且节点的费用最小

.

二、LS算法原理

        我们通过图来形象化描述路由选择问题,G=(N,E)是一个有N个节点(代表路由器),E条边(代表链路)的图(代表网络拓扑)。每条链路上的数字代表此链路的费用,如下图所示:

                                图1-1 网络拓扑及链路费用图
.

        假设源节点为u,我们要找到从源节点到其他节点的最低消费路径,其算法如下:

1、初始化:
   N' = {u}                                                                                      D(u)已知,将u加入到N'集合中
   for all nodes for n                                                                    对于除u以外的所有节点n 
        if n is a neighbor of u                                                         如果n节点使u节点的相邻节点
            then D(n) = c(u,n)                                                        那么将n节点的D(n)为c(u,n)
        else D(n) = ∞                                                                      否则D(n)为无限大

2、循环阶段
    find w not in N' such that D(w) is a minimum                      找出不在N'中的w【最小的D(w)】
    add w to N'                                                                             将w添加到N'中
    update D(n) for each neighbor n of w and not in N'           更新与w节点相邻的节点n的D(n),且n不能在N'中
        D(n) = min(  D(n) , D(w)+c(w,n)  )                                将D(n)置为D(n)和D(w)+c(w,n)中的最小值
    until N' = N                                                                             直到N' = N是结束循环

.

                                                                表1-1 图1-1中网络运行的状态链路算法步骤

        ※ 初始化阶段:找出所有与u相邻的邻居节点v,x,w,使D(v)=2,D(x)=1,D(w)=5;其余与u不相邻的y,z节点,其链路费用D(y)=∞,D(z)=∞
        ※ 第一次循环:我们找出在初始化阶段结束时具有最低费用的节点x,其费用为1,将节点x加入到N'中,更新与x节点相邻且不在N'中的节点【其实就是v,w,y节点】的D(n)值,计算公式为D(n) = min( D(n) , D(x)+c(x,n) ),得D(v)=2,D(w)=4,D(y)=2
        ※ 第二次循环:我们找出在第一次循环阶段结束时具有最低费用的节点v和y,我们先将y加入到N',并更新w,z节点的值,得D(w)=3,D(z)=4
........
        直到所有节点都被加入到N'中,循环结束,得到最低费用路径:c(u,v)=2,,c(u,w)=3,c(u,x)=1,c(u,y)=2,c(u,z)=4
.

        当LS算法终止时,对于每个目标节点,我们都可以从表中找到最短费用路径的前一节点。而对于这个前一节点,又有最短路径的前一节点。依次类推,我们可以得到源节点到任意目标节点最低消费路径的完整路径:
        (u,v):u-v
        (u,w):u-x-y-w
        (u,x):u-x
        (u,y):u-x-y
        (u,z):u-x-y-u
        所以,对于u节点路由,通过存储到每个目的节点路由最低费用路径的下一跳节点即可,于是u节点路由表生成如下:

.

三、LS震荡现象

        假设:1、链路费用是该链路所承载的数据量;2、初始路由是B逆时针发送1个单位给A,D顺时针发送1个单位给A,C逆时针发送e个单位给B,B再给A
        #注:红色箭头表示B、C、D路由器会有持续的1个单位,e个单位、1个单位的数据要发往路由器A
.

        所以初始状态将会如下图3-1a)所示:

                                3-1a) 初始状态网络费用状态
.

        当再次运行LS算法之后,B、C、D路由都将会认为顺时针路由费用最低,那么将会产生如图3-1b)所示的费用信息:

                                3-1b)再次执行LS算法后的网络费用状态
.

        当记录如图3-1b)所示的费用信息之后,再次运行LS算法,B、C、D路由器又将会向逆时针方向交付分组,结果如图3-1c)所示:

                                3-1c)第三次执行LS算法后的网络费用状态
.

        再次运行LS算法之后,又变成顺时针,如图3-1d)所示:

                                3-1d)第三次执行LS算法后的网络费用状态
.

        这样的现象我们称之为拥塞敏感的路由选择震荡现象,这种现象很可能会导致如下现象:
        假设B路由现处于图3-1b)状态中,并将数据转发给C,C转发给D,但是此时D的路由表更新了,那么此时链路状态将会变成3-1c)的情况。D会将先前的数据又转发给C,C又将转发给B,如果此时路由表又开始更新的话,那么将会变成图3-1d)所示。如此一来,数据报将在B、C、D之间来回转发并且到达不了A,当数据的TTL=0时,数据报将会被丢弃
.

        针对这种现象,链路状态算法通产会采取某种机制:让每台路由器发送链路通告的时间随机化,以确保不是所有的路由器都同时运行LS算法(即每台路由器执行LS算法的实际是不同的)

转载于:https://blog.51cto.com/13547664/2161510

你可能感兴趣的:(计算机网络之链路状态路由选择算法(LS))