12. 链路状态通告
- 链路状态通告(Link State Advertisements, LSA)
自治系统中的每台路由器都会始发一个或多个 link state advertisement
(链路状态通告,LSA)。本备忘录定义了五种不同类型的 LSA,它们在
4.3 节中说明。LSA 的集合构成 link-state database(链路状态数据库)。
每种不同类型的 LSA 都有各自不同的功能。router-LSA 和 network-LSA
描述某个区域的路由器和网络是如何互连的。summary-LSA 提供了一种
压缩区域路由信息的方法。AS-external-LSA 提供了一种在整个自治系统
中透明通告外部获得的路由信息的方法。
每个 LSA 都以一个标准的 20 字节头部开始。该 LSA 头部将在下文讨论。
Type Dest Area Path Type Cost Next Adv.
Hop(s) Router(s)
________________________________________________________________
N Ib 0 intra-area 16 RT3 *
N Ia 0 intra-area 21 RT3 *
R RT3 0 intra-area 1 * *
R RT10 0 intra-area 16 RT3 *
R RT11 0 intra-area 19 RT3 *
________________________________________________________________
N N9-N11,H1 0 inter-area 30 RT3 RT11
表 14:增加一条 virtual link
所引起的变化。
12.1. LSA 头部(The LSA Header)
LSA 头部包含 LS type、Link State ID 和 Advertising Router
字段。这三个字段的组合唯一地标识一个 LSA。
在自治系统中,同一个 LSA 可能同时存在多个实例。此时必须判断
哪个实例更新。这一判断通过检查 LS sequence(序列号)、LS
checksum(校验和)和 LS age(年龄)字段做出。这些字段同样
包含在 20 字节的 LSA 头部中。
若干种 OSPF 报文类型都会列出 LSA。当实例并不重要时,一个 LSA
通过其 LS type、Link State ID 和 Advertising Router 来引用
(见 Link State Request 报文)。否则,还必须引用 LS sequence
number、LS age 和 LS checksum 字段。
下面详细解释 LSA 头部中包含的各个字段。
12.1.1. LS age
该字段是 LSA 的年龄,以秒为单位。它应当按无符号 16 位
整数处理。LSA 被始发时它被置为 0。在泛洪过程的每一跳上,
它都必须增加 InfTransDelay。LSA 在保存于各路由器数据库中
时也会老化。
LSA 的年龄绝不会增长超过 MaxAge。年龄为 MaxAge 的 LSA
不参与路由表计算。当某个 LSA 的年龄首次达到 MaxAge 时,
它会被重新泛洪。当年龄为 MaxAge 的 LSA 不再为保证数据库
同步所需要时,它最终会从数据库中被清除。关于 LSA 老化的
更多信息,请参阅第 14 节。
当路由器收到一个 LSA 的两个实例,且二者的 LS 序列号和
LS 校验和都相同时,会检查 LS age 字段。此时年龄为 MaxAge
的实例总是被接受为最新的;这使得旧的 LSA 可以被迅速地
从路由域中清除。否则,如果两者年龄相差超过 MaxAgeDiff,
则年龄较小的实例被接受为最新的。[12] 更多细节见 13.1 节。
12.1.2. Options
LSA 头部中的 Options 字段指示哪些可选能力与该 LSA 关联。
OSPF 的可选能力在 4.5 节中说明。本规范定义了一项可选
能力,由 Options 字段中的 E-bit 表示。Options 字段中
无法识别的位应设为零。
E-bit 表示 OSPF 的 ExternalRoutingCapability。该位应当在
所有与 backbone 关联的 LSA 中,以及所有与非 stub 区域
关联的 LSA 中置位(见 3.6 节)。它在所有 AS-external-LSA
中也应置位。在所有与 stub 区域关联的 router-LSA、
network-LSA 和 summary-LSA 中,它应被清零。对于所有 LSA,
E-bit 的设置仅供参考;它不影响路由表计算。
12.1.3. LS type
LS type 字段决定了 LSA 的格式和功能。不同类型的 LSA 有
不同的名称(例如 router-LSA 或 network-LSA)。本备忘录
定义的所有 LSA 类型,除 AS-external-LSA(LS type = 5)外,
都只在单个区域内泛洪。AS-external-LSA 在整个自治系统内
泛洪,但不包括 stub 区域(见 3.6 节)。下面的表 15 简要
描述了每一种 LSA 类型。
12.1.4. Link State ID
该字段标识 LSA 所描述的那一部分路由域。取决于 LSA 的
LS type,Link State ID 取表 16
LS Type LSA 描述
________________________________________________
1 这些是 router-LSA。
它们描述路由器各接口的
状态集合。更多信息
请参阅 12.4.1 节。
________________________________________________
2 这些是 network-LSA。
它们描述连接到该网络的
路由器集合。更多信息
请参阅
12.4.2 节。
________________________________________________
3 或 4 这些是 summary-LSA。
它们描述 inter-area 路由,
并使得路由信息可以在区域
边界处被压缩。由 area border
router 始发,Type 3 summary-LSA
描述到网络的路由,而
Type 4 summary-LSA 描述到
AS boundary router 的路由。
________________________________________________
5 这些是 AS-external-LSA。
由 AS boundary router 始发,
它们描述通向
自治系统外部目的地的路由。
自治系统的默认路由也可以
用 AS-external-LSA 描述。
表 15:OSPF 链路状态通告(LSA)。
中所列的取值。
实际上,对于 Type 3 summary-LSA(LS type = 3)和
AS-external-LSA(LS type = 5),Link State ID 还可以
LS Type Link State ID
_______________________________________________
1 始发路由器的 Router ID。
2 该网络 Designated Router 的
IP 接口地址。
3 目的网络的 IP 地址。
4 所描述的 AS boundary router
的 Router ID。
5 目的网络的 IP 地址。
表 16:LSA 的 Link State ID。
额外地置位目的网络的一个或多个"主机"位。例如,为掩码为
255.0.0.0 的网络 10.0.0.0 始发 AS-external-LSA 时,
Link State ID 可以设为 10.0.0.0 到 10.255.255.255 之间
(含)的任意值(不过应尽可能使用 10.0.0.0)。这种设置
某些主机位的自由度,使得路由器可以为两个地址相同但掩码
不同的网络始发各自独立的 LSA。详见附录 E。
当 LSA 描述的是网络时(LS type = 2、3 或 5),只需用 LSA
正文中包含的 network/subnet 掩码对 Link State ID 做掩码
运算,即可容易地得出该网络的 IP 地址。当 LSA 描述的是
路由器时(LS type = 1 或 4),Link State ID 总是所描述
路由器的 OSPF Router ID。
当 AS-external-LSA(LS Type = 5)描述的是默认路由时,
其 Link State ID 被设为 DefaultDestination(0.0.0.0)。
12.1.5. Advertising Router
该字段指定该 LSA 始发者的 OSPF Router ID。对于
router-LSA,该字段与 Link State ID 字段相同。network-LSA
由该网络的
Designated Router 始发。summary-LSA 由 area border router
始发。AS-external-LSA 由 AS boundary router 始发。
12.1.6. LS sequence number
序列号字段是一个有符号 32 位整数。它用于检测旧的和重复的
LSA。序列号空间是线性有序的。序列号越大(按有符号 32 位
整数比较),LSA 就越新。为了更精确地描述序列号空间,在
下面的讨论中令 N 表示常量 2**31。
序列号 -N(0x80000000)是保留的(且未被使用)。这就使得
-N + 1(0x80000001)成为最小(因而也是最旧)的序列号;
该序列号被称为常量 InitialSequenceNumber。路由器在首次
始发任何 LSA 时使用 InitialSequenceNumber。此后,每当
路由器始发该 LSA 的一个新实例时,LSA 的序列号就加一。
当试图将序列号增长到超过最大值 N - 1(0x7fffffff,也称为
MaxSequenceNumber)时,必须先把该 LSA 的当前实例从路由域
中清除。这通过对该 LSA 提前老化(见 14.1 节)并重新泛洪
来完成。一旦这次泛洪被所有相邻邻居确认,就可以以
InitialSequenceNumber 作为序列号始发一个新实例。
当在泛洪过程中意外收到某个 LSA 的更新实例时,路由器可能
被迫提升它自己某个 LSA 的序列号。这应当是一种罕见事件。
它可能表明:由该路由器自身在上次重启/重载之前始发的一个
过时 LSA 仍然存在于自治系统中。更多信息见 13.4 节。
12.1.7. LS checksum
该字段是 LSA 全部内容(LS age 字段除外)的校验和。之所以
排除 LS age 字段,是为了在不更新校验和的情况下也能增加
LSA 的年龄。所使用的校验和与 ISO 无连接数据报所使用的
相同;它通常被称为 Fletcher checksum。它在 [Ref6] 的附录 B
中有文档说明。LSA 头部还包含以字节为单位的 LSA 长度;
减去 LS age 字段的大小(两字节)即得到要做校验和的数据量。
校验和用于检测 LSA 的数据损坏。这种损坏可能发生在 LSA
被泛洪的过程中,也可能发生在它保存于路由器内存中的时候。
LS checksum 字段不能取值为零;出现这样的取值应被视为
校验和失败。换言之,校验和的计算并非可选。
LSA 的校验和在两种情况下会被验证:a) 当它在 Link State
Update 报文中被接收时;b) 在链路状态数据库老化过程中的
某些时刻。检测到校验和失败在两种情况下导致不同的动作。
更多细节见第 13 节和第 14 节。
每当 LS sequence number 字段表明某个 LSA 的两个实例相同
时,就会检查 LS checksum 字段。如果存在差异,则 LS
checksum 较大的实例被认为是最新的。[13] 更多细节见
13.1 节。
12.2. 链路状态数据库(The link state database)
路由器为其所属的每个区域维护一个独立的链路状态数据库。属于
同一区域的所有路由器,对该区域拥有完全相同的链路状态数据库。
每个区域各自的数据库总是被分别处理。最短路径计算针对每个区域
分别进行(见第 16 节)。
区域链路状态数据库的各个组成部分只在该区域内泛洪。最后,当
某条(属于 Area A 的)adjacency 正在建立时,两台路由器之间
只同步 Area A 的数据库。
区域数据库由 router-LSA、network-LSA 和 summary-LSA 组成
(全部列在区域数据结构中)。此外,外部路由(AS-external-LSA)
被包含在所有非 stub 区域的数据库中(见 3.6 节)。
OSPF 的实现必须能够访问区域数据库中的各个独立条目。这个查找
功能基于 LSA 的 LS type、Link State ID 和 Advertising
Router。[14] 数据库中每个 LSA 只有单个实例(最新的那个)。
数据库查找功能在 LSA 泛洪过程(第 13 节)和路由表计算
(第 16 节)中被调用。此外,利用这个查找功能,路由器可以判断
它自己是否曾经始发过某个特定的 LSA,如果始发过,其 LS 序列号
是多少。
在以下情况下 LSA 会被加入路由器的数据库:a) 它在泛洪过程中
被接收(第 13 节);或 b) 它由路由器自身始发(12.4 节)。
在以下情况下 LSA 会从路由器的数据库中删除:a) 在泛洪过程中
它被一个更新的实例覆盖(第 13 节);或 b) 路由器为其自身始发
的某个 LSA 始发了更新的实例(12.4 节);或 c) 该 LSA 老化
超时并从路由域中被清除(第 14 节)。每当某个 LSA 从数据库中
被删除时,它也必须从所有邻居的 Link state retransmission list
中移除(见第 10 节)。
12.3. TOS 的表示(Representation of TOS)
为了与之前版本的 OSPF 规范([Ref9])向后兼容,router-LSA、
summary-LSA 和 AS-external-LSA 中可以包含 TOS 相关的信息。
OSPF LSA 中 TOS 的编码在表 17 中规定。该表把 OSPF 编码与
IP 报文头的 TOS 字段(在 [Ref12] 中定义)关联起来。OSPF 编码
以十进制
整数表示,而 IP 报文头的 TOS 字段以 [Ref12] 中使用的二进制
TOS 值表示。
OSPF 编码 RFC 1349 TOS 取值
___________________________________________
0 0000 normal service
2 0001 minimize monetary cost
4 0010 maximize reliability
6 0011
8 0100 maximize throughput
10 0101
12 0110
14 0111
16 1000 minimize delay
18 1001
20 1010
22 1011
24 1100
26 1101
28 1110
30 1111
表 17:OSPF 中 TOS 的表示。
12.4. 始发 LSA(Originating LSAs)
对任意给定的 OSPF 区域,路由器都会始发若干 LSA。每台路由器
始发一个 router-LSA。如果该路由器同时还是该区域中某些网络的
Designated Router,它还会为这些网络始发 network-LSA。
area border router 为每个已知的 inter-area 目的地始发一个
summary-LSA。AS boundary router 为每个已知的 AS external
目的地始发一个 AS-external-LSA。目的地是逐个通告的,这样
任何单条路由的变化都可以被泛洪,而不必重新泛洪整个路由集合。
在泛洪过程中,单个 Link State Update 报文可以携带多个 LSA。
举例来说,考虑图 6 中的路由器 RT4。它是一台 area border
router,有一条到 Area 1 的连接和一条到 backbone 的连接。
路由器 RT4 向 backbone 始发 5 个不同的 LSA(一个 router-LSA,
以及为网络 N1-N4 各始发一个 summary-LSA)。路由器 RT4 还会
向 Area 1 始发 8 个不同的 LSA(一个 router-LSA 和七个
summary-LSA,如图 7 所示)。如果 RT4 被选为网络 N3 的
Designated Router,它还会向 Area 1 始发 N3 的 network-LSA。
在同一张图中,路由器 RT5 将始发 3 个不同的 AS-external-LSA
(网络 N12-N14 各一个)。假定没有任何区域被配置为 stub,
这些 LSA 将在整个 AS 中泛洪。但是,如果 area 3 已被配置为
stub 区域,网络 N12-N14 的 AS-external-LSA 将不会被泛洪进
area 3(见 3.6 节)。取而代之的是,路由器 RT11 会始发一个
默认 summary-LSA,在整个 area 3 中泛洪(见 12.4.3 节)。
这指示 area 3 中所有内部路由器把它们的 AS 外部流量发送给
RT11。
每当一个 LSA 的新实例被始发时,其 LS 序列号加一,其 LS age
被置为 0,其 LS checksum 被计算出来,然后该 LSA 被加入链路
状态数据库并从相应的接口泛洪出去。关于将 LSA 安装进链路状态
数据库的细节,见 13.2 节。关于新始发 LSA 的泛洪细节,见
13.3 节。
可能导致 LSA 新实例被始发的十种事件是:
(1) 路由器自身始发的某个 LSA 的 LS age 字段达到了
LSRefreshTime 值。此时会始发该 LSA 的一个新实例,即使
该 LSA 的内容(除 LSA 头部外)保持不变。这保证了所有 LSA
的周期性始发。这种 LSA 的周期性更新为链路状态算法增加了
健壮性。仅描述不可达目的地的 LSA 不应被刷新,而应从路由域
中清除(见 14.1 节)。
当 LSA 所描述的内容发生变化时,就会始发一个新的 LSA。但是,
同一个 LSA 的两个实例的始发时间间隔不得小于 MinLSInterval。
这可能要求把下一个实例的生成推迟最多 MinLSInterval。以下事件
可能导致 LSA 的内容发生变化。当且仅当新 LSA 的内容确实与原来
不同时,这些事件才应引起新的始发:
(2) 某个接口的状态发生变化(见 9.1 节)。这可能意味着需要
生成 router-LSA 的新实例。
(3) 某个所连接网络的 Designated Router 发生变化。应当始发
一个新的 router-LSA。此外,如果路由器自身现在成为
Designated Router,还应生成新的 network-LSA。如果路由器
自身不再是 Designated Router,则它可能曾为该网络始发过的
任何 network-LSA 都应从路由域中清除(见 14.1 节)。
(4) 某个相邻路由器进入/离开 FULL 状态。这可能意味着需要生成
router-LSA 的新实例。此外,如果路由器自身就是所连接网络的
Designated Router,还应生成新的 network-LSA。
接下来的四种事件仅涉及 area border router:
(5) 路由表中新增/删除/修改了一条 intra-area 路由。这可能导致
在每个所连接的区域(可能包括 backbone)中始发该路由对应
的 summary-LSA 新实例。
(6) 路由表中新增/删除/修改了一条 inter-area 路由。这可能导致
在每个所连接的区域中始发该路由对应的 summary-LSA 新实例
(但绝不会向 backbone 始发)。
(7) 路由器新接入某个区域。此时路由器必须为其路由表中所有相关
的 intra-area 和 inter-area 路由,向该新接入的区域始发
summary-LSA。更多细节见 12.4.3 节。
(8) 当路由器所配置的某条 virtual link 的状态发生变化时,可能
需要向该 virtual link 的 Transit area 始发一个新的
router-LSA(见 12.4.1 节中关于 router-LSA 的 V 位的讨论),
同时也向 backbone 始发一个新的 router-LSA。
最后两种事件仅涉及 AS boundary router(以及曾经的 AS boundary
router):
(9) 通过与外部路由协议(如 BGP)的直接交互所获得的某条外部
路由发生变化。这将导致 AS boundary router 始发一个
AS-external-LSA 的新实例。
(10)
某台路由器不再是 AS boundary router,也许是在重启之后。
在这种情况下,该路由器应清除它之前始发过的所有
AS-external-LSA。这些 LSA 可以通过 14.1 节规定的提前老化
过程来清除。
下面详细说明每种类型 LSA 的构造。总的来说,这些小节描述的是
LSA 正文的内容(即 20 字节 LSA 头部之后的部分)。关于 LSA
头部构建的信息,见 12.1 节。
12.4.1. Router-LSA
路由器为其所属的每个区域始发一个 router-LSA。这样的 LSA
描述路由器到该区域各条链路的状态集合。该 LSA 只在该特定
区域内泛洪,不再向外扩散。
....................................
. 192.1.2 Area 1 .
. + .
. | .
. | 3+---+1 .
. N1 |--|RT1|-----+ .
. | +---+ \ .
. | \ _______N3 .
. + \/ \ . 1+---+
. * 192.1.1 *------|RT4|
. + /\_______/ . +---+
. | / | .
. | 3+---+1 / | .
. N2 |--|RT2|-----+ 1| .
. | +---+ +---+8 . 6+---+
. | |RT3|----------------|RT6|
. + +---+ . +---+
. 192.1.3 |2 . 18.10.0.6|7
. | . |
. +------------+ .
. 192.1.4 (N4) .
....................................
图 15:标注了 IP 地址的 Area 1
router-LSA 的格式见附录 A(A.4.2 节)。该 LSA 的前 20
字节是 12.1 节讨论过的通用 LSA 头部。router-LSA 的
LS type = 1。
路由器还通过在其 router-LSA 中置位相应的位(分别是 bit B
和 bit E)来指示它是否为 area border router 或 AS boundary
router。这使得到这类路由器的路径可以被保存在路由表中,
以便后续处理 summary-LSA 和 AS-external-LSA。只要路由器
实际接入两个或更多区域,bit B 就应置位,即使该路由器当前
并未接入 OSPF backbone 区域。在 stub 区域的 router-LSA 中
绝不应置位 bit E(stub 区域不能包含 AS boundary router)。
此外,当且仅当路由器是一条或多条以 Area A 为 Transit area
的、完全邻接的 virtual link 的端点时,路由器才在其 Area A
的 router-LSA 中置位 bit V。bit V 的置位使 Area A 中的
其他路由器能够发现该区域是否支持转接流量(见第 6 节中的
TransitCapability)。
router-LSA 随后描述路由器到该区域的可用连接(即接口或
链路)。每条链路都按所连接网络的种类进行分类。每条链路
还标注有其 Link ID。该 Link ID 为链路另一端的实体命名。
表 18 汇总了 Type 和 Link ID 字段所使用的取值。
Link type 描述 Link ID
__________________________________________________
1 Point-to-point 邻居 Router ID
链路
2 到 transit Designated Router
network 的链路 的接口地址
3 到 stub network IP 网络号
的链路
4 Virtual link 邻居 Router ID
表 18:router-LSA 中的
链路描述。
此外,还要为每条链路指定 Link Data 字段。该字段为链路
提供 32 位的额外信息。对于到 transit network 的链路、
编号的 point-to-point 链路以及 virtual link,该字段指定
相关路由器接口的 IP 接口地址(路由表计算需要它,见
16.1.1 节)。对于到 stub network 的链路,该字段指定该
stub network 的 IP 地址掩码。对于无编号的 point-to-point
链路,Link Data 字段应设为该无编号接口的 MIB-II [Ref8]
ifIndex 值。
最后,要指定使用该链路作为输出时的代价。链路的输出代价
是可配置的。除到 stub network 的链路外,输出代价必须
始终为非零。
为进一步说明构建链路描述列表的过程,假设某台路由器希望
为 Area A 构建一个 router-LSA。该路由器检查它的接口数据
结构集合。对每个接口,执行以下步骤:
o 如果所连接的网络不属于 Area A,则不向该 LSA 添加任何
链路,应继续检查下一个接口。
o 如果接口状态为 Down,则不添加任何链路。
o 如果接口状态为 Loopback,则只要它不是到无编号
point-to-point 网络的接口,就添加一条 Type 3 链路
(stub network)。Link ID 应设为该 IP 接口地址,
Link Data 设为掩码 0xffffffff(表示主机路由),
代价设为 0。
o 否则,添加到 router-LSA 中的链路描述取决于 OSPF 接口
类型。point-to-point 接口所使用的链路描述在 12.4.1.1
节规定,virtual link 在 12.4.1.2 节,broadcast 和 NBMA
接口在 12.4.1.3 节,Point-to-MultiPoint 接口在
12.4.1.4 节。
在考察完所有路由器接口之后,通过检查属于 Area A 的
attached host(所连主机)列表,把主机链路加入 router-LSA。
主机路由被表示为一条 Type 3 链路(stub network),其
Link ID 为该主机的 IP 地址,Link Data 为全 1 掩码
(0xffffffff),代价为该主机所配置的代价(见 C.7 节)。
12.4.1.1. 描述 point-to-point 接口
对于 point-to-point 接口,按如下方式向 router-LSA
添加一条或多条链路描述:
o 如果相邻路由器已完全邻接,则添加一条 Type 1 链路
(point-to-point)。Link ID 应设为相邻路由器的
Router ID。对于编号的 point-to-point 网络,Link
Data 应指定 IP 接口地址。对于无编号的
point-to-point 网络,Link Data 字段应指定该接口的
MIB-II [Ref8] ifIndex 值。代价应设为该
point-to-point 接口的输出代价。
o 此外,只要接口状态为 "Point-to-Point"(且无论
相邻路由器处于何种状态),就应添加一条 Type 3
链路(stub network)。这条 stub 链路可以有两种
形式:
Option 1
假定已知相邻路由器的 IP 地址,则将该 Type 3
链路的 Link ID 设为邻居的 IP 地址,Link Data
设为掩码 0xffffffff(表示主机路由),代价设为
接口所配置的输出代价。[15]
Option 2
如果已为该 point-to-point 链路分配了一个子网,
则将该 Type 3 链路的 Link ID 设为该子网的 IP
地址,Link Data 设为该子网的掩码,代价设为
接口所配置的输出代价。[16]
12.4.1.2. 描述 broadcast 和 NBMA 接口
对于可用的 broadcast 和 NBMA 接口,按如下方式向
router-LSA 添加单条链路描述:
o 如果接口状态为 Waiting,则添加一条 Type 3 链路
(stub network),Link ID 设为所连接网络的 IP
网络号,Link Data 设为所连接网络的地址掩码,
代价等于接口所配置的输出代价。
o 否则,说明所连接网络已经选出了 Designated Router。
如果路由器与该 Designated Router 完全邻接,或者
路由器自身就是 Designated Router 并且至少与另外
一台路由器完全邻接,则添加单条 Type 2 链路
(transit network),Link ID 设为所连接网络
Designated Router 的 IP 接口地址(可能就是路由器
自身),Link Data 设为路由器自己的 IP 接口地址,
代价等于接口所配置的输出代价。否则,按接口状态为
Waiting 时那样添加链路(见上文)。
12.4.1.3. 描述 virtual link
对于 virtual link,只有当 virtual neighbor 完全邻接时
才向 router-LSA 添加链路描述。此时添加一条 Type 4
链路(virtual link),Link ID 设为 virtual neighbor
的 Router ID,Link Data 设为与该 virtual link 关联的
IP 接口地址,代价设为路由表计算过程中为该 virtual
link 计算出的代价(见第 15 节)。
12.4.1.4. 描述 Point-to-MultiPoint 接口
对于可用的 Point-to-MultiPoint 接口,按如下方式向
router-LSA 添加一条或多条链路描述:
o 添加单条 Type 3 链路(stub network),Link ID
设为路由器自己的 IP 接口地址,Link Data 设为掩码
0xffffffff(表示主机路由),代价设为 0。
o 对于与该接口关联的每个完全邻接的邻居,额外添加
一条 Type 1 链路(point-to-point),Link ID 设为
相邻路由器的 Router ID,Link Data 设为 IP 接口
地址,代价等于接口所配置的输出代价。
12.4.1.5. router-LSA 示例
考虑图 6 中路由器 RT3 所生成的 router-LSA。包含路由器
RT3 的区域(Area 1)在图 15 中以实际网络地址重新绘制。
假定 RT3 所有接口地址的最后一个字节都是 3,因而它的
接口地址为 192.1.1.3 和 192.1.4.3,并假定其他路由器
采用类似的编址方案。此外,假定所有链路都工作正常,
并且 Router ID 被赋值为最小的 IP 接口地址。
RT3 始发两个 router-LSA,一个用于 Area 1,一个用于
backbone。假定路由器 RT4 已被选为网络 192.1.1.0 的
Designated Router。RT3 用于 Area 1 的 router-LSA 如下
所示。它表明 RT3 有两条到 Area 1 的连接:第一条是到
transit network 192.1.1.0 的链路,第二条是到 stub
network 192.1.4.0 的链路。注意,transit network 由其
Designated Router 的 IP 接口来标识(即 Link ID =
192.1.1.4,这是 Designated Router RT4 连到 192.1.1.0
的 IP 接口)。另外注意 RT3 已表明它是一台 area border
router。
; RT3 用于 Area 1 的 router-LSA
LS age = 0 ;始发时总是如此
Options = (E-bit) ;
LS type = 1 ;表示 router-LSA
Link State ID = 192.1.1.3 ;RT3 的 Router ID
Advertising Router = 192.1.1.3 ;RT3 的 Router ID
bit E = 0 ;不是 AS boundary router
bit B = 1 ;area border router
#links = 2
Link ID = 192.1.1.4 ;Desig. Rtr. 的 IP 地址
Link Data = 192.1.1.3 ;RT3 连到该网络的 IP 接口
Type = 2 ;连接到 transit network
# TOS metrics = 0
metric = 1
Link ID = 192.1.4.0 ;IP 网络号
Link Data = 0xffffff00 ;网络掩码
Type = 3 ;连接到 stub network
# TOS metrics = 0
metric = 2
接下来是 RT3 用于 backbone 的 router-LSA。它表明
RT3 只有一条到 backbone 的连接。该连接是通过一条
到路由器 RT6 的无编号 point-to-point 链路实现的。
RT3 再次表明它是一台 area border router。
; RT3 用于 backbone 的 router-LSA
LS age = 0 ;始发时总是如此
Options = (E-bit) ;
LS type = 1 ;表示 router-LSA
Link State ID = 192.1.1.3 ;RT3 的 router ID
Advertising Router = 192.1.1.3 ;RT3 的 router ID
bit E = 0 ;不是 AS boundary router
bit B = 1 ;area border router
#links = 1
Link ID = 18.10.0.6 ;邻居的 Router ID
Link Data = 0.0.0.3 ;P-P 链路的 MIB-II ifIndex
Type = 1 ;连接到路由器
# TOS metrics = 0
metric = 8
12.4.2. Network-LSA
为每个 transit 类型的 broadcast 或 NBMA 网络生成一个
network-LSA。(transit network 是指有两台或更多路由器
连接其上的网络。)network-LSA 描述连接到该网络的所有
路由器。
该网络的 Designated Router 始发这个 LSA。只有当
Designated Router 至少与该网络上另外一台路由器完全邻接
时,它才始发该 LSA。network-LSA 在包含该 transit network
的区域内泛洪,不再向外扩散。network-LSA 列出那些与
Designated Router 完全邻接的路由器;每台完全邻接的路由器
由其 OSPF Router ID 标识。Designated Router 把自己也包含
在这个列表中。
network-LSA 的 Link State ID 是 Designated Router 的 IP
接口地址。该值与网络的地址掩码(同样包含在 network-LSA
中)做掩码运算,即得到该网络的 IP 地址。
曾经是某个网络的 Designated Router、但现已不再是的路由器,
应当清除它之前始发的 network-LSA。该 LSA 不再用于路由表
计算。清除它的方式是提前把该 LSA 的年龄增加到 MaxAge 并
重新泛洪(见 14.1 节)。此外,在路由器的 Router ID 发生
改变这种罕见情况下,必须清除所有以该路由器之前的 Router
ID 始发的 network-LSA。由于路由器可能完全不知道它之前的
Router ID 是什么,这类 network-LSA 通过以下特征来识别:
其 Link State ID 等于该路由器的某个 IP 接口地址,而其
Advertising Router 等于该路由器当前 Router ID 以外的
某个值(更多细节见 13.4 节)。
12.4.2.1. network-LSA 示例
再次考虑图 6 中的区域配置。为 Area 1 中的网络 N3、
Area 2 中的网络 N6 和 N8,以及 Area 3 中的网络 N9
始发 network-LSA。假定路由器 RT4 已被选为网络 N3 的
Designated Router,则 RT4 代表网络 N3 生成如下
network-LSA(地址分配见图 15):
; 网络 N3 的 Network-LSA
LS age = 0 ;始发时总是如此
Options = (E-bit) ;
LS type = 2 ;表示 network-LSA
Link State ID = 192.1.1.4 ;Desig. Rtr. 的 IP 地址
Advertising Router = 192.1.1.4 ;RT4 的 Router ID
Network Mask = 0xffffff00
Attached Router = 192.1.1.4 ;Router ID
Attached Router = 192.1.1.1 ;Router ID
Attached Router = 192.1.1.2 ;Router ID
Attached Router = 192.1.1.3 ;Router ID
12.4.3. Summary-LSA
summary-LSA 所描述的目的地可以是一个 IP 网络、一台 AS
boundary router,或者一段 IP 地址范围。summary-LSA 只在
单个区域内泛洪。所描述的目的地位于该区域之外,但仍属于
该自治系统。
summary-LSA 由 area border router 始发。要向某个区域通告
哪些确切的汇总路由,是通过按下述算法检查路由表结构
(见第 11 节)来确定的。注意,只有 intra-area 路由被通告
进 backbone,而 intra-area 和 inter-area 路由都会被通告
进其他区域。
为了确定要向所连接的 Area A 通告哪些路由,对每个路由表
条目按如下方式处理。记住,每个路由表条目描述的是到某个
特定目的地的一组等价最佳路径:
o 只有 network 和 AS boundary router 这两种 Destination
Type 才会在 summary-LSA 中被通告。如果路由表条目的
Destination Type 是 area border router,则检查下一个
路由表条目。
o AS external 路由绝不会在 summary-LSA 中被通告。
如果路由表条目的 Path-type 是 type 1 external 或
type 2 external,则检查下一个路由表条目。
o 否则,如果与这组路径关联的区域就是 Area A 本身,
则不为该路由生成 summary-LSA。[17]
o 否则,如果与这组路径关联的 next hop 属于 Area A 本身,
则不为该路由生成 summary-LSA。[18] 这在逻辑上等价于
距离矢量协议的水平分割(split horizon)逻辑。
o 否则,如果路由表代价等于或超过 LSInfinity 值,则
不能为该路由生成 summary-LSA。
o 否则,如果该路由的目的地是一台 AS boundary router,
则当且仅当该路由表条目描述的是通向该 AS boundary
router 的首选路径时,才应始发 summary-LSA(见 16.4 节
的第 3 步)。若是,则为该目的地始发一个 Type 4
summary-LSA,其 Link State ID 等于该 AS boundary
router 的 Router ID,metric 等于该路由表条目的代价。
注意:如果 Area A 已被配置为 stub 区域,则不应生成
这些 LSA。
o 否则,Destination type 为 network。如果这是一条
inter-area 路由,则为该目的地生成一个 Type 3
summary-LSA,其 Link State ID 等于该网络的地址
(必要时 Link State ID 也可以置位该网络的一个或多个
主机位;详见附录 E),metric 等于路由表代价。
o 剩下的唯一情形是到某个网络的 intra-area 路由。这意味着
该网络包含在路由器直连的某个区域中。一般而言,这类
信息必须先被压缩,然后才出现在 summary-LSA 中。记住,
每个区域都有一份已配置的地址范围列表,每个范围由一个
[address,mask] 对以及 Advertise 或 DoNotAdvertise 的
状态指示组成。对每个范围最多始发一个 Type 3
summary-LSA。当该范围的状态指示为 Advertise 时,生成
一个 Type 3 summary-LSA,其 Link State ID 等于
该范围的地址(必要时 Link State ID 也可以置位该范围的
一个或多个"主机"位;详见附录 E),代价等于其各组成
网络代价中的最大值。当该范围的状态指示为
DoNotAdvertise 时,该 Type 3 summary-LSA 被抑制,
其组成网络对其他区域保持隐藏。
默认情况下,如果某个网络不包含在任何显式配置的地址
范围中,则生成一个 Type 3 summary-LSA,其 Link State
ID 等于该网络的地址(必要时 Link State ID 也可以置位
该网络的一个或多个"主机"位;详见附录 E),metric 等于
该网络的路由表代价。
如果某个区域能够承载转接流量(即其 TransitCapability
被置为 TRUE),则在把 backbone 网络的路由信息汇总进
该区域之前,不应对其进行压缩;也不应抑制把 backbone
网络通告进 transit area。换言之,在向 transit area
始发 summary-LSA 时,应忽略 backbone 所配置的地址
范围。
如果路由器为某个目的地通告了 summary-LSA,而该目的地随后
变为不可达,则路由器必须把该 LSA 的年龄设为 MaxAge 并
重新泛洪,从而将其从路由域中清除(见 14.1 节)。此外,
如果该目的地仍然可达,但按上述过程已不能再被通告(例如,
它原本是与某个非 backbone 区域关联的 intra-area 路由,
现在变成了 inter-area 路由,因而不再能向 backbone 通告),
则该 LSA 也应从路由域中清除。
12.4.3.1. 向 stub 区域始发 summary-LSA
当 Area A 是一个 OSPF stub 区域时,12.4.3 节中的算法
是可选的。连接到 stub 区域的 area border router 可以
按 12.4.3 节的算法向该区域始发 summary-LSA,也可以
选择只始发 summary-LSA 的一个子集,这可能受配置控制。
始发的 LSA 越少,stub 区域的链路状态数据库就越小,
从而进一步降低对其路由器资源的需求。但是,省略 LSA
也可能导致次优的 inter-area 路由,尽管路由功能仍会
继续工作。
如 12.4.3 节所规定的,Type 4 summary-LSA
(ASBR-summary-LSA)绝不会向 stub 区域始发。
在 stub 区域中,每台 area border router 不是引入外部
路由,而是向该区域始发一个"默认 summary-LSA"。该默认
summary-LSA 的 Link State ID 被设为 DefaultDestination,
metric 设为(按区域)可配置的参数 StubDefaultCost。
注意,StubDefaultCost 不必在该 stub 区域的所有 area
border router 上配置为相同的值。
12.4.3.2. summary-LSA 示例
再次考虑图 6 中的区域配置。路由器 RT3、RT4、RT7、
RT10 和 RT11 都是 area border router,因此都会始发
summary-LSA。特别考虑路由器 RT4。它的路由表已在
11.3 节的示例中计算出来。RT4 同时向 backbone 和
Area 1 始发 summary-LSA。向 backbone,路由器 RT4 为
网络 N1-N4 分别始发独立的 LSA。向 Area 1,路由器 RT4
为网络 N6-N8 以及 AS boundary router RT5、RT7 分别
始发独立的 LSA。它还把主机路由 Ia 和 Ib 压缩为单个
summary-LSA。最后,到网络 N9、N10、N11 和主机 H1 的
路由由单个 summary-LSA 通告。这一压缩最初是由路由器
RT11 执行的。
这些 LSA 在图 7 和图 8 中以图形方式展示。下面给出
路由器 RT4 始发的其中两个 summary-LSA。相关网络和
路由器的实际 IP 地址已在图 15 中分配。
; 网络 N1 的 Summary-LSA,
; 由路由器 RT4 始发进 backbone
LS age = 0 ;始发时总是如此
Options = (E-bit) ;
LS type = 3 ;Type 3 summary-LSA
Link State ID = 192.1.2.0 ;N1 的 IP 网络号
Advertising Router = 192.1.1.4 ;RT4 的 ID
metric = 4
; AS boundary router RT7 的 Summary-LSA,
; 由路由器 RT4 始发进 Area 1
LS age = 0 ;始发时总是如此
Options = (E-bit) ;
LS type = 4 ;Type 4 summary-LSA
Link State ID = 路由器 RT7 的 ID
Advertising Router = 192.1.1.4 ;RT4 的 ID
metric = 14
12.4.4. AS-external-LSA
AS-external-LSA 描述通向自治系统外部目的地的路由。大多数
AS-external-LSA 描述的是通向特定外部目的地的路由;在这些
情况下,LSA 的 Link State ID 被设为目的网络的 IP 地址
(必要时 Link State ID 也可以置位该网络的一个或多个
"主机"位;详见附录 E)。但是,也可以通过把 LSA 的 Link
State ID 设为 DefaultDestination(0.0.0.0),用一个
AS-external-LSA 来描述自治系统的默认路由。AS-external-LSA
由 AS boundary router 始发。AS boundary router 为它所学到
的每条外部路由始发一个 AS-external-LSA,这些路由或是通过
另一种路由协议(如 BGP)学到,或是通过配置信息得到。
AS-external-LSA 是唯一在整个自治系统中泛洪的 LSA 类型;
所有其他类型的 LSA 都局限于单个区域。不过,AS-external-LSA
不会被泛洪进入/贯穿 stub 区域(见 3.6 节)。这使得 stub
区域内部路由器的链路状态数据库规模得以减小。
为外部路由所通告的 metric 可以是两种类型之一。Type 1
metric 与链路状态 metric 具有可比性。Type 2 metric 则被
假定大于任何 AS 内部路径的代价。
如果路由器为某个目的地通告了 AS-external-LSA,而该目的地
随后变为不可达,则路由器必须把该 LSA 的年龄设为 MaxAge
并重新泛洪,从而将其从路由域中清除(见 14.1 节)。
12.4.4.1. AS-external-LSA 示例
再一次考虑图 6 所示的 AS。其中有两台 AS boundary
router:RT5 和 RT7。路由器 RT5 为网络 N12-N14 始发
三个 AS-external-LSA。路由器 RT7 为网络 N12 和 N15
始发两个 AS-external-LSA。假定 RT7 是通过 BGP 学到
它到 N12 的路由,并且它希望向该 AS 通告一个 Type 2
metric。那么 RT7 将为 N12 始发如下 LSA:
; 网络 N12 的 AS-external-LSA,
; 由路由器 RT7 始发
LS age = 0 ;始发时总是如此
Options = (E-bit) ;
LS type = 5 ;AS-external-LSA
Link State ID = N12 的 IP 网络号
Advertising Router = 路由器 RT7 的 ID
bit E = 1 ;Type 2 metric
metric = 2
Forwarding address = 0.0.0.0
在上面的例子中,forwarding address 字段被设为
0.0.0.0,表示发往该外部目的地的报文应被转发给
通告该路由的 OSPF 路由器(RT7)。但这并不总是
人们期望的结果。考虑图 16 中所示的例子。有三台
OSPF 路由器(RTA、RTB 和 RTC)连接到一个共同的
网络。这些路由器中只有一台,即 RTA,在与非 OSPF
路由器 RTX 交换 BGP 信息。RTA 于是必须为它从 RTX
学到的那些目的地始发 AS-external-LSA。通过使用
AS-external-LSA 的 forwarding address 字段,RTA
可以指定发往这些目的地的报文被直接转发给 RTX。
如果没有这个特性,路由器 RTB 和 RTC 到达这些目的地
就要多走一跳。
注意,当 forwarding address 字段非零时,它应当
指向属于另一个自治系统的路由器。
也可以为默认路由指定 forwarding address。例如,
在图 16 中,RTA 可能希望指定所有发往外部的报文
默认都被转发给它的 BGP 对等体 RTX。由此产生的
AS-external-LSA 如下所示。注意 Link State ID
被设为 DefaultDestination。
; 由路由器 RTA 始发的默认路由
; 报文经由 RTX 转发
LS age = 0 ;始发时总是如此
Options = (E-bit) ;
LS type = 5 ;AS-external-LSA
Link State ID = DefaultDestination ; 默认路由
Advertising Router = 路由器 RTA 的 ID
bit E = 1 ;Type 2 metric
metric = 1
Forwarding address = RTX 的 IP 地址
在图 16 中,假设改为 RTA 和 RTB 都与 RTX 交换
BGP 信息。在这种情况下,
RTA 和 RTB 将始发相同的一组 AS-external-LSA。
这些 LSA 如果指定相同的 metric,在功能上就是等价的,
因为它们指定了相同的目的地和 forwarding address
(RTX)。这显然导致了重复劳动。如果 RTA 或 RTB
中只有一台始发这组 AS-external-LSA,路由结果保持
不变,而链路状态数据库的规模会减小。但是,必须
无歧义地定义由哪台路由器来始发这些 LSA(否则可能
两台都不始发,或者始发者的身份来回振荡)。因此
确立了以下规则:如果两台彼此可达的路由器始发了
功能等价的 AS-external-LSA(即目的地、代价和非零
forwarding address 都相同),则采用 OSPF Router ID
较大的那台路由器所始发的 LSA。OSPF Router ID
较小的那台路由器随后可以清除它的 LSA。清除 LSA
的过程在 14.1 节讨论。
+
|
+---+.....|.BGP
|RTA|-----|.....+---+
+---+ |-----|RTX|
| +---+
+---+ |
|RTB|-----|
+---+ |
|
+---+ |
|RTC|-----|
+---+ |
|
+
图 16:forwarding address 示例