网络
运行链路状态路由协议的路由器是交换链路状态信息。所有路由器都会生成自己直连接口状态的链路信息,并通告出去。路由器把在网络中收到的链路状态信息存入 LSDB(链路状态数据库),LSDB 是对整个网络拓扑结构和网段信息的汇总,同步完 LSDB 后,所有路由器对网络的认识是一样的。然后,所有路由器开始单独使用 SPF( Shortest Path First )算法进行计算,得到一棵无环的最短路径树,是以自己为根,到达全网络的路径,最后把产生的路由加载到路由表中。

LSA - 图1

LSA 简介

OSPF 是典型的链路状态路由协议,使用 LSA( Link State Advertisement ,链路状态通告)来装载和传输链路状态信息。LSA 需要描述邻接路由器信息、直连链路信息、跨区域信息等,所以定义了多种类型的 LSA 。
LSA - 图2
还有一些类型的 LSA 很少使用:
第六类 LSA :在 MOSPF 协议中使用的组播 LSA 。
第八类 LSA :在 OSPF 域内传播 BGP 属性时使用的外部属性 LSA 。
第九类 LSA :本地链路范围的透明 LSA 。
第十类 LSA :区域范围内的透明 LSA 。
第十一类 LSA :AS 范围内的透明 LSA 。
内部路由器( Internal Router ,IR ):所有接口都在同一个 OSPF 区域内的路由器。
区域边界路由器( Area Border Router ,ABR ):接入多个区域的路由器,并非所有接入多个区域的路由器都是 ABR 。它至少有一个接口在 Area0 中,同时还有其它接口在其它区域中。ABR 负责在区域之间传递路由信息,因此必须连接到 Area0 ,同时连接着其它区域。
骨干路由器( Backbone Router ,BR ):至少有一个接口接入 Area0 的路由器,那它就是一台骨干路由器,另外 ABR 也是骨干路由器。
AS 边界路由器( AS Boundary Router ,ASBR ):工作在 OSPF 自治系统( Autonomous System ,AS )边界的路由器。ASBR 将 OSPF 域外的路由引入到本域,外部路由在整个 OSPF 域内传递。并不是同时运行多种路由协议的路由器就一定是 ASBR ,ASBR 一定是将外部路由重分发到 OSPF ,或者执行了路由重分发操作的路由器。
LSA - 图3

LSA 头部

LSU 报文用于链路状态更新,这个报文包含一个或多个 LSA ,而且是完整的 LSA 。虽然 LSA 有多种类型,但是这些 LSA 使用相同的 LSA 头部
LSA - 图4
LSA 头部一共 20 字节。
LSA - 图5
链路状态老化时间( Link-State Age ):表示 LSA 的老化时间,也就是说,LSA 存在了多长时间,单位是秒。路由器生成 LSA 时,这个值为 0 ,随着 LSA 在网络中传输,老化时间逐渐累加。当 LSA 存储到路由器的 LSDB 后,LSA 的老化时间也在递增,当到达 MaxAge(最大老化时间)时,这个 LSA 不在用于路由计算。
选项( Options ):每一比特位对应 OSPF 的某种特性。
链路状态类型( Link-State Type ):表示 LSA 的类型。OSPF 有多种类型的 LSA ,每个 LSA 类型都由对应的类型编号。
链路状态 ID( Link-State ID ):LSA 的标识。不同的 LSA 类型,字段的含义不同。
通告路由器( Advertising Router ):生成这条 LSA 的路由器的 Router-ID 。
链路状态序列号( Link-State Sequence Number ):表示这个 LSA 的序列号,用于判断 LSA 的新旧或重复。
链路状态校验和( Link-State Checksum ):校验和。
长度( Length ):LSA 的总字节长度。
每个 LSA 头部的 链路状态类型链路状态 ID通告路由器 这三个字段唯一标识一个 LSA 。如果出现三个字段都相同的多条 LSA ,还可以根据 链路状态老化时间链路状态序列号校验和 字段来判断 LSA 的新旧。

LSA 详解

