第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 转发流程

完整 MPLS 转发流程 - 图示

3.2 PHP(Penultimate Hop Popping)场景下的转发

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

PHP(Penultimate Hop Popping)场景下的转发 - 图示

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 最长前缀匹配
多层标签 外层标签决定传输路径,内层标签决定最终交付

思考

  1. 如果 Ingress LER 的 FIB 中查不到目的 IP 对应的 MPLS FEC,数据包会怎样处理?
  2. MPLS Swap 操作为什么不查看 IP 头部?这种设计对转发性能有什么影响?
  3. 当 LFIB 和 FIB 对同一目的地的转发决策不一致时(如 IGP 路由变化但 LDP 标签未更新),数据包走哪条路径?

下篇预告:第157篇:PHP(次末跳弹出)机制