3. MPLS基础与标签转发原理
MPLS(Multiprotocol Label Switching,多协议标签交换)在Juniper MX系列路由器上并不是一个孤立特性,而是承载BGP/MPLS L3VPN、L2VPN、RSVP-TE、Segment Routing等业务的基础转发平面。理解MPLS的关键,不是记住“标签”这个词,而是理解标签如何被压入、交换、弹出,以及数据包在每一跳上究竟依据什么信息做转发决策。
一、标签栈:MPLS转发的“地址”
MPLS标签是一个20 bit的本地标识,封装在二层头与IP头之间,称为Shim Header。单个标签头包含:20 bit Label、3 bit EXP(现多用于Traffic Class)、1 bit S(栈底标志)、8 bit TTL。一个数据包可以携带多个标签,形成标签栈(Label Stack)。栈顶标签最先被处理,栈底标签的S位为1。
标签栈的存在使MPLS具备天然的层次化转发能力。例如在MX上承载L3VPN时,典型栈结构为:外层为传输标签(如RSVP-TE或LDP标签),内层为VPN标签(由MP-BGP分配)。外层标签负责把包送到远端PE,内层标签负责在远端PE上区分VRF。若再叠加快速重路由或分段路由,栈深还会增加。
二、LSP、LER与LSR:一条标签路径的组成
LSP(Label Switched Path,标签交换路径)是一条单向的标签转发通道。它由入口LER(Label Edge Router,标签边缘路由器)、中间LSR(Label Switching Router,标签交换路由器)和出口LER共同构成。LER负责压入或弹出标签,LSR负责交换标签。注意:LSP是单向的,往返流量通常由两条独立LSP承载。
在MX上,LSP的建立方式主要有三种:LDP(依赖IGP路由逐跳分配标签)、RSVP-TE(显式路径、带宽预留、支持FRR)、以及Segment Routing(基于IGP扩展或BGP分配SID)。不同方式决定了标签栈的深度、路径可控性和保护能力。
三、PHP:倒数第二跳弹出
PHP(Penultimate Hop Popping)是MPLS中一个非常实用的优化机制。在默认情况下,出口LER会向倒数第二跳LSR分配一个“隐式空标签”(Implicit Null,标签值3)。倒数第二跳收到该标签后,在转发前直接弹出外层标签,只把内层标签或IP包交给出口LER。这样出口LER就不必再为外层标签做一次查表,直接按内层标签或IP路由转发,降低了出口设备的处理负担。
在MX上,PHP行为与LSP类型有关。LDP LSP默认启用PHP;RSVP-TE LSP默认也支持PHP,但可通过配置no-php关闭;Segment Routing中,若使用Adj-SID或Node-SID,PHP行为取决于SID类型和转发语义。需要特别注意的是,如果出口LER需要保留外层标签用于某些策略(如统一转发、流量统计或显式空标签场景),可以配置显式空标签(Explicit Null,标签值0),此时倒数第二跳不弹出标签,而是把标签值改为0后继续转发,由出口LER自行弹出。
四、MX上的MPLS转发行为
在MX系列上,MPLS转发由Packet Forwarding Engine(PFE)完成,控制平面负责标签分配和LSP建立。以LDP为例,MX会为每个IGP前缀分配一个本地标签,并通过LDP会话通告给邻居。当数据包进入入口LER时,PFE根据目的FEC查找出标签映射,执行Push操作;中间LSR根据入标签查找ILM(Incoming Label Map),执行Swap;倒数第二跳根据隐式空标签执行Pop;出口LER根据内层标签或IP头完成最终转发。
下面是一个典型的MX LDP LSP查看示例,用于观察标签绑定和下一跳关系:
user@MX-A> show ldp database
Input label database, 10.0.0.1:0--10.0.0.2:0
Label Prefix
300000 10.255.0.4/32
300001 10.255.0.5/32
Output label database, 10.0.0.1:0--10.0.0.2:0
Label Prefix
300016 10.255.0.4/32
300017 10.255.0.5/32
user@MX-A> show route table inet.3 10.255.0.4/32 detail
10.255.0.4/32 (1 entry, 1 announced)
*LDP Preference: 9
Next hop: 10.0.0.2 via ge-0/0/0.0, selected
Label operation: Push 300016
State: <Active Int>
从输出可以看到:MX-A为10.255.0.4/32分配的出标签是300016,下一跳是10.0.0.2。当流量命中该FEC时,PFE会压入300016并转发给下一跳。在中间LSR上,入标签300016会被交换为新的出标签,直到倒数第二跳弹出。
五、显式空标签与隐式空标签的对比
隐式空标签(标签值3)表示“请倒数第二跳弹出外层标签”,出口LER不再看到该标签。显式空标签(标签值0)表示“请把标签值改为0后继续转发”,出口LER会收到一个标签值为0的包,然后自行弹出。两者核心区别在于:PHP由倒数第二跳完成弹出,显式空标签由出口LER完成弹出。显式空标签通常用于需要保留标签栈层次或出口LER需要感知标签到达的场景。
在MX上,可以通过以下命令观察LSP的标签操作和PHP行为:
user@MX-A> show mpls lsp name to-MX-D detail
From: 10.0.0.1, State: Up, ActiveRoute: 0
Name: to-MX-D
LSPtype: Static Configured
Label operation: Push 300016
...
No PHP: Disabled
如果看到No PHP: Disabled,说明该LSP启用了PHP;若为Enabled,则说明关闭了PHP,出口LER会收到显式空标签或保留外层标签。
六、小结与判断依据
MPLS转发的核心是标签栈和LSP。标签栈提供层次化转发能力,LSP定义单向路径,LER负责边缘压入/弹出,LSR负责标签交换,PHP优化出口处理。在MX上,实际转发行为由PFE执行,控制平面通过LDP、RSVP-TE或SR建立标签映射。判断一个包在某一跳的行为,关键看入标签、ILM表项、出标签和下一跳。掌握这些对象和关系,才能进一步理解L3VPN、TE和FRR在MX上的实现。