LSA - 图6
图中网络部署了 OSPF ,R1 、R2 、R3 都连接在一台二层交换机上,三台路由器的 G0/0 接口都激活了 OSPF ,并且都属于 Area0 。通过设置,R3 的 G0/0 接口成为 DR 。R1 的 G0/1 连接的网段和 R2 的 G0/1 连接网段也激活了 OSPF ,也属于 Area0 。R3 和 R4 使用 Serial1/0 接口连接,接口采用 PPP 封装,激活了 OSPF ,且属于 Area1 。R4 还连接着外部网络,连接的接口没激活 OSPF ,并将外部路由引入到了 OSPF 域。R1 的 Router-ID 是 1.1.1.1 ,R2 的 Router-ID 是 2.2.2.2 ,R3 的 Router-ID 是 3.3.3.3 ,R4 的 Router-ID 是 4.4.4.4 。
每种 LSA 都有各自的功能,Type-1 LSA( Router LSA ,路由器 LSA )和 Type-2 LSA( Network LSA ,网络 LSA )是描述的区域内的网络拓扑和 IP 网段信息,只能在区域内泛洪。有了这两种 LSA ,区域内的路由器就可以计算出区域内各个网段的路由,这些路由叫做区域内部路由。Type-3 LSA( Network Summary LSA ,网络汇总 LSA )用于描述一个区域内的路由信息,并在其它区域内传递。也就是说,这种 LSA 用来告诉其它区域到达生成 LSA 这个区域的路由,这些路由叫做区域间路由。Type-4 LSA( ASBR Summary LSA ,ASBR 汇总 LSA ),用于描述 ASBR 的 Router-ID 。它不会主动生成,触发条件是 ABR 收到一个 Type-5 LSA ,目的是让区域内的路由器知道如何到达 ASBR 。Type-5 LSA( AS External LSA ,AS 外部 LSA )用来描述 OSPF 域外的路由,它一旦生成,会在整个 OSPF 域内扩散。OSPF 域外的路由信息来源,通常是静态路由或其它路由协议的路由。

1、Type-1 LSA

每一台运行 OSPF 的路由器都会生成 Type-1 LSA ,这个 LSA 描述了路由器的直连接口状态和接口 Cost ,同一个区域的接口共用一个 Type-1 LSA 描述。当路由器的多个接口属于不同区域,就分别为每个区域单独生成一个 Type-1 LSA ,LSA 只描述各种区域的接口信息。
LSA - 图7
Type-1 LSA 中,LSA 头部的 链路状态类型 字段值为 1 ,链路状态 ID 字段值是生成 Type-1 LSA 的路由器的 Router-ID 。
V 位( Virtual Link Endpoint Bit ):如果值为 1 ,表示路由器是 Virtual Link 的端点。
E 位( External Bit ):如果值为 1 ,表示路由器是 ASBR 。
B 位( Border Bit ):如果值为 1 ,表示路由器是两个区域的边界路由器。一个路由器连接两个或两个以上的区域,生成的 Type-1 LSA 的 B 位值为 1 。
链路数量( Links Number ):表示 Type-1 LSA 的 Link 数量。Link 是描述直连接口的,每条 Link 都包含 链路类型 、 链路 ID 、链路数量 、度量值 这些关键信息。路由器可能会使用一个或者多个 Link 来描述某个接口。
链路类型( Link Type ):表示 Link 的类型。OSPF 中有多种网络类型:P2P 、P2MP 、Broadcast 、NBMA ,可以根据接口的协议来判断接口的网络类型。链路类型不同,对应的 链路 ID 、链路数据 也不同。注意:链路类型和网络类型是不同的概念。
LSA - 图8
链路 ID( Link ID ):Link 的标识,不同的链路类型,链路 ID 的定义也不同。
链路数据( Link Data ):不同的链路类型,对链路数据的定义也是不同的。
度量值( Metric ):Cost 值。
由于 TOS 和 TOS 度量值在 RFC2328 中不再支持,保留仅仅只是为了兼容早期的 OSPF 版本,可以忽略和 TOS 相关的字段。
LSA - 图9
以 R1 为例,G0/0 和 G0/1 都激活了 OSPF ,都接入了 Area0 ,因此路由器会生成一个 Type-1 LSA ,描述两个接口的状况,并在 Area0 内泛洪。R1 的 G0/1 是一个以太网接口,且没有建立 OSPF 邻接关系,这个接口的 Link 内容是:链路类型 = 3 ,表示连接到一个末梢网络;链路 ID = 192.168.1.0 ,是接口 IP 地址的网络地址;链路数据 = 255.255.255.0 ,是接口的网络掩码;度量值 = 1 ,是接口的 Cost 值。R1 的 G0/0 和 R3 建立了邻接关系,接口的关键信息是:链路类型 = 2 ,表示连接到一个传输网络;链接 ID = 192.168.123.3 ,是 DR 的接口 IP 地址,也就是 R3 的接口 IP 地址;链路数据 = 192.168.123.1 ,是自己接口的 IP 地址;度量值 = 1 。R1 生成的这个 Type-1 LSA 包含两个 Link ,在整个 Area0 内泛洪。
LSA - 图10
R3 的情况比较特殊,两个接口分别连接两个区域,G0/0 连接的 Area0 ,Serial1/0 连接的 Area1 ,显然是一台 ABR 。R3 会生成两个 Type-1 LSA ,一个在 Area0 内泛洪,描述的是 G0/0 接口信息,包含一个描述 G0/0 接口的 Link ,链路类型 = 2 ,表示连接到一个传输网络;链路 ID = 192.168.123.3 ;链路数据 = 192.168.123.3 ,度量值 = 1 。R3 生成的另一个 Type-1 LSA ,在 Area1 内泛洪,描述的是接口 Serial1/0 。Serial1/0 接口的网络类型是 P2P ,描述这种类型的接口时,OSPF 可能会使用多条 Link 。R3 的 Serial1/0 ,这个 P2P 接口有一个 Full 的邻居,这样会使用两个 Link 来描述这个接口和邻居关系。其中一个 Link 的链接类型 = 1 ,表示点对点连接到另一个路由器;链路 ID = 4.4.4.4 ,是这个邻居的 Router-ID ,也就是 R4 的 Router-ID ;链路数据 = 192.168.34.3 ,是自己接口的 IP 地址;度量值 = 48 。另一个 Link 的链路类型 = 3 ,表示接入一个末梢网络;链路 ID = 192.168.34.0 ;链路数据 = 255.255.255.0 ;度量值 = 48 。为什么要两个 Link 来描述一个接口?Type-1 LSA 的主要用途是帮助其它路由器绘制出网络拓扑和发现网段信息。这两个 Link 中,前一个是用于绘制拓扑,后一个是描述这段链路的网段信息。
Type-1 LSA 在处理 Loopback 接口时,无论接口的掩码地址是多少位,描述的掩码都是 32 位的。描述接口时,链路类型为 3 ,接入一个末梢网络,链路 ID 是接口的 IP 地址,链路数据全是 F ,表示掩码是 255.255.255.255 ,会计算出一条 32 位的主机路由。要想把路由的掩码恢复成 Loopback 接口的真实掩码,可以把 Loopback 接口的网络类型修改为 Broadcast 或 NBMA 。

