第156篇:MPLS 转发过程:标签压入、交换、弹出
关键词:MPLS转发、Push、Swap、Pop、LFIB、FIB、标签转发、IMPI、IMP
一、引言
MPLS 的转发过程是标签交换网络的"心脏"。当一个 IP 数据包进入 MPLS 域时,它经历了从"IP 路由查找"到"标签查找"的转变。理解 MPLS 转发的每一步操作——标签压入(Push)、标签交换(Swap)和标签弹出(Pop)——对于排查 MPLS 故障、优化转发性能至关重要。
二、核心概念
2.1 转发信息库
MPLS 转发依赖两个关键的信息库:
| 信息库 | 全称 | 作用 | 查找依据 |
|---|---|---|---|
| FIB | Forwarding Information Base | IP 转发决策 | 目的 IP 地址(最长前缀匹配) |
| LFIB | Label Forwarding Information Base | 标签转发决策 | 入标签值(精确匹配) |
LFIB 由 LIB(Label Info Base)中优选的标签绑定生成。当数据包携带标签到达时,LSR 优先使用 LFIB 进行快速查找转发;当数据包不携带标签时,使用 FIB 进行 IP 路由查找。
2.2 三种标签操作
Push(压入标签)
在 Ingress LER(入口边缘路由器)执行。Ingress LER 收到原始 IP 数据包后: 1. 在 FIB 中查找目的 IP,命中 FEC 对应的 MPLS 出标签 2. 在 IP 报文头部之前压入 MPLS 标签头 3. 基于标签转发表从出接口发出
原始 IP 包: [二层头部 | IP头部 | 数据]
Push 后: [二层头部 | MPLS标签 | IP头部 | 数据]
Swap(交换标签)
在 Transit LSR(核心路由器)执行。Transit LSR 收到带标签的数据包后: 1. 在 LFIB 中精确匹配入标签 2. 查找对应的出标签和出接口 3. 将入标签替换为出标签(Swap) 4. 从出接口发出
Swap 前: [二层头部 | 入标签=1025 | IP头部 | 数据]
Swap 后: [二层头部 | 出标签=2030 | IP头部 | 数据]
Pop(弹出标签)
在 Egress LER(出口边缘路由器)执行。Egress LER 收到带标签的数据包后: 1. 在 LFIB 中匹配入标签 2. 发现该标签对应"隐式空标签"(Implicit Null,值=3)或为出口 3. 弹出 MPLS 标签头 4. 对原始 IP 报文执行 IP 路由查找并转发
Pop 前: [二层头部 | 出标签=3 | IP头部 | 数据]
Pop 后: [二层头部 | IP头部 | 数据]
2.3 标签转发表(LFIB)结构
| 字段 | 说明 |
|---|---|
| 入接口 | 数据包到达的接口 |
| 入标签 | 匹配该条目的入标签值 |
| 出接口 | 转发出去的接口 |
| 出标签 | 替换后的标签值(或 ImpExp/ImpNull) |
| FEC | 该标签对应的转发等价类 |
三、技术细节
3.1 完整 MPLS 转发流程

3.2 PHP(Penultimate Hop Popping)场景下的转发
PHP(次末跳弹出)机制下,倒数第二跳路由器执行 Pop 操作,最后一跳收到的标签值为"隐式空标签"(3)或直接是 IP 报文:

