本文目录导读:

- 场景假设
- 第一步:标签压入(Push)—— Ingress 路由器
- 第二步:标签交换(Swap)—— Transit 路由器
- 第三步:标签弹出(Pop)—— Egress 路由器
- 关键概念与补充说明
- 标签交换的本质
MPLS(多协议标签交换)的核心思想是通过短而固定的标签来指导数据包的转发,而不是像传统IP路由那样依赖最长前缀匹配,它的标签交换过程可以概括为“压入、交换、弹出”。
下面用一个具体的例子来详细拆解这个过程。
场景假设
- 网络中有一个MPLS域,包含三台路由器:Ingress(入口)、Transit(中转)、Egress(出口)。
- 数据包要从网络A发往网络B,路径是 Ingress → Transit → Egress。
- 在MPLS域内部,为到达网络B的FEC(转发等价类)预先建立了一条LSP(标签交换路径),分配的标签如下:
- Ingress 告诉 Transit:发送给我的数据,标签用 100。
- Transit 告诉 Egress:发送给我的数据,标签用 200。
第一步:标签压入(Push)—— Ingress 路由器
- 收到原始IP包:Ingress路由器收到一个普通的IP数据包,目标IP是网络B。
- 分类:基于目标IP地址,它匹配到一个FEC(所有去往网络B的流量”)。
- 查找标签转发表:根据这个FEC,它查到对应的出站标签(Out Label)是 100,并且出接口是通往Transit路由器的接口。
- 执行动作:
- 在IP数据包前面压入(Push)一个MPLS头部,其中Label=100。
- 将带有标签100的包从对应接口转发给Transit路由器。
数据包的样子: [MPLS Label=100] [IP头] [负载]
第二步:标签交换(Swap)—— Transit 路由器
- 收到带标签的包:Transit路由器从Ingress路由器收到一个带有标签 100 的MPLS包。
- 查找标签转发表:Transit路由器查看自己的LFIB(标签转发信息表),找到对应 入标签 = 100 的表项,表项内容通常为:
- 入标签:100
- 出标签:200 (这是下一跳Egress要求的标签)
- 出接口:通往Egress路由器的接口
- 下一跳:Egress路由器的IP
- 执行动作:
- 将MPLS头部中的标签从 100 交换(Swap)为 200。
- (如TTL、CoS)可能根据策略修改,但标签是核心替换项。
- 将带有新标签200的包从出接口转发给Egress路由器。
数据包的样子: [MPLS Label=200] [IP头] [负载]
第三步:标签弹出(Pop)—— Egress 路由器
- 收到带标签的包:Egress路由器从Transit路由器收到一个带有标签 200 的MPLS包。
- 查找标签转报表:Egress路由器查找自己的LFIB,找到 入标签 = 200 的表项,它发现自己是LSP的终点(倒数第二跳通常已弹出,这里假设是Egress弹出,更常见的是PHP——倒数第二跳弹出,见下方补充)。
- 表项通常显示:出标签为 Pop 或 Implicit-Null(隐式空标签)。
- 执行动作:
- 弹出(Pop)MPLS头部,直接露出原始的IP数据包。
- 继续IP转发:Egress路由器得到的是一个普通的IP数据包,它根据目标IP地址查询普通的路由表,将数据包转发给最终的设备(如网络B的交换机或PC)。
数据包的样子: [IP头] [负载] (恢复了原始形态)
关键概念与补充说明
-
转发等价类(FEC)
在上面的例子中,“去往网络B的所有流量”就是一个FEC,MPLS将具有相同转发行为(例如去往同一目的地、同优先级)的流聚合到一个FEC,并分配相同标签,简化了处理。
-
标签分配与分发
- 上面的例子假设标签已经预配好(例如通过LDP、RSVP-TE或BGP-LU协议),实际网络中,下游路由器(如Transit、Egress)会通过标签分发协议主动向上游路由器通告“你发给我去往网络B的包时,应该用标签X”。
- 下游标签分发:Egress告诉Transit用标签200;Transit告诉Ingress用标签100。
-
PHP(倒数第二跳弹出)
- 在上面的例子中,如果Egress是直接弹出了标签,它还需要查一次IP路由表,为了优化,通常使用PHP:
- Egress会告诉上一跳(Transit):“你不需要给我带标签,直接给我IP包就行,我自己查IP表更快。” Egress分配的标签是 隐式空标签(Implicit Null,值为3)。
- 在Transit上,当它查到入标签=100时,出标签会执行 Pop 动作,直接去掉MPLS头部,将原始IP包发给Egress。
- 这样,Egress就不需要再查标签表了,它直接收到IP包进行IP转发,这就是标准的MPLS转发流程。
- 在上面的例子中,如果Egress是直接弹出了标签,它还需要查一次IP路由表,为了优化,通常使用PHP:
-
标签栈(Label Stack)
- MPLS允许在数据包前压入多层标签,最内层标签用于标识目的地,外层标签用于引导数据包通过特定的隧道(例如MPLS TE或L3VPN),在转发过程中,只有栈顶标签被用于转发决策,当外层标签弹出后,内层标签暴露出来,继续指导下一跳转发。
标签交换的本质
- 数据层面:MPLS交换过程就是压入、交换、弹出三个基本操作的组合。
- 控制层面:标签的分配和分发由标签分发协议完成,确保每个路由器都知道“收到标签X后,应该换成标签Y并发给谁”。
- 核心优势:基于短标签的精确匹配转发,比基于最长前缀匹配的IP路由查找更快(硬件实现简单),并且天然支持流量工程和VPN多租户隔离。
标签: MPLS标签交换
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。