2、Type-2 LSA

经过 Type-1 LSA 的泛洪,区域内的路由器已经大致了解自己所在区域内的网络拓扑。但是光有 Type-1 LSA 是不够的,在一个 MA 网络中,接口 Link 的链路类型是 2 ,链路 ID 是 DR 的接口 IP 地址,链路数据是路由器自己的接口 IP 地址,但是不清楚 MA 网络的掩码,也不知道有多少路由器在 MA 网络中,这就需要用到 Type-2 LSA 了。
在 MA 网络中,OSPF 会选举 DR 和 BDR ,所有 DRother 路由器只能和 DR 及 BDR 建立邻接关系,DRother 路由器之间不会建立 Full 的 OSPF 邻接关系。在 MA 网络中,DR 会生成 Type-2 LSA ,在区域内泛洪 Type-2 LSA ,列出 MA 网络中所有路由器的 Router-ID ,包括 DR 本身,和这个网络的掩码。
LSA - 图11
Type-2 LSA 中,LSA 头部的 链路状态类型 字段值为 2 ,链路状态 ID 字段值是生成 Type-2 LSA 的路由器的 Router-ID 。
网络掩码( Network Mask ):这个 MA 网络的网络掩码。
相连的路由器的 Router-ID :连接到这个 MA 网络的路由器的 Router-ID 。和 DR 建立邻接关系的邻居 Router-ID ,以及 DR 自己的 Router-ID 。如果有多台路由器接入 MA 网络,就使用多个字段描述。
LSA - 图12
R1 、R2 、R3 路由器的 G0/0 接口都接入到同一台二层交换机,另外这三个接口处于同一个 MA 网络,会选举 DR 和 BDR ,由于人为把 R3 的 G0/0 接口的 DR 优先级调高,因此 R3 成为这个 MA 网络的 DR 。这样,R3 会在 Area0 内泛洪一个 Type-2 LSA ,这个 LSA 中包含 R1 、R2 、R3 三台路由器的 Router-ID ,以及这个 MA 网络的掩码:255.255.255.0 。Area1 内没有 MA 网络,因此不存在 Type-2 LSA 。
经过 Type-1 、Type-2 LSA 在区域内泛洪,OSPF 能够描绘出一个区域内的完整拓扑,包括设备每个接口的 Cost ,并发现各个网段的信息,也就是网络地址和网络掩码。这个区域内的所有路由器的 LSDB 是完全一致的,这样路由器才能准确计算出到达区域各个网段的路由。经过 Type-1 、Type-2 LSA 泛洪和计算得出的路由,叫做区域内部路由( Intra-Area Route )。
LSA - 图13
R3 是一台 ABR ,两个接口分别连接 Area0 和 Area1 ,分别维护这两个区域的 LSDB 。然后,R3 以自己为根,运行 SPF 算法,获得到达各个网段的最短路径。
与 R3 不同,R1 和 R2 是区域内的路由器,只能根据区域内的 Type-1 、Type-2 LSA 计算出到达 Area0 内各个网段的路由,而 Area0 之外的路由,却无法知道,不如:192.168.34.0/24 网段的路由。要实现区域之间路由的传递,就需要使用 Type-3 LSA 。

3、Type-3 LSA

