跳到主要内容

A.1. 处理标签分发事件

本节通过为每个标签分发事件规定一个算法来定义 LDP 标签分发过程。对 LDP 实现的要求是: 其事件处理必须具有这些算法所规定的效果。也就是说, 只要效果相同, 实现不必严格遵循这些算法所规定的步骤。

处理标签分发事件的算法共享一些公共动作。下面的规范把这些公共动作打包为过程单元。这些公共过程的规范在它们自己的一节 "Common Label Distribution Procedures" 中给出, 该节紧随本节之后。

实现会使用数据结构来存储有关协议活动的信息。本附录以足以描述这些算法的详细程度规定要存储的信息, 并假定能够按需取回这些信息。它不规定数据结构的细节。

A.1.1. 收到标签请求​

摘要:

LSR 对从 LDP 对等体收到某个 FEC 标签请求的响应可能涉及以下一项或多项动作:

  • 向请求方 LSR 发送一条通知消息, 说明为何无法提供该 FEC 的标签映射;

  • 向请求方 LSR 发送该 FEC 的标签映射;

  • 向该 FEC 的下一跳发送该 FEC 的标签请求;

  • 安装标签以供该 LSR 转发/交换使用。

上下文:

  • LSR。处理该事件的 LSR。

  • MsgSource。发送该消息的 LDP 对等体。

  • FEC。该消息中规定的 FEC。

  • RAttributes。随该消息收到的属性, 例如 Hop Count、Path Vector。

  • SAttributes。要包含在传播给 FEC 下一跳的 Label Request 消息 (如果有) 中的属性。

  • StoredHopCount。先前为该 FEC 记录的跳数 (如果有)。

算法:

   LRq.1   执行过程 Check_Received_Attributes (MsgSource,
           LabelRequest, RAttributes)。
           如果检测到环路 (Loop Detected), 转到 LRq.4。

   LRq.2   该 FEC 是否有下一跳 (Next Hop)?
           如果没有, 转到 LRq.5。

   LRq.3   MsgSource 是下一跳吗?
           如果不是, 转到 LRq.6。

   LRq.4   执行过程 Send_Notification (MsgSource, Loop
           Detected)。
           转到 LRq.13

   LRq.5   执行过程 Send_Notification (MsgSource, No Route)。
           转到 LRq.13。

   LRq.6   LSR 先前是否从 MsgSource 收到过针对该 FEC 的标签请求?
           如果没有, 转到 LRq.8。(见注释 1。)

   LRq.7   该标签请求是重复请求吗?
           如果是, 转到 LRq.13。(见注释 2。)

   LRq.8   记录从 MsgSource 收到的针对该 FEC 的标签请求, 并将其
           标记为待定 (pending)。

   LRq.9   执行 LSR 标签分发过程:

         对于下游主动独立控制 (Downstream Unsolicited Independent
         Control) 或对于下游按需独立控制 (Downstream On Demand
         Independent Control)

            1. LSR 先前是否从下一跳收到并保留了该 FEC 的标签
               映射?
               如果是, 将 Propagating 置为 IsPropagating。
               如果没有, 将 Propagating 置为 NotPropagating。

            2. 执行过程
               Prepare_Label_Mapping_Attributes(MsgSource, FEC,
               RAttributes, SAttributes, Propagating,
               StoredHopCount)。

            3. 执行过程 Send_Label (MsgSource, FEC,
               SAttributes)。

            4. LSR 是该 FEC 的出口吗? 或者 LSR 先前是否从下一跳
               收到并保留了该 FEC 的标签映射?
               如果是, 转到 LRq.11。
               如果没有, 转到 LRq.10。

           对于下游主动有序控制 (Downstream Unsolicited Ordered
           Control) 或对于下游按需有序控制 (Downstream On Demand
           Ordered Control)

            1. LSR 是该 FEC 的出口吗? 或者 LSR 先前是否从下一跳
               收到并保留了该 FEC 的标签映射?
               (见注释 3。)
               如果没有, 转到 LRq.10。

            2. 执行过程
               Prepare_Label_Mapping_Attributes(MsgSource, FEC,
               RAttributes, SAttributes, IsPropagating,
               StoredHopCount)

            3. 执行过程 Send_Label (MsgSource, FEC,
               SAttributes)。
               转到 LRq.11。

   LRq.10  执行 LSR 标签请求过程:

      对于从不请求 (Request Never)

               1. 转到 LRq.13。

      对于需要时请求 (Request When Needed) 或
      对于按请求请求 (Request On Request)

            1.  执行过程 Prepare_Label_Request_Attributes
               (Next Hop, FEC, RAttributes, SAttributes);

            2. 执行过程 Send_Label_Request (Next Hop, FEC,
               SAttributes)。
               转到 LRq.13。

   LRq.11  LSR 是否已成功地向 MsgSource 发送了该 FEC 的标签?
           如果没有, 转到 LRq.13。(见注释 4。)

   LRq.12  执行 LSR 标签使用过程。

           对于立即使用 (Use Immediate) 或对于未检测到环路时
           使用 (Use If Loop Not Detected)

            1. 安装发送给 MsgSource 的标签, 以及来自下一跳的标签
               (如果 LSR 不是出口), 以供转发/交换使用。

   LRq.13  完成 (DONE)。

   注释:

      1. 在 MsgSource 是非标签合并 (non-label merging) LSR 的
         情况下, 它会为每一个向它请求该 FEC 标签的上游 LDP 对等体
         发送一条标签请求。LSR 必须能够把来自非标签合并 MsgSource
         的这类请求与重复的标签请求区分开。

         LSR 使用所收到的 Label Request 消息的 message ID 来检测
         重复请求。这意味着 LSR (上游对等体) 在 Label Request 事务
         完成之前, 不得重用用于某条 Label Request 的 message ID。

      2. 当 LSR 向某个对等体发送标签请求时, 它记录该请求已发送,
         并将其标记为未完成 (outstanding)。只要该请求被标记为
         未完成, 该 LSR 就不应 (SHOULD NOT) 向该对等体发送针对
         同一标签的另一个请求。这样的第二个请求将是重复的。下文
         描述的 Send_Label_Request 过程遵循该规则。

         重复的标签请求被视为协议错误, 接收方 LSR 应当 (SHOULD)
         丢弃它 (也可以向 MsgSource 返回一条适当的通知)。

      3. 如果该 LSR 不支持合并 (merge-capable), 该判断将失败。

      4. Send_Label 过程可能因缺少标签资源而失败, 在这种情况下
         LSR 不应 (SHOULD NOT) 执行标签使用过程。

