跳到主要内容

3.2 The Link-State NLRI (链路状态 NLRI)

MP_REACH_NLRI 和 MP_UNREACH_NLRI 属性是 BGP 用于携带不透明信息的容器。每个 Link-State NLRI 描述一个节点, 一条链路或一个前缀。

所有非 VPN 链路, 节点和前缀信息必须使用 AFI 16388 / SAFI 71 进行编码。VPN 链路, 节点和前缀信息必须使用 AFI 16388 / SAFI 72 进行编码。

为了使两个 BGP speaker 交换 Link-State NLRI, 它们必须使用 BGP Capabilities Advertisement 来确保双方都能够正确处理此类 NLRI。这按照 [RFC4760] 中的规定完成, 使用 capability code 1 (multi-protocol BGP), BGP-LS 使用 AFI 16388 / SAFI 71, BGP-LS-VPN 使用 AFI 16388 / SAFI 72。

Link-State NLRI 的格式如下图所示。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NLRI Type | Total NLRI Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// Link-State NLRI (variable) //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 5: Link-State AFI 16388 / SAFI 71 NLRI Format

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NLRI Type | Total NLRI Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Route Distinguisher +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// Link-State NLRI (variable) //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 6: Link-State VPN AFI 16388 / SAFI 72 NLRI Format

Total NLRI Length 字段包含 NLRI 其余部分的累计长度 (以八位字节为单位), 不包括 NLRI Type 字段或其本身。对于 VPN 应用, 它还包括 Route Distinguisher 的长度。

                   +------+---------------------------+
| Type | NLRI Type |
+------+---------------------------+
| 1 | Node NLRI |
| 2 | Link NLRI |
| 3 | IPv4 Topology Prefix NLRI |
| 4 | IPv6 Topology Prefix NLRI |
+------+---------------------------+

Table 1: NLRI Types

Route Distinguisher 在 [RFC4364] 中定义和讨论。

