一、前提知识

OSPF V2在发展的过程经过了很多次改进,其中比较重要的两个标准是RFC1583和RFC2328。这两个标准在计算路由的时候使用的计算方法不一样。华为的VRP默认是开启了兼容RFC1583的功能,即默认采用最小COST来选路,如果部分路由器关闭了RFC1583兼容能力,OSPF在选路的时候还会参考区域类型等因素(如它会优先经过普通区域而不是骨干区域)可能会导致网络产生环路。

本实验就主要用来理解“取消兼容RFC1583引发环路”这个知识点。

二、实验拓扑

三、基础配置

 --------------------------------------------------------------------------------------------
R1的配置
#
 sysname R1
#
router id 1.1.1.1 
#
interface GigabitEthernet0/0/0
 ip address 12.1.1.1 255.255.255.0 
#
interface LoopBack100
 ip address 100.100.100.100 255.255.255.255 
#
ospf 1 
 import-route direct type 1
 area 0.0.0.0 
  network 12.1.1.1 0.0.0.0 
#
---------------------------------------------------------------------------------------------
R2的配置
#
 sysname R2
#
router id 2.2.2.2 
#
interface GigabitEthernet0/0/0
 ip address 12.1.1.2 255.255.255.0 
#
interface GigabitEthernet0/0/1
 ip address 23.1.1.1 255.255.255.0 
#
ospf 1  
 area 0.0.0.0 
  network 12.1.1.2 0.0.0.0 
 area 0.0.0.1 
  network 23.1.1.1 0.0.0.0 
#
---------------------------------------------------------------------------------------------
R3的配置
#
 sysname R3
#
router id 3.3.3.3 
#
interface GigabitEthernet0/0/0
 ip address 23.1.1.2 255.255.255.0 
#
interface GigabitEthernet0/0/1
 ip address 34.1.1.1 255.255.255.0 
#
ospf 1 
 area 0.0.0.1 
  network 23.1.1.2 0.0.0.0 
  network 34.1.1.1 0.0.0.0 
#
---------------------------------------------------------------------------------------------
R4的配置
#
 sysname R4
#
router id 4.4.4.4 
#
interface GigabitEthernet0/0/0
 ip address 34.1.1.2 255.255.255.0 
#
interface LoopBack100
 ip address 100.100.100.100 255.255.255.255 
#
ospf 1 
 import-route direct type 1
 area 0.0.0.1 
  network 34.1.1.2 0.0.0.0 
#
---------------------------------------------------------------------------------------------

四、环路观察

1、修改配置生成环路

配置思路如下图黄底字所示R2上取消RFC1583兼容,R3上修改接口修改g0/0/1接口COST。

[R2]ospf

[R2-ospf-1]undo rfc1583 compatible

 

[R3]inter g0/0/1

[R3-GigabitEthernet0/0/1]ospf cost 10

2、观察环路的现象

在R2或R3上tracert 100.100.100.100,发现数据包在R2和R3之间打环

[R2]tracert 100.100.100.100
 traceroute to  100.100.100.100(100.100.100.100), max hops: 30 ,packet length: 40,press CTRL_C to break 
 1 23.1.1.2 80 ms  1 ms  20 ms 
 2 23.1.1.1 10 ms  1 ms  1 ms 
 3 23.1.1.2 20 ms  10 ms  20 ms 
 4 23.1.1.1 10 ms  10 ms  10 ms 
 5 23.1.1.2 30 ms  20 ms  20 ms 
 6 23.1.1.1 30 ms  10 ms  20 ms 
 7 23.1.1.2 20 ms  30 ms  20 ms 
 8 23.1.1.1 40 ms  20 ms  20 ms 
 9 23.1.1.2 30 ms  30 ms  40 ms 
10 23.1.1.1 30 ms  30 ms  20 ms 
11 23.1.1.2 40 ms  30 ms  * 
12 23.1.1.1 40 ms  30 ms  50 ms 
13 23.1.1.2 50 ms  40 ms  40 ms 
14 23.1.1.1 30 ms  50 ms  40 ms 
15 23.1.1.2 50 ms  40 ms  60 ms 
16 23.1.1.1 40 ms  40 ms  40 ms 
17 23.1.1.2 50 ms  60 ms  60 ms 
18 23.1.1.1 50 ms  40 ms  50 ms 
19 23.1.1.2 60 ms  70 ms  * 
20 23.1.1.1 50 ms  70 ms  50 ms 
21 23.1.1.2 60 ms  70 ms  60 ms 
22 23.1.1.1 60 ms  110 ms  60 ms 
23 23.1.1.2 60 ms  80 ms  70 ms 
24 23.1.1.1 60 ms  60 ms  70 ms 
25 23.1.1.2 70 ms  90 ms  80 ms 
26 23.1.1.1 70 ms  70 ms  70 ms 
27 23.1.1.2 90 ms  70 ms  70 ms 
28 23.1.1.1 70 ms  80 ms  70 ms 
29 23.1.1.2 80 ms  90 ms  * 
30 23.1.1.1 70 ms  90 ms  90 ms 
[R2]

五、环路生成原因分析

先来观察下路由的变化,取消引发环路的配置

[R2-ospf-1]rfc1583 compatible

[R2-ospf-1]dis this

ospf 1 
 area 0.0.0.0 
  network 12.1.1.2 0.0.0.0 
 area 0.0.0.1 
  network 23.1.1.1 0.0.0.0

[R3-GigabitEthernet0/0/1]undo ospf cost

即默认配置时,R2和R3针对100.100.100.100的路由分别如下

 

[R2]dis ip routing-table 100.100.100.100
------------------------------------------------------------------------------
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

100.100.100.100/32  O_ASE   150  2           D   12.1.1.1        GigabitEthernet0/0/0


