在上一周的博客中,我们介绍了分段路由 (SR) 路径,知道了它是一个有序分段列表。
此外,我们还阐述了分段作为一种指令,可以使数据包遍历一个或多个链路。
本周,我们将讨论一种利用 MPLS 实施 SR 的方式。我们将这种实施方式称为 SR-MPLS。全面掌握 SR-MPLS 有助于您理解下一周博客的内容,其中我们将介绍如何使用 SR 来支持流量工程应用。
概述
在 SR-MPLS 中,SR 路径将编码为 MPLS 标签堆栈。每个标签堆栈条目表示 SR 路径中的一个分段。在本周的博客中,我们将介绍如何使用 MPLS 标签来对邻接分段和前缀分段进行编码。
邻接分段
图 1:邻接分段
在图 1 中,SR 路径将 R1 连接到 R4。该 SR 路径包含三个邻接分段。分段 1 使数据包遍历链路 R1->R2,而分段 2 则使数据包遍历链路 R2->R3。分段 3 会使数据包遍历链路 R3->R4。
当 R1 从 SR 域外接收数据包时,会指示该数据包受策略约束。相关策略可能会使 R1 沿着图中所示的 SR 路径转发数据包。发生这种情况时,R1 便会施加包含两个条目的 MPLS 标签堆栈。堆栈上部的条目表示分段 2,并带有 MPLS 标签 1002。堆栈下部的条目表示分段 3,并带有 MPLS 标签 1003。
在应用 MPLS 标签堆栈后,R1 通过分段 1(即链路 R1->R2)转发数据包。当数据包到达 R2 后,R2 将从最上部的标签堆栈条目提取标签(即 1002)并在其转发信息库 (FIB) 中搜索相应条目。相应的 FIB 条目包括一个指令(即 POP)和下一跳(即 R3)。
因此,R2 将从标签堆栈中弹出最上部的条目,并通过分段 2(即链路 R2->R3)转发数据包。
当数据包到达 R3 后,R3 将从剩余的标签堆栈条目提取标签(即 1003)并在其 FIB 中搜索相应条目。相应的 FIB 条目包括一个指令(即 POP)和下一跃点(即 R4)。因此,R3 将从标签堆栈中弹出剩余的条目,并通过分段 3(即链路 R3->R4)转发数据包。数据包将在未封装 MPLS 的情况下到达 R4。
前缀分段
图 2:前缀分段
在图 2 中,SR 路径通过 R4 将 R1 连接到 R7。SR 路径包含两个前缀分段。分段 1 是一个前缀分段,它会使数据包沿着最低成本路径从 R1 遍历到 R4。分段 2 也是一个前缀分段,它会使数据包沿着最低成本路径从 R4 遍历到 R7。在该网络中,所有链路均配置有相同的 IGP 指标(即 10)。因此,从 R1 到 R4 的最低成本路径将遍历链路 R1->R2、R2->R3 和 R3->R4,而从 R4 到R7 的最低成本路径则遍历链路 R4->R8 和 R8->R7。
当 R1 从 SR 域外部收到数据包后,它会使该数据包受其策略的约束。相关策略可能会使 R1 通过图中所示的 SR 路径转发数据包。如果发生这种情况,R1 将应用一个包含两个条目的 MPLS 标签堆栈。该标签堆栈上部的条目表示分段 1,并带有标签 2001。该标签堆栈下部的条目表示分段 2,并带有标签 2002。
在应用 MPLS 标签堆栈后,R1 会通过链路 R1->R2 将数据包转发到分段 1。当数据包到达 R2 后,R2 将从最上部的标签堆栈条目提取标签(即 2001)并在其 FIB 中搜索相应条目。相应的 FIB 条目包括一个指令(即 SWAP – 3001)和下一跃点(即 R3)。因此,R2 会使用新值(即 3001)覆盖最上部的标签并将数据包转发到 R3。
当数据包到达 R3 后,R3 将从最上部的标签堆栈条目提取标签(即 3001)并在其 FIB 中搜索相应条目。相应的 FIB 条目包括一个指令(即 POP)和下一跃点(即 R4)。因此,R4 将从标签堆栈中弹出最上部的条目,并通过链路 R3->R4 将数据包转发到分段2。
当数据包到达 R4 后,R4 将从剩余的标签堆栈条目提取标签(即 2002)并在其 FIB 中搜索相应条目。相应的 FIB 条目包括一个指令(即 SWAP – 3002)和下一跃点(即 R8)。
因此,R4 会使用新值(即 3002)覆盖剩余的标签并将数据包转发到 R8。
当数据包到达 R8 后,R8 将从剩余的标签堆栈条目提取标签(即 3002)并在其 FIB 中搜索相应条目。相应的 FIB 条目包括一个指令(即 POP)和下一跃点(即 R7)。因此,R8 会从标签堆栈中弹出剩余的条目并在未封装 MPLS 的情况下将数据包转发到 R7。
倒数第二跃点弹出 (PHP) 和显式空标签
在上述示例中,每个分段都会执行 PHP 程序。当数据包遍历某一分段时,该分段的倒数第二个节点会弹出与该分段关联的标签。
如果 SR 路径还包含一个分段,而该分段尚未遍历,则当前分段的出口节点也将是下一分段的入口节点。在这种情况下,当数据包到达该节点时,下一分段的标签便会显示在堆栈上部。如果 SR 路径不再包含其他尚未遍历的分段,则该分段的出口节点也将是该路径的出口节点。此时,数据包便会在未封装 MPLS 的情况下到达该路径的出口节点。
在某些情况下,SR 路径中最后一个链路可能无法在未封装 MPLS 的情况下传输数据包。例如,该数据包可能是 IPv6,而该链路仅支持 IPv4。为了防止这种问题发生,SR 入口节点可以将一个 MPLS 显式空标签添加到 MPLS 标签堆栈上部。
当最后一个分段中倒数第二个节点弹出与该最终分段关联的标签时,它便会显示此显式空标签。之后,它就会将该数据包转发到该路径的出口节点。该路径的出口节点会弹出该显式空标签,并继续处理该数据包。
总结
本周,我们了解了 SR-MPLS 如何将 SR 路径编码为 MPLS 标签堆栈。同时,还了解了 SR-MPLS 如何使用其 FIB 来处理数据包。
下周,我们将探讨如何将 SR 应用于流量工程应用。