SPF计算过程
概述
讲完了LSDB我们来看SPF计算过程。这个过程会比较复杂,大家可以去反复的练习,学习一下:
- Phase 1:构建SPF树
- 根据Router-LSA和Network-LSA中的拓普信息,构建SPF树干。
- Phase 2:计算最优路由。
- 基于SPF树干和Router-LSA、Network-LSA的路由信息,计算最优路由。
1、首先SPF算法我们要根据Router-LSA和Network-LSA中的拓扑信息来去构建一个SPT树干。也就是说现在我相当于要种一颗树,对于这棵树来说它的枝干是最重要的,我把枝干搭起来之后,我再在上面去长叶子。
什么是叶子呢?
对于OSPF来说,它的路由就是挂在树干上的叶子,也就是第二个步骤,计算一个最优的路由。
2、基于SPF树干和Router-LSA和Network-LSA中的路由信息,来去计算一个最优路由。
这是SPF算法的两个过程:
- 首先计算拓扑信息,这个拓扑信息就类似于它的树干。
- 第二个,有了树干我再把路由叶子挂在这个树干上,并且在计算完成之后我必须要保证这颗拓扑树是无环的拓扑树。
实例
我们来看一下具体是怎么去构建SPF树的:
在我们的网络中每一台路由器都有自己的拓扑树,每一台路由器都认为自身是树的根节点。
这里就以RTA为例,RTA的拓扑树就认为我是根的开始,那么RTA就会作为根节点。然后去查看我自己的LSDB,并且是我自己生成的1类LSA。然后我就会看到两个拓扑信息,最后一个是路由信息,我们先不看,先要构建树的话我们要看拓扑信息。
这里的两个拓扑信息,一个是广播多路访问网络,一个是点对点,我们先来看广播多路访问网络:
Link ID:
10.1.12.2,这个是我们DR的接口IP。
Data:
10.1.12.1。这个是我连接DR的接口IP地址。这个时候我就知道了,我有个DR的接口IP地址是10.1.12.1。
然后第二个是我们的点对点网络:
Link id:
3.3.3.3,这个很明显是一个拓扑信息,我有一个邻居它的Router-id是3.3.3.3。
data:
我连接这个邻居的接口IP地址是10.1.13.1,是我自己的接口IP地址,这是两个需要去注意的拓扑信息。
然后我们把它加入到候选列表中。这个时候我们就可以画出一个节点,这个节点是DR,DR的接口IP地址是10.1.12.1。
我们可以看到这个点对点的网络其实就结束了,它再往下展开也没有什么可以展开的了。但是这个广播多路访问网络或者是NBMA网络肯定是可以往下展开的,因为我们不知道他具体的拓扑信息。
我们这里只知道DR,那么DROther是谁呢,我们不知道,因此我们还需要去查看对应的2类LSA。
那么2类LSA由谁去生成呢?就是10.1.12.2去生成。
我们可以查看DR的LSDB【display ospf lsdb network 10.1.12.2】,去查看DR的接口IP地址生成的LSA。
在这里我们根据2类LSA,我们可以发现这个广播多路访问和非广播多路访问网络中,只有两台路由器:
- 一条是RTB,2.2.2.2。
- 另外一台是RTA,1.1.1.1。
那么我们就大概知道了这个拓扑信息。实际上它们两个是直连的。我们可以认为中间的黄色路由器是一个伪节点,即一个虚拟的节点,不需要去管它。
此时RTA的拓扑信息我们都已经看完了,我们知道它有一个广播多路访问网络,或者是非广播多路访问网络。我们还知道它有一个点对点的邻居关系。
接着我们就要继续往下面去看,我们可以去看什么?
因为我们知道我有一个邻居是RTB,我们就可以【display ospf lsdb router 2.2.2.2】,这里就是去查看2.2.2.2这台路由器的router-LSA,即1类LSA。在这里我们可以看到有3条信息:
Link Type:
第一条信息是TransNet。
Link ID:
10.1.12.2。
Data:
10.1.12.2。
这里我们可以看到,我和DR相连的接口IP是相同的,证明2.2.2.2这个路由器就是DR。
这个是一个小技巧的判断,如果Link ID和data是一致的,就说明我们这个路由器在本网络中就是一个DR的角色。
我们可以发现这个网段在之前是一个RTA和RTB的邻居关系,这个类型描述的就是RTA和RTB的邻居关系,我们已经看过了,不用再看了。
接着我们发现一个新的Link id和data都为10.1.235.2,可以看到link id和我的data完全一致:
Link id:
DR的接口IP地址。
Data:
我与DR相连的接口IP地址。
两个人完全一致说明RTB这个路由器是一个DR,但是只能判断自己是DR,具体这个DR连接哪一个BDR,连接哪一个DRother我也不清楚。
我们先知道这个信息。然后接着往后看:
Link id:
4.4.4.4。
Data:
10.1.24.2。
Link Type:
点对点。说明我有一个点对点的邻居关系。
Metric:
48。
那么我们把后面两个有用的信息再去加入到候选列表中:
在这里这个候选列表中,我们首先第一个节点是RTB这台DR,即10.1.235.2,这里我们要计算它的开销。
- 这里从RTA到RTB的开销是1,再从RTB到MA网络的开销又是1,因此它的开销最后是等于2的。
- 然后第二个,4.4.4.4也是一致的,我们从RTA到RTB,它的一个开销是1,此时RTB到另一个邻居的关系,即4.4.4.4也就是RTD。此时RTB到我的点对点邻居4.4.4.4的开销是48,总共为49.
我们可以看一下,假如我们还有一个路由器是48,此时RTB到达4.4.4.4的开销是48。再去换算的话就是累加的,RTA到达RTB的开销是1,RTB到4.4.4.4的开销是48,加起来就是49了。
这个是一个简单的带宽的叠加,我们可以注意一下。
接着往后看,在之前我们针对于RTB的查看中,我们可以发现RTB在另外的一个网段也是一个DR的角色。
这个网段是10.1.235.2的这个网段,现在我们就想看一下,具体10.1.235.2它的DR和BDR、DRother的邻居关系是什么样的呢?
一样的,我们【display ospf lsdb network 10.1.235.2】,在这里我们可以看到在这一个MA网段中我们可以看到有3个邻居,RTB、RTC和RTE这三个邻居关系。
因此我们可以把网络画出来,除了RTB在这个网络中还连接了两台路由器,RTC和RTE,即3.3.3.3和5.5.5.5。
此时再去计算RTA到RTC和RTE的Metric值,这个计算是很简单的:
RTA到达RTB的Metric值是1,然后RTB到达其他的RTC、RTE的Metric值也是1,那么两个叠加起来就等于2了,这个是非常简单的。
然后我们再去注意一下,在这个候选列表的过程中我们发现之前有一个点对点的邻居关系。我们可以回顾一下:
在最早最早开始的时候,我们去查看RTA上自己生成的1类LSA的时候,我们可以看到RTA和RTC有一个点对点的邻居关系Metric是48。
然后经过我们继续往下去遍历,去计算的时候,我们发现针对于这个RTC,我们还有另外的路径可以走,相当于有两条路:
- 一种是通过P2P的路径去走。
- 一种是通过MA网络的路走过去。
通过MA网络的路走到RTC,它的Metric值明显要小,只有2。而通过点对点的路径走过去,要48的开销,比较大。
因此我们把这个候选节点给它删掉,因为它并不是一个最优的路径。
接着我们继续往后看,在RTB上面,其实我们已经把RTB所有的路由信息都看完了,接着就到了RTC,也就是3.3.3.3。
在RTC上我们继续来看一下:
- 我们可以看到它有两个路由信息10.1.235.2,这个路由信息其实就是下面这一块,这块我们已经检查过了,不用再去检查。
- 另外就是1.1.1.1,也就是RTC这个路由器,它和RTA之间还互连着。这个互连的邻居关系是点对点的。
其实这个链路类型的话,我们也在RTA的1类LSA中查看过了,也就是我们上面提到过的被删掉的候选路径。
接着我们来看RTE,最后一台路由器,为什么要看最后一台路由器呢?因为其实最开始的4.4.4.4我们已经有了相应的邻居关系,其实可以不用去查看了。
当然如果我们想去查看的话也可以查看一遍,当然去查看的话情况是和RTC一致的,我们会发现它里面的类型都已经在之前的遍历中已经描述过了,这是一个比较多余的动作,我们在这里因为时间关系省略了。
如果我们想去看一下RTD,即4.4.4.4的邻居的关系,包括网络的信息,也是可以的。
最后我们来看一下RTE,5.5.5.5这个路由器的1类LSA。
查看1类LSA:
- 首先我们的TransNet网络我们已经看过了,就不用再看了。
- 接着我们再来查看点对点网络,发现点对点网络有一个邻居关系是4.4.4.4。我们可以看到在图中可能是这样子,但是我们明显看到这已经是一个环路了。
我们之前就讲过了SPF树是一个无环的最短路径树,我们必须要保证它是没有环路的。
我们可以看一下,要保证没有环路是很简单的,我们选择从RTA到达4.4.4.4的最优路径就能保证无环了。
我们现在这里有两条路:
- RTA->RTB->4.4.4.4。
- RTA->RTB->5.5.5.5->4.4.4.4。
我们选择一个最优的路线走就可以了。通过这个图中很明显:
- 从RTA到达4.4.4.4,经过RTA->RTB->4.4.4.4这条路线的话,它的Metric值是1+48,最后等于49。
- 另外一条计算RTA->RTB->5.5.5.5->4.4.4.4,RTB到达多路访问网络,再通过5.5.5.5,再到4.4.4.4,这条路线的Metric的值明显是更大的。即1+1+48,很明显是等于50。
这里并不是一个最优的链路,因此我们就不去选它,最后我们把候选加入到总的列表的是,开销为49的路径。
计算最优路由
- 从根节点开始一次添加各节点LSA中的路由信息。
- 添加顺序为各节点加入SPF树的顺序。
最后我们从RTA出发,计算出了RTA自己的SPF树。然后根据这个SPF树,我们知道StubNet,我们把每一个StubNet都加入到树干上去,这个时候就相当于加入了不同的叶子。
然后我们再根据SPF树,去计算出到每一个叶子的Metric值,来进行一个累加和叠加,这个就是我们计算最优路径的一个过程。