前两类 LSA 解决了区域内路由计算的问题,Type-1 、Type-2 LSA 只能在区域内泛洪,无法泛洪到区域外。区域之间的路由计算,就要使用 Type-3 LSA ,也就是网络汇总 LSA( Network Summary LSA )。Type-3 LSA 是 ABR 生成的,用来解决区域之间的路由传递问题。由于 ABR 同时连接着非骨干区域和骨干区域 Area0 ,它会分别维护不同区域的 LSDB ,并且计算出直连区域的区域内部路由,它向某个区域发送 Type-3 LSA ,是向这个区域通告到达其它区域的区域间路由。
LSA - 图14
Type-3 LSA 中,LSA 头部的 链路状态 ID 字段值是区域间路由的目的网络地址。
网络掩码( Netmask ):区域间路由的目的网络掩码。
度量值( Metric ):路由的 Cost 。
LSA - 图15
R3 已经知道了 Area0 和 Area1 内各个网段的区域内部路由,现在为这些区域内的路由生成 Type-3 LSA ,并通告到另一个区域中。R3 把描述了到达 Area1 内 192.168.34.0/24 网段的路由的 Type-3 通告给 Area0 。这个 Type-3 LSA 中,链路状态 ID 是目的网络地址 192.168.34.0 ,网络掩码是 255.255.255.0 ,通告路由器是 R3( ABR )的 Router-ID ,路由的 Cost 是 48 ,即 R3 自己到达目的网络的 Cost ,也即 R3 的 Serial1/0 接口的 Cost 。
收到 Type-3 LSA 后,R1 和 R2 就有到达 192.168.34.0/24 网段的区域间路由,并且路由的 Cost 是 49 ,即 48 + 1 ,其中 1 是它们 G0/0 接口的 Cost ,也就是它们到达目的网段的 Cost 。
LSA - 图16
另外,R3 也会把描述到达 Area0 内三个网段的路由的 Type-3 LSA 通告到 Area1 。这样,R4 就能够学习到这三条区域间路由。
LSA - 图17
假如新增路由器 R5 ,R5 分别和 R1 、R2 直连,直连网段分别是 192.168.1.0/24 、192.168.2.0/24 ,接口都在 Area2 中,其它内容不变。
从左到右来看,R1 和 R2 作为 ABR ,会为 Area0 通告两条 Type-3 LSA ,分别描述到达 Area2 内的 192.168.1.0/24 和 192.168.2.0/24 网段的路由。这样 R3 就能根据 Type-3 LSA 计算出到达这两个网段的区域间路由。
在一个区域中泛洪的 Type-3 LSA 描述的是到达区域之外、但仍属于 OSPF 域的网段路由,并且只能在一个区域内泛洪。因此,R1 和 R2 通告到 Area0 的 Type-3 LSA 只能在 Area0 中泛洪,不能直接进入 Area1 ,R3 会重新生成 Type-3 LSA 通告到 Area1 ,描述到达相应网络的区域间路由。
接下来,R3 会生成 3 条 Type-3 LSA 通告到 Area1 ,也就是 Area0 的 192.168.123.0/24 网段的路由,Area2 中 192.168.1.0/24 和 192.168.2.0/24 网段的路由。这 3 条 Type-3 LSA 的 Cost 是 R3 自己到达相应网段的 Cost 。R4 会收到这些 Type-3 LSA ,并计算区域间路由,而它到达三个目的网段的 Cost ,等于 R3 通告的 Cost 值加上自己到达 R3 的 Cost 值。
这时,会发现 OSPF 区域间路由的传播和距离矢量路由协议的路由传播过程类似,非常容易引发路由环路,对于区域间路由的传播,OSPF 也需要一定的防环机制。
首先,OSPF 区域间路由必须通过 Area0 中转,逻辑上就是以 Area0 为中心,其它区域为分支的星型逻辑机构,减小环路产生的可能。也就是所有的非骨干区域必须与骨干区域 Area0 直接相连
其次,OSPF 的 ABR 只能把自己直连区域的区域内部路由通告给 Area0 ,ABR 的区域间路由不允许通告给 Area0 。但是,ABR 可以将直连区域的区域内部路由和到达其它区域的区域间路由通告给非骨干区域。
这样的话,对于 R3 来说,到达 Area0 中的 192.168.123.0/24 网段的路由就是区域内路由,到达 Area1 中的 192.168.34.0/24 网段的路由也是区域内路由,到达 Area2 中的 192.168.1.0/24 和 192.168.2.0/24 网段的路由就是区域间路由,R3 会把 Area0 和 Area2 的三条路由都通告到 Area1 中,只把 Area1 的一条路由通告到 Area0 中,防止引发路由环路。

4、Type-4 LSA

