MPLS 标签栈编码

简介: “多协议标签交换 (MPLS)”[1] 需要一组程序来用“标签栈”来扩充网络层数据包,从而将它们变成“有标签的数据包”。支持 MPLS 的路由器称为“标签交换路由器”或“LSR”。为了在特定数据链路上传输带标签的数据包,LSR 必须支持一种编码技术,在给定标签堆栈和网络层数据包的情况下,该技术会生成带标签的数据包。

640.gif


RFC3032:MPLS Label Stack Encoding,January 2001


本备忘录的状态


本文档为 Internet 社区指定了 Internet 标准跟踪协议,并请求讨论和改进建议。本协议的标准化状态和现状请参考当前版本的《互联网官方协议标准》(STD 1)。本备忘录的分发不受限制。


版权声明


版权所有 (C) 互联网协会 (2001)。版权所有。


梗概


多协议标签交换 (Multi-Protocol Label Switching,MPLS)”[1] 需要一组程序用“标签栈”来扩充网络层数据包,从而将它们变成“有标签的数据包”。支持 MPLS 的路由器称为“标签交换路由器”或“LSR”。为了在特定数据链路上传输带标签的数据包,LSR 必须支持一种编码技术,在给定标签堆栈和网络层数据包的情况下,该技术会生成带标签的数据包。本文档规定了 LSR 使用的编码,以便在点对点协议 (Point-to-Point Protocol,PPP) 数据链路、LAN 数据链路以及可能的其他数据链路上传输带标签的数据包。在某些数据链路上,堆栈顶部的标签可能以不同的方式编码,但必须使用此处描述的技术对标签堆栈的其余部分进行编码。该文件还规定了处理标签栈编码的各个字段的规则和程序。


1、 介绍


“多协议标签交换 (MPLS)”[1] 需要一组程序来用“标签栈”来扩充网络层数据包,从而将它们变成“有标签的数据包”。支持 MPLS 的路由器称为“标签交换路由器”或“LSR”。为了在特定数据链路上传输带标签的数据包,LSR 必须支持一种编码技术,在给定标签堆栈和网络层数据包的情况下,该技术会生成带标签的数据包。


本文档规定了 LSR 使用的编码,以便在 PPP 数据链路和 LAN 数据链路上传输带标签的数据包。指定的编码也可能对其他数据链接有用。


该文件还规定了处理标签栈编码的各个字段的规则和程序。由于 MPLS 独立于任何特定的网络层协议,因此大多数此类过程也是独立于协议的。但是,对于不同的协议,有一些确实有所不同。在本文档中,我们指定了与协议无关的过程,并为 IPv4 和 IPv6 指定了与协议相关的过程。


在某些交换设备(例如 ATM 交换机)上实现的 LSR 可能使用不同的编码技术对标签堆栈的顶部一两个条目进行编码。然而,当标签堆栈有附加条目时,必须将本文档中描述的编码技术用于附加标签堆栈条目。


1.1、 需求说明


本文档中的关键词“必须”、“不得”、“需要”、“应该”、“不应”、“应该”、“不应该”、“推荐”、“可以”和“可选”是按照 RFC 2119 [2] 中的描述进行解释。


2、 标签栈


2.1、 编码标签栈


标签堆栈表示为“标签堆栈条目”的序列。每个标签堆栈条目由 4 个八位字节表示。如图 1 所示。


640.png

图1

Label: Label Value,标签值,20位
Exp: Experimental Use,实验使用,3位
S: Bottom of Stack,堆栈底部,1位
TTL: Time to Live,生存时间,8位


标签栈条目出现在数据链路层报文头之后,但在任何网络层报文头之前。在数据包中标签栈的顶部出现最早,底部出现最晚。网络层数据包紧跟在设置了 S 位的标签堆栈条目之后。


每个标签堆栈条目分为以下字段:


1. 堆栈底部 (S)


