深入探讨OSPF环路问题(一)

TECH_LAB_666 2018-02-28 05:18:39
前言:

OSPF是我们每一个网络工程师都非常熟悉的一个IGP协议,因为其自身的优点(配置简单,分层设计,网络类型丰富等)使得OSPF在现有的网络中部署的非常之多,各种讨论OSPF的文章及案例也层出不穷,所以我就在想,如果我要以OSPF为题写一篇技术型文章,到底写什么样的内容才会让你们有观看的***,绞尽脑汁最后把思路聚焦于环路的问题上。

我们都知道OSPF是基于SPF算法的动态路由协议,SPF算法有一个最大的优点是可以保证网络的绝对无环,但因为OSPF采用的是分区域设计,每一个区域都单独的维护各自的数据库,执行各自的SPF算法,所以SPF可以保证OSPF无环的前提条件是在同一个区域内,即在同一个区域内,OSPF构建的网络是一个绝对无环的网络。但OSPF区域间信息的传递是依靠3 类lsa,而3类lsa里面携带的其实就是路由,所以我们说OSPF在区域间是存在失量形为(直接传递路由的形为称为失量形为)的,因为失量形为的存在,也就导致了OSPF的环路问题。

接下来,我会带领大家进入OSPF环路的世界,也会让大家见识到当初设计OSPF协议的工程师是如何费尽心思的解决OSPF环路问题的。



环路场景:



场景一:OSPF区域间环路

我们都知道,OSPF在设计区域结构的时候有两个非常重要的规则:

规则一、所有非骨干区域都必须与骨干区域相连

规则二、骨干区域不能被分割

因为有这两个规则的存在,说实话大大的限制了OSPF在部署时的灵活性,那协议开发者为什么要设计这两个规则出来呢? 如果没有这两个规则又会带来什么问题?带着这此问题,我们来看两个拓扑:




如图一所示(假定没有所有非骨干区域都必须与骨干区域相连这条规则):

1、R6上有一个loopback接口,地址为:6.6.6.6/32,宣告进了Area 4.

2、R6会产生关于6.6.6.6的1类lsa,类型为stub,并传递给R2。

3、因为R2位于区域边界,连接两个不同的区域,所以会把1类lsa中描述路由信息的stub转换为3类lsa,并在其它区域传递。

4、在图一中,R1;R3;R4也都位于区域边界,所以当R1收到这份3类lsa时,会传递给R3,R3此时又传递给R7,R7传递给R4,R4同理也会传递给R2。

5、此时R2会认为去往6.6.6.6这个网段有两条路径可达,一条是直接走R6,另一条是走R4,如果R2选择了R4去往6.6.6.6,那就产生了R2-R4-R7-R3-R1-R2这个环路。

总结:因为有了以上环路的风险,所以开发者在设计OSPF时必须解决这个问题,也就有了规则一(所有非骨干区域都必须与骨干区域相连),那协议的设计者是如何保证规则一不被打破的呢? 要明白这个问题,首先需要明白一个非常重要的概念:ABR(区域边界路由器),需要满足以下三个条件才能成为一台真正意义上的ABR:

1、至少连接两个区域

2、连接的区域中有一个是区域零(骨干区域)

3、在区域零中至少有一个活跃的邻居

而定义ABR的作用就在于:只有ABR才能产生3类lsa,如图一所示,R3与R4都连接了两个区域,但他们却都不是ABR(不满足第2第3条),也就是说当R1这台ABR把描述6.6.6.6这条路由的3类LSA传递给R3时,因为R3不是ABR,所以不会把该条3类LSA传递给R7,R4在区域3中也就收不到这份3类lsa,同理R2也不会从区域2中收到关于6.6.6.6网段的3类LSA,也就防止了环路的产生。

接下来我们来研究一下第二个规则的必要性:



如图二所示:(假定骨干区域能被分割)

1、R2上有一个loopback接口,地址为2.2.2.2/32,宣告进了区域3。

2、R2作为区域2的ABR,所以会向区域2内产生关于2.2.2.2网段的3类LSA

3、R4从区域2中学习到此条3类LSA,因为R4也是一台ABR,所以R4也会向区域0中产生关于2.2.2.2网段的3类LSA。

4、R3从区域0中学习到此条3类LSA,因为R3也是一台ABR,所以R3也会向区域1中产生关于2.2.2.2网段的3类LSA。

5、R1从区域1中学习到此条3类LSA,因为R1也是一台ABR,所以R1也会向区域0中产生关于2.2.2.2网段的3类LSA。

6、此时R2学习到了两条关于2.2.2.2的路由,一条是自己产生的,另一条是R1发过来的,当R2自己产生的2.2.2.2不可达时,就会优选从R1过来的路由,所以就会导致R2访问2.2.2.2时出现R2-R1-R3-R4-R2这样一条环路。