通过 Type-1 、Type-2 LSA ,路由器能够知道区域内部网络拓扑,并发现区域内的网段信息,单个区域内的路由计算没有问题。通过 Type-3 LSA 的泛洪,实现区域间的路由传递。这样,Type-1 、Type-2 和 Type-3 LSA 这三类 LSA 解决了 OSPF 域内的路由计算问题。
LSA - 图18
然而域外的路由(比如 RIP 路由、静态路由等)如何获得?解决办法就是可以通过 ASBR 把域外的路由引入 OSPF ,OSPF 使用 Type-5 LSA 描述这些外部的路由,Type-5 LSA 能在整个 OSPF 域内泛洪,除了一些特殊的区域,这样所有的路由器都知道这些到达外部的路由,但是只知道到达外部路由还不够,还要知道引入这些外部路由的 ASBR 的位置。与 ASBR 同一个区域的路由器通过 Type-1 、Type-2 LSA 计算出到达 ASBR 的路由,然而这两种 LSA 只能在自己区域内泛洪,其它区域的路由器不知道如何到达 ASBR 。这就需要用到 Type-4 LSA 了。Type-4 LSA 叫做 ASBR 汇总 LSA( ASBR Summary LSA ),由 ABR 生成的,它实际上是一条到达 ASBR 的主机路由。
LSA - 图19
Type-4 LSA 的格式和 Type-3 LSA 是一样的。在 Type-4 LSA 中,链路状态 ID 字段值是 ASBR 的 Router-ID ,网络掩码 字段值全是 0 ,度量值 字段值是 ABR 自己到达 ASBR 的 Cost 值。
LSA - 图20
R4 作为 ASBR 把外部路由 10.0.0.0/8 引入到 OSPF 域。R4 生成 Type-5 LSA 描述这条外部路由。由于 R3 和 R4 在同一个区域,R3 通过 Area1 内泛洪的 Type-1 LSA 计算出到达 ASBR R4 的最佳路径。一旦在 R4 上执行引入外部路由的命令( import-route 命令),R4 就会在生成的 Type-1 LSA 中把 E 位值设为 1 ,宣告自己是 ASBR 。然而,Area0 的 R1 和 R2 通过 Type-5 LSA 只知道 10.0.0.0/8 这个外部网络,但不知道如何到达 ASBR ,也就无法进行路由计算。因此,R3 作为和 ASBR 同一个区域的 ABR ,会生成 Type-4 LSA 描述这个 ASBR ,并在 Area0 内泛洪,这样 Area0 内的 R1 和 R2 才能计算出到达 10.0.0.0/8 的外部路由,并加载到路由表。
实际上,Type-4 LSA 的主要作用,是帮助和 ASBR 不在同一个区域的路由器计算出到达 ASBR 的路由。另外,路由器并不会把通过 Type-4 LSA 计算出来的到达 ASBR 的路由加载到全局路由表中,而是存放在一个特殊的数据表里。在路由器上使用 display ospf abr-asbr 命令,可以看到路由器的 ABR 和 ASBR 。

5、Type-5 LSA

当 ASBR 把外部路由引入 OSPF 时,会生成 Type-5 LSA ,用来描述这些外部路由。这种类型的 LSA 一旦生成后,就会在整个 OSPF 域内传播,除了一些特殊区域。Type-5 LSA ,也就是 AS 外部 LSA( AS External LSA )。
LSA - 图21
Type-5 LSA 中,LSA 头部的 链路状态 ID 字段值是外部路由的目的网络地址。
网络掩码( Netmask ):外部路由的目的网络掩码。
E 位 :用来表示外部路由使用的度量值类型。OSPF 有两种外部路由度量值类型,分别是 Metric-Type-1 和 Metric-Type-2 。如果值为 0 ,表示外部路由使用的度量值类型是 Metric-Type-1 ;如果值为 1 ,表示外部路由使用的度量值类型是 Metric-Type-2 。
度量值( Metric ):表示外部路由的 Cost 。
转发地址( Forwarding Address ,FA ):当 FA 为 0.0.0.0 时,那么到达这个外部网段的流量会发送到引入外部路由的 ASBR 。如果 FA 不是 0.0.0.0 ,那么流量会发送到这个转发地址。FA 这个概念,是为了在 OSPF 的某些特殊场景中,规避次优路径问题。
外部路由标记( External Route Tag ):外部路由才能携带的标记,常用于部署路由策略。举个栗子,在 OSPF 域外有两种业务:办公和生产,现在 ASBR 把两种业务的路由都引入 OSPF ,描述这些外部路由的 Type-5 LSA 会在整个 OSPF 域内传播。如果需要在域内的某个区域部署路由策略,对办公和生产的路由执行不同的策略,那么先要区分这些路由。如果通过路由的目的网络地址和网络掩码区分,显然是不方便的。而如果在 ASBR 引入这些外部路由是,就分别为生产和办公路由打上相应的标记,那么在域内执行策略的时候,就可以直接对相应的标记进行路由匹配,使得路由策略的部署更加方便。
LSA - 图22
在 ASBR 把外部路由引入 OSPF 时,可以指定路由的外部 Cost 值,以及度量值类型,这两个值会写入 Type-5 LSA 的对应字段中。
一台路由器收到 Type-5 LSA 后,需要检查引入这条外部路由的 ASBR 是否可达。如果 ASBR 可达,路由器才会使用 Type-5 LSA 进行外部路由计算。另外,不同的外部路由度量值类型,路由的 Cost 值算法是不同的。假如一条 Type-5 LSA 的外部 Cost 为 B ,而路由器 X 到达生成这条 Type-5 LSA 的 ASBR 的路由 Cost 为 A ,那么当 Type-5 LSA 的度量值类型是 Metric-Type-1 时,X 计算出的这条外部路由的 Cost 等于 A + B ,但如果度量值类型为 Metric-Type-2 ,那么路由的 Cost 等于 B 。