Node NLRI (NLRI Type = 1) 如下图所示。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+
| Protocol-ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier |
| (64 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Local Node Descriptors (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 7: The Node NLRI Format

Link NLRI (NLRI Type = 2) 如下图所示。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+
| Protocol-ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier |
| (64 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Local Node Descriptors (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Remote Node Descriptors (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Link Descriptors (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 8: The Link NLRI Format

IPv4 和 IPv6 Prefix NLRI (NLRI Type = 3 和 Type = 4) 使用相同的格式, 如下图所示。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+
| Protocol-ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier |
| (64 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Local Node Descriptors (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Prefix Descriptors (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 9: The IPv4/IPv6 Topology Prefix NLRI Format

Protocol-ID 字段可以包含以下值之一:

            +-------------+----------------------------------+
| Protocol-ID | NLRI information source protocol |
+-------------+----------------------------------+
| 1 | IS-IS Level 1 |
| 2 | IS-IS Level 2 |
| 3 | OSPFv2 |
| 4 | Direct |
| 5 | Static configuration |
| 6 | OSPFv3 |
+-------------+----------------------------------+

Table 2: Protocol Identifiers

当 BGP-LS 提供本地信息时, 应该使用 'Direct' 和 'Static configuration' 协议类型。对于从其他协议派生的所有信息, 必须使用相应的 Protocol-ID。如果 BGP-LS 直接访问接口信息并希望通告本地链路, 则应该使用 Protocol-ID 'Direct'。对于建模虚拟链路 (如第 4 节所述), 应该使用 Protocol-ID 'Static configuration'。

OSPF 和 IS-IS 可以在同一链路上运行多个路由协议实例。参见 [RFC6822] 和 [RFC6549]。这些实例定义独立的 "路由宇宙"。64 位 Identifier 字段用于标识 NLRI 所属的路由宇宙。表示来自同一路由宇宙的链路状态对象 (节点, 链路或前缀) 的 NLRI 必须具有相同的 'Identifier' 值。具有不同 'Identifier' 值的 NLRI 必须被视为来自不同的路由宇宙。表 3 列出了本文档中定义为众所周知的 'Identifier' 值。

             +------------+----------------------------------+
| Identifier | Routing Universe |
+------------+----------------------------------+
| 0 | Default Layer 3 Routing topology |
+------------+----------------------------------+

Table 3: Well-Known Instance Identifiers

如果给定协议不支持多个路由宇宙, 则应该根据表 3 设置 Identifier 字段。但是, 实现可以为给定协议使 'Identifier' 可配置。

每个 Node Descriptor 和 Link Descriptor 由一个或多个 TLV 组成, 如以下各节所述。

每个链路由底层 IGP 使用的一对 Router-ID 锚定, 即 IS-IS 的 48 位 ISO System-ID 和 OSPFv2 和 OSPFv3 的 32 位 Router-ID。IGP 可以使用一个或多个辅助 Router-ID, 主要用于流量工程目的。例如, IS-IS 可能有一个或多个 IPv4 和 IPv6 TE Router-ID [RFC5305] [RFC6119]。这些辅助 Router-ID 必须包含在第 3.3.2 节描述的链路属性中。

希望 Node Descriptor 内的 Router-ID 分配是全局唯一的。但是, 可能存在不存在全局注册表的 Router-ID 空间 (例如 ISO), 或者更糟的是, Router-ID 已按照 RFC 1918 [RFC1918] 中描述的私有 IP 分配进行分配。BGP-LS 使用 Autonomous System (AS) Number 和 BGP-LS Identifier (参见第 3.2.1.4 节) 来消除 Router-ID 的歧义, 如第 3.2.1.1 节所述。

需要解决的一个问题是能够全局标识 IGP 节点的能力 (所谓 "全局", 我们指在相互通信的所有 BGP-LS speaker 收集的 BGP-LS 数据库中)。这可以通过以下两个要求来表达:

(A) 同一节点不能由两个键表示 (否则, 一个节点将看起来像两个节点)。

(B) 两个不同的节点不能由同一个键表示 (否则, 两个节点将看起来像一个节点)。

我们将 "IGP 域" 定义为一组节点 (因此, 通过扩展, 还有链路和前缀), 在这些节点中, 每个节点通过使用 Area-ID, Router-ID, Protocol-ID, Multi-Topology ID 和 Instance-ID 的组合具有唯一的 IGP 表示。问题是 BGP 可能从多个独立的 "IGP 域" 接收节点/链路/前缀信息, 我们需要区分它们。此外, 我们不能假设每个 AS 始终只有一个 IGP 域。在 IGP 转换期间, 可能存在两个冗余的 IGP。

在第 3.2.1.4 节中, 描述了一组 sub-TLV, 它允许为任何给定的节点/链路信息指定灵活的键, 以确保 NLRI 的全局唯一性。

Local Node Descriptors TLV 包含锚定链路本地端的节点的 Node Descriptor。这是所有三种类型的 NLRI (节点, 链路和前缀) 中的强制性 TLV。此 TLV 的长度是可变的。值包含第 3.2.1.4 节中定义的一个或多个 Node Descriptor Sub-TLV。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// Node Descriptor Sub-TLVs (variable) //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 10: Local Node Descriptors TLV Format

Remote Node Descriptors TLV 包含锚定链路远端的节点的 Node Descriptor。这是 Link NLRI 的强制性 TLV。此 TLV 的长度是可变的。值包含第 3.2.1.4 节中定义的一个或多个 Node Descriptor Sub-TLV。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// Node Descriptor Sub-TLVs (variable) //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 11: Remote Node Descriptors TLV Format

Node Descriptor Sub-TLV 类型代码点和长度列在下表中:

           +--------------------+-------------------+----------+
| Sub-TLV Code Point | Description | Length |
+--------------------+-------------------+----------+
| 512 | Autonomous System | 4 |
| 513 | BGP-LS Identifier | 4 |
| 514 | OSPF Area-ID | 4 |
| 515 | IGP Router-ID | Variable |
+--------------------+-------------------+----------+

Table 4: Node Descriptor Sub-TLVs

Node Descriptor TLV 中的 sub-TLV 值定义如下:

Autonomous System: 不透明值 (32 位 AS Number)

BGP-LS Identifier: 不透明值 (32 位 ID)。与 Autonomous System Number (ASN) 结合, 唯一标识 BGP-LS 域。ASN 和 BGP-LS ID 的组合必须是全局唯一的。IGP flooding-set (LSP/LSA 被泛洪的一组 IGP 节点) 内的所有 BGP-LS speaker 必须使用相同的 ASN, BGP-LS ID 元组。如果 IGP 域由多个 flooding-set 组成, 则 IGP 域内的所有 BGP-LS speaker 应该使用相同的 ASN, BGP-LS ID 元组。

Area-ID: 用于标识 NLRI 所属的 32 位区域。Area Identifier 允许区分同一路由器的不同 NLRI。

IGP Router-ID: 不透明值。这是强制性 TLV。对于 IS-IS 非伪节点, 这包含 6 个八位字节的 ISO Node-ID (ISO system-ID)。对于对应于 LAN 的 IS-IS 伪节点, 这包含 7 个八位字节 - 指定路由器的 6 个八位字节 ISO system-ID 加上 1 个八位字节伪节点号。对于 OSPFv2 和 OSPFv3 非伪节点, 这是 4 个八位字节的 Router-ID。对于 OSPFv2 和 OSPFv3 伪节点 (LAN 的 Designated Router), 这是 DR 的 Router-ID (4 个八位字节), 后跟 DR 接口到多路访问网络的 IPv4 接口地址 (4 个八位字节), 用于 OSPFv2, 或后跟 DR 接口索引 (4 个八位字节) 用于 OSPFv3。

Multi-Topology ID (MT-ID) TLV 携带链路, 节点或前缀的一个或多个 IS-IS 或 OSPF Multi-Topology ID。

IS-IS MT-ID 的语义在 RFC 5120 [RFC5120] 的第 7.2 节中定义。OSPF MT-ID 的语义在 RFC 4915 [RFC4915] 的第 3.7 节中定义。如果 MT-ID TLV 中的值来自 OSPF, 则高 9 位必须设置为 0。位 R 是保留位, 应该在发起时设置为 0, 接收时忽略。

MT-ID TLV 的格式如下图所示。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length=2*n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R R R R| Multi-Topology ID 1 | .... //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// .... |R R R R| Multi-Topology ID n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 12: Multi-Topology ID TLV Format

其中 Type 是 263, Length 是 2*n, n 是 TLV 中携带的 MT-ID 数量。

MT-ID TLV 可以出现在 Link Descriptor, Prefix Descriptor 或 Node NLRI 的 BGP-LS 属性中。在 Link 或 Prefix Descriptor 中, 仅允许包含链路或前缀可达的拓扑的 MT-ID 的单个 MT-ID TLV。如果想要为给定的 Link Descriptor 或 Prefix Descriptor 通告多个拓扑, 则需要生成多个 NLRI, 其中每个 NLRI 包含唯一的 MT-ID。在 Node NLRI 的 BGP-LS 属性中, 允许一个 MT-ID TLV 包含节点可达的所有拓扑的 MT-ID 数组。

Link Descriptor 字段是一组 Type/Length/Value (TLV) 三元组。每个 TLV 的格式在第 3.1 节中显示。Link Descriptor TLV 唯一标识一对锚定路由器之间的多条并行链路中的一条链路。Link Descriptor TLV 描述的链路实际上是 "半链路", 是逻辑链路的单向表示。为了完整描述单个逻辑链路, 两个发起路由器各通告一个半链路, 即为给定的点对点链路通告两个 Link NLRI。

大多数 Link Descriptor TLV 中 Value 字段的格式和语义对应于 [RFC5305], [RFC5307] 和 [RFC6119] 中定义的 IS-IS Extended IS Reachability sub-TLV 中 Value 字段的格式和语义。尽管 Link Descriptor TLV 的编码最初是为 IS-IS 定义的, 但 TLV 可以携带 IS-IS 或 OSPF 提供的数据。

以下 TLV 在 Link NLRI 中作为 Link Descriptor 有效:

   +-----------+---------------------+--------------+------------------+
| TLV Code | Description | IS-IS TLV | Reference |
| Point | | /Sub-TLV | (RFC/Section) |
+-----------+---------------------+--------------+------------------+
| 258 | Link Local/Remote | 22/4 | [RFC5307]/1.1 |
| | Identifiers | | |
| 259 | IPv4 interface | 22/6 | [RFC5305]/3.2 |
| | address | | |
| 260 | IPv4 neighbor | 22/8 | [RFC5305]/3.3 |
| | address | | |
| 261 | IPv6 interface | 22/12 | [RFC6119]/4.2 |
| | address | | |
| 262 | IPv6 neighbor | 22/13 | [RFC6119]/4.3 |
| | address | | |
| 263 | Multi-Topology | --- | Section 3.2.1.5 |
| | Identifier | | |
+-----------+---------------------+--------------+------------------+

Table 5: Link Descriptor TLVs

链路的本地节点发起的 LSA/LSP 中存在的关于链路的信息决定链路的 Link Descriptor 中的 TLV 集。

Prefix Descriptor 字段是一组 Type/Length/Value (TLV) 三元组。Prefix Descriptor TLV 唯一标识节点发起的 IPv4 或 IPv6 前缀。以下 TLV 在 IPv4/IPv6 Prefix NLRI 中作为 Prefix Descriptor 有效:

   +-------------+---------------------+----------+--------------------+
| TLV Code | Description | Length | Reference |
| Point | | | (RFC/Section) |
+-------------+---------------------+----------+--------------------+
| 263 | Multi-Topology | variable | Section 3.2.1.5 |
| | Identifier | | |
| 264 | OSPF Route Type | 1 | Section 3.2.3.1 |
| 265 | IP Reachability | variable | Section 3.2.3.2 |
| | Information | | |
+-------------+---------------------+----------+--------------------+

Table 6: Prefix Descriptor TLVs

OSPF Route Type TLV 是一个可选 TLV, 可以出现在 Prefix NLRI 中。它用于标识前缀的 OSPF 路由类型。当 OSPF 前缀在 OSPF 域中以多种路由类型通告时使用。Route Type TLV 允许区分这些通告。OSPF Route Type TLV 的格式如下图所示。

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Route Type |
+-+-+-+-+-+-+-+-+

Figure 13: OSPF Route Type TLV Format

其中 TLV 的 Type 和 Length 字段在表 6 中定义。

OSPF Route Type 字段值在 OSPF 协议中定义, 可以是以下之一:

  • Intra-Area (0x1)
  • Inter-Area (0x2)
  • External 1 (0x3)
  • External 2 (0x4)
  • NSSA 1 (0x5)
  • NSSA 2 (0x6)

IP Reachability Information TLV 是一个强制性 TLV, 包含最初在 IGP 拓扑中通告的一个 IP 地址前缀 (IPv4 或 IPv6)。其目的是通过其 BGP next hop 将特定 BGP 服务 NLRI 粘合到 LSDB 中的给定节点。路由器应该为其每个 BGP next hop 通告一个 IP Prefix NLRI。

IP Reachability Information TLV 的格式如下图所示:

      0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix Length | IP Prefix (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 14: IP Reachability Information TLV Format

TLV 的 Type 和 Length 字段在表 6 中定义。以下两个字段确定地址族的可达性信息。Prefix Length 字段包含前缀的位长度。IP Prefix 字段包含前缀的最高有效八位字节, 即前缀长度 1 到 8 为 1 个八位字节, 前缀长度 9 到 16 为 2 个八位字节, 前缀长度 17 到 24 为 3 个八位字节, 前缀长度 25 到 32 为 4 个八位字节, 等等。