A.1.2. 收到标签映射​

摘要:

LSR 对从 LDP 对等体收到某个 FEC 标签映射的响应可能涉及以下一项或多项动作:

  • 就使该 FEC 标签向该 LDP 对等体发送一条 Label Release 消息;

  • 向一个或多个 LDP 对等体发送该 FEC 的 Label Mapping 消息;

  • 安装新学到的标签以供该 LSR 转发/交换使用。

上下文:

  • LSR。处理该事件的 LSR。

  • MsgSource。发送该消息的 LDP 对等体。

  • FEC。该消息中规定的 FEC。

  • Label。该消息中规定的标签。

  • PrevAdvLabel。先前向上游对等体通告过的该 FEC 的标签 (如果有)。假定先前没有通告过标签, 则该标签与正在处理的 Label Mapping 消息中的标签相同。

  • StoredHopCount。先前为该 FEC 记录的跳数。

  • RAttributes。随该消息收到的属性, 例如 Hop Count、Path Vector。

  • SAttributes。要包含在传播给上游对等体的 Label Mapping 消息 (如果有) 中的属性。

算法:

   LMp.1   所收到的标签映射是否匹配先前向 MsgSource 发送的、针对
           该 FEC 的一条未完成标签请求? 如果不匹配, 转到 LMp.3。

   LMp.2   删除该未完成的 FEC 标签请求的记录。

   LMp.3   执行过程 Check_Received_Attributes (MsgSource,
           LabelMapping, RAttributes)。
           如果未检测到环路 (No Loop Detected), 转到 LMp.9。

   LMp.4   LSR 是否拥有先前从 MsgSource 收到的该 FEC 的标签映射?
           (见注释 1。)
           如果没有, 转到 LMp.8。(见注释 2。)

   LMp.5   先前从 MsgSource 收到的标签是否与 Label (即该消息中收到
           的标签) 相同? (见注释 3。)
           如果不相同, 转到 LMp.8。(见注释 4。)

   LMp.6   删除先前从 MsgSource 收到的、匹配的该 FEC 的标签映射。

   LMp.7   将 Label 从转发/交换使用中移除。(见注释 5。)

   LMp.8   执行过程 Send_Message (MsgSource, Label Release,
           FEC, Label, Loop Detected Status code)。转到 LMp.33。

   LMp.9   LSR 是否拥有先前从 MsgSource 收到的、针对所涉 LSP 的该
           FEC 的标签映射? (见注释 6。)
           如果没有, 转到 LMp.11。

   LMp.10  先前从 MsgSource 收到的标签是否与 Label (即该消息中收到
           的标签) 相同? (见注释 3。)
           或者
           所收到的标签映射是否是针对先前向 MsgSource 发送的一条
           未完成标签请求的响应? (见注释 12。)
           如果是, 转到 LMp.11。

   LMp.10a LSR 是否运行在下游主动 (Downstream Unsolicited) 模式?
           如果是, 删除先前从 MsgSource 收到的该标签的标签映射,
           并将其从转发/交换使用中移除。
           执行过程 Send_Message (MsgSource, Label Release,
           FEC, 先前从 MsgSource 收到的标签)。

   LMp.11  确定该 FEC 的下一跳。

   LMp.12  MsgSource 是该 FEC 的下一跳吗?
           如果是, 转到 LMp.14。

   LMp.13  执行 LSR 标签释放过程:

                对于保守标签保留 (Conservative Label retention):

                    1. 转到 LMp.32。

                对于宽松标签保留 (Liberal Label retention):

                    1. 记录已从 MsgSource 收到带有 Label 和
                       RAttributes 的该 FEC 的标签映射。
                       转到 LMp.33。

   LMp.14  LSR 是该 FEC 的入口吗?
           如果不是, 转到 LMp.16。

   LMp.15  安装 Label 以供转发/交换使用。

   LMp.16  记录已从 MsgSource 收到带有 Label 和 RAttributes 的该
           FEC 的标签映射。

   LMp.17  对每个 Peer 迭代执行 LMp.18 到 LMp.31。(见注释 7。)

   LMp.18  LSR 先前是否向 Peer 发送过针对所涉 LSP 的该 FEC 的标签
           映射? (见注释 8。)
           如果是, 转到 LMp.22。

   LMp.19  LSR 是否正在使用下游主动有序控制 (Downstream Unsolicited
           Ordered Control) 标签分发过程?
           如果不是, 转到 LMp.28。

   LMp.20  执行过程 Prepare_Label_Mapping_Attributes (Peer,
           FEC, RAttributes, SAttributes, IsPropagating,
           StoredHopCount)。

   LMp.21  执行过程 Send_Message (Peer, Label Mapping, FEC,
           PrevAdvLabel, SAttributes)。(见注释 13。)
           转到 LMp.28。

   LMp.22  对先前向 Peer 发送过的每一个该 FEC 的标签映射, 迭代执行
           LMp.23 到 LMp.27。

   LMp.23  所收到的标签映射中的 RAttributes 是否与先前向 Peer 发送
           的那些一致? 如果一致, 从 LMp.22 继续迭代下一个标签映射。
           (见注释 9。)

   LMp.24  执行过程 Prepare_Label_Mapping_Attributes (Peer,
           FEC, RAttributes, SAttributes, IsPropagating,
           StoredHopCount)。

   LMp.25  执行过程 Send_Message (Peer, Label Mapping, FEC,
           PrevAdvLabel, SAttributes)。(见注释 10。)

   LMp.26  更新先前向 Peer 发送的该 FEC 标签映射的记录, 以包含所
           发送的新属性。

   LMp.27  结束从 LMp.22 开始的迭代。

   LMp.28  LSR 是否有来自 Peer 的、被标记为待定的该 FEC 标签请求?
           如果没有, 转到 LMp.30。

   LMp.29  执行 LSR 标签分发过程:

        对于下游主动独立控制或对于下游主动有序控制:

            1. 执行过程
               Prepare_Label_Mapping_Attributes (Peer, FEC,
               RAttributes, SAttributes, IsPropagating,
               UnknownHopCount)。

            2. 执行过程 Send_Label (Peer, FEC, SAttributes)。
               如果该过程失败, 在 LMp.17 处继续迭代下一个 Peer。

            3. 如果 Peer 不存在待定请求, 转到 LMp.30。
               (见注释 11。)

        对于下游按需独立控制或对于下游按需有序控制:

            1. 对来自 Peer 的、被标记为待定的每一个该 FEC 标签请求,
               迭代执行第 2 步到第 5 步。

            2. 执行过程
               Prepare_Label_Mapping_Attributes (Peer, FEC,
               RAttributes, SAttributes, IsPropagating,
               UnknownHopCount)

            3. 执行过程 Send_Label (Peer, FEC, SAttributes)。
               如果该过程失败, 在 LMp.17 处继续迭代下一个 Peer。

            4. 删除该待定请求的记录。

            5. 结束从第 1 步开始的迭代。

            6. 转到 LMp.30。

   LMp.30  执行 LSR 标签使用过程:

        对于立即使用或对于未检测到环路时使用:

            1. 对先前向 Peer 发送过的每一个该 FEC 的标签映射, 迭代
               执行第 2 步到第 3 步。

            2. 安装所收到的标签和向 Peer 发送的标签, 以供转发/交换
               使用。

            3. 结束从第 1 步开始的迭代。

            4. 转到 LMp.31。

   LMp.31  结束从 LMp.17 开始的迭代。
           转到 LMp.33。

   LMp.32  执行过程 Send_Message (MsgSource, Label Release,
           FEC, Label)。

   LMp.33  完成 (DONE)。

