跳到主要内容

3.4. 常用参数的 TLV 编码

有若干参数被不止一条 LDP 消息使用。本节规定这些常用参数的 TLV 编码。

3.4.1. FEC TLV​

标签绑定到转发等价类 (Forwarding Equivalence Class, FEC)。一个 FEC 是一个或多个 FEC 元素的列表。FEC TLV 编码 FEC 项。

其编码为:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| FEC (0x0100) | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FEC Element 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
~ ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FEC Element n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

FEC Element 1 到 FEC Element n

FEC 元素有若干类型; 见 "FECs" 一节。FEC 元素的编码取决于 FEC 元素的类型。

FEC Element 值编码为一个 1 字节字段 (规定元素类型) 后跟一个可变长度字段 (即依赖于类型的元素值)。请注意, 虽然 FEC 元素值的表示依赖于类型, 但 FEC 元素编码本身并不使用标准 LDP TLV 编码。

FEC Element 值编码为:

      FEC Element       Type      Value
type name

Wildcard 0x01 No value; i.e., 0 value octets;
see below.
Prefix 0x02 See below.

请注意, 本版本的 LDP 仅对 Label Mapping 消息支持每个 FEC 使用多个 FEC Element。本版本不允许在其他消息中使用多个 FEC Element, 这属于未来研究的课题。

Wildcard FEC Element

只用于 Label Withdraw 和 Label Release 消息。表示该撤销/释放要应用于紧随其后的 Label TLV 中该标签所关联的所有 FEC。它必须是 FEC TLV 中唯一的 FEC Element。

Prefix FEC Element 值编码:

    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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix (2) | Address Family | PreLen |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Address Family

两字节量, 其取值来自 [ASSIGNED_AF] 中的 ADDRESS FAMILY NUMBERS, 用于编码 Prefix 字段中地址前缀的地址族。

PreLen

一字节无符号整数, 包含其后地址前缀的比特长度。长度为 0 表示匹配所有地址的前缀 (默认目的地); 在这种情况下, Prefix 本身为零个八位组。

Prefix

按 Address Family 字段编码的地址前缀, 其比特长度由 PreLen 字段规定, 并填充到字节边界。

3.4.1.1. FEC 过程​

如果在解码 FEC TLV 时, LSR 遇到某个带有它不支持的 Address Family 的 FEC Element, 它 应当 (SHOULD) 停止解码该 FEC TLV, 中止处理包含该 TLV 的消息, 并向其 LDP 对等体发送一条 "Unsupported Address Family" 通知消息以信号错误。

如果它遇到无法解码的 FEC Element 类型, 它 应当 (SHOULD) 停止解码该 FEC TLV, 中止处理包含该 TLV 的消息, 并向其 LDP 对等体发送一条 "Unknown FEC" 通知消息以信号错误。

3.4.2. 标签 TLV​

标签 TLV (Label TLV) 编码标签。标签 TLV 由用于通告、请求、释放和撤销标签映射的消息携带。

在需要 Label TLV 的场合中, 可以出现若干不同种类的标签 TLV。

3.4.2.1. Generic Label TLV​

LSR 使用 Generic Label TLV 来编码用于标签值与底层链路技术无关的链路上的标签。这类链路的例子有 PPP 和 Ethernet。

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Generic Label (0x0200) | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Label |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Label

这是一个 20 位标签值, 以 20 位数的形式表示在 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Label | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

更多信息见 [RFC3032]。

3.4.2.2. ATM Label TLV​

LSR 使用 ATM Label TLV 来编码用于 ATM 链路的标签。

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| ATM Label (0x0201) | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Res| V | VPI | VCI |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Res

该字段保留。发送时必须置为零, 接收时必须忽略。

V-bits

两比特交换指示符。如果 V-bits 为 00, 则 VPI 和 VCI 都有意义。如果 V-bits 为 01, 则只有 VPI 字段有意义。如果 V-bit 为 10, 则只有 VCI 有意义。

VPI

Virtual Path Identifier (虚路径标识符)。如果 VPI 少于 12 位, 它 应当 (SHOULD) 在该字段中右对齐, 且前面的比特 应当 (SHOULD) 置为 0。

VCI

Virtual Channel Identifier (虚通道标识符)。如果 VCI 少于 16 位, 它 应当 (SHOULD) 在该字段中右对齐, 且前面的比特 必须 (MUST) 置为 0。如果在 V-bits 字段中指示了虚路径交换, 则接收方 必须 (MUST) 忽略该字段, 且发送方必须将其置为 0。

3.4.2.3. Frame Relay Label TLV​