对于标签堆栈中的最后一个条目(即堆栈底部),该位设置为 1,对于所有其他标签堆栈条目,该位设置为 0。


2. 生存时间 (TTL)


该八位字段用于对生存时间值进行编码。该字段的处理在 2.4 节中描述。


3. 实验使用


该三位字段保留供实验使用。


4. 标签值


这个 20 位字段携带标签的实际值。


当接收到一个带标签的数据包时,会查找栈顶的标签值。成功查找的结果是:


a) 数据包要转发到的下一跳;


b) 转发前要对标签栈进行的操作;该操作可以是用另一个替换顶部标签堆栈条目,或者从标签堆栈弹出一个条目,或者替换顶部标签堆栈条目然后将一个或多个附加条目推送到标签堆栈上。


除了学习下一跳和标签堆栈操作外,还可以学习出站数据链路封装,以及可能需要的其他信息,以便正确转发数据包。


有几个保留的标签值:


i. 值 0 表示“IPv4 显式空标签”。此标签值仅在标签堆栈的底部是合法的。它表示必须弹出标签栈,然后数据包的转发必须基于 IPv4 头。


ii. 值 1 表示“路由器警报标签”。此标签值在标签堆栈中的任何位置都是合法的,底部除外。当接收到的数据包在标签栈顶部包含该标签值时,将其传递给本地软件模块进行处理。数据包的实际转发由堆栈中它下面的标签决定。但是,如果数据包被进一步转发,路由器警报标签应该在转发之前被推回到标签堆栈上。此标签的使用类似于 IP 数据包中“路由器警报选项”的使用 [5]。由于此标签不能出现在堆栈底部,因此它与特定的网络层协议无关。


iii. 值 2 表示“IPv6 显式空标签”。此标签值仅在标签堆栈的底部是合法的。它表示必须弹出标签堆栈,然后数据包的转发必须基于 IPv6 头。


iv. 值 3 表示“隐式 NULL 标签”。这是一个 LSR 可以分配和分发的标签,但实际上从未出现在封装中。当 LSR 以其他方式用新标签替换堆栈顶部的标签,但新标签是“隐式 NULL”时,LSR 将弹出堆栈而不是进行替换。虽然这个值可能永远不会出现在封装中,但需要在标签分发协议中指定,所以保留了一个值。


v. 保留值 4-15。


2.2、 确定网络层协议


当最后一个标签从数据包的标签栈中弹出时(导致栈被清空),对数据包的进一步处理将基于数据包的网络层报文头。因此,从堆栈中弹出最后一个标签的 LSR 必须能够识别数据包的网络层协议。然而,标签栈不包含任何明确标识网络层协议的字段。这意味着网络层协议的身份必须可以从从堆栈底部弹出的标签值中推断出来,可能还有网络层报文头本身的内容。


因此,当第一个标签被推送到网络层数据包时,标签必须是仅用于特定网络层的数据包的标签,或者必须是仅用于特定网络层协议集的标签,其中指定网络层的数据包可以通过检查网络层头来区分。此外,每当在数据包传输期间该标签被另一个标签值替换时,新值也必须是满足相同标准的值。如果不满足这些条件,则从数据包中弹出最后一个标签的 LSR 将无法识别数据包的网络层协议。


遵守这些条件并不一定能使中间节点识别数据包的网络层协议。在普通条件下,这不是必需的,但在某些错误条件下是可取的。例如,如果中间 LSR 确定标记的数据包无法传递,则该 LSR 可能需要生成特定于数据包网络层的错误消息。中间 LSR 识别网络层的唯一方法是检查顶部标签和网络层报文头。因此,如果中间节点能够为带标签的数据包生成协议特定的错误消息,堆栈中的所有标签必须满足上面针对出现在堆栈底部的标签指定的标准。


如果一个数据包由于某种原因无法转发(例如,它超过了数据链路 MTU),并且无法识别其网络层协议,或者没有指定的协议相关规则来处理错误情况,则该数据包必须默默地丢弃。