注释:

   1.  如果该 LSR 进行合并 (merging), 则针对所涉 LSP 的该 FEC,
       最多应有 1 个收到的映射。在非合并情况下, 针对所涉 LSP 的
       该 FEC, 可能有多个收到的映射。

   2.  如果该 LSR 已检测到环路, 且它先前未从 MsgSource 收到该 FEC
       的标签映射, 则它直接释放该标签。

   3.  该消息中收到的 Label 是否与上一步 (LMp.4 或 LMp.9) 中识别
       出的那 1 个或多个标签映射中的任何一个相匹配?

   4.  来自同一对等体的、带有不同标签的主动映射, 将是在尝试建立
       多路径标签交换, 而本版本的 LDP 不支持该功能。

   5.  如果 Label 未处于转发/交换使用中, LMp.7 不会产生任何效果。

   6.  如果所收到的标签映射消息在 LMp.1 中匹配了一条未完成标签
       请求, 那么 (依定义) 该 LSR 先前未收到针对所涉 LSP 的该 FEC
       的标签映射。如果该 LSR 正在合并所涉 LSP 的上游标签, 则最多
       应有 1 个收到的映射。在非合并情况下, 同一 FEC 可能有多个
       收到的标签映射, 每个产生的 LSP 对应一个。

   7.  LMp.17 的迭代包含 MsgSource, 以处理该 LSR 运行在下游主动
       有序控制模式下的情况。有序控制使该 LSR 在收到其下一跳
       (MsgSource) 为该 FEC 发来的标签映射之前, 无法为该 FEC 通告
       标签。

   8.  如果该 LSR 正在合并该 LSP, 它可能先前已向一个或多个对等体
       发送过该 FEC LSP 的标签映射。如果该 LSR 不进行合并, 它可能
       已向至多一个 LSR 发送过所涉 LSP 的标签映射。

   9.  该检查会考虑环路检测 Path Vector 属性。如果所收到的
       RAttributes 包含 Path Vector, 而先前未向该 Peer 发送过任何
       Path Vector, 或者所收到的 Path Vector 与先前向该 Peer 发送
       的 Path Vector 不一致, 则这些属性被视为不一致。请注意, LSR
       在把所收到的 Path Vector 传播到某条映射消息中之后, 并不要求
       它存储该 Path Vector。如果 LSR 不存储该 Path Vector, 它就
       无法检查新收到的 Path Vector 的一致性。这意味着每当这样的
       LSR 收到携带 Path Vector 的映射消息时, 它必须始终传播该
       Path Vector。

   10. LMp.22 到 LMp.27 处理当 LSR 使用独立控制、且它在向上游对等
       体发送映射之后又从下游对等体收到映射时可能出现的情况。在这
       种情况下, 该 LSR 需要向上游传播任何发生变化的属性, 例如
       Hop Count。如果配置了环路检测, 所传播的属性必须包含 Path
       Vector。

   11. 运行在下游主动模式下的 LSR 必须处理它收到的任何 Label
       Request 消息。如果有待定的标签请求, 则落入下游按需过程,
       以满足这些待定请求。

   12. 由步骤 LMp.1 确定。

   13. 运行在有序控制模式下的 LSR 可以选择在这一阶段跳过那个向它
       发送了导致它生成该标签映射消息的通告的对等体。这样做实际
       上会提供一种水平分割 (split-horizon) 形式。

