EXP bit and MPLS Queuing

本页解释 MPLS 数据包中的 EXP 位以及 RouterOS 如何为 QoS 处理它,包括优先级标记、队列策略和 MPLS mangle 规则。文中详细说明在数据包交换、倒数第二跳弹出和本地处理过程中 EXP 位如何被处理,并给出在 RouterOS 中配置 MPLS mangle 规则的示例。

EXP 位与 MPLS 队列

当 MPLS 标签附加到数据包时,会使数据包长度增加 32 位(4 字节)。这 32 位的组成如下:

  • 标签值本身(20 位)。
  • EXP("experimental")字段(3 位)。
  • 生存时间字段(8 位)。
  • 栈底字段(1 位)。

MPLS 标准并未规定 "experimental" 位的用途,但最常见的用法是承载 QoS 信息,类似于 VLAN 标签中的 802.1q 优先级。EXP 字段只有 3 位,这意味着它可以承载 0 到 7 的值,从而支持 8 个流量类别。

RouterOS 中的 EXP 字段处理

当 RouterOS 收到 MPLS 数据包时,它会将该数据包的 "ingress priority" 值设置为顶层标签中承载的值。"ingress priority" 不是数据包头中的字段——它是 RouterOS 在处理数据包时为其分配的额外标记。当 RouterOS 为 MPLS 数据包打标签时,它会将 EXP 位设置为分配给该数据包的 "priority"(而非 "ingress priority")。当 RouterOS 交换 MPLS 数据包时,它会自动将 "ingress priority" 复制到 "priority"。这样,常规的 MPLS 交换就能在整条标签交换路径上传递优先级信息。

有关 "ingress priority" 和 "priority" 处理的更多信息另见 WMM 与 VLAN 优先级。

EXP 字段的行为取决于对数据包执行的操作:

  • 如果 RouterOS 对数据包进行 MPLS 交换(弹出标签并压入新标签),新标签中的 EXP 字段与接收到的标签一致,因为:
    • RouterOS 将 "ingress priority" 设置为接收到的标签中的 EXP 位。
    • 交换会自动将 "priority" 设置为 "ingress priority"。
    • RouterOS 为数据包打上新标签,并将其 EXP 位设置为 "priority" 中的值。
  • 如果 RouterOS 通过倒数第二跳弹出(路由器弹出接收到的标签且不压入新标签)来交换数据包,则 EXP 字段的优先级会保留在数据包的 "priority" 字段中。其他 MAC 协议,例如 WMM 或 802.1q VLAN,随后可以使用该值:
    • RouterOS 将 "ingress priority" 设置为接收到的标签中的 EXP 位。
    • 交换会自动将 "priority" 设置为 "ingress priority"。
    • RouterOS 在不再压入标签的情况下将数据包交换到下一跳,而这发生在 VLAN 接口上。
    • VLAN 接口将 VLAN 头中的 802.1q 优先级设置为数据包的 "priority" 值。

倒数第二跳弹出可能会在最后一跳丢失标签交换路径上承载的 QoS 信息。如果需要保留这些信息,请对标签交换路径中的最后一跳使用 Explicit NULL 标签而不是 Implicit NULL 标签,以禁用倒数第二跳弹出。MPLS TE 隧道默认对最后一跳使用 Explicit NULL 标签。

  • 如果 RouterOS 通过标签交换路径发送数据包(路由器将第一个标签压入数据包),它会将 EXP 位设置为 "priority" 中的值。你可以使用防火墙规则或其他方式(例如从 IP 头中的 DSCP 字段)正确设置该值。
  • 如果 RouterOS 收到需要本地处理的数据包,它会将 "ingress priority" 设置为接收到的数据包的 EXP 字段。随后你可以使用该值更新数据包的 DSCP 字段,或通过防火墙规则从 "ingress priority" 设置 "priority"。

MPLS Mangle 与队列

RouterOS 防火墙只能处理 IP 流量,这意味着你无法直接在 mangle 中标记 MPLS 数据包并通过队列对其进行限速。你必须在入口边缘路由器上添加 MPLS 头之前执行队列,或者在出口边缘路由器上移除 MPLS 标签之后执行队列。

从 ROS v7.17 开始,RouterOS 包含 MPLS Mangle。该功能允许你根据 EXP 位添加数据包标记,或在标签交换(P)路由器上、或在 MPLS 封装后的 PE 输出上更改所分配的 EXP 位。

该配置可从 /mpls/mangle 菜单访问。

基本示例

我们来看一个非常基本的示例:在 LSP 沿途的标签交换路由器(P)上,我们希望标记 EXP 位为 0 的数据包、限制带宽,并将 EXP 位改为 3:

/mpls/mangle
add chain=forward exp=0 set-exp=3 set-mark=m0

/queue/tree
add limit-at=10M max-limit=10M name=mpls_queue packet-mark=m0 parent=sfp-sfpplus2

无法使用基于 IMQ 接口的队列(simple queue、queue tree global)对 MPLS 数据包进行排队。你必须使用以 "真实" 接口作为父级的 queue tree。

MPLS Mangle 表会显示匹配的数据包计数,这对于调试你的配置很有用:

[admin@CCR2004_2XS_111] /mpls/mangle> print 
Flags: X - DISABLED
Columns: CHAIN, EXP, SET-EXP, SET-MARK, PACKETS
#   CHAIN    EXP  SET-EXP  SET-MARK  PACKETS
0   forward    0        3  m0        221 654

MPLS mangle 规则不会像常规防火墙 mangle 规则那样逐行执行。相反,MPLS Mangle 会一次性应用所有操作。

例如,请查看下面这组规则:

/mpls/mangle
add chain=forward exp=0 set-mark=m0
add chain=forward exp=0 set-exp=3
add chain=forward exp=3 set-mark=m3

在此示例中,如果传入数据包的 EXP 位值为 0,则第三条规则不会生效。

为特定 EXP 位设置操作后,其他规则无法再修改它:

[admin@CCR2004_2XS_111] /mpls/mangle> add chain=forward exp=0 set-mark=m4
failure: conflicting forward set-mark rule