总结:有了环路,一定要想办法规避,所以针对图二的环路问题,协议开发者制定了规则二(骨干区域不能被分割),为了保证规则二不会被打破,OSPF规定:从非骨干区域收到的3类LSA,ABR能接收但不会使用这条3类LSA(此条规定也可以称为OSPF的水平分割原则)。所以在上述的第三步中,R4作为一台ABR,从非骨干区域(Area 2)中收到一条3类LSA,R4是不会处理的(不会参与路由计算,不会泛洪),在上图中R4与R3都无法访问2.2.2.2网段,从而避免了环路。



场景二:OSPF外部路由引起的环路

OSPF的路由可以分为两种,一种是内部路由,由1类,2类,3类LSA形成的路由都是内部路由,即network产生的路由。另外一种是外部路由,由5类,7类LSA形成的称为外部路由,即import产生的路由。内部路由的环路问题可以通过场景一的内容解决,那外部路由是否会有环路问题?以及我们的解决办法又是什么呢? 在正式讲外部路由引起的环路问题时,需要先科普一下OSPF的一些相关知识点:

1、特殊区域:OSPF为了能适应各种环境及路由器的组网,开发了特殊区域这一概念,OSPF的特殊区域可分为两种类型:

A、stub区域:stub区域拒绝5类lsa进入,即拒绝外部路由进入本区域,也不能在本区域下面引入外部路由,区域内的路由器通过ABR下发的默认路由来访问外部网络。

B、NSSA区域:这是一种特殊的stub区域,它保持了stub区域拒绝5类lsa的特点,但是它能允许在该区域引入外部路由,外部路由以7类lsa的形式存在于本区域中,nssa区域的ABR会向其它区域把此7类LSA翻译(转换)成5类LSA(俗称7转5),使其它区域的路由器可以访问此外部路由。

2、外部路由类型:ospf外部路由有两种类型

A、Type 1:也称为E1。路由器在计算type1路由的Cost时,会把此路由的外部cost(ASBR到达目标网段的cost)与内部cost(本路由器到达ASBR的cost)相加。

B、Type 2:也称为E2,引入路由时默认为此类型,路由器在计算type2路由的cost时,只计算外部cost,而忽略内部cost。但当一台路由器收到两条相同的type2路由时,首先会对比外部cost的值,如果一样再对比内部cost值。

3、FA地址:FA的全称为forwarding address,是5类lsa与7类lsa中的一个字段,FA字段可以影响路由器的选路,所以它的作用是用于解决次优与环路。(FA作为OSPF协议中的一个重点与难点,要讲的东西可以有很多,因为本文章我们主要讲解环路,所以FA只会以结论的形式引入)。

4、外部路由的选路问题:大致可分为两种情况

情况一:外部路由中未包含FA地址:此时路由器计算去往ASBR的路径。

情况二:外部路由中包含FA地址:此时路由器直接计算去往FA的路径。

回顾了以上知识点后,我们来看这样一张拓扑图:



如图三所示:区域1为NSSA区域,各链路的cost如图所示:

1、在R1上把1.1.1.1引入OSPF,此时R1会产生关于1.1.1.1网段的7类LSA。

2、R2与R3作为Area1的ABR,都有责任进行7转5的动作,但OSPF规定默认情况下只有R-ID大的才能进行7转5,R2与R3的R-ID如图所示,即R3会进行7转5的动作,由R3产生关于1.1.1.1的5类lsa,并在Area0中泛洪。

3、R4从Area 0中收到此5lsa,并泛洪给R2。

4、我们来分析R4如何去往1.1.1.1,此时会有两种情况:

情况一:R4收到的这条5类LSA中FA地址为0.0.0.0

根据OSPF外部路由的选路规则,当5类LSA中FA地址为0时,则计算去往ASBR的路径。

1、此时产生此条5类LSA的是R3,所以R3为ASBR,R4可直接通过Area 0到达ASBR(R3)。

2、R3是通过Area 1学习到的1.1.1.1网段,所以R3可通过Area1去往1.1.1.1,即把数据包发送给R2。

3、此时R2可通过两条LSA学习到1.1.1.1的路由

第一条:R1产生的7类LSA。类型为Type2,外部Cost为1(外部cost默认都为1),内部cost为10(内部cost,本路由器到ASBR的cost)

第二条:R3产生的5类LSA,由R4泛洪给R2(参考上面第二步),类型为Type 2,外部Cost为1,内部Cost为2(R2-R4-R3的cost)

4、R2执行选路规则,两条LSA同为Type2类型,先对比外部cost值,都为1,然后对比内部cost值,第一条为10,第二条为2,所以R2会优选第二条(R3产生的5类lsa),即会把数据包转发给R4。

5、环路形成:R4-R3-R2-R4

情况二:R4收到的这条5类LSA中FA地址为10.1.12.1(R1与R2的互联接口)

根据OSPF外部路由的选路规则,当5类LSA中FA地址为非0时,直接计算去往FA地址的路径。