A.1.3. 收到标签中止请求​

摘要:

当 LSR 从某个对等体收到 Label Abort Request 消息时, 它检查自己是否已经响应了所涉的标签请求。如果已经响应, 它就静默忽略该消息。如果尚未响应, 它就向该对等体发送一条 Label Request Aborted 通知。此外, 如果它有一条针对所涉 LSP、发向下游对等体的未完成标签请求, 它就向下游对等体发送一条 Label Abort Request, 以中止该 LSP。

上下文:

  • LSR。处理该事件的 LSR。

  • MsgSource。发送该消息的 LDP 对等体。

  • FEC。该消息中规定的 FEC。

  • RequestMessageID。要中止的标签请求消息的 message ID。

  • Next Hop。该 FEC 的下一跳。

算法:

   LAbR.1  该消息是否匹配先前从 MsgSource 收到的某条 Label Request
消息? (见注释 1。)
如果不匹配, 转到 LAbR.12。

LAbR.2 LSR 是否已响应了先前收到的该标签请求?
如果是, 转到 LAbR.12。

LAbR.3 执行过程 Send_Message (MsgSource, Notification,
Label Request Aborted, TLV), 其中 TLV 是在该 Label Abort
Request 消息中收到的 Label Request Message ID TLV。

LAbR.4 LSR 是否有针对该 FEC 的未完成 Label Request 消息?
如果有, 转到 LAbR.7。

LAbR.5 LSR 是否有该 FEC 的标签映射? 如果没有, 转到 LAbR.11。

LAbR.6 生成事件: 从 MsgSource 收到该 FEC 的 Label Release 消息。
(见注释 2。)
转到 LAbR.11。

LAbR.7 LSR 是否在合并该 FEC 的 LSP?
如果不是, 转到 LAbR.9。

LAbR.8 该 FEC 是否存在未完成的标签请求?
如果有, 转到 LAbR.11。

LAbR.9 执行过程 Send_Message (Next Hop, Label Abort
Request, FEC, TLV), 其中 TLV 是一个 Label Request message
ID TLV, 它包含该 LSR 在未完成 Label Request 消息中使用
的 Message ID。

LAbR.10 记录该 FEC 的标签中止请求处于待定状态。

LAbR.11 删除来自 MsgSource 的该 FEC 标签请求的记录。

LAbR.12 完成 (DONE)。

注释:

1. LSR 使用 FEC 和该标签中止请求所携带的 Label Request message
ID TLV 来定位它 (如果有) 关于先前从 MsgSource 收到的该标签
请求的记录。

2. 如果 LSR 已从 NextHop 收到标签映射, 它应当表现得如同它已向
MsgSource 通告了标签映射、而 MsgSource 已释放了该映射一样。

A.1.4. 收到标签释放​

摘要:

当 LSR 从某个对等体收到针对某个 FEC 的 Label Release 消息时, 它检查是否还有其他对等体持有被释放的标签。如果没有任何对等体持有, 则该 LSR 把该标签从转发/交换使用中移除 (如果它尚未这样做), 并且如果该 LSR 持有来自该 FEC 下一跳的标签映射, 它就释放该标签映射。

上下文:

  • LSR。处理该事件的 LSR。

  • MsgSource。发送该消息的 LDP 对等体。

  • Label。该消息中规定的标签。

  • FEC。该消息中规定的 FEC。

算法:

   LRl.1   FEC 是否匹配某个已知 FEC? 如果不匹配, 转到 LRl.14。

LRl.2 从持有该 FEC 的 Label 的对等体记录中移除 MsgSource。
(见注释 1。)

LRl.3 该消息是否匹配先前向 MsgSource 发送的、针对该 FEC 的某
条未完成标签撤销?
如果不匹配, 转到 LRl.5

