RFC3031:Multiprotocol Label Switching Architecture,January 2001
本文档为 Internet 社区指定了 Internet 标准跟踪协议,并请求讨论和改进建议。本协议的标准化状态和现状请参考当前版本的《互联网官方协议标准》(STD 1)。本备忘录的分发不受限制。
版权所有 (C) 互联网协会 (2001)。版权所有。
本文档规定了多协议标签交换 (Multiprotocol Label Switching,MPLS) 的架构。
本文档中的关键词“必须”、“不得”、“需要”、“应该”、“不应”、“应该”、“不应该”、“推荐”、“可以”和“可选”是按照 RFC 2119 中的描述进行解释。
本文档规定了多协议标签交换 (MPLS) 的架构。
请注意,MPLS 用于组播的使用留待进一步研究。
当无连接网络层协议的数据包从一个路由器传输到下一个路由器时,每个路由器都会为该数据包做出独立的转发决策。也就是说,每个路由器都会分析数据包的头部,并且每个路由器都运行网络层路由算法。每个路由器根据对数据包报文头的分析和运行路由算法的结果,独立地为数据包选择下一跳。
包头包含的信息远多于简单地选择下一跳所需的信息。因此,可以将选择下一跳视为两个函数的组合。第一个函数将整组可能的数据包划分为一组“转发等效类(Forwarding Equivalence Classes,FEC)”。第二个将每个 FEC 映射到下一跳。就转发决策而言,映射到同一 FEC 的不同数据包是无法区分的。属于特定 FEC 并从特定节点传播的所有数据包都将遵循相同的路径(或者如果正在使用某些类型的多路径路由,它们都将遵循与 FEC 相关联的一组路径之一)。
在传统的 IP 转发中,如果特定路由器的路由表中存在某个地址前缀 X,使得 X 是每个数据包的目标地址的“最长匹配”,则该路由器通常会将两个数据包视为在同一个 FEC 中。当数据包穿过网络时,每一跳依次重新检查数据包并将其分配给 FEC。
在 MPLS 中,当数据包进入网络时,将特定数据包分配给特定 FEC 只需一次。数据包被分配到的 FEC 被编码为一个短的固定长度值,称为“标签/label”。当一个数据包被转发到它的下一跳时,标签也随之发送;也就是说,数据包在转发之前被“标记/labeled”。
在后续的跃点上,不会对数据包的网络层报文头进行进一步分析。相反,标签用作指定下一跳和新标签的表的索引。旧标签被新标签替换,数据包被转发到它的下一跳。
在 MPLS 转发范式中,一旦数据包被分配给 FEC,后续路由器就不再进行进一步的报文头分析;所有转发都是由标签驱动的。与传统的网络层转发相比,这具有许多优点。
– MPLS 转发可以由能够进行标签查找和替换,但不能分析网络层报文头,或者不能以足够的速度分析网络层报文头的交换机来完成。
– 由于数据包在进入网络时被分配给 FEC,入口路由器可以在确定分配时使用它拥有的关于数据包的任何信息,即使该信息无法从网络层报文头中收集。例如,到达不同端口的数据包可能会分配给不同的 FEC。另一方面,传统的转发只能考虑在包头中与包一起传输的信息。
– 在特定路由器进入网络的数据包可以与在不同路由器进入网络的相同数据包标记不同,因此可以轻松做出依赖于入口路由器的转发决策。这不能通过传统转发来完成,因为数据包的入口路由器的身份不与数据包一起传播。
– 决定如何将数据包分配给 FEC 的考虑可能变得越来越复杂,而对仅转发标记数据包的路由器没有任何影响。
– 有时需要强制数据包遵循在数据包进入网络时或之前明确选择的特定路由,而不是在数据包通过网络时由正常动态路由算法选择。这可以作为策略问题或支持流量工程来完成。在传统转发中,这需要数据包携带其路由的编码(“源路由”)。在 MPLS 中,可以使用标签来表示路由,这样显式路由的身份就不需要随包携带。
一些路由器分析数据包的网络层报文头不仅是为了选择数据包的下一跳,还可以确定数据包的“优先级”或“服务等级”。然后他们可以对不同的数据包应用不同的丢弃阈值或调度规则。 MPLS 允许(但不要求)从标签中完全或部分推断优先级或服务类别。在这种情况下,可以说标签代表 FEC 和优先级或服务类别的组合。
MPLS 代表“多协议”标签交换,多协议,因为它的技术适用于任何网络层协议。然而,在本文档中,我们专注于使用 IP 作为网络层协议。
支持 MPLS 的路由器称为“标签交换路由器”或 LSR。
本节给出了本文档中使用的术语的一般概念概述。其中一些术语在文档的后面部分有更精确的定义。
帧中继网络中用于标识帧中继电路的标签
一组以相同方式转发的 IP 数据包(例如,通过相同的路径,具有相同的转发处理)
标签合并,当它应用于基于帧的媒介上的操作时,因此信元交织的潜在问题不是问题。
一个固定长度的短物理连续标识符,用于标识 FEC,通常具有本地意义。
用单个输出标签替换特定 FEC 的多个输入标签
基本转发操作包括查找传入标签以确定传出标签、封装、端口和其他数据处理信息。
一种转发范式,允许通过使用标签来识别在转发时无法区分的数据包类别来简化数据转发。
两个 MPLS 节点之间的跳,在该节点上使用标签完成转发。
通过一个或多个层次结构中的一个或多个 LSR 的路径,后跟特定 FEC 中的数据包。
能够转发本地 L3 数据包的 MPLS 节点
3层下的协议层(因此提供3层使用的服务)。当通过交换短固定长度标签完成时,转发发生在2层,无论被检查的标签是 ATM VPI/VCI、帧中继 DLCI 还是 MPLS 标签。
IP 及其相关路由协议运行的协议层与2层同义的链路层
一种处理环路的方法,允许设置环路,数据可能通过环路传输,但环路被检测到
一种处理环路的方法,其中数据从不通过环路传输
一组有序的标签
完成标签合并的节点
一组连续的节点,它们运行 MPLS 路由和转发,并且也在一个路由或管理域中
将 MPLS 域与域外节点连接的 MPLS 节点,要么是因为它不运行 MPLS,要么是因为它在不同的域中。请注意,如果 LSR 的相邻主机未运行 MPLS,则该 LSR 是 MPLS 边缘节点。
一个 MPLS 边缘节点,在它离开 MPLS 域时处理流量
一个 MPLS 边缘节点,在它进入 MPLS 域时处理流量
数据包头中携带的标签,代表数据包的 FEC
运行 MPLS 的节点。 MPLS 节点将了解 MPLS 控制协议,将运行一个或多个 L3 路由协议,并能够根据标签转发数据包。 MPLS 节点也可以选择性地转发本地 L3 数据包。
IETF 工作组以及与工作组相关的工作
与3层同义
标签堆栈的同义词
与标签交换路径同义
面向连接的2层技术(例如 ATM 或帧中继)使用的电路,需要在2层交换机中维护状态信息。
标签合并,MPLS标签携带在ATM VCI域(或VPI/VCI组合域)中,使多个VC合并为一个VC
标签合并,在ATM VPI字段中携带MPLS标签,可以将多个VP合并为一个VP。在这种情况下,仅当两个单元源自同一节点时,它们才会具有相同的 VCI 值。这允许通过 VCI 区分来自不同来源的信元。
ATM 网络中用于标识电路的标签
ATM:Asynchronous Transfer Mode,异步传输模式
BGP:Border Gateway Protocol,边界网关协议
DLCI:Data Link Circuit Identifier,数据链路电路标识符
FEC:Forwarding Equivalence Class,转发等效类
FTN:FEC to NHLFE Map,FEC到NHLFE的映射
IGP:Interior Gateway Protocol,内部网关协议
ILM:Incoming Label Map,传入标签映射
IP:Internet Protocol,互联网协议
LDP:Label Distribution Protocol,标签分发协议
L2:Layer 2,2层
L3:Layer 3,3层
LSP:Label Switched Path,标签交换路径
LSR:Label Switching Router,标签交换路由器
MPLS:MultiProtocol Label Switching,多协议标签交换
NHLFE:Next Hop Label Forwarding Entry,下一跳标签转发条目
SVC:Switched Virtual Circuit,交换虚电路
SVP:Switched Virtual Path,交换虚拟路径
TTL:Time-To-Live,生存时间
VC:Virtual Circuit,虚电路
VCI:Virtual Circuit Identifier,虚电路标识符
VP:Virtual Path,虚拟路径
VPI:Virtual Path Identifier,虚拟路径标识符
本文档中的想法和文本是从许多来源和收到的评论中收集的。我们要感谢 Rick Boivie、Paul Doolan、Nancy Feldman、Yakov Rekhter、Vijay Srinivasan 和 George Swallow 的投入和想法。
在本节中,我们将介绍 MPLS 的一些基本概念并描述要使用的一般方法。
标签是一个短的、固定长度的、本地有效的标识符,用于识别 FEC。放置在特定数据包上的标签表示该数据包被分配到的转发等效类。
最常见的是,数据包根据(完全或部分)其网络层目标地址分配给 FEC。但是,标签永远不是该地址的编码。
如果 Ru 和 Rd 是 LSR,他们可能会同意,当 Ru 向 Rd 发送数据包时,当且仅当数据包是特定 FEC F 的成员时,Ru 将使用标签值为 L 的数据包进行标记。也就是说,他们可以同意对于从 Ru 移动到 Rd 的数据包,标签 L 和 FEC F 之间的“绑定”。由于这样的约定,L 成为 Ru 代表 FEC F 的“传出标签”,而 L 成为 Rd 代表 FEC F 的“传入标签”。
请注意,除了从 Ru 发送到 Rd 的数据包之外,L 不一定代表任何数据包的 FEC F。 L 是一个任意值,它与 F 的绑定对于 Ru 和 Rd 来说是局部的。
当我们在上面谈到从 Ru“发送”到 Rd 的数据包时,我们并不暗示数据包起源于 Ru 或它的目的地是 Rd。相反,我们的意思是包括在一个或两个 LSR 处是“传输数据包”的数据包。
有时,Rd 可能很难甚至不可能告诉到达的带有标签 L 的数据包,标签 L 是由 Ru 放置在数据包中的,而不是由其他某个 LSR 放置的。 (当 Ru 和 Rd 不是直接邻居时,通常就是这种情况。)在这种情况下,Rd 必须确保从标签到 FEC 的绑定是一对一的。也就是说,Rd 必须不同意 Ru1 将 L 绑定到 FEC F1,同时也同意其他一些 LSR Ru2 将 L 绑定到不同的 FEC F2,除非 Rd 总是可以告诉,当它收到带有传入标签 L 的数据包时,标签是由Ru1 贴在数据包上还是由Ru2 贴上。
每个 LSR 都有责任确保它可以唯一地解释其传入标签。
假设 Ru 和 Rd 同意将标签 L 绑定到 FEC F,用于从 Ru 发送到 Rd 的数据包。那么对于这个绑定,Ru是“上游LSR”,Rd是“下游LSR”。
就给定的绑定而言,一个节点在上游,一个在下游,仅意味着特定标签表示从上游节点传输到下游节点的数据包中的特定 FEC。这并不意味着该 FEC 中的数据包实际上会从上游节点路由到下游节点。
“标记包”是标签已被编码到其中的包。在某些情况下,标签驻留在专门为此目的而存在的封装标头中。在其他情况下,标签可以驻留在现有的数据链路或网络层报文头中,只要存在可用于该目的的字段即可。要使用的特定编码技术必须得到对标签进行编码的实体和对标签进行解码的实体双方同意。
在 MPLS 架构中,将特定标签 L 绑定到特定 FEC F 的决定是由 LSR 做出的,LSR 是与该绑定相关的下游。下游 LSR 然后将绑定通知上游 LSR。因此标签是“下游分配的”,标签绑定分布在“下游到上游”的方向。
如果一个 LSR 被设计成只能查找落入某个数字范围内的标签,那么它只需要确保它只绑定在该范围内的标签。
由 Rd 分发到 Ru 的标签 L 到 FEC F 的特定绑定可能具有关联的“属性”。如果作为下游 LSR 的 Ru 也分发一个标签绑定到 FEC F,那么在某些条件下,它可能还需要分发它从 Rd 接收到的相应属性。
标签分发协议是一组过程,一个 LSR 通过这些过程通知另一个它所做的标签/FEC 绑定。使用标签分发协议来交换标签/FEC 绑定信息的两个 LSR 就它们交换的绑定信息而言被称为“标签分发对等体”。如果两个 LSR 是标签分发对等体,我们将说它们之间存在“标签分发邻接”。
(注意:两个 LSR 可能是关于某些绑定集的标签分发对等点,但不是关于其他一些绑定集。)
标签分发协议还包括两个标签分发对等方为了了解彼此的 MPLS 功能而需要参与的任何协商。
体系结构不假定只有一个单一的标签分发协议。事实上,许多不同的标签分发协议正在标准化。现有协议已经扩展,以便标签分发可以搭载在它们上(参见,例如,[MPLS-BGP]、[MPLS-RSVP-TUNNELS])。还为分发标签的明确目的定义了新协议(参见,例如,[MPLS-LDP]、[MPLS-CR-LDP]。
在本文档中,我们尝试使用首字母缩写词“LDP”来特指[MPLS-LDP]中定义的协议;当谈到一般的标签分发协议时,我们尽量避免使用首字母缩略词。
MPLS 体系结构允许 LSR 从其针对特定 FEC 的下一跳明确请求该 FEC 的标签绑定。这称为“下游按需”标签分发。
MPLS 体系结构还允许 LSR 将绑定分发到未明确请求它们的 LSR。这称为“未经请求的下游”标签分发。
预计某些 MPLS 实现将仅提供下游按需标签分发,而某些将仅提供主动提供的下游标签分发,而某些将同时提供两者。提供哪个可能取决于特定实现所支持的接口的特性。然而,这两种标签分发技术可以同时在同一网络中使用。在任何给定的标签分配邻接上,上游 LSR 和下游 LSR 必须就使用哪种技术达成一致。
LSR Ru 可以从 LSR Rd 接收(或已经接收)针对特定 FEC 的标签绑定,即使 Rd 不是该 FEC 的 Ru 的下一跳(或不再是 Ru 的下一跳)。
然后 Ru 可以选择是跟踪此类绑定,还是丢弃此类绑定。如果 Ru 跟踪此类绑定,则如果 Rd 最终成为其针对所讨论的 FEC 的下一跳,则它可能会立即再次开始使用该绑定。如果 Ru 丢弃这样的绑定,那么如果 Rd 稍后成为下一跳,则必须重新获取绑定。
如果 LSR 支持“自由标签保留模式”,它会维护从不是该 FEC 下一跳的 LSR 接收到的标签和 FEC 之间的绑定。如果 LSR 支持“保守标签保留模式”,它会丢弃此类绑定。
自由标签保留模式允许更快地适应路由更改,但保守标签保留模式虽然需要 LSR 来维护更少的标签。
到目前为止,我们已经说得好像一个带标签的数据包只带有一个标签。正如我们将看到的,拥有一个更通用的模型是很有用的,在这个模型中,一个带标签的数据包携带许多标签,组织为后进先出堆栈。我们将其称为“标签堆栈”。
虽然,正如我们将看到的,MPLS 支持层次结构,但标记数据包的处理完全独立于层次结构。处理总是基于顶部标签,不考虑某些数量的其他标签过去可能已经“高于它”,或者目前某些数量的其他标签可能低于它的可能性。
一个未标记的数据包可以被认为是一个标签栈为空的数据包(即,其标签栈的深度为 0)。
如果一个数据包的标签栈的深度为 m,我们将栈底的标签称为 1 级标签,将其上方的标签(如果存在)称为 2 级标签,将顶部的标签称为堆栈作为第 m 级标签。
当我们引入 LSP 隧道和 MPLS 层次结构的概念(第 3.27 节)时,标签堆栈的效用将变得清晰。
“下一跳标签转发条目”(Next Hop Label Forwarding Entry,NHLFE) 用于转发带标签的数据包。它包含以下信息:
1. 数据包的下一跳
2. 对数据包的标签栈执行的操作;这是以下操作之一:
a) 用指定的新标签替换标签堆栈顶部的标签
b) 弹出标签栈
c) 用指定的新标签替换标签堆栈顶部的标签,然后将一个或多个指定的新标签压入标签堆栈。
它还可能包含:
d) 传输数据包时使用的数据链路封装
e) 传输数据包时对标签栈进行编码的方式
f) 正确处理数据包所需的任何其他信息。
请注意,在给定的 LSR 上,数据包的“下一跳”可能是该 LSR 本身。在这种情况下,LSR 需要弹出顶级标签,然后将结果数据包“转发”给自己。然后它会根据弹出堆叠的标签后剩余的内容做出另一个转发决定。这可能仍然是带标签的数据包,也可能是本机 IP 数据包。
这意味着在某些情况下,LSR 可能需要对 IP 报文头进行操作以转发数据包。
如果数据包的“下一跳”是当前 LSR,那么标签栈操作必须是“弹出栈”。
“传入标签映射”(Incoming Label Map,ILM) 将每个传入标签映射到一组 NHLFE。它用于转发作为标记数据包到达的数据包。
如果 ILM 将特定标签映射到包含多个元素的一组 NHLFE,则必须在转发数据包之前选择该组中的一个元素。从集合中选择元素的过程超出了本文档的范围。让 ILM 将标签映射到包含多个 NHLFE 的集合可能很有用,例如,如果需要在多个等成本路径上进行负载平衡。
“FEC 到 NHLFE”(FTN)将每个 FEC 映射到一组 NHLFE。它用于转发未标记到达但在转发前要标记的数据包。
如果 FTN 将特定标签映射到包含多个元素的一组 NHLFE,则在转发数据包之前必须选择该组中的一个元素。从集合中选择元素的过程超出了本文档的范围。让 FTN 将标签映射到包含多个 NHLFE 的集合可能很有用,例如,如果需要在多个等成本路径上进行负载平衡。
标签交换是使用以下程序来转发数据包。
为了转发带标签的数据包,LSR 检查标签堆栈顶部的标签。它使用 ILM 将此标签映射到 NHLFE。使用 NHLFE 中的信息,它确定将数据包转发到何处,并对数据包的标签堆栈执行操作。然后它将新标签堆栈编码到数据包中,并转发结果。
为了转发未标记的数据包,LSR 会分析网络层报文头,以确定数据包的 FEC。然后它使用 FTN 将其映射到 NHLFE。使用 NHLFE 中的信息,它确定将数据包转发到何处,并对数据包的标签堆栈执行操作。 (当然,在这种情况下弹出标签堆栈是非法的。)然后它将新标签堆栈编码到数据包中,并转发结果。
重要的是要注意,在使用标签交换时,下一跳总是来自 NHLFE;在某些情况下,如果不使用 MPLS,这可能与下一跳不同。
给定的 LSR Rd 可以将标签 L1 绑定到 FEC F,并将该绑定分发到标签分发对等体 Ru1。 Rd 还可以将标签 L2 绑定到 FEC F,并将该绑定分发到标签分发对等体 Ru2。 L1 == L2 是否由架构决定;这是本地的事情。
给定的 LSR Rd 可以将标签 L 绑定到 FEC F1,并将该绑定分发到标签分发对等体 Ru1。 Rd 还可以将标签 L 绑定到 FEC F2,并将该绑定分发到标签分发对等体 Ru2。如果(且仅当)RD 可以判断,当它收到顶部标签为 L 的数据包时,标签是由 RU1 还是由 RU2 放置在那里的,那么架构不要求 F1 == F2。在这种情况下,我们可以说 Rd 为其分配给 Ru1 的标签使用了与分配给 Ru2 的标签不同的“标签空间”。
一般来说,如果满足以下条件,Rd 只能判断是 Ru1 还是 Ru2 将特定标签值 L 放在标签堆栈的顶部:
– Ru1 和 Ru2 是 Rd 向其分发标签值 L 的绑定的唯一标签分发对等体,并且
– Ru1 和 Ru2 均通过点对点接口直接连接到 Rd。
当这些条件成立时,LSR 可以使用具有“每个接口”范围的标签,即每个接口唯一的标签。我们可以说 LSR 正在使用“每个接口的标签空间”。当这些条件不成立时,标签在分配它们的 LSR 上必须是唯一的,我们可以说 LSR 正在使用“每个平台的标签空间”。
如果特定的 LSR Rd 通过两个点对点接口连接到特定的 LSR Ru,则 Rd 可以向 Ru 分发标签 L 与 FEC F1 的绑定,以及标签 L 与 FEC F2 的绑定,F1 != F2,当且仅当每个绑定仅对 Ru 通过特定接口之一发送到 Rd 的数据包有效。在所有其他情况下,Rd 不得将相同标签值的 Ru 绑定分发到两个不同的 FEC。
即使绑定被视为处于不同的“层次结构级别”,该禁令仍然有效。在 MPLS 中,没有针对层次结构的不同级别具有不同标签空间的概念;在解释标签时,标签的级别无关紧要。
问题是一个 LSR 是否可以使用多个 per-platform 标签空间,或者为同一个接口使用多个 per-interface 标签空间。这不是架构禁止的。然而,在这种情况下,LSR 必须有一些方法(架构未指定)为特定的传入标签确定该标签属于哪个标签空间。例如,[MPLS-SHIM] 指定用于单播数据包的标签空间与用于组播数据包的标签空间不同,并使用数据链路层代码点来区分这两个标签空间。
特定数据包 P 的“级别 m 标签交换路径 (LSP)”是一系列路由器,
<R1, ..., Rn>
具有以下属性:
1. R1,即“LSP Ingress”,是一个LSR,它将一个标签压入P的标签栈,得到深度为m的标签栈;
2. 对于所有的i,1<i<n,P在被LSR Ri接收时有一个深度为m的标签栈;
3. 在P从R1到R[n-1]的过程中,它的标签栈的深度从来没有小于m;
4. 对于所有的i,1<i<n:Ri通过MPLS的方式将P传输给R[i+1],即使用标签栈顶的标签(m级标签)作为索引ILM;
5. 对于所有 i,1<i<n:如果系统 S 在 Ri 发送 P 之后但在 R[i+1] 接收 P 之前接收并转发 P(例如,Ri 和 R[i+1] 可能通过交换数据链路子网连接,并且 S 可能是数据链路交换机之一),那么 S 的转发决策不是基于 m 级标签,也不是基于网络层报文头。这可能是因为:
a) 决策根本不基于标签栈或网络层头;
b) 该决定基于一个标签堆栈,附加标签已被压入到该标签堆栈上(即,在级别 m+k 标签上,其中 k>0)。
换句话说,我们可以将数据包 P 的 m 级 LSP 称为路由器序列:
1. 以一个 LSR(一个“LSP Ingress”)开始,它压入一个级别 m 的标签,
2. 其所有中间 LSR 通过在 m 级标签上进行标签交换来做出转发决策,
3. 当转发决定是由 m-k 级标签上的标签交换做出的转发决定时,它结束(在“LSP 出口”),其中 k>0,或者当转发决定是由“普通”非 MPLS 转发程序做出时。
这样做的结果(或者可能是一个假设)是,每当 LSR 将标签压入到已标记的数据包上时,它需要确保新标签对应于一个 FEC,其 LSP 出口是分配标签的 LSR,现在堆栈中的第二个。
当 P 的 m 级标签是对应于 FEC F 的标签时,如果它是特定数据包 P 的 m 级 LSP,我们将称一系列 LSR 为“特定 FEC F 的 LSP”。
考虑可能是 FEC F 的 LSP 入口节点的节点集。然后有一个 FEC F 的 LSP,它以这些节点中的每一个开始。如果其中许多 LSP 具有相同的 LSP 出口,则可以将此类 LSP 的集合视为一棵树,其根是 LSP 出口。 (因为数据沿着这棵树向根传播,这可以称为多点对点树。)因此我们可以说特定 FEC F 的“LSP 树”。
请注意,根据第 3.15 节的定义,如果 <R1, …, Rn> 是数据包 P 的 m 级 LSP,则 P 可以从 R[n-1] 传输到带有深度为 m-的标签栈的 Rn- 1.也就是说,标签栈可能会在 LSP 的倒数第二个 LSR 处弹出,而不是在 LSP 出口处弹出。
从架构的角度来看,这是非常合适的。 m 级标签的目的是将数据包送到 Rn。一旦R[n-1]决定将数据包发送给Rn,标签就不再具有任何作用,不再需要携带。
进行倒数第二跳弹出还有一个实际优势。如果不这样做,那么当 LSP 出口收到数据包时,它首先查找顶部标签,并根据该查找确定它确实是 LSP 出口。然后它必须弹出堆栈,并检查数据包的剩余部分。如果堆栈上有另一个标签,出口将查找此标签并根据此查找转发数据包。 (在这种情况下,数据包的m级LSP的出口也是其m-1级LSP的中间节点。)如果堆栈上没有其他标签,则根据其网络层目的地址转发该数据包。请注意,这将要求出口进行两次查找,即两次标签查找或标签查找后跟地址查找。
另一方面,如果使用倒数第二跳弹出,那么当倒数第二跳查找标签时,它确定:
– 这是倒数第二跳,以及
– 下一跳是谁。
然后倒数第二个节点弹出堆栈,并根据通过查找先前位于堆栈顶部的标签获得的信息转发数据包。当 LSP 出口收到数据包时,现在位于堆栈顶部的标签将是它需要查找的标签,以便做出自己的转发决定。或者,如果数据包只携带一个标签,LSP 出口将简单地看到网络层数据包,这正是它做出转发决定所需要看到的。
这种技术允许出口进行单次查找,并且也只需要倒数第二个节点进行单次查找。
如果知道只需要一次查找,那么在标签交换产品中创建转发“快速路径”可能会有很大帮助:
– 如果可以假设只需要一次查找,则可以简化代码
– 代码可以基于假设只需要一次查找的“时间预算”。
事实上,当倒数第二跳弹出完成时,LSP 出口甚至不需要是 LSR。
但是,某些硬件交换引擎可能无法弹出标签堆栈,因此不能普遍要求。也可能存在不希望倒数第二跳弹出的一些情况。因此,仅当出口节点特别请求时,或者 LSP 中的下一个节点不支持 MPLS 时,倒数第二个节点才会弹出标签堆栈。 (如果 LSP 中的下一个节点确实支持 MPLS,但没有发出这样的请求,则倒数第二个节点无法知道它实际上是倒数第二个节点。)
一个完全能够弹出标签栈的 LSR 必须在其下游标签分发对等点请求时执行倒数第二跳弹出。
初始标签分发协议协商必须允许每个 LSR 确定其相邻的 LSRS 是否能够弹出标签堆栈。 LSR 不得请求标签分发对等体弹出标签堆栈,除非它能够这样做。
如果使用倒数第二跳弹出,可能会询问出口节点是否总能正确解释接收到的数据包的顶部标签。只要遵守第 3.14 节的唯一性和范围规则,就始终可以明确地解释接收到的数据包的顶部标签。
特定 LSR 中特定标记数据包的 LSP 下一跳是作为下一跳的 LSP,由用于转发该数据包的 NHLFE 条目选择。
特定 FEC 的 LSP 下一跳是由 NHLFE 条目选择的下一跳,该条目由对应于该 FEC 的标签索引。
请注意,LSP 下一跳可能与网络层路由算法选择的下一跳不同。当我们提到后者时,我们将使用术语“L3 下一跳”。
如果 LSR 收到带有特定传入标签的带标签的数据包,但没有绑定该标签,它应该怎么做?人们很容易认为可以删除标签,并将数据包作为未标记的 IP 数据包转发。但是,在某些情况下,这样做可能会导致环路。如果上游 LSR 认为标签绑定到显式路由,而下游 LSR 不认为标签绑定任何东西,如果无标签 IP 数据包的逐跳路由将数据包带回上游 LSR,然后形成一个环路。
也有可能该标签旨在表示无法从 IP 报文头推断出的路由。
因此,当接收到带有无效传入标签的带标签的数据包时,必须将其丢弃,除非通过某种方式(不在当前文档的范围内)确定将其无标签转发不会造成任何危害。
一些 FEC 对应于通过动态路由算法分配的地址前缀。这些 FEC 的 LSP 设置可以通过以下两种方式之一完成:独立 LSP 控制或有序 LSP 控制。
在独立 LSP 控制中,每个 LSR 在注意到它识别特定的 FEC 后,做出独立的决定,将标签绑定到该 FEC 并将该绑定分发给其标签分发对等方。这对应于传统 IP 数据报路由的工作方式;每个节点独立决定如何处理每个数据包,并依靠路由算法快速收敛,以确保每个数据报正确投递。
在有序 LSP 控制中,如果 LSR 是该 FEC 的出口 LSR,或者如果它已经从该 FEC 的下一跳接收到该 FEC 的标签绑定,则 LSR 仅将标签绑定到特定 FEC。
如果要确保特定 FEC 中的流量遵循具有某些指定属性集的路径(例如,流量不会两次遍历任何节点,流量可以使用指定数量的资源,流量遵循明确指定的路径等)必须使用有序控件。在独立控制下,一些 LSR 可能会在 LSP 完全建立之前开始对 FEC 中的流量进行标签交换,因此 FEC 中的一些流量可能会遵循不具有指定属性集的路径。如果 FEC 的识别是建立相应 LSP 的结果,则也需要使用有序控制。
有序 LSP 建立可以由入口或出口发起。
有序控制和独立控制完全可以互操作。然而,除非 LSP 中的所有 LSR 都使用有序控制,否则对网络行为的总体影响主要是独立控制的影响,因为在 LSP 完全建立之前无法确定它不会被使用。
这种架构允许在独立控制和有序控制之间进行选择成为局部问题。由于这两种方法相互作用,给定的 LSR 只需要支持其中一种。一般来说,独立控制和有序控制的选择似乎对需要定义的标签分发机制没有任何影响。
将流量划分为 FEC 的一种方法是为路由表中出现的每个地址前缀创建一个单独的 FEC。然而,在特定的 MPLS 域内,这可能会产生一组 FEC,使得所有这些 FEC 中的所有流量都遵循相同的路由。例如,一组不同的地址前缀可能都具有相同的出口节点,并且标签交换可能仅用于将流量获取到出口节点。在这种情况下,在 MPLS 域内,这些 FEC 的联合本身就是一个 FEC。这就产生了一个选择:应该将不同的标签绑定到每个组件 FEC,还是应该将单个标签绑定到联合,并将该标签应用于联合中的所有流量?
将单个标签绑定到 FEC 联合(在某个域内)并将该标签应用于联合中的所有流量的过程称为“聚合”。 MPLS 架构允许聚合。聚合可以减少处理一组特定数据包所需的标签数量,还可以减少所需的标签分发控制流量。
给定一组“可聚合”为单个 FEC 的 FEC,可以 (a) 将它们聚合为单个 FEC,(b) 将它们聚合为一组 FEC,或 (c) 根本不聚合它们。因此,我们可以说聚合的“粒度”,(a) 是“最粗粒度”,(c) 是“最细粒度”。
当使用顺序控制时,对于给定的一组 FEC,每个 LSR 应该采用其下一跳用于这些 FEC 的粒度。
当使用独立控制时,可能会有两个相邻的 LSR,Ru 和 Rd,它们以不同的方式聚合一些 FEC。
如果 Ru 的粒度比 Rd 更细,这不会导致问题。 Ru 为这组 FEC 分配的标签比 Rd 多。这意味着当 Ru 需要将那些 FEC 中的标记数据包转发到 Rd 时,它可能需要将 n 个标签映射到 m 个标签,其中 n > m。作为一种选择,Ru 可以撤回它已经分发的 n 个标签的集合,然后分发一组 m 个标签,对应于 Rd 的粒度级别。这不是确保正确操作所必需的,但它确实导致 Ru 分配的标签数量减少,并且 Ru 通过分配更多数量的标签并没有获得任何特别的优势。是否这样做的决定是本地的事情。
如果 Ru 的粒度比 Rd 更粗(即,Rd 为 FEC 集分配了 n 个标签,而 Ru 分配了 m,其中 n > m),它有两个选择:
– 它可以采用 Rd 的更细粒度级别。这将要求它撤回已分发的 m 个标签,并分发 n 个标签。这是首选选项。
– 它可以简单地将它的 m 个标签映射到 Rd 的 n 个标签的子集,如果它可以确定这将产生相同的路由。例如,假设 Ru 将单个标签应用于需要通过某个出口 LSR 的所有流量,而 Rd 将许多不同的标签绑定到此类流量,具体取决于数据包的各个目标地址。如果 Ru 知道出口路由器的地址,并且如果 Rd 已将标签绑定到由该地址标识的 FEC,则 Ru 可以简单地应用该标签。
在任何情况下,每个 LSR 都需要(通过配置)知道它分配的标签使用什么粒度。在使用有序控制的情况下,这要求每个节点仅知道在该节点离开 MPLS 网络的 FEC 的粒度。对于独立控制,可以通过确保所有 LSR 一致配置为了解每个 FEC 的粒度来获得最佳结果。然而,在许多情况下,这可以通过使用适用于所有 FEC 的单一粒度级别来完成(例如“转发表中每个 IP 前缀一个标签”,或“每个出口节点一个标签”)。
路由选择是指用于为特定 FEC 选择 LSP 的方法。提议的 MPLS 协议架构支持两种路由选择选项:(1) 逐跳路由,和 (2) 显式路由。
逐跳路由允许每个节点独立地为每个 FEC 选择下一跳。这是当今现有 IP 网络中的常用模式。 “逐跳路由LSP”是使用逐跳路由选择其路由的LSP。
在显式路由的 LSP 中,每个 LSR 并不独立选择下一跳;相反,单个 LSR,通常是 LSP 入口或 LSP 出口,指定 LSP 中的几个(或所有)LSR。如果单个 LSR 指定了整个 LSP,则该 LSP 将“严格”显式路由。如果单个 LSR 仅指定部分 LSP,则该 LSP 将“松散地”显式路由。
LSR 后跟一个显式路由 LSP 的序列可以由配置选择,也可以由单个节点动态选择(例如,出口节点可以利用从链路状态数据库中学到的拓扑信息来计算以该出口节点结束的树的整个路径)。
显式路由可能有多种用途,例如策略路由或流量工程。在 MPLS 中,需要在分配标签时指定显式路由,但不必为每个 IP 数据包指定显式路由。这使得 MPLS 显式路由比 IP 源路由的替代方案更有效。
使用显式路由的过程,无论是严格的还是松散的,都超出了本文档的范围。
当带标签的数据包沿 LSP 传输时,有时可能会发生它到达 LSR 时 ILM 不会将数据包的传入标签映射到 NHLFE 的情况,即使传入标签本身是有效的。发生这种情况的原因可能是瞬态条件,或者应该是数据包下一跳的 LSR 上的错误。
在这种情况下,剥离标签堆栈并尝试根据其网络层标头通过传统转发进一步转发数据包是很诱人的。但是,通常这不是一个安全的程序:
– 如果数据包一直遵循明确路由的 LSP,这可能会导致环路。
– 数据包的网络头可能没有足够的信息来使这个特定的 LSR 能够正确地转发它。
除非可以确定(通过本文档范围之外的某种方式)这两种情况都不会发生,否则唯一安全的程序是丢弃数据包。
在传统的 IP 转发中,每个数据包在其报文头中携带一个“生存时间”(TTL) 值。每当数据包通过路由器时,其 TTL 减 1;如果 TTL 在数据包到达目的地之前达到 0,则数据包将被丢弃。
这提供了一定程度的保护,防止由于配置错误或路由算法失败或收敛缓慢而可能存在的转发环路。 TTL 有时也用于其他功能,例如组播范围,并支持“traceroute”命令。这意味着 MPLS 需要处理两个与 TTL 相关的问题: (i) TTL 作为抑制环路的一种方式; (ii) TTL 作为完成其他功能的一种方式,例如限制数据包的范围。
当一个数据包沿着一条 LSP 传输时,它应该以相同的 TTL 值出现,如果它在没有进行标签交换的情况下穿过相同的路由器序列,它就会具有相同的 TTL 值。如果数据包沿着 LSP 的层次结构传输,当它从 LSP 的层次结构中出现时,所经过的 LSR 跳的总数应该反映在它的 TTL 值中。
处理 TTL 的方式可能会有所不同,具体取决于 MPLS 标签值是否携带在 MPLS 特定的“填充”报文头 [MPLS-SHIM] 中,或者 MPLS 标签是否携带在 L2 报文头中,例如 ATM 报文头 [ MPLS-ATM] 或帧中继报文头 [MPLS-FRMRLY]。
如果标签值被编码在位于数据链路和网络层头之间的“填充”中,那么这个填充必须有一个 TTL 字段,它应该最初从网络层头的 TTL 字段加载,应该在每个 LSR 处递减。当数据包从它的 LSP 出现时,应该被复制到网络层报文头 TTL 字段中。
如果标签值编码在数据链路层报文头中(例如,ATM 的 AAL5 报文头中的 VPI/VCI 字段),并且标记的数据包由 L2 交换机(例如,ATM 交换机)转发,则数据链路层(像 ATM)本身没有 TTL 字段,那么就不可能在每个 LSR 跳上递减数据包的 TTL。由一系列不能递减数据包的 TTL 的 LSR 组成的 LSP 段将称为“非 TTL LSP 段”。
当一个数据包从一个非 TTL LSP 段出现时,它应该被赋予一个 TTL 来反映它所经过的 LSR 跳数。在单播情况下,这可以通过将有意义的 LSP 长度传播到入口节点来实现,使入口能够在将数据包转发到非 TTL LSP 段之前递减 TTL 值。
有时可以确定,在进入非 TTL LSP 段时,特定数据包的 TTL 将在数据包到达该非 TTL LSP 段的出口之前到期。在这种情况下,非 TTL LSP 段入口处的 LSR 不得对数据包进行标签交换。这意味着必须开发特殊程序来支持跟踪路由功能,例如,可以使用传统的逐跳转发来转发跟踪路由数据包。
在非 TTL LSP 段上,根据定义,TTL 不能用于防止转发环路。环路控制的重要性可能取决于用于沿非 TTL LSP 段提供 LSR 功能的特定硬件。
例如,假设使用 ATM 交换硬件来提供 MPLS 交换功能,标签携带在 VPI/VCI 字段中。由于 ATM 交换硬件不能减少 TTL,因此没有防止环路的保护。如果 ATM 硬件能够为携带不同 VPI/VCI 值的传入信元提供对缓冲池的公平访问,则这种环路可能不会对其他流量产生任何有害影响。然而,如果 ATM 硬件不能提供这种公平的缓冲区访问,那么即使是瞬时环路也可能导致 LSR 的总体性能严重下降。
即使可以提供公平的缓冲区访问,仍然值得拥有一些检测持续“比可能更长”的环路的方法。此外,即使 TTL 和/或每 VC 公平队列提供了一种使环路幸存的方法,但在可行的情况下仍然可能需要避免设置 LSP 环路。因此,所有可能附加到非 TTL LSP 段的 LSR 都需要支持用于环路检测的通用技术;然而,环路检测技术的使用是可选的。 [MPLS-ATM]和[MPLS-LDP]中规定了环路检测技术。
为了与标签堆栈所在的数据包一起传输标签堆栈,需要定义标签堆栈的具体编码。该架构支持多种不同的编码技术;编码技术的选择取决于用于转发标记数据包的特定类型的设备。
如果使用特定于 MPLS 的硬件和/或软件来转发标记数据包,对标记堆栈进行编码的最明显方法是定义一种新协议,用作数据链路层和网络层标头之间的“填充”。这个 shim 实际上只是网络层数据包的封装;它将是“独立于协议的”,因此它可以用于封装任何网络层。因此,我们将其称为“通用 MPLS 封装”。
通用 MPLS 封装又将封装在数据链路层协议中。
MPLS 通用封装在[MPLS-SHIM]中规定。
需要注意的是,MPLS 转发过程类似于传统“标签交换”交换机(例如 ATM 交换机)的转发过程。 ATM 交换机使用输入端口和输入 VPI/VCI 值作为索引到“交叉连接”表中,它们从中获得输出端口和输出 VPI/VCI 值。因此,如果一个或多个标签可以直接编码到这些传统交换机访问的字段中,那么传统交换机可以通过适当的软件升级,用作 LSR。我们将此类设备称为“ATM-LSR”。
在 ATM 信元头中编码标签有三种明显的方法(假设使用 AAL5):
1. SVC 编码
使用 VPI/VCI 字段对位于标签堆栈顶部的标签进行编码。该技术可用于任何网络。使用这种编码技术,每个 LSP 都被实现为一个 ATM SVC,标签分发协议就变成了 ATM“信令”协议。使用这种编码技术,ATM-LSR 不能在标签堆栈上执行“压入”或“弹出”操作。
2. SVP 编码
使用 VPI 字段对位于标签堆栈顶部的标签进行编码,使用 VCI 字段对堆栈中的第二个标签进行编码(如果存在)。与前一种技术相比,这种技术有一些优点,因为它允许使用 ATM“VP 交换”。也就是说,LSP 实现为 ATM SVP,标签分发协议作为 ATM 信令协议。
然而,这种技术不能总是被使用。如果网络包括通过非 MPLS ATM 网络的 ATM 虚拟路径,则 VPI 字段不一定可供 MPLS 使用。
当使用这种编码技术时,VP 出口处的 ATM-LSR 有效地执行“弹出”操作。
3. SVP 多点编码
使用 VPI 字段对位于标签栈顶部的标签进行编码,使用 VCI 字段的一部分对栈上的第二个标签进行编码(如果存在),并使用 VCI 字段的其余部分来标识 LSP入口。如果使用这种技术,则可以使用传统的 ATM VP 交换功能来提供多点对点 VP。来自不同数据包的信元将携带不同的 VCI 值。正如我们将在 3.26 节中看到的,这使我们能够在可以提供多点对点 VP 但不具有 VC 合并能力的 ATM 交换机上进行标签合并,而不会遇到任何信元交织问题。
该技术依赖于将 16 位 VCI 值分配给每个 ATM 交换机的能力的存在,这样就不会将单个 VCI 值分配给两个不同的交换机。 (如果可以为每个交换机分配足够数量的此类值,则还可以将 VCI 值视为堆栈中的第二个标签。)
如果堆栈上的标签多于 ATM 报文头中可以编码的标签,则 ATM 编码必须与通用封装相结合。
如果<R1, R2, R3>是LSP的一个段,则有可能R1在向R2传输数据包P时使用标签栈的一种编码,而在向R3传输数据包P时R2将使用不同的编码。一般而言,MPLS 架构支持在不同跃点上使用不同标签栈编码的 LSP。因此,当我们讨论处理标记数据包的过程时,我们抽象地谈论对数据包的标签堆栈进行操作。当接收到一个带标签的包时,LSR 必须对其进行解码以确定标签栈的当前值,然后必须对标签栈进行操作以确定栈的新值,然后在传输带标签的包之前对新值进行适当的编码到它的下一跳。
不幸的是,ATM 交换机没有将一种编码技术转换为另一种编码技术的能力。因此,MPLS 体系结构要求,只要两个 ATM 交换机有可能成为某个数据包的第 m 层 LSP 上的连续 LSR,那两个 ATM 交换机就使用相同的编码技术。
自然会有 MPLS 网络包含作为 LSR 运行的 ATM 交换机和使用 MPLS shim 报文头运行的其他 LSR 的组合。在这样的网络中,可能有一些 LSR 具有 ATM 接口以及“MPLS Shim”接口。这是在不同跃点上具有不同标签堆栈编码的 LSR 的一个示例。这样的 LSR 可以交换传入接口上的 ATM 编码标签堆栈,并用传出接口上的 MPLS 填充头编码标签堆栈替换它。
假设一个 LSR 将多个传入标签绑定到一个特定的 FEC。在该 FEC 中转发数据包时,人们希望有一个应用于所有此类数据包的传出标签。 FEC 中两个不同的数据包以不同的传入标签到达的事实是无关紧要的;人们希望使用相同的传出标签转发它们。这样做的能力被称为“标签合并”。
假设 LSR 能够从不同的传入接口和/或具有不同标签的两个数据包接收两个数据包,并将两个数据包以相同的标签从同一个传出接口发送出去,则它能够进行标签合并。一旦数据包被传输,它们从不同接口和/或具有不同传入标签到达的信息就会丢失。
假设对于来自不同接口或具有不同标签的任何两个数据包,如果这些数据包必须从不同的接口发送出去,或者必须具有不同的标签,则 LSR 不能进行标签合并。使用 SVC 或 SVP 编码的 ATM-LSR 不能进行标签合并。这将在下一节中更详细地讨论。
如果某个特定的 LSR 不能进行标签合并,那么如果同一 FEC 中的两个数据包以不同的传入标签到达,则它们必须以不同的传出标签转发。使用标签合并,每个FEC的出标签数量只需为1;如果没有标签合并,每个 FEC 的输出标签数量可能与网络中的节点数量一样大。
通过标签合并,特定 LSR 需要的每个 FEC 的传入标签数量永远不会大于标签分配邻接的数量。在没有标签合并的情况下,特定 LSR 需要的每个 FEC 的传入标签数量与将 FEC 中的流量转发到相关 LSR 的上游节点的数量一样大。事实上,LSR 甚至很难确定它必须为特定 FEC 支持多少这样的传入标签。
MPLS 体系结构支持合并和非合并 LSR,但允许存在不支持标签合并的 LSR。这导致了确保合并 LSR 和非合并 LSR 之间正确互操作的问题。数据报媒介的问题与 ATM 的情况有所不同。因此将分别讨论不同的媒介类型。
MPLS 转发过程与 ATM 和帧中继等技术使用的转发过程非常相似。即,一个数据单元到达后,在“交叉连接表”中查找标签(VPI/VCI 或 DLCI),在该查找的基础上选择输出端口,并重写标签值。事实上,可以使用这样的技术进行 MPLS 转发;标签分发协议可以用作设置交叉连接表的“信令协议”。
不幸的是,这些技术不一定支持标签合并功能。在 ATM 中,如果尝试执行标签合并,结果可能是来自各种数据包的信元交错。如果来自不同数据包的信元交错,则无法重新组合数据包。一些帧中继交换机在其背板上使用信元交换。这些交换机也可能无法支持标签合并,出于同样的原因——不同数据包的信元可能会交错,然后就无法重新组合数据包。
我们建议支持此问题的两种解决方案。首先,MPLS 将包含允许使用非合并 LSR 的程序。其次,MPLS 将支持允许某些 ATM 交换机充当合并 LSR 的程序。
由于 MPLS 支持合并和非合并 LSR,因此 MPLS 还包含确保它们之间正确互操作的程序。
只需要发送一个支持标签合并的上行LSR
每个 FEC 一个标签。不支持标签合并的上游邻居需要为每个 FEC 发送多个标签。但是,无法先验地知道它需要多少个标签。这将取决于有关 FEC 的上游有多少 LSR。
在 MPLS 架构中,如果特定上游邻居不支持标签合并,则不会为特定 FEC 发送任何标签,除非它明确要求该 FEC 的标签。上游邻居可能会发出多次这样的请求,并且每次都被赋予一个新标签。当下游邻居收到来自上游的此类请求,而下游邻居本身不支持标签合并时,它必须反过来向其下游邻居询问有关 FEC 的另一个标签。
可能有一些节点支持标签合并,但只能将有限数量的传入标签合并为单个传出标签。例如,假设由于某些硬件限制,一个节点能够将四个传入标签合并为一个传出标签。然而,假设这个特定节点有六个传入标签到达它,用于特定 FEC。在这种情况下,该节点可以将这些合并为两个传出标签。
标签合并是否适用于显式路由的 LSP 有待进一步研究。
有几种方法可用于消除 ATM 中的信元交织问题,从而使 ATM 交换机支持流合并:
1. VP合并,使用SVP Multipoint Encoding
使用VP合并时,将多条虚路径合并为一条虚路径,但在VP内使用不同的VCI区分不同来源的报文。
2. VC合并
当使用 VC 合并时,交换机需要缓冲来自一个数据包的信元,直到接收到整个数据包(这可以通过查找 AAL5 帧结束指示符来确定)。
VP 合并的优势在于它与更高百分比的现有 ATM 交换机实现兼容。这使得VP合并更有可能在现有网络中使用。与 VC 合并不同,VP 合并不会在合并点产生任何延迟,也不会强加任何缓冲区要求。但是,它的缺点是需要协调每个 VP 内的 VCI 空间。有多种方法可以实现这一点。选择一种或多种方法有待进一步研究。
与现有设备的兼容性与协议复杂性和可扩展性之间的这种权衡意味着 MPLS 协议需要支持 VP 合并和 VC 合并。为了做到这一点,参与 MPLS 的每个 ATM 交换机需要知道它的直接 ATM 邻居是执行 VP 合并、VC 合并还是不合并。
通过首先描述 VC 合并与非合并的互操作,最容易描述 ATM 上各种合并形式的互操作。
在 VC 合并节点和非合并节点互连的情况下,信元的转发在所有情况下都基于 VC(即 VPI 和 VCI 的串联)。对于每个节点,如果上游邻居正在执行 VC 合并,那么该上游邻居仅需要一个特定流的单个 VPI/VCI(这类似于在帧媒介上操作的情况下对单个标签的要求)。如果上游邻居没有进行合并,那么邻居将需要每个流的单个 VPI/VCI 以及足够的 VPI/VCI 以传递给其上游邻居。所需的数量将通过允许上游节点从其下游邻居请求额外的 VPI/VCI 来确定(这再次类似于帧合并使用的方法)。
类似的方法可以支持执行 VP 合并的节点。在这种情况下,VP 合并节点不是从其下游邻居请求单个 VPI/VCI 或多个 VPI/VCI,而是可以请求单个 VP(由 VPI 标识)但在 VP 内请求多个 VCI。此外,假设一个非合并节点位于两个不同的 VP 合并节点的下游。该节点可能需要请求一个 VPI/VCI(用于来自其自身的流量)加上两个 VP(每个上游节点一个),每个都与一组指定的 VCI(根据上游节点的请求)相关联。
为了支持所有的VP合并、VC合并和非合并,因此需要允许上游节点请求零个或多个VC标识符的组合(由VPI/VCI组成),加上零个或多个VP(由 VPI 标识),每个包含指定数量的 VC(由一组在 VP 中重要的 VCI 标识)。因此,VP 合并节点将请求一个 VP,其中包含一个用于它发起的流量的 VCI(如果合适)加上从上面请求的每个 VC 的 VCI(无论 VC 是否是包含 VP 的一部分)。 VC 合并节点将仅请求单个 VPI/VCI(因为它们可以将所有上游流量合并为单个 VC)。非合并节点将传递它们从上面获得的任何请求,并为它们发起的流量请求 VPI/VCI(如果适用)。
有时,路由器 Ru 会采取显式操作,使特定数据包传送到另一个路由器 Rd,即使 Ru 和 Rd 不是该数据包的逐跳路径上的连续路由器,并且 Rd 也不是数据包的最终目的地。例如,这可以通过将数据包封装在目标地址是 Rd 本身地址的网络层数据包中来完成。这将创建一条从 Ru 到 Rd 的“隧道”。我们将任何这样处理的数据包称为“隧道数据包”。
如果隧道分组遵循从 Ru 到 Rd 的逐跳路径,我们说它在“发送端点”为 Ru 且“接收端点”为 Rd 的“逐跳路由隧道”中。
如果隧道数据包通过除逐跳路径之外的路径从 Ru 传播到 Rd,我们说它位于“显式路由隧道”中,其“发送端点”为 Ru,其“接收端点”为 Rd。例如,我们可以通过将数据包封装在源路由的数据包中来通过显式路由隧道发送数据包。
可以将隧道实现为LSP,使用标签交换而不是网络层封装,使数据包通过隧道。隧道将是 LSP <R1, …, Rn>,其中 R1 是隧道的发送端点,Rn 是隧道的接收端点。这称为“LSP 隧道”。
要通过 LSP 隧道发送的一组数据包构成一个 FEC,隧道中的每个 LSR 必须为该 FEC 分配一个标签(即,必须为隧道分配一个标签)。将特定数据包分配给 LSP 隧道的标准是隧道传输端点的本地事务。为了将数据包放入 LSP 隧道,传输端点将隧道的标签压入到标签堆栈上,并将带标签的数据包发送到隧道中的下一跳。
如果隧道的接收端点不需要能够确定它通过隧道接收哪些数据包,如前所述,标签堆栈可能会在隧道中的倒数第二个 LSR 处弹出。
“逐跳路由 LSP 隧道”是作为发送端点和接收端点之间的逐跳路由 LSP 实现的隧道。
“Explicitly Routed LSP Tunnel”是LSP Tunnel,也是Explicitly Routed LSP。
考虑一个 LSP <R1, R2, R3, R4>。让我们假设 R1 收到未标记的数据包 P,并将标签压入其标签堆栈,使其遵循这条路径,这实际上是逐跳路径。然而,让我们进一步假设 R2 和 R3 没有直接连接,而是由于是 LSP 隧道的端点而成为“邻居”。所以 P 遍历的 LSR 的实际序列是 <R1, R2, R21, R22, R23, R3, R4>。
当 P 从 R1 到 R2 时,它会有一个深度为 1 的标签栈。 R2 打开标签,确定 P 必须进入隧道。 R2 首先用对 R3 有意义的标签替换 Incoming 标签。然后它压入一个新标签。此级别 2 标签具有对 R21 有意义的值。交换由 R21、R22、R23 在 2 级标签上完成。 R23 是 R2-R3 隧道中的倒数第二跳,在将数据包转发到 R3 之前弹出标签堆栈。当 R3 看到数据包 P 时,P 只有一个 1 级标签,现在已经退出了隧道。由于 R3 是 P 的第 1 级 LSP 中的倒数第二跳,它弹出标签堆栈,R4 接收未标记的 P。
标签堆栈机制允许 LSP 隧道嵌套到任何深度。
假设数据包P沿Level 1 LSP<R1, R2, R3, R4>传输,当从R2到R3时,沿Level 2 LSP<R2, R21, R22, R3>传输。从Level 2 LSP的角度来看,R2的标签分发对等体是R21。从Level 1 LSP的角度来看,R2的标签分发对等体是R1和R3。可以在层次结构的每一层都有标签分发对等点。我们将在 4.6 和 4.7 节中看到一些使用这种层次结构的方法。请注意,在此示例中,R2 和 R21 必须是 IGP 邻居,但 R2 和 R3 不必是。
当两个 LSR 是 IGP 邻居时,我们将它们称为“本地标签分发对等体”。当两个 LSR 可能是标签分发对等体,但不是 IGP 邻居时,我们将它们称为“远程标签分发对等体”。在上例中,R2 和 R21 是本地标签分发对等体,而 R2 和 R3 是远程标签分发对等体。
MPLS 架构支持两种在层次结构的不同层分配标签的方法:显式对等互连和隐式对等互连。
一种通过发送寻址到对等体的标签分发协议消息与自己的本地标签分发对等体执行标签分发。可以通过以下两种方式之一与远程标签分发对等方执行标签分发:
1. 显式对等互连
在显式对等互连中,通过向对等方发送标签分发协议消息来向对等方分发标签,这与对本地标签分发对等方所做的完全一样。当远程标签分发对等体的数量很少,或者更高级别标签绑定的数量很大,或者远程标签分发对等体位于不同的路由区域或域中时,这种技术最有用。当然,需要知道哪些标签分发给哪些peer;这在第 4.1.2 节中解决。
在 4.2.1 和 4.6 节中可以找到使用显式对等互连的示例。
2. 隐式对等互连
在隐式对等互连中,不发送寻址到对等体的标签分发协议消息。相反,为了将更高级别的标签分发给远程标签分发对等方,将更高级别的标签编码为较低级别标签的属性,然后将较低级别的标签与该属性一起分发给自己的本地标签分发对等方。本地标签分发对等体然后将信息传播到它们的本地标签分发对等体。这个过程一直持续到信息到达远程对等方。
当远程标签分发对等点的数量很大时,此技术最有用。隐式对等互连不需要 n 方对等互连网格来将标签分发到远程标签分发对等方,因为信息是通过本地标签分发对等互连传送的。但是,隐式对等互连要求中间节点存储它们可能不直接感兴趣的信息。
第 4.3 节中提供了使用隐式对等互连的示例。
MPLS 网络中的节点之间使用标签分发协议来建立和维护标签绑定。为了使 MPLS 正确运行,需要可靠地传输标签分发信息,并且需要按顺序传输属于特定 FEC 的标签分发协议消息。流量控制也是可取的,因为它具有在单个数据报中携带多个标签消息的能力。
实现这些目标的一种方法是使用 TCP 作为底层传输,就像在 [MPLS-LDP] 和 [MPLS-BGP] 中所做的那样。
该体系结构没有建立硬性规则来选择在何种情况下使用哪种标签分发协议。但是,可以指出一些注意事项。
在许多情况下,希望将标签绑定到 FEC,可以通过路由到地址前缀来识别(参见第 4.1 节)。如果有一种标准的、广泛部署的路由算法来分发这些路由,那么可以说标签分发最好通过将标签分发搭载在路由本身的分发上来实现。
例如,BGP 分发此类路由,如果 BGP 发言者也需要向其 BGP 对等方分发标签,则使用 BGP 进行标签分发(参见 [MPLS-BGP])具有许多优点。特别是,它允许 BGP 路由反射器分发标签,因此比使用 LDP 在 BGP 对等体之间分发标签具有显着的可扩展性优势。
当 RSVP 用于为特定流设置资源预留时,可能需要标记这些流中的数据包,以便不需要在每一跳应用 RSVP 过滤器规范。可以说,让 RSVP 分发标签作为其路径/保留设置过程的一部分是为此目的分发标签的最有效方法。
在 MPLS 的一些应用中,特别是那些与流量工程相关的应用中,需要建立一条明确的路由路径,从入口到出口。沿该路径应用资源预留也是可取的。
人们可以想象两种方法:
– 从用于设置资源预留的现有协议开始,并将其扩展为支持显式路由和标签分发。
– 从用于标签分发的现有协议开始,并将其扩展为支持显式路由和资源预留。
第一种方法产生了[MPLS-RSVP-TUNNELS]中规定的协议,第二种方法产生了[MPLS-CR-LDP]中规定的方法。
本节有待进一步研究
MPLS 的许多用途要求具有特定标签的数据包沿着相同的逐跳路由路径转发,该路径将用于转发在其网络层目标地址字段中具有指定地址的数据包。
通常,路由器 R 通过在其路由表中查找与 P 的目标地址最长匹配的地址前缀 X 来确定数据包 P 的下一跳。也就是说,给定 FEC 中的数据包只是那些与 R 路由表中给定地址前缀匹配的数据包。在这种情况下,可以使用地址前缀来标识 FEC。
请注意,数据包 P 可能会分配给 FEC F,并且 FEC F 可能会使用地址前缀 X 来标识,即使 P 的目标地址与 X 不匹配。
当且仅当满足以下条件之一时,LSR R1 和 R2 被认为是地址前缀 X 的标签分发对等体:
1. R1 到 X 的路由是它通过特定 IGP 的特定实例获知的路由,并且 R2 是该 IGP 实例中 R1 的邻居
2. R1 到 X 的路由是它通过路由算法 A1 的某个实例了解到的路由,并且该路由被重新分配到路由算法 A2 的一个实例中,并且 R2 在 A2 的那个实例中是 R1 的邻居
3. R1 是另一个 LSP 内的 LSP Tunnel 的接收端点,R2 是该隧道的发送端点,R1 和 R2 是 IGP 公共实例的参与者,并且在同一个 IGP 区域(如果有问题的 IGP 有区域),并且 R1 到 X 的路由是通过该 IGP 实例获知的,或者由 R1 重新分配到该 IGP 实例中
4. R1到X的路由是它通过BGP获知的路由,R2是R1的BGP peer
通常,这些规则确保如果到特定地址前缀的路由是通过 IGP 分发的,则该地址前缀的标签分发对等体是 IGP 邻居。如果通过 BGP 分发到特定地址前缀的路由,则该地址前缀的标签分发对等体是 BGP 对等体。在 LSP 隧道的其他情况下,隧道端点是标签分发对等体。
为了使用 MPLS 根据对应于任何地址前缀的逐跳路由转发数据包,每个 LSR 必须:
1. 将一个或多个标签绑定到出现在其路由表中的每个地址前缀;
2. 对于每个这样的地址前缀 X,使用标签分发协议将标签与 X 的绑定分发到 X 的每个标签分发对等体。
还有一种情况,LSR 必须为地址前缀分配标签绑定,即使不是 LSR 将该标签绑定到该地址前缀:
3. 如果 R1 使用 BGP 向 X 分发路由,将其他某个 LSR R2 命名为到 X 的 BGP Next Hop,并且如果 R1 知道 R2 已将标签 L 分配给 X,则 R1 必须将 L 和 X 之间的绑定分发到它分发该路由的任何 BGP 对等体。
这些规则确保当且仅当 BGP 路由分配到 IGP 时,将与 BGP 路由对应的地址前缀对应的标签分配给 IGP 邻居。否则,绑定在 BGP 路由上的标签只会分发给其他 BGP 发言者。
这些规则仅用于指示给定 LSR 必须向哪些其他 LSR 分发哪些标签绑定。
如果数据包P需要经过的逐跳路径是<R1, …, Rn>,那么<R1, …, Rn>可以是一条LSP,只要:
1. 有一个地址前缀X,对于所有的i,1<=i<n,X是Ri的路由表中P的目的地址的最长匹配;
2. 对于所有的 i,1<i<n,Ri 已经为 X 分配了一个标签,并将该标签分发给了 R[i-1]。
请注意,数据包的 LSP 只能扩展到它遇到一个路由器,该路由器的转发表具有更长的数据包目标地址的最佳匹配地址前缀。此时,LSP 必须结束,必须再次执行最佳匹配算法。
例如,假设目标地址为 10.2.153.178 的数据包 P 需要从 R1 到 R2 再到 R3。还假设 R2 向 R1 通告地址前缀 10.2/16,但 R3 向 R2 通告 10.2.153/23、10.2.154/23 和 10.2/16。也就是说,R2 正在向 R1 通告“聚合路由”。在这种情况下,数据包P可以在到达R2之前进行标签交换,但是由于R2已经进行了路由聚合,所以它必须执行最佳匹配算法才能找到P的FEC。
当且仅当以下条件之一成立时,LSR R 被认为是地址前缀 X 的“LSP 出口”LSR:
1. R 有一个地址 Y,所以 X 是 R 的路由表中与 Y 最长匹配的地址前缀,或
2. R 在其路由表中包含一个或多个地址前缀 Y,使得 X 是 Y 的适当初始子串,但 R 的 X 的“LSP 前一跳”不包含任何此类地址前缀 Y;也就是说,R 是地址前缀 X 的“解聚点”。
LSR R1 被认为是地址前缀 X 的“LSP 代理出口”LSR,当且仅当:
1. R1 对 X 的下一跳是 R2,并且 R1 和 R2 不是 X 的标签分发对等体(可能是因为 R2 不支持 MPLS),或
2. R1 已配置为 X 的 LSP 代理出口
LSP 的定义允许 LSP Egress 是一个不支持 MPLS 的节点;在这种情况下,LSP 中的倒数第二个节点是代理出口。
隐式 NULL 标签是一个具有特殊语义的标签,LSR 可以将其绑定到地址前缀。如果 LSR Ru 通过咨询其 ILM,看到标记的数据包 P 必须在 Rd 旁边转发,但该 Rd 已将隐式 NULL 的绑定分发到相应的地址前缀,则代替替换顶部的标签值标签栈,Ru弹出标签栈,然后将结果包转发给Rd。
LSR Rd 将隐式 NULL 和地址前缀 X 之间的绑定分配给 LSR Ru 当且仅当:
1. 第 4.1.2 节的规则表明 Rd 分发给 Ru 一个绑定 X 的标签,并且
2. Rd 知道 Ru 可以支持隐式 NULL 标签(即它可以弹出标签堆栈),并且
3. Rd 是 X 的 LSP 出口(不是代理出口)。
这会导致 LSP 上的倒数第二个 LSR 弹出标签堆栈。这是非常合适的;如果 LSP Egress 是 X 的 MPLS Egress,那么如果倒数第二个 LSR 没有弹出标签栈,LSP Egress 将需要查找标签,弹出标签栈,然后查找下一个标签(或查找L3 地址(如果不存在更多标签)。通过让倒数第二个 LSR 弹出标签堆栈,LSP 出口省去了必须查找两个标签才能做出转发决定的工作。
但是,如果倒数第二个 LSR 是 ATM 交换机,则它可能无法弹出标签堆栈。因此,隐式 NULL 的绑定可能只分发给支持该功能的 LSR。
如果地址前缀 X 的 LSP 中的倒数第二个 LSR 是 LSP 代理出口,它的行为就像 LSP 出口为 X 分发了一个隐式 NULL 的绑定。
在某些情况下,LSP 入口 Ri 知道几个不同 FEC 的数据包都必须遵循相同的 LSP,例如在 LSP 出口 Re 处终止。在这种情况下,可以通过对所有此类 FEC 使用单个标签来实现正确的路由;没有必要为每个 FEC 有一个不同的标签。如果(且仅当)以下条件成立:
1. LSR Re 的地址本身在路由表中作为“主机路由”,并且
2. 有一些方法可以让 Ri 确定 Re 是特定 FEC 集中所有数据包的 LSP 出口
然后 Ri 可以将单个标签绑定到集合中的所有 FECS。这称为“出口目标标签分配”。
LSR Ri 如何确定某个 LSR Re 是特定 FEC 中所有数据包的 LSP 出口?有多种可能的方式:
– 如果网络正在运行链路状态路由算法,并且该区域中的所有节点都支持 MPLS,那么路由算法会为 Ri 提供足够的信息来确定该 FEC 中的数据包必须通过哪些路由器离开路由域或区域。
– 如果网络正在运行 BGP,Ri 可能能够确定特定 FEC 中的数据包必须通过某个特定路由器离开网络,该路由器是该 FEC 的“BGP 下一跳”。
– 可以使用标签分发协议来传递有关哪些地址前缀“附加”到哪些出口 LSR 的信息。这种方法的优点是不依赖于链路状态路由的存在。
如果使用出口定向标签分配,整个网络需要支持的标签数量可能会大大减少。如果使用传统交换硬件来执行 MPLS,并且交换硬件只能支持有限数量的标签,那么这可能很重要。
一种可能的方法是将网络配置为默认使用出口目标标签分配,但将特定 LSR 配置为不为一个或多个地址前缀使用出口目标标签分配,该地址前缀是 LSP 出口。我们强加以下规则:
– 如果一个特定的 LSR 不是某组地址前缀的 LSP 出口,那么它应该以与它的 LSP 下一跳为这些地址前缀所做的相同的方式为地址前缀分配标签。也就是说,假设 Rd 是 Ru 的 LSP 下一跳地址前缀 X1 和 X2。如果 Rd 为 X1 和 X2 分配相同的标签,Ru 也应该如此。如果 Rd 为 X1 和 X2 分配不同的标签,那么 Ru 也应该如此。
例如,假设希望将出口目标标签分配设为默认值,但要将不同的标签分配给那些有多个可能的 LSP 出口的地址前缀(即,对于那些多宿主地址前缀)。可以配置所有 LSR 使用出口目标标签分配,然后配置少数 LSR 为那些多宿主地址前缀分配不同的标签。对于特定的多宿主地址前缀 X,只需要在 LSP 出口或 LSP 代理出口的 LSR 中配置 X。
需要注意的是,如果 Ru 和 Rd 是 X1 和 X2 的 LSP 中相邻的 LSR,如果 Ru 为 X1 和 X2 分配不同的标签而 Rd 只为它们分配一个标签,则转发仍将正确完成。这只是意味着 R1 会将不同的传入标签映射到相同的传出标签,这是一个普通的事件。
类似地,如果 Rd 为 X1 和 X2 分配了不同的标签,但 Ru 为它们分配了与其 LSP 出口或代理出口地址对应的标签,转发仍将正确完成。 Ru 只会将传入标签映射到 Rd 分配给该 LSP 出口地址的标签。
可能需要使用显式路由而不是逐跳路由的原因有很多。例如,这允许路由基于管理策略,并允许仔细设计 LSP 所采用的路由以允许流量工程 [MPLS-TRFENG]。
在某些情况下,网络管理员可能希望沿着某些预先指定的路径转发某些类别的流量,其中这些路径与流量通常遵循的逐跳路径不同。这可以用于支持策略路由或流量工程。显式路由可以是配置的路由,也可以通过某种方式动态确定,例如通过基于约束的路由。
MPLS 允许通过显式路由 LSP 隧道轻松完成此操作。所需要的只是:
1. 选择要发送到Explicitly Routed LSP Tunnel的数据包的方法;
2. 建立Explicitly Routed LSP隧道的方法;
3. 一种确保发送到隧道的数据包不会从接收端点环路回到发送端点的方法。
如果隧道的发送端点希望将标记的数据包放入隧道,它必须首先用隧道接收端点分配给它的标签值替换堆栈顶部的标签值。然后它必须压入与隧道本身相对应的标签,该标签由沿隧道的下一跳分配给它。为此,隧道端点应该是显式标签分发对等体。他们需要交换的标签绑定对隧道沿线的 LSR 不感兴趣。
假设特定的 LSR Re 是 10 个地址前缀的 LSP 代理出口,并且它通过不同的接口到达每个地址前缀。
可以为所有 10 个地址前缀分配一个标签。然后 Re 是所有 10 个地址前缀的 LSP 出口。这确保所有 10 个地址前缀的数据包都被传送到 Re。但是,Re 必须查找每个此类数据包的网络层地址,以便选择合适的接口来发送数据包。
或者,可以为每个接口分配一个不同的标签。然后 Re 是 10 个地址前缀的 LSP 代理出口。这消除了 Re 查找网络层地址以转发数据包的需要。但是,它可能会导致使用大量标签。
另一种方法是将所有 10 个地址前缀绑定到相同的 1 级标签(也绑定到 LSR 本身的地址),然后将每个地址前缀绑定到不同的 2 级标签。 2 级标签将被视为 1 级标签绑定的一个属性,我们称之为“堆栈属性”。我们强加以下规则:
– 当 LSR Ru 最初标记一个迄今为止未标记的数据包时,如果该数据包的目的地址的最长匹配是 X,并且 Ru 的 X 的 LSP 下一跳是 Rd,并且 Rd 已向 Ru 分发了标签 L1 到 X 的绑定,以及L2 的堆栈属性,则
1. Ru必须先将L2再L1压入数据包的标签栈,然后再将数据包转发给Rd;
2. 当 Ru 将 X 的标签绑定分发给它的标签分发对等体时,它必须包括 L2 作为堆栈属性。
3. 每当堆栈属性发生变化时(可能是因为 Ru 的 LSP 下一跳 X 的变化),Ru 必须分发新的堆栈属性。
注意,虽然沿 LSP 的每一跳绑定到 X 的标签值可能不同,但堆栈属性值不变地传递,并由 LSP 代理出口设置。
因此,X 的 LSP 代理出口与路由区域或域中的其他 LSR 成为“隐式对等体”。在这种情况下,显式对等连接将过于笨拙,因为对等点的数量会变得太大。
如果 LSR 支持特定流的多个路由,则它可以为流分配多个标签,每个路由一个。因此,对于特定地址前缀的特定邻居的第二个标签绑定的接收应被视为意味着任一标签都可用于表示该地址前缀。
如果为特定地址前缀指定了多个标签绑定,则它们可能具有不同的属性。
考虑数据包 P1 和 P2 的情况,每个数据包都有一个目的地地址,其在整个特定路由域中的最长匹配是地址前缀 X。假设 P1 的逐跳路径是 <R1, R2, R3> , 并且 P2 的逐跳路径是 <R4, R2, R3>。假设 R3 将标签 L3 绑定到 X,并将此绑定分发给 R2。 R2 将标签 L2 绑定到 X,并将此绑定分发给 R1 和 R4。当 R2 收到数据包 P1 时,它的传入标签将是 L2。 R2 将用 L3 覆盖 L2,并将 P1 发送到 R3。当 R2 收到数据包 P2 时,它的传入标签也将是 L2。 R2 再次用 L3 覆盖 L2,并将 P2 发送到 R3。
然后注意,当P1和P2从R2到R3时,它们携带相同的标签,就MPLS而言,它们是无法区分的。因此,与其讨论两个不同的 LSP,<R1, R2, R3> 和 <R4, R2, R3>,不如讨论单个“多点对点 LSP 树”,我们可以将其表示为 <{R1, R4}、R2、R3>。
当我们尝试使用传统的 ATM 交换机作为 LSR 时,这会产生一个困难。由于传统的 ATM 交换机不支持多点对点连接,因此必须有程序来确保每个 LSP 实现为一个点对点 VC。然而,如果使用支持多点对点 VC 的 ATM 交换机,那么 LSP 可以最有效地实现为多点对点 VC。或者,如果可以使用 SVP 多点编码(第 3.25.2 节),则 LSP 可以实现为多点对点 SVP。
考虑一个自治系统 A 的情况,它承载其他自治系统之间的传输流量。自治系统 A 将有多个 BGP 边界路由器,以及它们之间的 BGP 连接网,BGP 路由在其上分布。在许多此类情况下,希望避免将 BGP 路由分发到不是 BGP 边界路由器的路由器。如果可以避免这种情况,这些路由器上的“路由分发负载”将显着降低。但是,必须有一些方法来确保内部路由器将传输流量从边界路由器传送到边界路由器。
这可以通过 LSP 隧道轻松完成。假设 BGP 路由仅分发到 BGP 边界路由器,而不分发到从边界路由器到边界路由器的逐跳路径上的内部路由器。然后可以按如下方式使用 LSP 隧道:
1. 每个 BGP 边界路由器向同一自治系统中的每个其他 BGP 边界路由器分发它通过 BGP 分发给该路由器的每个地址前缀的标签。
2. 自治系统的IGP 为每个BGP 边界路由器维护一个主机路由。每个内部路由器将这些主机路由的标签分发给它的每个 IGP 邻居。
3. 假设:
a) BGP 边界路由器 B1 收到一个未标记的数据包 P,
b) B1 的路由表中的地址前缀 X 是 P 的目的地址的最长匹配,
c) 到 X 的路由是 BGP 路由,
d) X 的 BGP 下一跳是 B2,
e) B2 已将标签 L1 绑定到 X,并将此绑定分发给 B1,
f) B2地址的IGP下一跳是I1,
g) B2 的地址作为主机路由在 B1 和 I1 的 IGP 路由表中,并且
h) I1 已将标签 L2 绑定到 B2 的地址,并将此绑定分发给 B1。
那么在向I1发送数据包P之前,B1必须为P创建一个标签栈,然后压入标签L1,再压入标签L2。
4. 假设 BGP 边界路由器 B1 收到一个带标签的 Packet P,其中标签栈顶部的标签对应地址前缀 X,该路由是 BGP 路由,条件 3b, 3c, 3d,和 3e 都持有。那么在向I1发送数据包P之前,B1必须用L1替换标签栈顶部的标签,然后压入标签L2。
通过这些过程,给定的数据包 P 遵循所有成员都是 BGP 边界路由器的第 1 级 LSP,并且在第 1 级 LSP 中的每对 BGP 边界路由器之间,它遵循第 2 级 LSP。
这些过程有效地在 BGP 边界路由器之间创建了一个逐跳路由 LSP 隧道。
由于 BGP 边界路由器正在为 IGP 路由甚至不知道的地址前缀交换标签绑定,因此 BGP 路由器应该成为彼此之间的显式标签分发对等体。
有时可以在两个 BGP 边界路由器之间创建逐跳路由 LSP 隧道,即使它们不在同一个自治系统中。例如,假设B1和B2在AS 1中。假设B3是B2的EBGP邻居,并且在AS2中。最后,假设 B2 和 B3 位于两个自治系统(“非军事区”)共有的某个网络上。在这种情况下,可以在B1和B3之间直接建立一条LSP隧道,如下所示:
– B3 向 B2 分发路由(使用 EBGP),可选择为地址前缀分配标签;
– B2 将这些路由重新分配到 B1(使用 IBGP),表明每个此类路由的 BGP 下一跳是 B3。如果 B3 为地址前缀分配了标签,B2 将这些标签原封不动地传递给 B1。
– AS1 的 IGP 有一条通往 B3 的主机路由。
逐跳路由 LSP 隧道的使用不限于 BGP 下一跳之间的隧道。任何可能使用封装隧道的情况都是适合使用逐跳路由 LSP 隧道的情况。不是使用目的地地址是隧道接收端点地址的新标头封装数据包,而是将与隧道接收端点地址最长匹配的地址前缀对应的标签压入到数据包的标签堆栈上。发送到隧道中的数据包可能已经或可能没有被标记。
如果隧道的发送端点希望将标记的数据包放入隧道,它必须首先用隧道接收端点分配给它的标签值替换堆栈顶部的标签值。然后它必须压入与隧道本身相对应的标签,该标签由沿隧道的下一跳分配给它。为此,隧道端点应该是显式标签分发对等体。他们需要交换的标签绑定对隧道沿线的 LSR 不感兴趣。
组播路由通过构建组播树来进行。特定组播数据包必须沿其转发的树通常取决于数据包的源地址和目标地址。每当特定 LSR 是特定组播树中的节点时,它就会将标签绑定到该树。然后它将该绑定分发到组播树上的父节点。 (如果有问题的节点在 LAN 上,并且在该 LAN 上有兄弟姐妹,则它还必须将绑定分发给其兄弟姐妹。这允许父节点在向 LAN 上的所有子节点组播时使用单个标签值。)
当一个组播标记数据包到达时,与该标签对应的 NHLFE 指示该数据包的输出接口集,以及传出标签。如果在所有传出接口上使用相同的标签编码技术,则可以将完全相同的数据包发送到所有子接口。
在本节中,我们只考虑用于流量沿其逐跳路由路径进行标签交换的标签绑定。在这些情况下,有问题的标签将对应于路由表中的地址前缀。
有许多不同的过程可用于分发标签绑定。有些由下游 LSR 执行,有些由上游 LSR 执行。
下游 LSR 必须执行:
– 分发程序,以及
– 退出程序。
上游 LSR 必须执行:
– 请求程序,以及
– NotAvailable 程序,以及
– 释放程序,以及
– 标签使用程序。
MPLS 体系结构支持每个过程的多个变体。
然而,MPLS 架构并不支持所有可能变体的所有可能组合。支持的组合集将在第 5.2 节中描述,其中还将讨论不同组合之间的互操作性。
下游 LSR 使用分发程序来确定何时应将特定地址前缀的标签绑定分发给其标签分发对等方。该架构支持四种不同的分发程序。
不考虑使用的特定过程,如果特定地址前缀的标签绑定已由下游 LSR Rd 分发到上游 LSR Ru,并且如果该绑定的属性(如上定义)在任何时候发生变化,则Rd 必须将新属性通知 Ru。
如果一个 LSR 维护到一个特定地址前缀的多条路由,则该 LSR 是否将多个标签绑定到地址前缀(每个路由一个),从而分发多个绑定,这是一个本地问题。
让 Rd 是一个 LSR。假设:
1. X 是 Rd 路由表中的地址前缀
2. Ru 是 Rd 相对于 X 的标签分发节点
每当这些条件成立时,Rd 必须将标签绑定到 X 并将该绑定分发给 Ru。 Rd 负责跟踪它分发给 Ru 的绑定,并确保 Ru 始终拥有这些绑定。
在独立 LSP 控制模式下执行主动下游标签分配的 LSR 将使用此过程。
让 Rd 是一个 LSR。假设:
1. X 是 Rd 路由表中的地址前缀
2. Ru 是 Rd 相对于 X 的标签分发节点
3. Rd 是 X 的 LSP 出口或 LSP 代理出口,或者 Rd 的 X 的 L3 下一跳是 Rn,其中 Rn 与 Ru 不同,并且 Rn 已将标签绑定到 X 并将该绑定分发到 Rd。
然后,一旦这些条件都成立,Rd 应该将标签绑定到 X 并将该绑定分发给 Ru。
PushUnconditional 会为路由表中的所有地址前缀分配标签绑定,而 PushConditional 只会为那些已经从自己的 LSP 下一跳接收到标签绑定的地址前缀分配标签绑定,或者为那些地址前缀分配标签绑定。支持 MPLS 的 L3 下一跳。
该过程将由在有序 LSP 控制模式下执行主动下游标签分配的 LSR 使用。
让 Rd 是一个 LSR。假设:
1. X 是 Rd 路由表中的地址前缀
2. Ru 是 Rd 相对于 X 的标签分发节点
3. Ru 明确要求 Rd 将标签绑定到 X 并将绑定分发给 Ru
然后 Rd 应该将标签绑定到 X 并将该绑定分发给 Ru。请注意,如果 X 不在 Rd 的路由表中,或者如果 Rd 不是 Ru 相对于 X 的标签分发对等体,则 Rd 必须通知 Ru 它此时无法提供绑定。
如果 Rd 已经向 Ru 分发了地址前缀 X 的绑定,并且它收到来自 Ru 的新的地址前缀 X 绑定请求,它将绑定第二个标签,并将新的绑定分发给 Ru。第一个标签绑定仍然有效。
该过程将由使用独立 LSP 控制模式执行下游按需标签分发的 LSR 使用。
让 Rd 是一个 LSR。假设:
1. X 是 Rd 路由表中的地址前缀
2. Ru 是 Rd 相对于 X 的标签分发节点
3. Ru 明确要求 Rd 将标签绑定到 X 并将绑定分发给 Ru
4. Rd 是 X 的 LSP 出口或 LSP 代理出口,或者 Rd 的 X 的 L3 下一跳是 Rn,其中 Rn 与 Ru 不同,并且 Rn 已将标签绑定到 X 并将该绑定分发到 Rd
然后,一旦这些条件都成立,Rd 应该将标签绑定到 X 并将该绑定分发给 Ru。请注意,如果 X 不在 Rd 的路由表中,并且无法通过 Rd 的 X 下一跳获得 X 的绑定,或者如果 Rd 不是 Ru 相对于 X 的标签分发对等体,则 Rd 必须通知 Ru 它不能提供此时的绑定。
但是,如果唯一不成立的条件是 Rn 尚未向 Rd 提供标签,则 Rd 必须推迟对 Ru 的任何响应,直到它收到来自 Rn 的绑定。
如果 Rd 已将地址前缀 X 的标签绑定分发给 Ru,并且在稍后某个时间,标签绑定的任何属性发生更改,则 Rd 必须使用新属性将标签绑定重新分发给 Ru。即使 Ru 没有发出新的请求,它也必须这样做。
在有序 LSP 控制模式下执行下游按需标签分配的 LSR 将使用此过程。
在 5.2 节中,我们将讨论如何选择在任何给定时间使用的特定程序,以及如何确保选择不同程序的 LSR 之间的互操作性。
请求过程由上游 LSR 用于地址前缀,以确定何时明确请求下游 LSR 将标签绑定到该前缀并分发绑定。可以使用三种可能的程序。
永远不要提出要求。如果下游 LSR 使用 PushConditional 过程或 PushUnconditional 过程,这很有用,但如果下游 LSR 使用 PulledUnconditional 过程或 PulledConditional 过程,则这很有用。
当使用未经请求的下游标签分发和自由标签保留模式时,LSR 将使用此过程。
每当 L3 下一跳到地址前缀发生变化时,或者在获知新的地址前缀时发出请求,并且对于给定的地址前缀还没有来自该下一跳的标签绑定。
每当使用保守标签保留模式时,LSR 都会使用此程序。
除了在需要时发出请求(如第 5.1.2.2 节所述)之外,每当收到请求时发出请求。如果 Ru 不能作为 LSP 入口,它可能只有在收到来自上游的请求时才会发出请求。
如果 Rd 从 Ru 收到这样的请求,对于 Rd 已经为 Ru 分发了一个标签的地址前缀,Rd 应分配一个新的(不同的)标签,将其绑定到 X,并分发该绑定。 (Rd 是否可以立即将此绑定分发给 Ru 取决于所使用的分发程序。)
该过程将由正在执行下游按需标签分发但不进行标签合并的 LSR 使用,例如,不能进行 VC 合并的 ATM-LSR。
如果Ru和Rd分别是地址前缀X的上下游标签分发对等体,Rd是Ru对X的L3下一跳,Ru向Rd请求绑定X,但Rd回复此时不能提供绑定,因为它没有 X 的下一跳,所以 NotAvailable 过程决定了 Ru 如何响应。有两种可能的程序控制 Ru 的行为:
Ru 应该稍后再次发出请求。也就是说,请求者负责稍后重试以获取所需的绑定。当使用下游按需标签分发时,将使用此过程。
Ru 永远不应该重新发出请求,而是假设 Rd 将在可用时自动提供绑定。如果 Rd 使用 PushUnconditional 过程或 PushConditional 过程,即,如果使用未经请求的下游标签分发,这将很有用。
注意,如果 Rd 回复说它不能提供对 Ru 的绑定,是因为某些错误条件,而不是因为 Rd 没有下一跳,Ru 的行为将由标签分发协议的错误恢复条件控制,而不是由NotAvailable 程序。
假设 Rd 是一个 LSR,它已将标签绑定到地址前缀 X,并将该绑定分发给 LSR Ru。如果 Rd 不是 Ru 的地址前缀 X 的 L3 下一跳,或者已经不再是 Ru 的地址前缀 X 的 L3 下一跳,那么 Ru 将不会使用该标签。释放程序决定了 Ru 在这种情况下的行为。有两种可能的程序控制 Ru 的行为:
Ru 应该释放绑定,并通知 Rd 它已经这样做了。此过程将用于实施保守标签保留模式。
Ru 应该保持绑定,这样如果 Rd 稍后成为 Ru 的 X 的 L3 下一跳,它可以立即再次使用它。此过程将用于实现自由标签保留模式。
假设 Ru 是一个 LSR,它从 LSR Rd 收到了地址前缀 X 的标签绑定 L,并且 Ru 是 Rd 相对于 X 的上游,实际上 Rd 是 Ru 的 X 的 L3 下一跳。
如果 Rd 是 Ru 的 X 的 L3 下一跳,Ru 将使用绑定。如果在 Ru 接收到绑定时,Rd 不是 Ru 的 X 的 L3 下一跳,则 Ru 不使用该绑定时间。但是,如果 Rd 成为 Ru 的 X 的 L3 下一跳,则 Ru 可能会在稍后的某个时间开始使用绑定。
labelUse 过程决定了 Ru 如何使用 Rd 的绑定。
Ru可以使用两种程序:
Ru 可以立即使用绑定。在任何时候,当 Ru 与来自 Rd 的 X 绑定,并且 Rd 是 Ru 的 X 的 L3 下一跳时,Rd 也将是 Ru 的 X 的 LSP 下一跳。当不使用环路检测时使用此过程。
此过程与 UseImmediate 相同,除非 Ru 检测到 LSP 中存在环路。如果检测到环路,Ru 将停止使用标签 L 将数据包转发到 Rd。
在使用环路检测时使用此过程。
这将一直持续到 X 的下一跳发生变化,或者直到不再检测到环路。
在这种情况下,只有一个过程。
当 LSR Rd 决定打破标签 L 和地址前缀 X 之间的绑定时,那么这个解除绑定必须被分发到绑定被分发到的所有 LSR。
在 Rd 将 L 与任何其他地址前缀 Y 的任何新绑定分发给 Ru 之前,要求 Rd 将 L 从 X 的解除绑定分发到 LSR Ru,其中 X != Y。如果 Ru 知道新绑定在得知 L 与 X 解除绑定之前,L 到 Y,如果同时匹配 X 和 Y 的数据包被 Ru 转发到 Rd,那么在一段时间内,Ru 会将匹配 X 的数据包和匹配 Y 的数据包标记为标签L。
标签绑定的分发和撤销是通过标签分发协议完成的。所有标签分发协议都要求在两个标签分发对等体(隐式对等体除外)之间建立标签分发邻接。如果 LSR R1 与 LSR R2 有标签分配邻接,并且已经通过该邻接从 LSR R2 接收到标签绑定,那么如果邻接被任一对等方关闭(无论是由于故障还是正常操作),所有通过该邻接收到的绑定必须被视为已被撤消。
只要相关的标签分配邻接仍然存在,被撤回的标签绑定必须始终明确撤回。如果第二个标签绑定一个地址前缀,结果不是隐式撤回第一个标签,而是绑定两个标签;这是支持多路径路由所必需的。如果第二个地址前缀绑定到一个标签,结果不是隐式撤消该标签与第一个地址前缀的绑定,而是将该标签用于两个地址前缀。
考虑两个 LSR,Ru 和 Rd,它们是关于某些地址前缀集的标签分发对等体,其中 Ru 是上游对等体,Rd 是下游对等体。
管理Ru和Rd交互的MPLS方案可以描述为五组过程:<分发过程、请求过程、不可用过程、释放过程、标签使用过程>。 (因为只有一个提款程序,所以不必提及。)出现在其中一个位置的“*”是一个通配符,表示该类别中的任何程序都可能存在;出现在特定位置的“N/A”表示不需要该类别中的程序。
MPLS 体系结构仅支持以下指定的 MPLS 方案。如果显示需要它们,将来可能会添加其他方案。
如果Ru和Rd是标签分发对等体,并且都支持标签合并,则必须采用以下方案之一:
1. <PushUnconditional、RequestNever、N/A、NoReleaseOnChange、UseImmediate>
这是具有独立控制、自由标签保留模式和无环路检测的主动下游标签分发。
2. <PushUnconditional、RequestNever、N/A、NoReleaseOnChange、UseIfLoopNotDetected>
这是具有独立控制、自由标签保留和环路检测的主动下游标签分发。
3. <PushConditional, RequestWhenNeeded, RequestNoRetry, ReleaseOnChange, *>
这是主动提供的下游标签分发,具有有序控制(从出口)和保守的标签保留模式。环路检测是可选的。
4. <PushConditional, RequestNever, N/A, NoReleaseOnChange, *>
这是主动提供的下游标签分发,具有有序控制(从出口)和自由标签保留模式。环路检测是可选的。
5. <PulledConditional, RequestWhenNeeded, RequestRetry, ReleaseOnChange, *>
这是下游按需标签分发,具有有序控制(由入口启动)、保守的标签保留模式和可选的环路检测。
6. <PulledUnconditional、RequestWhenNeeded、N/A、ReleaseOnChange、UseImmediate>
这是下游按需标签分发,具有独立控制和保守的标签保留模式,没有环路检测。
7. <PulledUnconditional、RequestWhenNeeded、N/A、ReleaseOnChange、UseIfLoopNotDetected>
这是具有独立控制和保守标签保留模式的下游按需标签分发,具有环路检测。
假设R1、R2、R3和R4是ATM交换机,不支持标签合并,但作为LSR使用。进一步假设地址前缀 X 的 L3 逐跳路径是 <R1, R2, R3, R4>,并且目的地为 X 的数据包可以从这些 LSR 中的任何一个进入网络。由于没有多点对点的能力,LSP必须实现为点对点的VC,这意味着地址前缀X需要三个这样的VC:<R1, R2, R3, R4>, < R2、R3、R4> 和 <R3、R4>。
因此,如果 R1 和 R2 是 MPLS 对等体,并且是使用传统 ATM 交换硬件(即没有信元交织抑制)实现的 LSR,或者不能执行标签合并,则 R1 和 R2 之间使用的 MPLS 方案必须是以下之一:
1. <PulledConditional, RequestOnRequest, RequestRetry, ReleaseOnChange, *>
这是下游按需标签分发,具有有序控制(由入口启动)、保守的标签保留模式和可选的环路检测。
RequestOnRequest 过程的使用将导致 R4 将 X 的三个标签分发给 R3; R3 将 X 的 2 个标签分发给 R2,R2 将 X 的一个标签分发给 R1。
2. <PulledUnconditional、RequestOnRequest、N/A、ReleaseOnChange、UseImmediate>
这是下游按需标签分发,具有独立控制和保守的标签保留模式,没有环路检测。
3. <PulledUnconditional、RequestOnRequest、N/A、ReleaseOnChange、UseIfLoopNotDetected>
这是具有独立控制和保守标签保留模式的下游按需标签分发,具有环路检测。
很容易看出某些五元组不会产生可行的 MPLS 方案。例如:
- <PulledUnconditional, RequestNever, *, *, *>
<PulledConditional, RequestNever, *, *, *>
在这些 MPLS 方案中,下游 LSR Rd 仅根据 Ru 的请求向上游 LSR Ru 分发标签绑定,但 Ru 从未发出任何此类请求。显然,这些方案是不可行的,因为它们不会导致标签绑定的正确分布。
- <*, RequestNever, *, *, ReleaseOnChange>
在这些 MPLS 方案中,Rd 在不使用绑定时释放绑定,但它永远不会再次请求它们,即使它以后需要它们。因此,这些方案不能确保标签绑定得到正确分布。
在本节中,我们指定规则以防止一对标签分发对等体采用导致不可行 MPLS 方案的程序。这些规则需要在标签分发邻接的初始化期间在标签分发对等方之间交换信息,或者需要信息的先验知识(通过本文档范围之外的方式获得)。
1. 每个都必须说明是否支持标签合并。
2. 如果Rd不支持标签合并,Rd必须选择PulledUnconditional过程或PulledConditional过程。如果 Rd 选择 PulledConditional,则 Ru 将被迫使用 RequestRetry 过程。
即如果下游LSR不支持标签合并,则在选择MPLS方案时优先考虑其优先级。
3. 如果 Ru 不支持标签合并,但 Rd 支持,Ru 必须选择 RequestRetry 或 RequestNoRetry 过程。这会强制 Rd 分别使用 PulledConditional 或 PulledUnConditional 过程。
也就是说,如果只有一个 LSR 不支持标签合并,则在选择 MPLS 方案时,其偏好优先。
4. 如果Ru和Rd都支持标签合并,那么自由和保守标签保留模式的选择属于Ru。也就是说,Ru 可以选择使用 RequestWhenNeeded/ReleaseOnChange(保守),或使用 RequestNever/NoReleaseOnChange(自由)。但是,“推”与“拉”和“有条件”与“无条件”的选择属于Rd。如果 Ru 选择自由标签保留模式,Rd 可以选择 PushUnconditional 或 PushConditional。如果 Ru 选择保守的标签保留模式,Rd 可以选择 PushConditional、PulledConditional 或 PulledUnconditional。
这些选择共同决定了使用的 MPLS 方案。
一些路由器可能实现的安全程序依赖于相对于数据链路层头部位于固定位置的网络层头部。 MPLS 通用封装在数据链路层报文头和网络层报文头之间插入了一个 shim。这可能会导致任何此类安全程序失败。
MPLS 标签的含义取决于将标签放入标签堆栈的 LSR(“标签编写器”)和解释该标签的 LSR(“标签阅读器”)之间的协议。如果从不受信任的来源接受了带标签的数据包,或者如果某个特定的传入标签从该标签尚未分发到的 LSR 中被接受,则数据包可能会以非法方式路由。
IETF 已获知与本文档中包含的部分或全部规范相关的知识产权。有关更多信息,请参阅已声明权利的在线列表。
["MPLS using LDP and ATM VC Switching", RFC 3035, January 2001. ] Davie, B., Lawrence, J., McCloghrie, K., Rekhter, Y., Rosen, E., Swallow, G. and P. Doolan,
["Carrying Label Information in BGP-4", Rekhter, Rosen, Work in Progress. ]
["Constraint-Based LSP Setup using LDP", Jamoussi, Editor, Work in Progress. ]
["Use of Label Switching on Frame Relay Networks Specification", RFC 3034, January 2001. ] Conta, A., Doolan, P. and A. Malis,
["LDP Specification", RFC 3036, January 2001. ] Andersson, L., Doolan, P., Feldman, N., Fredette, A. and B. Thomas,
["Extensions to RSVP for LSP Tunnels", Awduche, Berger, Gan, Li, Swallow, Srinvasan, Work in Progress. ]
["MPLS Label Stack Encoding", RFC 3032, January 2001. ] Rosen, E., Rekhter, Y., Tappan, D., Fedorkow, G., Farinacci, D. and A. Conta,
['Dell, M. and J. McManus, "Requirements for Traffic Engineering Over MPLS", RFC 2702, September 1999. ] Awduche, D., Malcolm, J., Agogbua, J., O
版权所有 (C) 互联网协会 (2001)。版权所有。
本文件及其译文可能会被复制和提供给他人,并且可以全部或部分地准备、复制、出版和分发对其进行评论或以其他方式解释或协助其实施的衍生作品,不受任何限制,前提是上述版权声明和本段包含在所有此类副本和衍生作品中。但是,不得以任何方式修改本文档本身,例如通过删除版权声明或对 Internet 协会或其他 Internet 组织的引用,除非出于制定 Internet 标准的需要,在这种情况下,版权程序定义在必须遵循 Internet 标准流程,或按照要求将其翻译成英语以外的语言。
上述授予的有限权限是永久性的,不会被互联网协会或其继任者或受让人撤销。
本文档和其中包含的信息按“原样”提供,互联网协会和互联网工程工作队不提供所有明示或暗示的保证,包括但不限于任何保证,即使用此处的信息不会侵犯任何有关适销性或特定用途适用性的权利或任何默示保证。