3.5.1. 通知消息
LSR 发送通知 (Notification) 消息, 以将某个重要事件告知 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0| Notification (0x0001) | Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Status (TLV) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Optional Parameters |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Message ID
用于标识本消息的 32 位值。
Status TLV
表示正在信号的事件。Status TLV 的编码在 "Status TLV" 一节中规定。
Optional Parameters
该可变长度字段包含 0 个或多个参数, 每个参数编码为一个 TLV。以下可选参数是通用的, 可以出现在任何通知消息中:
Optional Parameter Type Length Value
Extended Status 0x0301 4 See below
Returned PDU 0x0302 var See below
Returned Message 0x0303 var See below
也可能出现其他可选参数, 它们特定于通知消息正在信号的具体事件; 这些参数在其他地方描述。
Extended Status
该 4 字节值是一个 Extended Status Code, 它编码附加信息, 以补充通知 Status Code 中所包含的状态信息。
Returned PDU
LSR 使用该参数将某个 LDP PDU 的一部分返回给发送该 PDU 的 LSR。该 TLV 的值是 PDU 头部, 以及紧随头部之后、相对于通知消息所信号的条件而言适当的那部分 PDU 数据。
Returned Message
LSR 使用该参数将某条 LDP 消息的一部分返回给发送该消息的 LSR。该 TLV 的值是消息的类型和长度字段, 以及紧随类型和长度字段之后、相对于通知消息所信号的条件而言适当的那部分消息数据。
3.5.1.1. 通知消息过程
如果 LSR 遇到某种情况, 需要以建议性或错误信息通知其对等体, 它就向该对等体发送一条通知消息, 其中包含编码该信息的 Status TLV, 以及可选的其他 TLV 以提供关于该情况的更多信息。
如果该情况属于致命错误, 则通知中携带的 Status Code 会表明这一点。在这种情况下, 发送该通知消息之后, 该 LSR 应当 (SHOULD) 通过关闭会话 TCP 连接来终止该 LDP 会话, 并丢弃与该会话关联的所有状态, 包括通过该会话学到的所有标签-FEC 绑定。
当 LSR 收到携带表示致命错误的 Status Code 的通知消息时, 它 应当 (SHOULD) 立即通过关闭会话 TCP 连接来终止该 LDP 会话, 并丢弃与该会话关联的所有状态, 包括通过该会话学到的所有标签-FEC 绑定。
上述说明不适用于会话初始化过程中对 Shutdown 消息的处理。当 LSR 在会话初始化期间收到 Shutdown 消息时, 它 应当 (SHOULD) 发送一条 Shutdown 消息, 然后关闭传输连接。
3.5.1.2. 由通知消息信号的事件
出于描述方便, 将通知消息所信号的事件分为以下类别是有用的。
3.5.1.2.1. 畸形 PDU 或消息
作为 LDP 发现机制一部分的畸形 LDP PDU 或消息, 通过静默丢弃来处理。
在某个 LDP 会话的 TCP 连接上收到的 LDP PDU 在以下情况下是畸形的:
-
PDU 头部中的 LDP Identifier 对接收方是未知的, 或者它是已知的, 但不是接收方为此 LDP 会话与该 LDP 对等体关联的 LDP Identifier。这是由 Bad LDP Identifier Status Code 信号的致命错误。
-
该 LDP 协议版本不为接收方所支持, 或者它被支持但不是会话建立期间为该会话协商的版本。这是由 Bad Protocol Version Status Code 信号的致命错误。
-
PDU Length 字段太小 (小于 14) 或太大 (大于最大 PDU 长度)。这是由 Bad PDU Length Status Code 信号的致命错误。 "Initialization Message" 一节描述了如何确定会话的最大 PDU 长度。
LDP 消息在以下情况下是畸形的:
-
Message Type 未知。
如果 Message Type 小于 0x8000 (高位 = 0), 则这是由 Unknown Message Type Status Code 信号的错误。
如果 Message Type 大于等于 0x8000 (高位 = 1), 则静默丢弃它。
-
Message Length 太大, 即指示该消息延伸到包含它的 LDP PDU 末尾之外。这是由 Bad Message Length Status Code 信号的致命错误。
-
Message Length 太小, 即小于可能的最小值组成部分。这是由 Bad Message Length Status Code 信号的致命错误。
-
该消息缺少一个或多个必需参数 (Mandatory Parameters)。这是由 Missing Message Parameters Status Code 信号的非致命错误。
3.5.1.2.2. 未知或畸形 TLV
作为 LDP 发现机制一部分的 LDP 消息中所包含的畸形 TLV, 通过静默丢弃包含它的消息来处理。
在某个 LDP 会话 TCP 连接上收到的 LDP 消息中所包含的 TLV, 在以下情况下是畸形的:
-
TLV Length 太大, 即指示该 TLV 延伸到包含它的消息末尾之外。这是由 Bad TLV Length Status Code 信号的致命错误。
-
TLV 类型未知。
如果 TLV 类型小于 0x8000 (高位 = 0), 则这是由 Unknown TLV Status Code 信号的错误。
如果 TLV 类型大于等于 0x8000 (高位 = 1), 则静默丢弃该 TLV。
-
TLV Value 畸形。当接收方处理该 TLV 但无法解码该 TLV Value 时, 会发生这种情况。这被解释为表明发送方或接收方 LSR 存在缺陷。这是由 Malformed TLV Value Status Code 信号的致命错误。
3.5.1.2.3. 会话 KeepAlive Timer 到期
这是由 KeepAlive Timer Expired Status Code 信号的致命错误。
3.5.1.2.4. 单方面会话关闭
这是由 Shutdown Status Code 信号的致命事件。通知消息可以可选地包含一个 Extended Status TLV, 以提供关闭的原因。发送方 LSR 在发送该通知后立即终止会话。
3.5.1.2.5. 初始化消息事件
如果初始化消息中收到的会话参数不可接受, 会话初始化协商 (见 "Session Initialization" 一节) 就可能失败。这是致命错误。具体的 Status Code 取决于被认为不可接受的参数, 并在 "Initialization Message" 各节中定义。
3.5.1.2.6. 由其他消息产生的事件
初始化消息以外的消息可能产生必须通过通知消息向 LDP 对等体信号的事件。这些事件以及用于信号它们的通知消息中所使用的 Status Code, 在描述这些消息的各节中说明。
3.5.1.2.7. 内部错误
LDP 实现可能能够检测其实现特有的问题情况。当这种情况使实现无法与对等体正确交互时, 该实现应当 (在能够做到时) 使用 Internal Error Status Code 向对等体发出信号。这是致命错误。
3.5.1.2.8. 杂项事件
这些是不属于上述任何类别的事件。本版本协议中没有定义杂项事件。