LRl.4 删除先前向 MsgSource 发送的、针对该 FEC 的未完成标签
撤销的记录。

LRl.5 LSR 是否在合并该 FEC 的标签? 如果不是, 转到 LRl.7。
(见注释 2。)

LRl.6 LSR 是否有该 FEC 的未完成标签通告?
如果有, 转到 LRl.11。

LRl.7 LSR 是该 FEC 的出口吗?
如果是, 转到 LRl.11。

LRl.8 该 FEC 是否有下一跳? 并且 LSR 是否拥有先前从下一跳收到
的该 FEC 的标签映射?
如果没有, 转到 LRl.11。

LRl.9 LSR 是否被配置为传播释放?
如果未配置, 转到 LRl.11。(见注释 3。)

LRl.10 执行过程 Send_Message (Next Hop, Label Release,
FEC, 来自 Next Hop 的 Label)。

LRl.11 将 Label 从针对来自 MsgSource 的流量的转发/交换使用中
移除。

LRl.12 是否仍有任何对等体持有该 FEC 的 Label?
如果有, 转到 LRl.14。

LRl.13 释放该 Label。

LRl.14 完成 (DONE)。

注释:

1. 如果 LSR 使用下游主动标签分发, 则在 MsgSource 请求之前,
它不应 (SHOULD NOT) 向 MsgSource 重新通告该 FEC 的标签映射。

2. LRl.5 到 LRl.9 处理如何确定该 LSR 是否应当把该 Label Release
传播给下游对等体 (LRl.9)。

3. 如果执行到 LRl.9, 则没有任何上游 LSR 持有该 FEC 的标签, 而
该 LSR 持有来自该 FEC 下一跳的该 FEC 标签。该 LSR 可以把该
Label Release 传播给下一跳。通过传播该 Label Release, 该 LSR
释放了可能稀缺的标签资源; 这样做同时也增加了当 MsgSource 或
其他上游 LSR 向它发送新的该 FEC Label Request 时重新建立该
LSP 的时延。

是否传播该释放不是协议问题。无论是否传播该释放, 标签分发都
会正常运行。是否传播的决定应当考虑如下因素: 在运行环境中标签
是否是稀缺资源、通过使所需信令量保持较小来保持 LSP 建立时延
较低的重要性, 以及在运行环境中 LSP 建立是由入口控制还是由
出口控制。

A.1.5. 收到标签撤销​

摘要:

当 LSR 从某个 LDP 对等体收到针对某个 FEC 的 Label Withdraw 消息时, 它用一条 Label Release 消息响应, 并把该标签从任何转发/交换使用中移除。如果正在使用有序控制, 该 LSR 向它先前发送过该 FEC 标签映射的每个 LDP 对等体发送一条 Label Withdraw 消息。如果该 LSR 使用下游按需标签通告结合独立控制, 则它随后表现得如同它刚刚识别出该 FEC 一样。

上下文:

  • LSR。处理该事件的 LSR。

  • MsgSource。发送该消息的 LDP 对等体。

  • Label。该消息中规定的标签。

  • FEC。该消息中规定的 FEC。

算法:

   LWd.1   将 Label 从转发/交换使用中移除。(见注释 1。)

LWd.2 执行过程 Send_Message (MsgSource, Label Release,
FEC, Label)。

LWd.3 LSR 先前是否从 MsgSource 收到并保留了匹配的该 FEC 标签
映射?
如果没有, 转到 LWd.13。

LWd.4 删除先前从 MsgSource 收到的、匹配的该 FEC 标签映射。

LWd.5 LSR 是否使用有序控制?
如果是, 转到 LWd.8。

LWd.6 MsgSource 是否使用下游按需标签通告?
如果不是, 转到 LWd.13。

LWd.7 生成事件: 识别出该 FEC 为新 FEC (Recognize New FEC)。
转到 LWd.13。(见注释 2。)

LWd.8 对除 MsgSource 之外的每个 Peer 迭代执行 LWd.9 到 LWd.12。

LWd.9 LSR 先前是否向 Peer 发送过该 FEC 的标签映射?
如果没有, 在 LWd.8 处继续迭代下一个 Peer。

LWd.10 先前发送给 Peer 的标签是否 "映射 (map)" 到被撤销的
Label?
如果不是, 在 LWd.8 处继续迭代下一个 Peer。(见注释 3。)

LWd.11 执行过程 Send_Label_Withdraw (Peer, FEC, 先前发送给
Peer 的 Label)。

LWd.12 结束从 LWd.8 开始的迭代。

LWd.13 完成 (DONE)。

注释:

1. 如果 Label 未处于转发/交换使用中, LWd.1 不会产生任何效果。

2. LWd.7 处理 LSR 使用下游按需标签分发结合独立控制的情况。在
这种情况下, 该 LSR 应当像它刚刚识别出该 FEC 一样, 向该 FEC
的下一跳发送标签请求。

3. LWd.10 同时处理标签合并 (一个或多个入标签映射到同一个出标签)
和非标签合并 (一个标签映射到该出标签) 两种情况。

A.1.6. 识别出新 FEC​

摘要:

LSR 对通过路由表获知一个新 FEC 的响应可能涉及以下一项或多项动作:

  • 向一个或多个 LDP 对等体发送该 FEC 的标签映射;

  • 向该 FEC 的下一跳发送该 FEC 的标签请求;

  • 当该 LSR 从该 FEC 的下一跳收到该 FEC 的标签映射时可能发生的任何动作。