6、Type-7 LSA

Type-7 LSA 就是 非完成末梢区域外部 LSA( Not-So-Stubby Area External LSA )。这是一种特殊的 LSA ,也用于描述 OSPF 外部路由,并且报文格式和 Type-5 LSA 一样,但是它的泛洪范围有严格限制:只能在 NSSA( Not-So-Stubby Area ,非完全末梢区域)内泛洪,并且不能进入 Area0 。
LSA - 图23
OSPF 除了常规区域外,还有几种特殊区域类型,NSSA 就是其中之一。NSSA 禁止 Area0 的 Type-5 LSA 进入,让区域内泛洪的 LSA 减少了一点,也减小了 NSSA 中路由器的路由表项,从而减小路由器负担。然而,ABR 为了让 NSSA 内的路由器能够通过骨干区域,访问过滤了的 Type-5 LSA 描述的外部路由,会向 NSSA 发布一条默认路由,使用 Type-7 LSA 描述。另外,NSSA 允许自己区域内的路由器引入少量外部路由,这些外部路由引入后,使用 Type-7 LSA 描述,而且 Type-7 LSA 只能在这个 NSSA 内泛洪,不允许进入 Area0 。NSSA 的 ABR 会将 NSSA 内泛洪的 Type-7 LSA 转换成 Type-5 LSA ,让这些外部路由能够在 OSPF 域内传播。
LSA - 图24
Area1 中泛洪了两条 Type-7 LSA ,其中一条是由 ASBR ,即 R4 生成的,用于描述外部路由 10.0.0.0/8 ,另一条是由 ABR ,即 R3 自动生成的,是一条默认路由,这条默认路由只在 Area1 内传播。

7、判断 LSA 的新旧

OSPF 会周期性的泛洪 LSA ,以 1800 秒为周期。这么长时间的泛洪周期,可避免网络中的 OSPF 流量过大,减少不必要的带宽消耗。另外,当网络拓扑发生变化时,OSPF 会立即执行 LSA 的触发更新,以便网络快速的收敛。
OSPF 采用链路状态类型、链路状态 ID 、通告路由器三元组来标识一个 LSA ,其实就是每个 LSA 头部的三个关键字段。
当路由器收到同一个 LSA 的两个不同实例时,比如路由器收到一个 LSA ,并把它加载到自己的 LSDB 中,随后又从网络中再次收到这个 LSA 的另一个实例,即 LSA 的三元组都相同,LSA 的内容可能不同,这时路由器该如何判断两个 LSA 的新旧?从网络中收到的 LSA 是否应该替换 LSDB 中原有的 LSA ?OSPF 使用 链路状态序列号、老化时间、校验和 来判断一个 LSA 的新旧。
a. 首先,链路状态序列号更大的实例是更新的 LSA ,因为路由器每次在刷新 LSA 时,LSA 的链路状态序列号 + 1 ,链路状态序列号越大,LSA 越新。
b. 如果 LSA 实例的链路状态序列号相同,那么校验和更大的实例是更新的 LSA 。
c. 如果 LSA 实例的链路状态序列号、校验和都相同,且实例的老化时间设置为 MaxAge(最大老化时间,默认 3600 秒),那么这个实例是最新的。
d. 如果 LSA 实例的链路状态序列号、校验和都相同,且没有实例的老化时间设置为 MaxAge ,那么当两个实例的老化时间差超过 MaxAgeDiff(最大老化时间差额,默认是 900 秒)时,这是两个不同的实例,且老化时间值越小的 LSA 越新。
e. 如果 LSA 实例的链路状态序列号、校验和都相同,没有实例的老化时间设置为 MaxAge ,并且两个实例的老化时间相等,或相差不超过 MaxAgeDiff ,那么它们是相同的实例。
当设备的 LSDB 中已经存在某个 LSA 时,又从网络中收到这个 LSA 的另一个实例,就通过上面的步骤判断同一个 LSA 的两个不同实例的新旧。如果是两个不同的实例,新的 LSA 实例会覆盖旧实例。如果是两个相同的实例,只保留先收到的 LSA 实例。
LSDB 中的 LSA 都有老化时间,最大是 3600 秒。如果超过这个值,那么这个 LSA 会从 LSDB 中删除。LSDB 中删除 LSA 的情况有两种:
a. 老化时间超过 MaxAge ,路由器自动删除 LSDB 中的 LSA 。
b. 路由器生成 MaxAge 的 LSA ,并在区域中泛洪,收到 LSA 的路由器会用其更新自己 LSDB 中的 LSA 。泛洪 MaxAge 的 LSA ,作用相当于毒化路由。