2.3、为标记的 IP 数据包生成 ICMP 消息


第 2.4 节和第 3 节讨论了需要为标记的 IP 数据包生成 ICMP 消息的情况。为了使特定 LSR 能够生成 ICMP 数据包并将该数据包发送到 IP 数据包的源,必须满足两个条件:


1. 该 LSR 必须能够确定特定的标记数据包是 IP 数据包;


2. 该 LSR 必须能够路由到数据包的 IP 源地址。


第 2.2 节讨论了条件 1。以下两小节讨论条件 2。但是,在某些情况下,条件 2 根本不成立,并且在这些情况下将无法生成 ICMP 消息。


2.3.1、 通过中转路由域的隧道


假设有人使用 MPLS “隧道”通过一个中转路由域,其中外部路由不会泄漏到域的内部路由器中。例如,内部路由器可能正在运行 OSPF,并且可能只知道如何到达该 OSPF 域内的目的地。该域可能包含多个自治系统边界路由器 (Autonomous System Border Routers,ASBR),它们相互使用 BGP。但是,在这个例子中,来自 BGP 的路由没有分发到 OSPF 中,并且不是 ASBR 的 LSR 不运行 BGP。


在这个例子中,只有 ASBR 知道如何路由到某个任意数据包的源。如果内部路由器需要向 IP 数据包的源发送 ICMP 消息,它将不知道如何路由 ICMP 消息。


一种解决方案是让一个或多个 ASBR 将“默认”注入 IGP。(注意:这不需要 BGP 携带“默认”。)这将确保任何必须离开域的未标记数据包(例如 ICMP 数据包)被发送到具有完整路由信息的路由器。具有完整路由信息的路由器会在数据包通过中转域发回之前对其进行标记,因此在中转域内使用默认路由不会导致任何环路。


该方案仅适用于具有全局唯一地址的报文,以及所有ASBR都具有完整路由信息的网络。下一小节描述了当这些条件不成立时有效的解决方案。


2.3.2、 通过公共主干隧道传输私有地址


在某些使用 MPLS 隧道通过路由域的情况下,可能根本无法路由到分片数据包的源地址。例如,如果数据包中携带的 IP 地址是私有(即,不是全球唯一的)地址,并且 MPLS 被用于通过公共骨干网隧道传输这些数据包,就会出现这种情况。到 ASBR 的默认路由在此环境中不起作用。


在这种环境下,为了向数据包的源发送ICMP消息,可以将原始数据包的标签栈复制到ICMP消息中,然后对ICMP消息进行标签交换。这将导致消息朝着原始数据包的目的地方向而不是其源方向前进。除非消息被标签交换到目标主机,否则它将在知道如何路由到原始数据包源的路由器中以未标记的方式结束,此时消息将以正确的方向发送。


如果 ICMP 消息是“超时”消息或“目标无法到达,因为需要分片和 DF 设置”消息,则此技术非常有用。


将标签栈从原始数据包复制到ICMP消息时,必须准确复制标签值,但标签栈中的TTL值应设置为放置在ICMP消息IP头中的TTL值。此 TTL 值应足够长,以允许 ICMP 消息需要遵循的迂回路由。


请注意,如果数据包的 TTL 到期是由于存在路由环路,那么如果使用此技术,ICMP 消息也可能会环路。由于接收到 ICMP 消息后不会发送 ICMP 消息,并且由于许多实现会限制可以生成 ICMP 消息的速率,因此预计这不会造成问题。


2.4、 处理生存时间字段


2.4.1、 定义


标记数据包的“传入 TTL”定义为接收数据包时顶部标签堆栈条目的 TTL 字段的值。


标记数据包的“传出 TTL”定义为以下较大者:


a) 比传入的 TTL 少 1,


b) 零。


网络异常,图片无法展示
|
2.4.2、 独立于协议的规则


如果标记数据包的输出 TTL 为 0,则标记数据包不得进一步转发;也不能剥离标签堆栈并将数据包作为未标记的数据包转发。数据包在网络中的生命周期被视为已过期。


