跳到主要内容

3. 协议规范

前面描述 LDP 操作的各节讨论了涉及 LDP 对等体之间交换消息的场景。本节规定消息的编码以及处理这些消息的过程。

LDP 消息交换是通过在 LDP 会话 TCP 连接上发送 LDP 协议数据单元 (Protocol Data Unit, PDU) 来完成的。

每个 LDP PDU 可以携带一条或多条 LDP 消息。请注意, 一个 LDP PDU 中的各条消息不必彼此相关。例如, 单个 PDU 可以携带一条通告若干 FEC 的 FEC-标签绑定的消息、另一条请求若干其他 FEC 的标签绑定的消息, 以及第三条信号某个事件的通知消息。

3.1. LDP PDU​

每个 LDP PDU 由一个 LDP 头部后跟一条或多条 LDP 消息组成。LDP 头部为:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | PDU Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LDP Identifier |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Version

包含协议版本号的两字节无符号整数。本版本规范规定 LDP 协议版本为 1。

PDU Length

两字节整数, 规定本 PDU 的总长度 (以八位组为单位), 不包括 Version 和 PDU Length 字段。

最大允许的 PDU Length 在 LDP 会话初始化时可协商。在协商完成之前, 最大允许长度为 4096 字节。

LDP Identifier

唯一标识本 PDU 所适用的发送方 LSR 标签空间的六字节字段。前四个八位组标识该 LSR, 且必须是全局唯一的值。它应当是分配给该 LSR 的 32 位路由器 Id (router Id), 同时也用于在环路检测路径向量 (Loop Detection Path Vectors) 中标识该 LSR。最后两个八位组标识该 LSR 内的一个标签空间。对于平台级 (platform-wide) 标签空间, 这两个八位组都应当为零。

请注意, LDP PDU 的第一个八位组没有对齐要求。

3.2. LDP 过程​

LDP 在以下方面定义了消息、TLV 和过程:

  • 对等体发现 (Peer discovery)
  • 会话管理 (Session management)
  • 标签分发 (Label distribution)
  • 错误与建议性信息的通知 (Notification of errors and advisory information)

随后的各节描述这些方面的消息和 TLV 编码, 以及适用于它们的过程。

标签分发过程很复杂, 很难作为一组彼此独立的消息和 TLV 规范来完整、一致且无歧义地描述。

附录 A "LDP Label Distribution Procedures" 以可能发生在 LSR 上的标签分发事件以及该 LSR 必须如何响应的方式描述标签分发过程。附录 A 是 LDP 标签分发过程的规范。如果本文档其他位置描述的过程与附录 A 冲突, 则以附录 A 规定 LDP 的行为。

3.3. 类型-长度-值编码​

LDP 使用类型-长度-值 (Type-Length-Value, TLV) 编码方案来编码 LDP 消息中携带的大部分信息。

一个 LDP TLV 编码为一个两字节字段, 其中使用 14 位规定 Type, 2 位规定 LSR 不识别该 Type 时的行为; 其后是一个两字节的 Length 字段, 再后是可变长度的 Value 字段。

 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| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Value |
~ ~
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

U-bit

未知 TLV 位。收到未知 TLV 时, 如果 U 为 0, 则必须向消息发起方返回一个通知, 并且必须忽略整条消息; 如果 U 为 1, 则必须静默忽略该未知 TLV, 并像该未知 TLV 不存在一样处理消息的其余部分。随后定义 TLV 的各节为 U 位规定了取值。

F-bit

转发未知 TLV 位。该位仅在 U 位被置位, 且包含该未知 TLV 的 LDP 消息需要被转发时适用。如果 F 为 0, 则该未知 TLV 不随包含它的消息一起转发; 如果 F 为 1, 则该未知 TLV 随包含它的消息一起转发。随后定义 TLV 的各节为 F 位规定了取值。通过同时置位 U 位和 F 位, 一个 TLV 可以作为不透明数据 (opaque data) 穿过不识别该 TLV 的节点传播。

Type

编码 Value 字段应如何解释。

Length

规定 Value 字段的长度 (以八位组为单位)。

Value

长度为 Length 个八位组的八位组串, 它所编码的信息应按 Type 字段的规定来解释。

请注意, TLV 的第一个八位组没有对齐要求。

请注意, Value 字段本身可以包含 TLV 编码。也就是说, TLV 可以嵌套。

TLV 编码方案非常通用。原则上, 出现在 LDP PDU 中的所有内容都可以编码为 TLV。本规范没有充分发挥 TLV 方案的通用性。在不需要其通用性、且使用它会造成不必要的空间浪费的地方, 就没有使用它。这些地方通常是: 待编码值的类型已知 (例如通过其在消息或外层 TLV 中的位置), 且值的长度固定, 或者可以很容易地从值编码本身推导出来。

为 LDP 定义的一些 TLV 彼此相似。例如, 有 Generic Label TLV、ATM Label TLV 和 Frame Relay TLV; 见 "Generic Label TLV"、"ATM Label TLV" 和 "Frame Relay TLV" 各节。

虽然可以按 "规定 TLV 类别的 TLV type" 与 "规定该类别中特定 TLV 的 TLV subtype" 的方式来考虑这样相互关联的 TLV, 但本规范并未形式化 TLV subtype 的概念。

本规范从 16 位 TLV 类型编号空间的某个连续块中, 为相关 TLV (例如标签 TLV) 分配类型值。

"TLV Summary" 一节列出了本版本协议中定义的 TLV, 以及本文档中描述每个 TLV 的章节。