区域类型

OSPF 是目前使用最广泛的 IGP 之一,能够支持大规模的网络,在实际的组网中几乎随处可见。已经知道 OSPF 是链路状态路由协议,使用 LSA 来描述网络拓扑和网段信息,为了减少 LSA 的泛洪、减小路由器 LSDB 的规模,从而减小路由器的性能损耗,OSPF 引入了多区域的概念。把 OSPF 域划分成多个区域,可以有许多好处。每个区域独立维护一套 LSDB ,并单独运行 SPF 算法,而且区域内的拓扑变更也不会对整个 OSPF 带来过大的影响,让 OSPF 能够支持更大规模的网络。但仅仅这些还不够,当 OSPF 部署在一个大型网络中,实现数据互通的前提是要打通网络中的路由,而将路由信息传递到位只是第一步,还需要考虑如何优化网络、如何进一步减少 LSA 在网络中的泛洪、如何减小路由器路由表的规模。
LSA - 图25
这个网络的规模比较大,网络从逻辑上分成三个区块,分别是省公司、地市公司、区县公司,其中地市和区县公司的网络运行 OSPF 协议,在同一个 OSPF 域。整个 OSPF 网络进行了层次化的设计,地市分公司的核心网络部署在 Area0 ,而每个区县公司规划在非 0 区域,CO-SW1 和 CO-SW2 是地市分公司的两台汇聚设备,用于连接地市分公司和下面的区县分公司,这两台设备同时也是 ABR 。每个区县公司规划了一个独立的区域,比如区县公司 1 在 Area1 ,区县公司 2 在 Area2 ,以此类推。地市分公司的出口路由器( OR-R1 和 OR-R2 )与省公司的 PE 路由器( PE1 和 PE2 )对接,通过 BGP 交互路由信息,出口路由器 OR-R1 和 OR-R2 把从省公司学到的 BGP 路由引入 OSPF ,让整个 OSPF 域内的路由器能够学到这些外部路由,从而使得访问省公司的数据流量能够顺利的路由到 PE 路由器。
开始时,区县公司的路由器能够学到整个 OSPF 域内的路由,也学到 OR 路由器从 BGP 引入的外部路由。随着业务规模逐渐变大,省公司、地市公司的网络变得更加庞大,区县公司可能也会逐渐增多,这都会导致每个区县路由器的路由表变得臃肿,每台路由器将变得不堪重负。实际上,对于每个区县公司而言,不用知道 OSPF 域外,甚至 OSPF 区域外的路由细节,这些信息可以屏蔽掉,因为每个区县公司都是一个末梢网络,它们的外出流量只需送到地市分公司的汇聚设备,就可以顺利路由到目的地,无论这个目的地是域外的,还是其它区县公司的。
OSPF 设计了多种区域类型,用于满足多种业务需求。

1、骨干区域( Backbone Area )

骨干区域是 Area0 ,是整个 OSPF 域的中心枢纽。一个 OSPF 域有且只有一个 Area0 ,所有的区域间路由必须通过 Area0 中转。

2、常规区域( Normal Area )

所有的 OSPF 区域,默认情况下都是常规区域。当然,Area0 是常规区域中比较特殊的一个。OSPF 所有的非骨干区域(非 0 常规区域)必须和 Area0 直接相连。常规区域中允许 Type-1 、Type-2 、Type-3 、Type-4 和 Type-5 LSA 泛洪,禁止 Type-7 LSA 出现在常规区域内。
LSA - 图26
Area1 是一个非 0 常规区域,CO-SW1 和 CO-SW2 作为这个区域的 ABR ,会将 Type-3 、Type-4 和 Type-5 LSA 都传入 Area1 。

3、末梢区域( Stub Area )