根据标签栈条目中的标签值,数据包可能会被简单地丢弃,或者它可能会被传递到适当的“普通”网络层进行错误处理(例如,为了生成 ICMP 错误消息,请参阅第 2.3 节) .


当一个带标签的数据包被转发时,标签堆栈顶部的标签堆栈条目的 TTL 字段必须设置为传出的 TTL 值。


请注意,传出 TTL 值仅是传入 TTL 值的函数,与转发前是否推送或弹出任何标签无关。任何不在堆栈顶部的标签堆栈条目中的 TTL 字段的值都没有意义。


2.4.3、 依赖 IP 的规则


我们将“IP TTL”字段定义为 IPv4 TTL 字段的值或 IPv6 Hop Limit 字段的值,以适用者为准。


当 IP 数据包第一次被标记时,标签栈条目的 TTL 字段必须设置为 IP TTL 字段的值。(如果 IP TTL 字段需要递减,作为 IP 处理的一部分,假定这已经完成。)


当一个标签被弹出,结果标签栈是空的,那么 IP TTL 字段的值应该被替换为输出 TTL 值,如上定义。在 IPv4 中,这也需要修改 IP 报文头校验和。


人们认识到,可能存在这样的情况,即网络管理人员在穿越 MPLS 域时更愿意将 IPv4 TTL 递减 1,而不是将 IPv4 TTL 递减域内的 LSP 跳数。


2.4.4、 在不同的封装之间转换


有时,LSR 可能会通过标签交换控制 ATM (label switching controlled ATM,LC-ATM) 接口 [9] 接收带标签的数据包,并且可能需要通过 PPP 或 LAN 链路将其发送出去。那么传入的数据包将不会使用本文档中指定的封装被接收,但传出的数据包将使用本文档中指定的封装发送。


在这种情况下,“传入 TTL”的值由用于在例如 LC-ATM 接口上携带标记数据包的过程确定。TTL 处理然后如上所述进行。


有时,LSR 可能会通过 PPP 或 LAN 链路接收带标签的数据包,并且可能需要将其发送出去,例如,LC-ATM 接口。然后将使用本文档中指定的封装接收传入数据包,但不会使用本文档中指定的封装发送传出数据包。在这种情况下,携带“传出 TTL”值的过程由用于在例如 LC-ATM 接口上携带标记数据包的过程确定。


3、 分片和路径 MTU 发现


正如有可能接收到一个太大而无法在其输出链路上传输的未标记 IP 数据报一样,也有可能接收到一个太大而无法在其输出链路上传输的标记数据包。


由于将一个或多个附加标签推送到其标签堆栈上,因此最初足够小以在该链路上传输的接收分组(标记或未标记)也可能变得太大。在标签交换中,如果推送额外的标签,数据包的大小可能会增加。因此,如果收到一个带有 1500 字节帧有效载荷的标记数据包,并推送一个附加标签,则需要将其作为带有 1504 字节有效载荷的帧转发。


本节规定了处理“过大”标记数据包的规则。特别是,它提供了确保实现路径 MTU 发现 [4] 的主机和使用 IPv6 [7,8] 的主机能够生成不需要分片的 IP 数据报的规则,即使这些数据报在遍历时被标记网络。


通常,未实现路径 MTU 发现 [4] 的 IPv4 主机发送包含不超过 576 个字节的 IP 数据报。由于当今大多数数据链路上使用的 MTU 为 1500 字节或更多,因此此类数据报需要分片的可能性非常小,即使它们被标记。


一些未实现路径 MTU 发现 [4] 的主机将生成包含 1500 字节的 IP 数据报,只要 IP 源地址和目标地址在同一子网上。这些数据报不会通过路由器,因此不会分片。