上下文:

  • LSR。处理该事件的 LSR。

  • FEC。新识别出的 FEC。

  • Next Hop。该 FEC 的下一跳。

  • InitAttributes。要与该新 FEC 关联的属性。(见注释 1。)

  • SAttributes。要包含在发送给对等体的 Label Mapping 或 Label Request 消息 (如果有) 中的属性。

  • StoredHopCount。与先前从 Next Hop 收到的该 FEC 标签映射 (如果有) 关联的跳数。

算法:

   FEC.1   执行 LSR 标签分发过程:

        对于下游主动独立控制:

            1. 对每个 Peer 迭代执行第 2 步到第 5 步。

            2. LSR 先前是否从 Next Hop 收到并保留了该 FEC 的标签
               映射?
               如果是, 将 Propagating 置为 IsPropagating。
               如果不是, 将 Propagating 置为 NotPropagating。

            3. 执行过程 Prepare_Label_Mapping_Attributes
               (Peer, FEC, InitAttributes, SAttributes, Propagating,
               Unknown hop count(0))。

            4. 执行过程 Send_Label (Peer, FEC, SAttributes)。

            5. 结束从第 1 步开始的迭代。
               转到 FEC.2。

        对于下游主动有序控制:

            1. 对每个 Peer 迭代执行第 2 步到第 5 步。

            2. LSR 是该 FEC 的出口吗? 或者 LSR 先前是否从 Next Hop
               收到并保留了该 FEC 的标签映射?
               如果不是, 继续迭代下一个 Peer。

            3. 执行过程 Prepare_Label_Mapping_Attributes
               (Peer, FEC, InitAttributes, SAttributes, Propagating,
               StoredHopCount)。

            4. 执行过程 Send_Label (Peer, FEC, SAttributes)。

            5. 结束从第 1 步开始的迭代。
               转到 FEC.2。

        对于下游按需独立控制或
        对于下游按需有序控制:

            1. 转到 FEC.2。(见注释 2。)

   FEC.2   LSR 先前是否从 Next Hop 收到并保留了该 FEC 的标签映射?
           如果是, 转到 FEC.5

   FEC.3   Next Hop 是 LDP 对等体吗?
           如果不是, 转到 FEC.6

   FEC.4   执行 LSR 标签请求过程:

        对于从不请求 (Request Never):

            1. 转到 FEC.6

        对于需要时请求或
        对于按请求请求:

            1. 执行过程
               Prepare_Label_Request_Attributes (Next Hop, FEC,
               InitAttributes, SAttributes);

            2. 执行过程 Send_Label_Request (Next Hop, FEC,
               SAttributes)。
               转到 FEC.6。

   FEC.5   生成事件: 从 Next Hop 收到标签映射 (Received Label
           Mapping from Next Hop)。
           (见注释 3。)

   FEC.6   完成 (DONE)。

注释:

   1. 可能属于 InitAttributes 的属性示例, 是指定所期望 LSP 特性的
      属性, 例如服务等级 (Class of Service, CoS)。(请注意, 当前
      版本的 LDP 未规定 CoS 属性, 但 LDP 扩展可以规定。)

      FEC InitAttributes (如果有) 的指定方式超出了 LDP 的范围。请
      注意, InitAttributes 不会包含已知的 Hop Count 或 Path Vector。

   2. 使用下游按需标签分发的 LSR 只有在拥有先前收到、且被标记为
      待定的标签请求时才会发送标签。这样的 LSR 不会有这类待定请求,
      因为它对任何针对未知 FEC 的标签请求都以向请求方 LSR 发送
      No Route 通知并丢弃该标签请求来响应; 见 LRq.3

   3. 如果该 LSR 拥有来自 Next Hop 的该 FEC 标签, 它应当表现得如同
      它刚刚从 Next Hop 收到该标签一样。这种情况发生在宽松标签保留
      模式下。

A.1.7. 检测到 FEC 下一跳变化​

摘要:

LSR 对某个 FEC 下一跳变化的响应可能涉及以下一项或多项动作:

  • 将来自该 FEC 旧下一跳的标签从转发/交换使用中移除;

  • 向一个或多个 LDP 对等体发送该 FEC 的标签映射消息;

  • 向该 FEC 的新下一跳发送标签请求;

  • 当该 LSR 从该 FEC 的新下一跳收到标签映射时可能发生的任何动作。

上下文:

  • LSR。处理该事件的 LSR。

  • FEC。下一跳发生变化的 FEC。

  • New Next Hop。该 FEC 当前的下一跳。

  • Old Next Hop。该 FEC 先前的下一跳。

  • OldLabel。先前从 Old Next Hop 收到的标签 (如果有)。

  • CurAttributes。当前与该 FEC 关联的属性 (如果有)。

  • SAttributes。要包含在发送给 New Next Hop 的 Label Request 消息 (如果有) 中的属性。

算法:

   NH.1   LSR 先前是否从 Old Next Hop 收到并保留了该 FEC 的标签
映射? 如果没有, 转到 NH.6。

NH.2 将标签从转发/交换使用中移除。(见注释 1。)

NH.3 LSR 是否使用宽松标签保留?
如果是, 转到 NH.6。

NH.4 执行过程 Send_Message (Old Next Hop, Label
Release, OldLabel)。