末梢区域也叫做 Stub 区域,当一个非 0 常规区域只有一个出口,比如这个区域只有一个 ABR ,这个区域可以配置成 Stub区域。当一个区域配置成 Stub 区域后,区域内的 ABR 会阻挡 Type-5 LSA 进入区域,也就是说,禁止外部路由发布到这个区域。通过这种方式可以减少区域内泛洪的 LSA 数量,同时区域内的 ABR 自动下发一条使用 Type-3 LSA 描述的默认路由,让区域内的路由器能够路由到域外,这样既减小了区域内网络设备的路由表规模,又保证了正常的访问外部网络,还降低了设备的资源消耗。另外,ABR 依然会把描述区域间路由的 Type-3 LSA 传输到 Stub 区域中。
LSA - 图27
Area1 配置为 Stub 区域,这样 Area1 的 ABR(即 CO-SW1 和 CO-SW2 )不再把 Type-5 LSA 传播到这个区域。由于 Type-5 LSA 无法进入这个区域,Type-4 LSA 也没必要在这个区域泛洪,所以 CO-SW1 和 CO-SW2 也不会向区域内传播 Type-4 LSA 。这样,Router-X 的路由表不会出现到达省公司(即 OSPF 域外)的具体路由,路由表的规模减小,设备的资源消耗也降低。当然,Router-X 还是需要访问省公司的,为了让 Router-X 的发往省公司的路由到达目的地,ABR 会自动向 Area1 导入默认路由,这条默认路由使用 Type-3 LSA 描述,CO-SW1 和 CO-SW2 都会下发默认路由。Router-X 发往省公司的流量,通过默认路由,先到达 CO-SW1 或 CO-SW2 ,再转发到省公司。
还能在 Stub 区域的基础上,进一步进一步减少 LSA 泛洪,即在 Stub 区域的 ABR 上,阻挡描述区域间路由的 Type-3 LSA进入区域,区域内的路由器通过 ABR 下发的默认路由到达其它区域和域外的网络。这个特殊区域内,只有 Type-1 、Type-2 LSA 和描述默认路由的 Type-3 LSA 存在,意味区域内路由器的路由表只有到达区域内部的路由,以及指向 ABR 的默认路由,路由器的路由表被极度的精简了。这个特殊的区域,叫做完全末梢网络( Totally Stub Area )。
LSA - 图28
在 CO-SW1 和 CO-SW2 上,进一步阻挡 Type-3 LSA 进入 Area1 ,这样 Router-X 不会学习到 Area1 之外的区域间路由,也学不到到达省公司的外部路由,Router-X 的路由表会极大程度的简化。当然,Router-X 可以通过 ABR 下发的默认路由把外出的数据包转发出去。

4、非完全末梢区域( Not-So-Stubby Area )

Stub 区域的 ABR 能够阻挡 Type-4 LSA 和 Type-5 LSA 进入区域内,并且禁止区域内的路由器把外部路由引入到区域。Area1 一旦配置成 Stub 区域,那么 CO-SW1 、CO-SW2 和 Router-X 都不能把外部路由引入到这个区域。
假如 Router-X 路由器下挂了一个小型区县网络,这个网络的路由器采用静态路由实现路由的交互。现在这个小型网络需要访问地市公司和省公司的网络资源,那么要把两个路由域打通,在 Router-X 上执行路由重分发是一种解决方案,但是 Area1 已经是 Stub 区域,Router-X 不允许引入外部路由,如果把 Area1 恢复成常规区域,又丢失了 Stub 区域的优势,到达省公司的外部路由又传到 Area1 。这时,可以使用另一个特殊区域:NSSA 。
NSSA( Not-So-Stubby Area ),也就是非完全末梢区域,可以看成是 Stub 区域的扩展,它有 Stub 区域的特点:阻挡 Type-4 和 Type-5 LSA 进入,减少区域内泛洪的 LSA 数量。同时,允许区域内的路由器把少量外部路由引入 OSPF 。引入的外部路由,用 Type-7 LSA 描述,这些 Type-7 LSA 只能在自己的 NSSA 内泛洪,不允许直接进入 Area0 。为了让 OSPF 域内其它区域学习到 NSSA 引入的外部路由,NSSA 的 ABR 会把 Type-7 LSA 转换成 Type-5 LSA ,然后传入 Area0 ,从而泛洪到整个 OSPF 域。
LSA - 图29
Area1 配置成 NSSA ,这样 Area1 的 ABR 会阻挡 Type-5 LSA 进入区域内。另外,Router-X 连接到一个静态路由网络,他将路由表中的静态路由引入 OSPF ,这些引入的外部路由使用 Type-7 LSA 描述,这些 LSA 在 Area1 内泛洪,并且禁止进入 Area0 。CO-SW1 和 CO-SW2 作为 NSSA 的 ABR ,也能收到 Type-7 LSA ,根据这些 LSA 计算出到达静态路由网络的路由。另外,CO-SW1 和 CO-SW2 把 Type-7 LSA 转换成 Type-5 LSA ,并把转换后的 Type-5 LSA 传入 Area0 ,这样外部路由就可以被整个 OSPF 域中的路由器学习到。同时,CO-SW1 和 CO-SW2 会向 NSSA 内下发一条 Type-7 LSA 的默认路由,让 Router-X 能够通过这条默认路由到达省公司。
还可以在 NSSA 的基础上,进一步减少 LSA 的泛洪。在 NSSA 的 ABR 上,可以进一步把 Type-3 LSA 阻挡掉,从而把区域间的路由都过滤掉,NSSA 的 ABR 会自动下发一条默认路由到区域内,默认路由使用 Type-3 LSA 描述,让区域内的路由器能够通过默认路由访问 OSPF 域内的其它区域,和域外的网络。这种类型的特殊区域也叫做 Totally NSSA 。

5、各种区域类型允许出现的 LSA

LSA - 图30