不幸的是,一些主机会生成包含 1500 字节的 IP 数据报,只要 IP 源地址和目标地址具有相同的有类网络号。这是当此类数据报被标记时存在任何分片风险的一种情况。(即便如此,除非数据包必须在它第一次被标记和未被标记之间穿过某种以太网,否则分片是不可能的。)


本文档规定了允许配置网络的过程,以便来自未实现路径 MTU 发现的主机的大型数据报在第一次被标记时仅被分片一次。这些过程使得(假设合适的配置)可以避免对已经被标记的数据包进行分片的需要。


3.1、 术语


对于特定的数据链接,我们可以使用以下术语:


帧有效载荷/ Frame Payload


数据链路帧的内容,不包括任何数据链路层报文头或报尾(例如,MAC 报文头、LLC 报文头、802.1Q 报文头、PPP 报文头、帧校验序列等)。


当帧承载未标记的 IP 数据报时,帧有效载荷就是 IP 数据报本身。当帧承载带标签的 IP 数据报时,帧有效载荷由标签堆栈条目和 IP 数据报组成。


常规的最大帧有效载荷大小


数据链路标准允许的最大帧有效载荷大小。例如,以太网的常规最大帧有效负载大小为 1500 字节。


真正的最大帧有效载荷大小


连接到数据链路的接口硬件可以正确发送和接收的最大帧有效载荷大小。


在以太网和 802.3 网络上,我们认为真正的最大帧有效载荷大小比传统的最大帧有效载荷大小大 4-8 个字节(只要不存在 802.1Q 标头和 802.1p 标头,并且只要当数据包正在传输到其下一跳时,交换机或网桥都不能添加它们)。例如,相信大多数以太网设备都可以正确发送和接收承载 1504 或者 1508 字节有效载荷的数据包,只要以太网标头没有 802.1Q 或 802.1p 字段。


在 PPP 链路上,真正的最大帧有效载荷大小实际上可能是无限的。


标记数据包的有效最大帧有效载荷大小


这是常规最大帧有效载荷大小或真实最大帧有效载荷大小,取决于数据链路上设备的能力和所使用的数据链路头的大小。


最初标记的 IP 数据报


假设在特定 LSR 接收到一个未标记的 IP 数据报,并且该 LSR 在转发数据报之前推送一个标签。这样的数据报将在该 LSR 上称为初始标记的 IP 数据报。


先前标记的 IP 数据报


在被特定 LSR 接收之前已经被标记的 IP 数据报。


3.2、 最大初始标记 IP 数据报大小


每个LSR有以下能力


a) 接收未标记的 IP 数据报,

b) 向数据报添加标签栈,以及

c) 转发生成的标记数据包


应该支持称为“最大初始标记 IP 数据报大小”的配置参数,该参数可以设置为非负值。


如果此配置参数设置为零,则不起作用。


如果设置为正值,则按以下方式使用。如果:


a) 收到未标记的 IP 数据报,并且

b) 该数据报在其 IP 报文头中没有设置 DF 位,并且

c) 该数据报需要在转发前进行标记,以及

d) 数据报的大小(标记前)超过了参数的值。



a) 数据报必须被分成多个分片,每个分片的大小不大于参数的值,并且

b) 每个分片必须被标记然后转发。


例如,如果此配置参数的值设置为 1488,则任何包含超过 1488 字节的未标记 IP 数据报将在标记之前被分片。每个分片都能够在 1500 字节的数据链路上承载,无需进一步分片,即使多达三个标签被推入其标签堆栈。


换句话说,将此参数设置为非零值可以消除先前标记的 IP 数据报的所有分片,但可能会导致初始标记的 IP 数据报的一些不必要的分片。


注意这个参数的设置不会影响设置了DF位的IP数据报的处理;因此Path MTU 发现的结果不受此参数设置的影响。


3.3、 何时标记 IP 数据报太大?


一个标记的 IP 数据报,其大小超过了要转发它的数据链路的常规最大帧有效载荷大小,可能会被认为是“太大”。