1、在此图中R4收到的5类LSA中FA地址为10.1.12.1,关于10.1.12.1这个地址,R4是通过3类LSA学习到的(10.1.12.1位于Area 1中,R2与R3都为ABR,都会产生关于10.1.12.0网段的3类lsa),R4此时其实可以收到两条10.1.12.0的3类LSA,一条R2产生,一条R3产生,通过计算cost后发现,选择R2去往10.1.12.1更近,所以R4会把数据包转发给R2。

2、R2同样执行选路计算,计算去往FA地址10.1.12.1的路径,此地址是R2的一个直连路由,所以R2会把数据包转发给R1。

3、此时全程的路径为:R4-R2-R1,解决了环路问题。

总结:OSPF针对外部路由可以通过FA地址来防环,7类LSA中一般情况下都会携带FA地址,在执行7转5后FA地址会默认保留,所以在默认情况下面不会出现环路问题。如果我们在做7转5时把FA地址抵制了,就有可能出现上述的环路问题。5类LSA FA地址的填充需要满足一些条件,有机会我再整理一篇文章来单独讲FA地址。



场景三:OSPF Vlink导致的环路问题

我们在场景一的时候讨论过设计区域的两个规则,因为有这两个规则的存在,大大降低了网络部署的灵活性,为了解决这个灵活性问题协议开发者开发了Vlink这个技术。

使用Vlink技术可以很好的解决区域被分割的问题,但Vlink却是一把双刃剑,配置好了可以修复区域分割,但配置错了的话也会导致环路,接下来我们就一起来讨论一下Vlink导致环路的问题。






如图四所示:此拓扑中Area 2没有与Area 0相连,打破了OSPF区域设计时所有非骨干区域都需要与骨干区域相连的规则,所以在正常情况下,区域0与区域2中的路由器是不能互访的,为了能使这两个区域互访,我们可以在R2与R4之间建立一条Vlink,使得区域2能使用R2与R4之间的这条虚链路连接到区域0,此时我们一步一步的分析下这个拓扑所产生的问题。

1,R5上有一个loopback接口,地址为5.5.5.5/32,宣告进了区域2。

2,R4作为区域2中的ABR(R2与R4之间的Vlink建立起来后,R4就成为了一台ABR),会产生关于5.5.5.5网段的3类LSA,并向区域1与区域0泛洪。

3,此时区域1中的关于5.5.5.5网段的这条3类LSA会传递给R3,R3在区域1中传递给R2。

4,区域0中的关于5.5.5.5网段的这条3类LSA会通过Vlink传递给R2(Vlink使用单播传递LSA),R2经区域0传递给R1,R1经区域0传递给R3(注意R2并不能直接把这条3类LSA传递给R3,因为R2与R3之间的链路在区域1中)。

5,这个时候我们来分析下R3的情况,经第三步与第四步可得知,R3能收到两条关于5.5.5.5网段的3类LSA:

A:由R4产生,在区域0中由R4-R2-R1-R3传递过来

B:由R4产生,在区域1中由R4-R3传递过来

6,根据场景一中所讲的规定,从非骨干区域收到的3类LSA,ABR能接收但不会使用这条3类LSA,即R3虽然能收到两条关于5.5.5.5网段的3类LSA,但它能使用的只有第一条,即由区域0传递过来的这条3类LSA。

7,因为只能使用R1传递给R3的3类LSA,所以当R3要访问5.5.5.5时,会先把数据包转发给R1,R1转发给R2,R2知道去往5.5.5.5的数据包是要转发到R4的,但R2去往R4只能经过区域1传递给R3,所以此时产生了R3-R2-R1-R3的环路。

总结:在华为设备上此环路的解决办法为修改Vlink的邻居建立路由器,在R3与R4之间配置Vlink就可以避免环路。

在思科设备上,除了修改建立邻居的路由器外,还可以通过no capability transit(默认启用)命令来解决此环路。

no capability transit命令解释:

首先得明白transit,transit是指Vlink所建立的区域,在上图中区域1为transit区域。使能这条命令后,当R3在区域0中收到一条3类lsa时,发现此3类LSA的ADV(通知者)为R4,并且R4在transit区域中可达,此时R3会计算从transit区域中去往此ADV-Router的Cost,如果计算结果为经过transit区域去往R4要比走区域0近,那就会选择从transit区域去往目标。如图四所示,R3此时会选择走transit区域去往目标网段,还不走区域0,从而避免了环路。

…………

篇幅有限,未完待续!

...全文
2060 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
豆子哒哒哒 2019-09-22
  • 打赏
  • 举报
回复
后边没图了,写的很好

2,076

社区成员

发帖
与我相关
我的任务
社区描述
华为认证、思科认证、项目管理、计算机等级考试、Linux认证、微软认证、H3C认证等IT认证相关的技术交流空间。
社区管理员
  • IT培训
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