4. MPLS转发与标签操作实战

MPLS转发的核心并不在于“查路由表”,而在于对标签栈的精确操作。一台设备收到带标签的报文后,究竟是把新标签压入栈顶、把栈顶标签替换成另一个值,还是把栈顶标签弹出,取决于它在当前LSP(标签交换路径)中扮演的角色,以及报文的下一跳类型。理解Push、Swap、Pop三种基本动作,是读懂Comware转发流程和display命令输出的前提。

三种基本标签操作的定义与触发条件

先明确参照约定:本文所述“栈顶”指报文最外层、最先被设备读取的标签,位于标签栈的最上方;标签栈自栈顶向下依次为外层标签、内层标签。设备转发时总是先处理栈顶标签。

  • Push(压入):在原有标签栈之上再压入一个或多个新标签,报文标签深度增加。典型场景是Ingress LSR(入站标签交换路由器)收到普通IP报文后,为其压入本LSP的出标签,使报文进入MPLS域;在MPLS VPN中,PE还会先压私网标签、再压公网标签,形成两层标签栈。
  • Swap(交换):将栈顶标签替换为另一标签值,标签深度不变。这是Transit LSR(中转LSR)的典型动作,依据入标签查LFIB(标签转发信息库),得到出标签和出接口。
  • Pop(弹出):移除栈顶标签,标签深度减一。当栈顶标签为隐式空标签(值为3)时,倒数第二跳设备执行Pop,使Egress LSR收到的是无标签IP报文;若为显式空标签(值为0),则Egress LSR自己弹出标签后再查IP路由。

需要特别区分:PHP(倒数第二跳弹出)是Pop的一种部署方式,由倒数第二跳设备完成弹出,目的是减轻Egress LSR的标签处理负担。而Swap只改变标签值,不改变栈深,这是它与Push、Pop最本质的区别。

标签栈处理与转发流程

Comware的MPLS转发流程可概括为:入接口收到报文后,根据报文是否带标签、标签值以及本地LFIB表项,决定执行Push、Swap还是Pop,然后从对应出接口发出。对于Ingress,先查FIB得到Tunnel ID,再查NHLFE(下一跳标签转发项)获得出标签和出接口,执行Push;对于Transit,直接以栈顶标签查LFIB,执行Swap;对于Egress或PHP场景,执行Pop后按IP路由转发。

下面这张图展示了同一报文在Ingress、Transit、倒数第二跳、Egress四类角色上的标签栈变化与操作对应关系,可对照理解“谁在什么时候动栈顶”。

MPLS标签栈在转发路径上的变化与操作 Ingress LSR PE / 入站 Transit LSR 中转 倒数第二跳 PHP Egress LSR 出站 Push Swap Pop 入栈前 IP报文 出栈后 标签 L1 IP报文 入标签 L1 L1 IP报文 出标签 L2 L2 IP报文 入标签 L2 L2 IP报文 弹出后 IP报文 收到无标签 IP报文 查IP路由转发 栈顶标签始终最先被处理:Push 增加栈深,Swap 只换值不改栈深,Pop 减少栈深;PHP 由倒数第二跳完成弹出。

Comware转发流程中的关键表项

在Comware上,MPLS转发依赖几张关键表:FIB表用于Ingress查找Tunnel ID;ILM(入标签映射)表把入标签映射到NHLFE;NHLFE表记录出标签、出接口、下一跳和操作类型(Push/Swap/Pop)。执行display mpls lsp可以看到LSP的建立状态,display mpls lsp verbose能看到入标签、出标签、出接口和下一跳;display fib用于确认IP路由与Tunnel ID的关联;display mpls ilm和display mpls nhlfe则直接反映标签操作类型。

下面给出一段示例配置与查看命令,用于在Comware设备上建立一条静态LSP并观察标签操作。示例参数为教学假设,实际部署需按现网规划替换。

# 在Ingress上配置静态LSP,出标签1600,下一跳10.0.0.2
system-view
mpls lsr-id 1.1.1.1
mpls
static-lsp ingress LSP1 destination 3.3.3.3 32 nexthop 10.0.0.2 out-label 1600

# 在Transit上配置Swap:入标签1600,出标签1700
static-lsp transit LSP1 incoming-interface GigabitEthernet1/0/1 in-label 1600 nexthop 10.0.0.3 out-label 1700

# 在倒数第二跳配置PHP:入标签1700,出标签3(隐式空)
static-lsp transit LSP1 incoming-interface GigabitEthernet1/0/1 in-label 1700 nexthop 10.0.0.4 out-label 3

# 查看LSP与标签操作
display mpls lsp
display mpls lsp verbose
display mpls ilm
display mpls nhlfe

执行display mpls lsp verbose时,重点看In/Out Label、Nexthop、Out Interface和State字段。若Ingress显示Out Label为1600、State为Up,说明Push动作已生效;Transit显示In Label 1600、Out Label 1700,说明Swap正常;倒数第二跳显示Out Label为3,说明已按PHP弹出。若某跳State为Down,通常要检查下一跳可达性、出接口状态或静态LSP配置是否与对端一致。

display命令分析要点与常见排障

分析display输出时,建议按“入标签—操作—出标签—出接口”的顺序核对。常见异常有三类:一是标签不匹配,表现为Transit上查不到对应ILM表项,报文被丢弃,需核对上下游in-label/out-label是否首尾相接;二是PHP未生效,Egress收到带标签报文却无对应ILM,需检查倒数第二跳是否配置out-label 3;三是出接口Down导致LSP State为Down,需先恢复链路再确认标签转发。

判断标签操作类型的小技巧:看display mpls nhlfe中的Operation字段,Push对应“Push”,Swap对应“Swap”,Pop对应“Pop”;同时结合In Label与Out Label是否为空、是否为3来交叉验证。

把三种操作与转发角色对应起来记忆:Ingress做Push,Transit做Swap,倒数第二跳做Pop,Egress做IP转发。再结合Comware的ILM、NHLFE表和display命令逐跳核对,就能把“标签栈怎么变、报文怎么走”这条链路完整串起来。