大小超过要转发的数据链路的真实最大帧有效载荷大小的标记 IP 数据报必须被视为“太大”。


一个不是“太大”的带标签的 IP 数据报必须在没有分片的情况下传输。


3.4、 处理过大的标记 IPv4 数据报


如果标记的 IPv4 数据报“太大”,并且其 IP 报文头中未设置 DF 位,则 LSR 可以默默地丢弃该数据报。


请注意,仅当网络中每个能够向未标记 IP 数据报添加标签堆栈的 LSR 中的“最大初始标记 IP 数据报大小”设置为非零值时,丢弃此类数据报才是明智的处理。


如果 LSR 选择不丢弃过大的标记 IPv4 数据报,或者如果在该数据报中设置了 DF 位,则它必须执行以下算法:


1. 剥去标签栈条目,得到IP数据报。

2. 令 N 为标签栈中的字节数(即标签栈条目数的 4 倍)。

3. 如果 IP 数据报在其 IP 报文头中没有设置“Don't Fragment”位:


A. 将其转换为分片,每个分片必须至少比有效最大帧有效载荷大小小 N 个字节。

B. 如果不需要分片,则在每个分片前加上原始数据报上的相同标签标头。

C. 转发分片


4. 如果 IP 数据报在其 IP 报文头中设置了“Don't Fragment”位:


A. 不得转发数据报

B. 创建 ICMP 目标不可达消息:


i. 将其代码字段 [3] 设置为“需要分片和 DF 集”,

ii. 将其 Next-Hop MTU 字段 [4] 设置为 Effective Maximum Frame Payload Size 与 N 值之间的差值


C. 如果可能,将 ICMP Destination Unreachable Message 发送到丢弃数据报的源。


3.5、 处理过大的标记 IPv6 数据报


要处理过大的带标签的 IPv6 数据报,LSR 必须执行以下算法:


1. 剥去标签栈条目,得到IP数据报。

2. 令 N 为标签栈中的字节数(即标签栈条目数的 4 倍)。

3. 如果 IP 数据报包含超过 1280 个字节(不包括标签堆栈条目),或者如果它不包含分片头,则:


A. 创建一个ICMP Packet Too Big Message,并将其Next-Hop MTU字段设置为Effective Maximum Frame Payload Size与N的值之差


B. 如果可能,将 ICMP Packet Too Big Message 传输到数据报的源。


C. 丢弃标记的 IPv6 数据报。


4. 如果 IP 数据报不大于 1280 个八位字节,并且它包含一个分片头,则


A. 将其转换为分片,每个分片必须至少比有效最大帧有效载荷大小小 N 个字节。

B. 如果不需要分片,则在每个分片前加上原始数据报上的相同标签标头。

C. 转发分片。


分片的重新组装将在目标主机上完成。


3.6、 对路径 MTU 发现的影响


上述用于处理设置了 DF 位但“太大”的数据报的程序对 RFC 1191 [4] 的路径 MTU 发现程序有影响。实现这些过程的主机将发现一个 MTU,它足够小以允许在数据报上推送 n 个标签,而无需分片,其中 n 是沿当前使用的路径实际推送的标签数量。


换句话说,来自使用路径 MTU 发现的主机的数据报将永远不需要由于需要放置标签头或向现有标签头添加新标签而被分片。(此外,来自使用路径 MTU 发现的主机的数据报通常设置了 DF 位,因此无论如何都不会分片。)


请注意,路径 MTU 发现仅在需要发生标记的 IP 数据报分片的点上才能正常工作,有可能导致 ICMP 目标不可达消息被路由到数据包的源地址。见第 2.3 节。


如果无法将来自 MPLS“隧道”内的 ICMP 消息转发到数据包的源地址,但网络配置使隧道发送端的 LSR 可以接收必须通过隧道的数据包,但是太大而无法完整地穿过隧道,那么:


- 隧道发送端的 LSR 必须能够从整体上确定隧道的 MTU。它可以通过将数据包通过隧道发送到隧道的接收端点,并使用这些数据包执行路径 MTU 发现来做到这一点。