LSR 使用 Frame Relay Label 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Frame Relay Label (0x0202)| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |Len| DLCI |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Res

该字段保留。发送时必须置为零, 接收时必须忽略。

Len

该字段规定 DLCI 的比特数。支持以下取值:

      0 = 10 bits of DLCI
2 = 23 bits of DLCI

Len 取值 1 和 3 保留。

DLCI

Data Link Connection Identifier (数据链路连接标识符)。

对于 10 位 DLCI, 编码为:

    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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Frame Relay Label (0x0202)| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |Len| 0 | 10-bit DLCI |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

对于 23 位 DLCI, 编码为:

    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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Frame Relay Label (0x0202)| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |Len| 23-bit DLCI |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

更多信息见 [RFC3034]。

3.4.3. Address List TLV​

Address List TLV 出现在 Address 和 Address Withdraw 消息中。

其编码为:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Address List (0x0101) | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Address Family | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Addresses |
~ ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Address Family

两字节量, 其取值来自 [ASSIGNED_AF] 中的 ADDRESS FAMILY NUMBERS, 用于编码 Addresses 字段中所包含的地址。

Addresses

来自指定 Address Family 的地址列表。单个地址的编码取决于 Address Family。

本版本协议定义了以下地址编码:

      Address Family      Address Encoding

IPv4 4 octet full IPv4 address
IPv6 16 octet full IPv6 address

3.4.4. Hop Count TLV​

Hop Count TLV 作为可选字段出现在建立 LSP 的消息中。它在 LSP 建立过程中计算该 LSP 上的 LSR 跳数。

请注意, 穿越 ATM 和帧中继链路的 LSP 的建立过程要求使用 Hop Count TLV (见 [RFC3035] 和 [RFC3034])。

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Hop Count (0x0103) | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HC Value |
+-+-+-+-+-+-+-+-+

HC Value

1 字节无符号整数跳数值。

3.4.4.1. 跳数过程​

在 LSP 建立期间, LSR R 可能收到该 LSP 的、包含 Hop Count TLV 的 Label Mapping 或 Label Request 消息。如果收到, 它 应当 (SHOULD) 记录该跳数值。

如果 LSR R 随后要继续该 LSP 的建立, 将该 LSP 的 Label Mapping 消息传播给上游对等体, 或将该 Label Request 消息传播给下游对等体, 则它必须按如下方式确定要包含在传播消息中的跳数:

  • 如果该消息是 Label Request 消息, R 必须 (MUST) 将收到的跳数加一;

  • 如果该消息是 Label Mapping 消息, R 按如下方式确定跳数:

    • 如果 R 是某个 LSR 域的边缘集合的成员, 该域中的 LSR 不执行 'TTL 递减 (TTL-decrement)', 且上游对等体位于该域内, 则 R 必须 (MUST) 在传播该消息之前将跳数重置为 1。

    • 否则, R 必须 (MUST) 将收到的跳数加一。

LSP 中的第一台 LSR (对于 Label Request 消息是入口, 对于 Label Mapping 消息是出口) 应当 (SHOULD) 将跳数值设为 1。

按约定, 取值 0 表示未知跳数。对未知跳数加一的结果仍为未知跳数 (0)。

使用未知跳数值可以大大减少使用独立控制时的信令开销。当一条新的 LSP 建立时, 每台 LSR 都从未知跳数开始。添加一台跳数也未知的新 LSR 不会导致向上游传播跳数更新, 因为跳数保持未知。当出口最终被加入该 LSP 时, 各 LSR 通过 Label Mapping 消息向上游传播跳数更新。

如果不使用未知跳数, 则每当有一台新 LSR 加入该 LSP 时, 如果该新 LSR 比其他任何 LSR 更靠近出口, 就需要向上游传播一次跳数更新。这些更新是无用的开销, 因为它们并不反映到出口的跳数。

从入口节点的角度看, 跳数未知这一事实并不表示在该 LSP 上发送的分组是否真能到达出口。它所表示的只是: 来自出口的跳数更新尚未到达入口。

如果 LSR 收到包含 Hop Count TLV 的消息, 它 必须 (MUST) 检查该跳数值, 以确定跳数是否已超过其配置的最大允许值。如果超过, 它 必须 (MUST) 表现得如同包含该消息的报文已经历了环路一样, 即向该消息的发送方发送一条信号 Loop Detected 的通知消息作为响应。

如果配置了环路检测, 该 LSR 必须 (MUST) 遵循 "Loop Detection" 一节中规定的过程。

3.4.5. Path Vector TLV​

