3.5.7. 标签映射消息
LSR 向 LDP 对等体发送标签映射 (Label Mapping) 消息, 以向对等体通告 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| Label Mapping (0x0400) | Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FEC TLV |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Label TLV |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Optional Parameters |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Message ID
用于标识本消息的 32 位值。
FEC TLV
规定正在通告的 FEC-标签映射中的 FEC 部分。编码见 "FEC TLVs" 一节。
Label TLV
规定 FEC-标签映射中的 Label 部分。编码见 "Label TLV" 一节。
Optional Parameters
该可变长度字段包含 0 个或多个参数, 每个参数编码为一个 TLV。可选参数为:
Optional Parameter Length Value
Label Request 4 See below
Message ID TLV
Hop Count TLV 1 See below
Path Vector TLV variable See below
Hop Count 和 Path Vector TLV 的编码见 "TLV Encodings for Commonly Used Parameters" 一节。
Label Request Message ID
如果本标签映射消息是对某条标签请求 (Label Request) 消息的响应, 则它必须包含 Label Request Message ID 可选参数。该可选参数的值是对应的标签请求消息的 Message ID。
Hop Count
规定由 Label 消息正在建立的 LSP 上 LSR 跳数的累计值。 "Hop Count Procedures" 一节描述如何处理该 TLV。
Path Vector
规定由 Label 消息正在建立的 LSP 上的各 LSR。 "Path Vector Procedures" 一节描述如何处理该 TLV。
3.5.7.1. 标签映射消息过程
映射 (Mapping) 消息由 LSR 用来向 LDP 对等体分发某个 FEC 的标签映射。如果 LSR 向多个 LDP 对等体分发某个 FEC 的映射, 那么它是为该 FEC 映射单个标签并向所有对等体分发该映射, 还是为其每个对等体使用不同的映射, 属于本地事务。
LSR 负责其所分发标签映射的一致性, 以及负责其各个对等体拥有这些映射。
从下游 LSR 收到某个前缀 (Prefix) 的标签映射消息的 LSR, 除非其路由表包含与该 FEC Element 精确匹配的条目, 否则 不应 (SHOULD NOT) 使用该标签进行转发。
更多细节见附录 A "LDP Label Distribution Procedures"。
3.5.7.1.1. 独立控制映射
如果 LSR 被配置为独立控制 (independent control), 则在以下任一情况下该 LSR 发送映射消息:
-
该 LSR 通过转发表识别出一个新的 FEC, 且标签通告方式为下游主动 (Downstream Unsolicited) 通告。
-
该 LSR 从上游对等体收到针对该 LSR 转发表中存在的某个 FEC 的请求 (Request) 消息。
-
某个 FEC 的下一跳变为另一个 LDP 对等体, 且配置了环路检测。
-
映射的属性发生变化。
-
从下游下一跳收到映射, 并且
a) 尚未创建上游映射, 或
b) 配置了环路检测, 或
c) 映射的属性已发生变化。
3.5.7.1.2. 有序控制映射
如果 LSR 执行有序控制 (Ordered Control), 则在以下任一情况下下游 LSR 发送映射消息:
-
该 LSR 通过转发表识别出一个新的 FEC, 并且它是该 FEC 的出口 (egress)。
-
该 LSR 从上游对等体收到针对该 LSR 转发表中存在的某个 FEC 的请求消息, 并且该 LSR 是该 FEC 的出口, 或者拥有该 FEC 的下游映射。
-
某个 FEC 的下一跳变为另一个 LDP 对等体, 且配置了环路检测。
-
映射的属性发生变化。
-
从下游下一跳收到映射, 并且
a) 尚未创建上游映射, 或
b) 配置了环路检测, 或
c) 映射的属性已发生变化。
3.5.7.1.3. 下游按需标签通告
通常, 在上游主动 (Downstream on Demand) 模式下运行时, 由上游 LSR 负责请求标签映射。然而, 如果不遵循某些规则, 具有不同通告方式的相邻 LSR 就可能陷入活锁 (livelock) 状态: 一切运行正常, 但没有标签被分发。例如, 考虑两台 LSR Ru 和 Rd, 对于某个特定 FEC, Ru 是上游 LSR 而 Rd 是下游 LSR。在此例中, Ru 使用下游主动通告方式, 而 Rd 使用下游按需方式。在这种情况下, Rd 可能假定 Ru 在需要时会请求标签映射, 而 Ru 可能假定如果 Rd 希望 Ru 使用某个标签, Rd 就会通告该标签。如果 Rd 和 Ru 都按上述假定的方式运行, 就不会有标签从 Rd 分发给 Ru。
如果遵循以下规则, 就可以避免这种活锁状态: 不应 (SHOULD NOT) 期望运行在下游按需模式下的 LSR 发送主动的映射通告。因此, 如果下游 LSR 运行在下游按需模式下, 则由上游 LSR 负责在需要时请求标签映射。
3.5.7.1.4. 下游主动标签通告
通常, 当下游 LSR 希望上游 LSR 使用某个标签时, 由下游 LSR 负责通告该标签映射。上游 LSR 如果愿意, 可以发出映射请求。
下游主动模式与保守标签保留 (Conservative Label retention) 相结合, 可能导致 LSR 释放它以后需要的某个 FEC 的标签。例如, 如果 LSR Rd 向 LSR Ru 通告某个 FEC 的标签, 而 Rd 并不是 Ru 在该 FEC 上的下一跳, 则 Ru 会释放该标签。如果 Ru 在该 FEC 上的下一跳后来变为 Rd, 它就需要先前释放的标签。
为处理这种情况, Ru 可以在需要时显式请求该标签, 或者 Rd 可以周期性地向 Ru 重新通告该标签。在许多情况下, Ru 会知道它何时需要来自 Rd 的标签。例如, 当它在该 FEC 上的下一跳变为 Rd 时。然而, 也可能存在 Ru 并不知道的情况。例如, Rd 可能试图建立一条具有非标准属性的 LSP。在这种情况下强制 Ru 显式请求该标签, 将要求它维护关于一条具有非标准属性的潜在 LSP 的状态。
在 Ru 知道自己需要该标签的情况下, 由 Ru 负责通过标签请求消息显式请求该标签。在 Ru 可能不知道它需要该标签的情况下, 由 Rd 负责周期性地向 Ru 重新通告该标签。
对于本版本的 LDP, Ru 知道自己需要 Rd 为其提供某个 FEC 的标签的唯一情况是: Rd 是该 FEC 在 Ru 处的下一跳, Ru 没有来自 Rd 的标签, 且该 FEC 的 LSP 是可以用本文档所定义的 TLV 建立的那种。