- 任何时候隧道的发送端点需要将数据包发送到隧道中,并且该数据包设置了 DF 位,并且超过了隧道 MTU,隧道的发送端点必须向源发送 ICMP Destination Unreachable 消息, 代码为“Fragmentation Required and DF Set”,下一跳 MTU 字段设置如上所述。


4、 通过 PPP 传输带标签的数据包


点对点协议 (PPP) [6] 提供了一种通过点对点链路传输多协议数据报的标准方法。PPP 定义了一个可扩展的链路控制协议,并提出了一系列用于建立和配置不同网络层协议的网络控制协议。


本节定义了用于建立和配置基于 PPP 的标签交换的网络控制协议。


4.1、 介绍


PPP 具有三个主要组成部分:


1. 一种封装多协议数据报的方法。

2. 用于建立、配置和测试数据链路连接的链路控制协议 (Link Control Protocol,LCP)。

3. 用于建立和配置不同网络层协议的一系列网络控制协议。


为了在点对点链路上建立通信,PPP 链路的每一端必须首先发送 LCP 数据包来配置和测试数据链路。在建立链路并根据 LCP 的需要协商可选设施后,PPP 必须发送“MPLS 控制协议”数据包以启用标记数据包的传输。一旦“MPLS 控制协议”达到 Opened 状态,就可以通过链路发送带标签的数据包。


链路将保持通信配置,直到明确的 LCP 或 MPLS 控制协议数据包关闭链路,或者直到发生某些外部事件(不活动计时器到期或网络管理员干预)。


4.2、 MPLS 的 PPP 网络控制协议


MPLS 控制协议 (MPLS Control Protocol,MPLSCP) 负责在 PPP 链路上启用和禁用标签交换的使用。它使用与链路控制协议 (LCP) 相同的数据包交换机制。在 PPP 到达网络层协议阶段之前,可能不会交换 MPLSCP 数据包。在达到此阶段之前收到的 MPLSCP 数据包应该被静默丢弃。


MPLS 控制协议与链路控制协议 [6] 完全相同,但有以下例外:


1. 框架修改


数据包可以利用对在链路建立阶段协商的基本帧格式的任何修改。


2. 数据链路层协议字段


PPP信息字段中封装了一个MPLSCP报文,PPP协议字段表示类型为16进制8281(MPLS)


3. 代码字段


仅使用代码 1 到 7(配置请求、配置确认、配置拒绝、配置拒绝、终止请求、终止确认和代码拒绝)。其他代码应被视为无法识别,并应导致代码拒绝。


4. 超时


在 PPP 到达网络层协议阶段之前,可能不会交换 MPLSCP 数据包。实现应准备好等待身份验证和链路质量确定完成,然后等待配置确认或其他响应超时。建议实现仅在用户干预或可配置的时间后放弃。


5. 配置选项类型


没有。


4.3、 发送带标签的数据包


在任何标记的数据包可以进行通信之前,PPP 必须达到网络层协议阶段,并且 MPLS 控制协议必须达到开放状态。


PPP 信息字段中封装了一个带标签的数据包,其中 PPP 协议字段指示类型 hex 0281(MPLS 单播)或类型 hex 0283(MPLS 组播)。PPP 链路上传输的标记报文的最大长度与PPP 封装报文的Information 字段的最大长度相同。


信息字段本身的格式如第 2 节中所定义。


请注意,为标记数据包定义了两个代码点;一种用于组播,一种用于单播。一旦 MPLSCP 达到 Opened 状态,标签交换组播和标签交换单播都可以通过 PPP 链路发送。


4.4、 标签交换控制协议配置选项


没有配置选项。


5、 在 LAN 媒体上传输带标签的数据包


每帧中只携带一个带标签的数据包。


标签栈条目紧跟在网络层报文头之前,并在任何数据链路层报文头之后,包括例如可能存在的任何 802.1Q 报文头。