3.3 多层标签转发(Label Stack)
当存在多层标签(如 L3VPN + TE 隧道)时,LSR 仅处理外层标签,内层标签对中间节点透明:
| 节点 | 外层标签操作 | 内层标签 |
|---|---|---|
| Ingress LER | Push TE标签 | Push VPN标签(在TE标签之下) |
| Transit LSR | Swap TE标签 | 透明透传(不查看) |
| TE终点/PHP | Pop TE标签 | 暴露内层VPN标签 |
| Egress LER | Pop VPN标签 | 还原为原始IP报文 |
双层标签结构:
[二层头部 | TE标签(outer) | VPN标签(inner) | IP头部 | 数据]
SBO S SBO S 目的IP Payload
3.4 TTL 处理机制
MPLS 标签中的 TTL 字段有两种处理方式:
| 处理方式 | 说明 |
|---|---|
| TTL Propagate(传播) | 将 IP TTL 复制到 MPLS TTL,每跳递减 MPLS TTL |
| TTL Fixed(固定) | MPLS TTL 使用固定值(如 255),不复制 IP TTL |
# 华为设备配置 TTL 传播
[Huawei-mpls] mpls ttl propagate enable
# 配置固定 TTL
[Huawei-mpls] mpls ttl-propagated disable
[Huawei-mpls] mpls ttl 255
四、实战配置/案例分析
4.1 华为 MPLS 转发验证
# 查看 LFIB 转发表
<NE40E> display mpls lsp
Total exists 8 lsp(s).
NLRR: 10.1.1.2/32
IN OUT INLBL OURLBL FEC
10GE1/0/1 * 1025 Impnul 10.1.1.2/32
# 解释: 从10GE1/0/1收到的入标签1025, 对应FEC 10.1.1.2/32, 出标签为ImpNull
NLRR: 10.1.1.3/32
10GE1/0/2 10GE1/0/1 1026 1030 10.1.1.3/32
# 解释: 从10GE1/0/2收到的入标签1026, 交换为出标签1030, 从10GE1/0/1发出
# 查看接口标签转发表
<NE40E> display mpls interface 10GE 1/0/1
Interface: 10GE1/0/1
MPLS: Enabled
LDP: Enabled
LSP In: 4, LSP Out: 4
4.2 追踪 MPLS 转发路径
# 使用 MPLS Traceroute 追踪 LSP 路径
<NE40E> tracelsp -a 10.1.1.1 ipv4 10.1.1.5 32 first-label 1028 timeout 2
1 10.1.1.1 InLabel: None OutLabel: 1028
2 10.1.1.2 InLabel: 1028 OutLabel: 1035
3 10.1.1.3 InLabel: 1035 OutLabel: 3 (ImpNull)
4 10.1.1.5 InLabel: 3 OutLabel: None (Pop)
Trace complete: 4 hops
# 使用 MPLS Ping 验证 LSP 连通性
<NE40E> ping -a 10.1.1.1 ldp-target 10.1.1.5
Ping 3 packets to LSP destination 10.1.1.5/32 via LDP:
Sequence=0 ttl=251 time=2ms
Sequence=1 ttl=251 time=1ms
Sequence=2 ttl=251 time=2ms
Statistics: 3 sent, 3 received, 0% loss
4.3 故障排查:MPLS 转发黑洞
故障场景:从 LSR-1 发往 10.2.2.0/24 的流量在 LSR-2 处中断,ping 测试超时。
# Step 1: 在 LSR-1 验证 LSP 状态
<LSR-1> display mpls lsp 10.2.2.0 24
NLRR: 10.2.2.0/24
IN OUT INLBL OURLBL FEC
* 10GE1/0/1 1029 1033 10.2.2.0/24
# LSP 状态正常,入标签Null(Ingress),出标签1033
# Step 2: 在 LSR-2 验证 LFIB
<LSR-2> display mpls lsp 10.2.2.0 24
NLRR: 10.2.2.0/24
IN OUT INLBL OURLBL FEC
10GE1/0/1 10GE1/0/2 1033 Null 10.2.2.0/24
# 出标签为Null,说明LSR-2是Egress
# Step 3: 检查 LSR-2 的 IP 路由
<LSR-2> display ip routing-table 10.2.2.0 24
# 路由存在: 10.2.2.0/24 via 10.0.0.5 (Eth1/0/2)
# Step 4: 检查出接口状态
<LSR-2> display interface 10GE 1/0/2
# 接口物理UP, 协议UP
# Step 5: 检查 MPLS 是否出接口启用
<LSR-2> display current-configuration interface 10GE 1/0/2
# 发现: 出接口 10GE1/0/2 未启用 MPLS!
# 根因: 对端设备是纯IP路由器, 不需要MPLS, 但Pop后IP转发正常
# 实际: 此配置正常, 问题在更下游
# Step 6: 在对端 (LSR-3) 检查
<LSR-3> display mpls lsp
# LSR-3 完全没有 MPLS LSP 条目
# 根因: LSR-3 未配置 MPLS, 但 LSR-2 已经 Pop 了标签
# 数据包到达 LSR-3 时已经是纯 IP 包, LSR-3 应该能 IP 转发
最终发现是 LSR-3 的 ACL 丢弃了来自该方向的流量。
五、总结
| 项目 | 要点 |
|---|---|
| Push | Ingress LER 将 IP 报文压入标签,启动 MPLS 转发 |
| Swap | Transit LSR 入标签精确匹配 LFIB,替换为出标签 |
| Pop | Egress LER(或 PHP 点)弹出标签,恢复 IP 报文 |
| LFIB | 标签转发表,精确匹配入标签,远快于 IP 最长前缀匹配 |
| 多层标签 | 外层标签决定传输路径,内层标签决定最终交付 |
思考
- 如果 Ingress LER 的 FIB 中查不到目的 IP 对应的 MPLS FEC,数据包会怎样处理?
- MPLS Swap 操作为什么不查看 IP 头部?这种设计对转发性能有什么影响?
- 当 LFIB 和 FIB 对同一目的地的转发决策不一致时(如 IGP 路由变化但 LDP 标签未更新),数据包走哪条路径?
下篇预告:第157篇:PHP(次末跳弹出)机制