第154篇:MPLS 标签分配协议——LDP 工作原理

关键词

LDP、标签分发协议、LDP 邻居、UDP 发现、TCP 会话、LIB、LFIB、标签映射


一、LDP 扮演的角色

上篇我们学习了 MPLS 的核心概念:标签、FEC、LSP。但有一个关键问题没有解决——标签是如何分配到每个 LSR 上的?

答案是:通过 LDP(Label Distribution Protocol,标签分发协议)

LDP 是 MPLS 域内最基础的标签分发协议,它负责: 1. 发现 LDP 邻居——让 LSR 知道哪些邻居也支持 MPLS 2. 建立 LDP 会话——在邻居之间建立 TCP 连接,传递标签信息 3. 分发标签绑定——告诉邻居"某个 FEC 对应某个标签" 4. 维护标签信息库——持续更新标签和 FEC 的映射关系

补充:除 LDP 外,还有 RSVP-TE(用于 MPLS TE)、MP-BGP(用于 MPLS VPN)、Segment Routing 等标签分发方式。LDP 是 MPLS 中最基本、最广泛使用的协议。


二、LDP 邻居发现

2.1 发现机制

LDP 邻居发现分为两个层次:

1. 基本发现(链路本地)
   ──────────────────────────────────────
   每台 LSR 通过 UDP 多播(224.0.0.2:646)
   周期发送 LDP Hello 报文
   目的 IP:224.0.0.2(所有路由器)
   目的端口:646(LDP 知名端口)
   收到 Hello 后,确认邻居存在

2. 扩展发现(目标 IP)
   ──────────────────────────────────────
   用于非直连邻居的 LDP 会话
   Hello 发送到指定的 IP 地址
   应用场景:MPLS TE 的 Targeted LDP 会话

2.2 Hello 报文包含的信息

LDP Hello 报文内容:
  - LSR ID(标识发送方)
  - Label Space ID(标签空间,通常为 0)
  - Hold Time(邻居保持时间,默认 15 秒)
  - 可选参数:IPv4/IPv6 地址等

保持时间:如果在 Hold Time 内没有收到邻居的 Hello 报文,则认为该邻居 Down。默认 15 秒,如果连续 3 次没有收到(3 × Hello 间隔),则超时。


三、LDP 会话建立

3.1 建立过程(6 步)

步骤 1:LDP Hello(UDP 组播)
   RTA ──────────── 224.0.0.2:646 ──────────── RTB
   双方周期发送 Hello,感知到对方存在
        │
步骤 2:TCP 连接建立
   RTA ──────────── 发起 TCP :646 ──────────── RTB
   由较大 LSR ID 的一方主动发起 TCP 连接
        │
步骤 3:LDP Initialization
   RTA ── Initialization 报文(协商参数)──▶ RTB
   RTA ◀── Initialization 报文(协商参数)── RTB
        │
步骤 4:KeepAlive 确认
   RTA ────────── KeepAlive ────────▶ RTB
   RTA ◀───────── KeepAlive ──────── RTB
   → 至此会话建立完成
        │
步骤 5:标签映射(Address + Label Mapping)
   RTA ◀══ Label Mapping (FEC→Label) ══ RTB
   RTA ══ Label Mapping (FEC→Label) ◀══ RTB
        │
步骤 6:定期 KeepAlive 维护
   RTA ◀══════ KeepAlive ══════▶ RTB  (默认 60 秒)

3.2 关键参数协商

Initialization 报文中协商的参数:

参数 默认值 说明
KeepAlive Time 30 秒 会话保持时间,双方取较小值
Hello Hold Time 15 秒 邻居保持时间
Label Advertisement Mode DU 分发模式(DU / DoD)
Label Retention Mode Liberal 保留模式(Liberal / Conservative)

四、标签分发方式

4.1 DU(Downstream Unsolicited)——下游主动分发

          RTA                          RTB
           │                            │
           │        FEC=10.0.0.0/24     │
           │      Label=100 ◀───────────│  RTB 主动将标签分配给 RTA
           │                            │
           │        FEC=20.0.0.0/24     │
           │      Label=200 ◀───────────│  RTB 主动将标签分配给 RTA
           │                            │
   ──── RTA 收到的 LIB ────
   FEC              Received From    Label
   10.0.0.0/24      RTB             100
   20.0.0.0/24      RTB             200
  • DU(默认模式):下游 LSR 不需要上游请求,主动为所有已知 FEC 分配标签并通告给邻居
  • 优势:LSP 建立快,所有 FEC 的标签信息提前就绪
  • 劣势:产生较多标签通告报文