NH.5 删除先前从 Old Next Hop 收到的该 FEC 标签映射。

NH.6 LSR 是否有与 Old Next Hop 之间处于待定状态的标签请求?
如果没有, 转到 NH.10。

NH.7 LSR 是否使用保守标签保留?
如果不是, 转到 NH.10。

NH.8 执行过程 Send_Message (Old Next Hop, Label Abort
Request, FEC, TLV), 其中 TLV 是一个 Label Request Message
ID TLV, 它携带该待定标签请求的 message ID。

NH.9 记录该 FEC 与 Old Next Hop 之间的标签中止请求处于待定
状态。

NH.10 该 FEC 是否有 New Next Hop?
如果没有, 转到 NH.16。

NH.11 LSR 先前是否从 New Next Hop 收到并保留了该 FEC 的标签
映射?
如果没有, 转到 NH.13。

NH.12 生成事件: 从 New Next Hop 收到标签映射 (Received Label
Mapping from New Next Hop)。
转到 NH.20。(见注释 2。)

NH.13 LSR 是否使用下游按需通告? 或者下一跳是否使用下游按需
通告? 或者 LSR 是否使用保守标签保留? (见注释 3。)
如果是, 转到 NH.14。
如果不是, 转到 NH.20。

NH.14 执行过程 Prepare_Label_Request_Attributes (Next
Hop, FEC, CurAttributes, SAttributes)。

NH.15 执行过程 Send_Label_Request (New Next Hop, FEC,
SAttributes)。(见注释 4。)
转到 NH.20。

NH.16 对每个 Peer 迭代执行 NH.17 到 NH.19。

NH.17 LSR 先前是否向 Peer 发送过该 FEC 的标签映射?
如果没有, 在 NH.16 处继续迭代下一个 Peer。

NH.18 执行过程 Send_Label_Withdraw (Peer, FEC, 先前发送给
Peer 的 Label)。

NH.19 结束从 NH.16 开始的迭代。

NH.20 完成 (DONE)。

注释:

1. 如果该 Label 未处于转发/交换使用中, NH.2 不会产生任何效果。

2. 如果该 LSR 拥有来自 New Next Hop 的该 FEC 标签, 它应当表现得
如同它刚刚从 New Next Hop 收到该标签一样。

3. 检查标签保留模式的目的, 是避免与处理 Label Mapping 消息过程
的 LMp.12-LMp.13 步骤发生竞争: 运行在保守标签保留模式下的
LSR 可能已经释放了从 New Next Hop 收到的标签映射, 而当时它
尚未检测到该 FEC 的下一跳已经变化。

4. 无论该 LSR 正在使用哪种标签请求过程, 只要 NH.13 中的条件
成立, 它就必须 (MUST) 发送标签请求。因此它直接执行
Send_Label_Request 过程, 而不是执行 LSR 标签请求过程。

A.1.8. 收到通知 / Label Request Aborted​

摘要:

当 LSR 从某个 LDP 对等体收到 Label Request Aborted 通知时, 它记录对应的标签请求事务 (如果有) 已经完成。

上下文:

  • LSR。处理该事件的 LSR。

  • FEC。请求其标签的 FEC。

  • RequestMessageID。要中止的标签请求消息的 message ID。

  • MsgSource。发送该 Notification 消息的 LDP 对等体。

算法:

   LRqA.1  该通知是否对应于针对该 FEC 的某条未完成标签请求中止?
(见注释 1。)
如果不对应, 转到 LRqA.3。

LRqA.2 记录该 FEC 的标签请求已被中止。

LRqA.3 完成 (DONE)。

注释:

1. LSR 使用 FEC 和 RequestMessageID 来定位它所记录的 (如果有)
该未完成标签请求中止。

A.1.9. 收到通知 / No Label Resources​

摘要:

当 LSR 从某个 LDP 对等体收到 No Label Resources 通知时, 它停止向该对等体发送标签请求消息, 直到它从该对等体收到 Label Resources Available 通知为止。

上下文:

  • LSR。处理该事件的 LSR。

  • FEC。请求其标签的 FEC。

  • MsgSource。发送该 Notification 消息的 LDP 对等体。

算法:

   NoRes.1 删除发往 MsgSource 的、针对该 FEC 的未完成标签请求的
记录。

NoRes.2 记录: 需要来自 MsgSource 的该 FEC 标签映射, 但当前没有
可用的标签资源。

NoRes.3 设置状态记录, 表明向 MsgSource 发送标签请求是 "不允许
(not OK)" 的。

NoRes.4 完成 (DONE)。

A.1.10. 收到通知 / No Route​

摘要:

当 LSR 从某个 LDP 对等体收到响应 Label Request 消息的 No Route 通知时, 其所使用的标签无路由 (Label No Route) 过程决定它的响应。该 LSR 要么不采取进一步动作, 要么通过启动一个定时器来推迟该标签请求, 并在该定时器稍后到期时向该对等体再发送一条 Label Request 消息。

上下文:

  • LSR。处理该事件的 LSR。

  • FEC。请求其标签的 FEC。

  • Attributes。与该标签请求关联的属性。

  • MsgSource。发送该 Notification 消息的 LDP 对等体。

算法:

   NoNH.1  删除发往 MsgSource 的、针对该 FEC 的未完成标签请求的
记录。