[R3]dis ip routing-table 100.100.100.100
------------------------------------------------------------------------------
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

100.100.100.100/32  O_ASE   150  2           D   34.1.1.2        GigabitEthernet0/0/1 

可见,R2去100.100.100.100的下一跳是R1,R3的下一跳是R4.路由背道而驰,南辕北辙是不会环路的。

 

现在我们重配置下R3接口开销,再看下路由表

[R3]inter g0/0/1

[R3-GigabitEthernet0/0/1]ospf cost 10

 

[R2]dis ip routing-table 100.100.100.100
------------------------------------------------------------------------------
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

100.100.100.100/32  O_ASE   150  2           D   12.1.1.1        GigabitEthernet0/0/0


[R3]dis ip routing-table 100.100.100.100
------------------------------------------------------------------------------
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

100.100.100.100/32  O_ASE   150  3           D   23.1.1.1        GigabitEthernet0/0/0

这时发现R3的路由转向了(原因是通过R4去目的地的COST变大了,总和为11,指向了R2(COST是3,R2不变继续指向R1.此时两个路由器的路由是同向的,也不会环路。

 

最后取消上R2的RFC1583兼容,让R2以RFC2328来选路,再查看下路由表

[R2]ospf

[R2-ospf-1]undo rfc1583 compatible

 

[R2]dis ip routing-table 100.100.100.100
------------------------------------------------------------------------------
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

100.100.100.100/32  O_ASE   150  12          D   23.1.1.2        GigabitEthernet0/0/1


[R3]dis ip routing-table 100.100.100.100
------------------------------------------------------------------------------

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

100.100.100.100/32  O_ASE   150            D   23.1.1.1        GigabitEthernet0/0/0

 

可以发现,此次配置引发了R2路由表的变更。R2舍近求远放弃了通过R1去目的地的捷径(COST为2),而选择和通过R3去往目的地(COST为12).因为R3的路由表是以R2为下一跳的,此时两个路由器的路由表互指对方为下一跳,悲剧就发生了.

 

现在我们来反过来问一下:为何R2要舍近求远呢?

因为RFC2328在选路时,不是最优先考虑COST的,是要考虑路由的类型及区域的类型的,比如它认为经过经过普通区域的路由好于经过骨干区域的路由。现在R2有两条路,一条经过普通区域1到100.100.100.100,COST是12,另一条是经过骨干区域0去100.100.100.100,COST是2.但是RFC2328就忽略COST的大小选前者,如果开了RFC1583兼容,就会考虑COST小的后者。(结尾有详细参考参考说明)

六、环路规避


这个环路因不同路由器配置了不同的OSPF选路标准造成,规避方法是要保证所有路由器的标准一样,要关RFC1583兼容就全关,要开就全开。华为默认是所有路由器都开了1583兼容的。

 

七、扩展学习(RFC1583 RFC2328选路细节)

通过同一个OSPF进程内的LSA计算的相同路由条目:

1. Intra-area 的路由优于 Inter-area 

2. Inter-area 的路由优于 external-area 

3. 对于external-area 路由,类型1方式记录路由开销的优于类型2

4. 对于external-area 路由,且开销类型相同

  1)同为外部类型2,重分布时携带M小的最优

  2-------------------------------------------------------------------

        定义两种开销值:

        x=内部设备到forwarding-address的开销;FA0时,X为到ASBR的开销

        y=外部路由重分发进来时LSA携带的开销值

      ------------------------------------------------------------------

      此时需要分选择标准:

       * RFC1583标准:

         ATYPE-1路由比对:

            X+Y值最小路由

         BTYPE-2路由比对:

            X值最小路由

        之后就没有成型的规范了。基本实现应该是负载

       * RFC2328标准:

         直接比对X路由类型

          (1).backbone areaintra-area路由最优先

          (2).intra-area backbone路由与inter-area路由优先级相同

           如果无法比对出结果,则等同RFC1583继续比对

           如果多条都是最小开销,选择学习到的这些LSA的区域里,选择最大area-ID里面的LSA使用

           之后没有任何成型规范。所以,如果ID(associated area-ID)相同,基本实现应该是负载

PS:目前思科的算法,依然是使用RFC1583;其进程命令compatible rfc1583,也只是在对OSPF汇总的Metric取值上做标准调整;应该是多RFC标准混用。华为,Juniper设备也算法调整命令,而且作用在于修改此处算法标准。

5. 如果多external-area LSA参数相同(same destination,cost and non-zero forwarding-address

   此时分情况讨论:

   A:同类外部LSA(都是同普通区域同类外部或都是同NSSA区域同类外部)(参考RFC1583-12.4.5RFC2328-12.4.4.1)

      ASBR之间相互可达。RID最大的ASBR重分发路由优,其他ASBR都将自己的外部LSA置为超时失效状态,从LSDB清除掉。

      如失去比自己RID大的ASBR的联系,则重新产生外部LSA

      另一种情况,NSSA T7-LSA生成T5-LSA.如果多设备都是NSSA ABR,且NSSA区域内相互可达。则只有RID最高的NSSA ABR会执行T7-2-T5

   B:不同类外部LSA

      此时也要分选择标准:

    * RFC3101标准:

      1. P-bit功能的TYPE-7 LSA

      2. type-5 LSA

      3. RID最高的LSA

    * RFC1587标准:

      1. type 5 LSA

      2. P-bit功能的type 7 LSA

      3. 其他的 type-7 LSA

PS:目前,不同厂商使用标准都不一样,思科设备在IOS 15.1(2)S前使用的是RFC1587标准,之后默认使用RFC3101标准。OSPF进程配置环境下,通过compatible rfc1587命令可修改。