4.2 DoD(Downstream on Demand)——按需分发

          RTA                          RTB
           │                            │
           │   Label Request            │
           │    FEC=10.0.0.0/24 ───────▶│  RTA 请求特定 FEC 的标签
           │                            │
           │   Label Mapping            │
           │    FEC=10.0.0.0/24 ◀───────│  RTB 只分配请求的标签
           │    Label=100               │
  • DoD:上游 LSR 需要标签时才发送请求,下游 LSR 仅在收到请求后分配标签
  • 优势:节省标签资源
  • 劣势:LSP 建立延迟(需要先请求再等待标签)

4.3 标签保留模式

模式 行为 适用场景
Liberal(自由模式,默认) 保留所有收到的标签(即使不是最优下一跳) 快速收敛,切换下一跳时不用重建 LSP
Conservative(保守模式) 只保留最优下一跳的标签 标签资源受限的设备

五、LDP 的核心数据结构

5.1 LIB(Label Information Base)

LIB 是 LDP 维护的原始标签信息,记录从所有邻居收到的标签映射。

LIB(标签信息库): | FEC Neighbor Label | | | --- | --- | | 10.0.0.0/24 RTB 100 10.0.0.0/24 RTC 150 20.0.0.0/24 RTB 200 20.0.0.0/24 RTC 250 | ← 从 RTB 收到 ← 从 RTC 收到 |

5.2 LFIB(Label Forwarding Information Base)

LFIB 是真正用于转发的标签表,从 LIB 中选出一条最优路径。

LFIB(标签转发信息表): | In-Label Out-Label Out-Intf Next-Hop | | | --- | --- | | 300 100 GE0/0/1 10.1.1.2 400 - (pop) GE0/0/2 10.1.2.2 | ← 到 10.0.0.0/24 ← PHP |

从 LIB 到 LFIB 的流程:

LIB(所有邻居的标签)
    │
    │  IGP 路由表中选择最优下一跳
    ▼
为最优下一跳分配的标签确定 Out-Label
    │
    │  本地分配入标签
    ▼
LFIB(转发表)

六、LDP 的标签分配过程示例

网络拓扑(所有链路运行 OSPF):
R1 ─── R2 ─── R3 ─── R4
                     │
                  Loopback0: 4.4.4.4/32

步骤:
1. OSPF 使所有路由器知道 4.4.4.4/32 的路由
2. LDP 在所有接口上 Hello → 发现邻居
3. LDP 建立 TCP 会话
4. 标签映射过程(以 4.4.4.4/32 为例):

  R4:为 4.4.4.4/32 分配标签(隐式空标签/implicit-null)
   │
   │  Label Mapping: FEC=4.4.4.4/32, Label=implicit-null
   ▼
  R3:收到 R4 的标签
      为 4.4.4.4/32 分配本地标签 200
   │
   │  Label Mapping: FEC=4.4.4.4/32, Label=200
   ▼
  R2:收到 R3 的标签
      为 4.4.4.4/32 分配本地标签 200  → PHP(次末跳弹出)
   │
   │  Label Mapping: FEC=4.4.4.4/32, Label=300
   ▼
  R1:收到 R2 的标签
      加入 LIB

最终 LFIB:
  R1:4.4.4.4/32 → push 300 → R2
  R2:入标签 300 → swap 200 → R3
  R3:入标签 200 → pop → R4

七、LDP 的收敛

7.1 LDP 与 IGP 的联动

LDP 的收敛依赖于 IGP(OSPF/ISIS)的收敛: - IGP 路由收敛 → LDP 重新计算下一跳 → 更新 LIB/LFIB - LDP-IGP 同步:当链路恢复时,LDP 会等待标签分发完成后再通知 IGP 启动邻接,避免标签未就绪前转发黑洞

7.2 FRR(快速重路由)

MPLS 环境下的 FRR 依赖于 LDP 的 Liberal 标签保留模式: - 即使备用路径不是最优路径,LDP 也保留了备用路径的标签 - 主路径故障时,直接切换到备用路径的标签,无需重新计算


八、总结

知识点 核心要点
LDP 作用 在 LSR 之间分发标签映射,自动建立 LSP
邻居发现 UDP 组播到 224.0.0.2:646
会话建立 TCP 连接(646 端口)+ Initialization + KeepAlive
标签分发模式 DU(主动分发,默认)和 DoD(按需分发)
标签保留模式 Liberal(保留所有)和 Conservative(仅保留最优)
LIB vs LFIB LIB 存所有邻居的标签;LFIB 存最优路径的标签

九、思考

  1. LDP 是如何发现邻居的?使用什么协议和端口?
  2. DU 和 DoD 两种标签分发模式的区别是什么?
  3. Liberal 标签保留模式为什么有利于快速收敛?
  4. LIB 和 LFIB 之间的关系是什么?
  5. LDP 会话建立过程中,Initialization 报文协商了哪些参数?

下篇预告:第155篇《LDP 邻居建立与标签分发方式(DU/DoD)》——深入探讨 LDP 会话的每种状态,以及 DU 和 DoD 模式下的标签分发细节。