NoNH.2 执行 LSR 标签无路由过程。

对于不重试请求 (Request No Retry):

1. 转到 NoNH.3。

对于重试请求 (Request Retry):

1. 记录要发往 MsgSource 的、针对该 FEC 和 Attributes 的
延迟标签请求。

2. 启动超时。转到 NoNH.3。

NoNH.3 完成 (DONE)。

A.1.11. 收到通知 / Loop Detected​

摘要:

当 LSR 从某个 LDP 对等体收到响应 Label Request 消息或 Label Mapping 消息的 Loop Detected Status Code 时, 它表现得如同它收到了 No Route 通知一样。

上下文:

见 "Receive Notification / No Route"。

算法:

见 "Receive Notification / No Route"。

注释:

  1. 当该 Loop Detected 通知是响应 Label Request 消息时, 它出现在 Notification 消息中的一个 Status Code TLV 里。当它是响应 Label Mapping 消息时, 它出现在 Label Release 消息中的一个 Status Code TLV 里。

A.1.12. 收到通知 / Label Resources Available​

摘要:

当 LSR 从某个 LDP 对等体收到 Label Resources Available 通知时, 它恢复向该对等体发送标签请求。

上下文:

  • LSR。处理该事件的 LSR。

  • MsgSource。发送该 Notification 消息的 LDP 对等体。

  • SAttributes。与被推迟的 Label Request 消息一起存储的属性。

算法:

   Res.1   设置状态记录, 表明向 MsgSource 发送标签请求是 "允许
(OK)" 的。

Res.2 对每一条 "需要来自 MsgSource 的某 FEC 标签映射、但无可用
标签资源" 的记录, 迭代执行 Res.3 到 Res.6。

Res.3 MsgSource 是该 FEC 的下一跳吗?
如果不是, 转到 Res.5。

Res.4 执行过程 Send_Label_Request (MsgSource, FEC,
SAttributes)。如果该过程失败, 终止迭代。

Res.5 删除 "需要来自 MsgSource 的该 FEC 标签映射但没有可用
资源" 的记录。

Res.6 结束从 Res.2 开始的迭代。

Res.7 完成 (DONE)。

A.1.13. 检测到本地标签资源已变为可用​

摘要:

在 LSR 向某个 LDP 对等体发送了 No Label Resources 通知之后, 当标签资源稍后变为可用时, 它向每个这样的对等体发送一条 Label Resources Available 通知。

上下文:

  • LSR。处理该事件的 LSR。

  • Attributes。与被推迟的 Label Mapping 消息一起存储的属性。

算法:

   ResA.1  对 LSR 先前向其发送过 No Label Resources 通知的每个 Peer,
迭代执行 ResA.2 到 ResA.4。

ResA.2 执行过程 Send_Notification (Peer, Label Resources
Available)。

ResA.3 删除先前已向 Peer 发送过 No Label Resources 通知的记录。

ResA.4 结束从 ResA.1 开始的迭代。

ResA.5 对每一条 "需要为 Peer 提供某 FEC 标签映射但无标签资源"
的记录, 迭代执行 ResA.6 到 ResA.8。(见注释 1。)

ResA.6 执行过程 Send_Label (Peer, FEC, Attributes)。如果该过程
失败, 终止迭代。

ResA.7 清除 "需要为 Peer 提供该 FEC 标签映射但无标签资源" 的
记录。

ResA.8 结束从 ResA.5 开始的迭代

ResA.9 完成 (DONE)。

注释:

1. ResA.5 到 ResA.8 的迭代处理 LSR 使用下游主动标签分发、且先前
无法为某个 FEC 分配标签的情况。

A.1.14. LSR 决定不再对某个 FEC 进行标签交换​

摘要:

LSR 可以单方面决定不再为某个 LDP 对等体对某个 FEC 进行标签交换。这样做的 LSR 必须 (MUST) 向该对等体发送该 FEC 的 Label Withdraw 消息。

上下文:

  • Peer。该对等体。

  • FEC。该 FEC。

  • PrevAdvLabel。先前向该 Peer 通告的该 FEC 的标签。

算法:

   NoLS.1  执行过程 Send_Label_Withdraw (Peer, FEC,
PrevAdvLabel)。(见注释 1。)

NoLS.2 完成 (DONE)。

注释:

1. 该 LSR 可以在本事件中、或者在处理该对等体响应标签撤销而发回
的 Label Release 时, 将该标签从转发/交换使用中移除。如果该
LSR 不等待来自该对等体的 Label Release 消息, 则在收到该
Label Release 之前, 它不应 (SHOULD NOT) 重用该标签。

A.1.15. 延迟的标签请求超时​

摘要:

标签请求会因响应 No Route 和 Loop Detected 通知而被推迟。当某个针对某对等体的延迟 FEC 标签请求超时时, 该 LSR 发送该标签请求。

上下文:

  • LSR。处理该事件的 LSR。

  • FEC。与该超时事件关联的 FEC。

  • Peer。与该超时事件关联的 LDP 对等体。

  • Attributes。与被延迟的 Label Request 消息一起存储的属性。

算法:

   TO.1    取回该延迟标签请求的记录。

TO.2 Peer 是该 FEC 的下一跳吗?
如果不是, 转到 TO.4。

TO.3 执行过程 Send_Label_Request (Peer, FEC)。

TO.4 完成 (DONE)。