Path Vector TLV 与 Hop Count TLV 一起用于 Label Request 和 Label Mapping 消息, 以实现可选的 LDP 环路检测机制。见 "Loop Detection" 一节。它在 Label Request 消息中的使用记录了该请求所经过的 LSR 路径。它在 Label Mapping 消息中的使用记录了某次标签通告为建立 LSP 所经过的 LSR 路径。其编码为:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0| Path Vector (0x0104) | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LSR Id 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
~ ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LSR Id n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

一个或多个 LSR Id

一个 router-id 列表, 表示该消息所经过的 LSR 路径。每个 LSR Id 是对应 LSR 的 LDP Identifier 的前四个八位组 (router-id)。这确保它在 LSR 网络内是唯一的。

3.4.5.1. 路径向量过程​

当配置了环路检测时, Path Vector TLV 会携带在 Label Mapping 和 Label Request 消息中。

3.4.5.1.1. 标签请求路径向量​

"Loop Detection" 一节规定了 LSR 必须在 Label Request 消息中包含 Path Vector TLV 的各种情况。

在 Label Request 消息中收到 Path Vector 的 LSR 必须 (MUST) 执行 "Loop Detection" 一节中描述的过程。

如果该 LSR 检测到环路, 它 必须 (MUST) 拒绝该 Label Request 消息。

该 LSR 必须 (MUST):

  1. 向发送方 LSR 发送一条信号 "Loop Detected" 的通知消息。

  2. 不再进一步传播该 Label Request 消息。

请注意, 带有 Path Vector TLV 的 Label Request 消息会被转发, 直到:

  1. 发现环路,

  2. 到达该 LSP 的出口, 或

  3. 达到最大 Path Vector 限制或最大 Hop Count 限制。这被视为检测到了环路。

3.4.5.1.2. 标签映射路径向量​

"Loop Detection" 一节规定了 LSR 必须在 Label Mapping 消息中包含 Path Vector TLV 的各种情况。

在 Label Mapping 消息中收到 Path Vector 的 LSR 必须 (MUST) 执行 "Loop Detection" 一节中描述的过程。

如果该 LSR 检测到环路, 它 必须 (MUST) 拒绝该 Label Mapping 消息, 以防止转发环路。该 LSR 必须 (MUST):

  1. 向发送方 LSR 发送一条携带 Status TLV 的 Label Release 消息以信号 "Loop Detected"。

  2. 不再进一步传播该消息。

  3. 检查该 Label Mapping 消息是否针对一条已存在的 LSP。如果是, 该 LSR 必须解除 (unsplice) 任何已拼接到该 FEC 下游标签上的上游标签。

请注意, 带有 Path Vector TLV 的 Label Mapping 消息会被转发, 直到:

  1. 发现环路,

  2. 到达某个 LSP 入口, 或

  3. 达到最大 Path Vector 或最大 Hop Count 限制。这被视为检测到了环路。

3.4.6. Status TLV​

通知消息携带 Status TLV 以规定正在信号的事件。

Status 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|U|F| Status (0x0300) | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Status Code |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

U-bit

当 Status TLV 在通知消息中发送时, 应当 (SHOULD) 为 0。当 Status TLV 在其他消息中发送时, 应当 (SHOULD) 为 1。

F-bit

应当 (SHOULD) 与 Status Code 字段中 F 位的设置相同。

Status Code

编码正在信号的事件的 32 位无符号整数。Status Code 的结构为:

    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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|E|F| Status Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

E-bit

致命错误位。如果置位 (=1), 则这是一条致命错误通知 (Error Notification)。如果清零 (=0), 则这是一条建议通知 (Advisory Notification)。

F-bit

转发位。如果置位 (=1), 则应当 (SHOULD) 将该通知转发给与正在信号的事件相关联的 LSP 的下一跳或上一跳 LSR (如果有的话)。如果清零 (=0), 则不应 (SHOULD NOT) 转发该通知。

Status Data

30 位无符号整数, 规定状态信息。

本规范定义了一系列 Status Code (具有上述编码的 32 位无符号整数)。

Status Code 为 0 表示成功。

Message ID

如果非零, 则是用于标识该 Status TLV 所涉及的对等消息的 32 位值。如果为零, 则不标识任何特定的对等消息。

Message Type

如果非零, 则是该 Status TLV 所涉及的对等消息的类型。如果为零, 则该 Status TLV 不涉及任何特定消息类型。

请注意, Status TLV 的使用并不限于通知消息。通知消息以外的消息可以携带 Status TLV 作为可选参数。当通知消息以外的消息携带 Status TLV 时, 该 Status TLV 的 U 位 应当 (SHOULD) 置为 1, 以表示接收方在未准备好处理该 TLV 时 应当 (SHOULD) 静默丢弃它。