ethertype 值 8847 hex 用于指示帧携带 MPLS 单播数据包。


ethertype 值 8848 hex 用于指示帧携带 MPLS 组播数据包。


这些 ethertype 值可与以太网封装或 802.3 LLC/SNAP 封装一起使用,以承载标记数据包。选择使用这两种封装中的哪一种的过程超出了本文档的范围。


6、 IANA 考虑


标签值 0-15 具有特殊含义,如本文档中所述,或由 IANA 进一步分配。


在本文档中,标签值 0-3 在第 2.1 节中指定。


标签值 4-15 可由 IANA 根据 IETF 共识分配。


7、 安全考虑


此处指定的 MPLS 封装不会引起 MPLS 体系结构 [1] 或封装中包含的网络层协议体系结构中尚未存在的任何安全问题。


有两个从 MPLS 架构继承而来的安全注意事项,可以在此处指出:


- 一些路由器可能实现的安全程序依赖于相对于数据链路层头部位于固定位置的网络层头部。当使用 MPLS 封装时,这些过程将不起作用,因为该封装的大小可变。


- MPLS 标签的含义取决于将标签放入标签堆栈的 LSR(“标签编写器”)和解释该标签的 LSR(“标签阅读器”)之间的协议。但是,标签堆栈不提供任何方法来确定任何特定标签的标签编写者是谁。如果从不受信任的来源接受带标签的数据包,结果可能是数据包以非法方式路由。


8、 知识产权

IETF 已获知与本文档中包含的部分或全部规范相关的知识产权。有关更多信息,请参阅已声明权利的在线列表。


9、 参考文献

[1] Rosen, E., Viswanathan, A., and R. Callon, "Multiprotocol Label Switching Architecture", RFC 3031, January 2001.
[2] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
[3] Postel, J., "Internet Control Message Protocol", STD 5, RFC 792, September 1981.
[4] Mogul, J. and S. Deering, "Path MTU Discovery", RFC 1191, November 1990.
[5] Katz, D., "IP Router Alert Option", RFC 2113, February 1997.
[6] Simpson, W., Editor, "The Point-to-Point Protocol (PPP)", STD 51, RFC 1661, July 1994.
[7] Conta, A. and S. Deering, "Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification", RFC 1885, December 1995.
[8] McCann, J., Deering, S. and J. Mogul, "Path MTU Discovery for IP version 6", RFC 1981, August 1996.
[9] Davie, B., Lawrence, J., McCloghrie, K., Rekhter, Y., Rosen, E. and G. Swallow, "MPLS Using LDP and ATM VC Switching", RFC 3035, January 2001.


10、 完整版权声明


版权所有 (C) 互联网协会 (2001)。版权所有。


本文件及其译文可能会被复制和提供给他人,并且可以全部或部分地准备、复制、出版和分发对其进行评论或以其他方式解释或协助其实施的衍生作品,不受任何限制,前提是上述版权声明和本段包含在所有此类副本和衍生作品中。但是,不得以任何方式修改本文档本身,例如通过删除版权声明或对 Internet 协会或其他 Internet 组织的引用,除非出于制定 Internet 标准的需要,在这种情况下,版权程序定义在必须遵循 Internet 标准流程,或按照要求将其翻译成英语以外的语言。


上述授予的有限权限是永久性的,不会被互联网协会或其继任者或受让人撤销。


本文档和其中包含的信息按“原样”提供,互联网协会和互联网工程工作队不提供所有明示或暗示的保证,包括但不限于任何保证,即使用此处的信息不会侵犯任何有关适销性或特定用途适用性的权利或任何默示保证。


致谢


RFC 编辑器功能的资金目前由互联网协会提供。

相关文章
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
1252 10
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
410 59
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
997 77
|
11月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
239 0
栈区的非法访问导致的死循环(x64)
|
11月前
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
554 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
368 11
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
345 9
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
489 7

热门文章

最新文章