MPLS的基本工作原理
一、MPLS标签动作
MPLS 基本转发过程中涉及一些标签操作,主要包括标签压入 (Push)、标签交换(Swap)和标签弹出(Pop)这三个动作。
- Push:标签压入动作,可能会在Ingress或Transit节点上发生。
- 标签压入动作是指在IP报文的二层协议头和IP报头之间插入一个MPLS标签,或者是在现有标签栈顶部再增加一个新的出标签,即标签嵌套封装,如BGP/MPLS IP VPN的Ingress节点可能会在一个IP报文中同时压入多层公网或私网MPLS标签。
- Swap:标签交换动作,会在Transit节点发生
- 当MPLS报文在MPLS域内转发时,Transit节点根据标签转发表LFIB的查找,匹配到相应的表项后,用下一跳分配的出标签交换MPLS报文中原有的栈顶标签。原有MPLS报文中可以携带一层或多层MPLS标签,但仅交换最外层的标签。
- Pop:标签弹出动作,会在倒数第二跳Transit节点或Egress节点发生
- 当MPLS报文离开MPLS域时,Egress节点将MPLS报文外层的标签剥离,使后续的报文转发按照IP路由进行,或者按照余下的标签进行。也可以利用PHP特性,在倒数第二跳节点处将标签弹出,减少最后一跳的负担,使最后一跳节点直接进行IP路由转发或下一层标签转发。
二、Ingress LSR的处理
当IP报文进入MPLS域时:
- Ingress LSR查看FIB表,检查目的IP地址对应的Tunnel ID值是否为0x0(如果Tunnel ID值为0x0,则进入正常的IP转发流程)。
- 如果Tunnel ID值不为0x0,根据FIB表的Tunnel ID找到对应的NHLFE表项,将FIB表项和NHLFE表项关联起来。
- 查看NHLFE表项,可以得到出接口、下一跳、出标签和标签操作类型。
- 在IP报文中压入出标签,同时处理TTL,然后将封装好的MPLS报文发送给下一跳。
三、Transit LSR的处理
当MPLS报文在MPLS域转发时:
- Transit LSR根据MPLS的标签值查看对应的ILM表,得到Tunnel ID。
- 根据ILM表的Tunnel ID找到对应的NHLFE表项。
- 查看NHLFE表项,得到出接口、下一跳、出标签和标签操作类型,标签操作类型为Swap,则交换标签。
四、Egress LSR的处理
当MPLS报文需要离开MPLS域时:
- Egress根据ILM查询到该标签对应的操作为Pop,说明需要剥离该标签
- 根据当前标签头部的下一层报文头部进行下一步处理
五、MPLS详细转发过程
以下以支持PHP的LSP为例,说明MPLS报文的基本转发过程。在单纯的LDP LSP隧道环境下,MPLS报文最多仅带一层MPLS标签,从上游节点进入本地节点的入接口时携带的是上游节点分配给该FEC的出标签(也是本地节点对应的入标签),从本地节点出接口向下游节点发送时携带的是本地节点分配给对应FEC的出标签。
如图1-16所示,MPLS标签已分发完成,建立了一条LSP,其目的 地址为4.4.4.2/32,其MPLS报文的基本转发过程如下。
图1-16 MPLS报文基本转发示例
(1)Ingress节点收到目的地址为4.4.4.2的IP报文后,首先根据 FIB找到对应的下一跳,发现下一跳是LSR标签设备(如果发现下一跳 是IP设备时会直接按FIB表项进行IP转发),并且因为本节点是入节 点,所以在进行报文转发前需要进行标签压入动作,需压入的标签是 根据FEC 4.4.4.2与标签的映射关系找到的(为Z,作为出标签),然后 把MPLS报文从压入的标签所映射的出接口转发出去。
(2)Transit节点收到该标签的MPLS报文后,根据LFIB找到对应入 标签(上一节点的出标签就是本节点的入标签)所映射的出标签、出 接口,先进行标签交换(无需查看IP报头的目的地址),即用本地为 FEC 4.4.4.2/32分配的出标签(Y)替换报文中原来的MPLS标签 (Z),然后从找到的出标签所映射的出接口转发出去。
(3)倒数第二跳Transit节点收到MPLS报文后,同样根据LFIB找到 对应入标签所映射的出标签、出接口,先用本地为FEC 4.4.4.2/32分配 的出标签(通常为3)替换原来的MPLS标签,然后准备从出标签3所映 射的出接口转发出去。但是因为Egress分给其的出标签值为3(这是一 个特殊的标签,必须弹出,参见表1-1说明),所以需要先进行PHP操 作,弹出出标签(此时报文已不带MPLS标签了),并根据自己的出标 签3所映射的接口转发报文。
(4)Egress节点收到无MPLS标签的IP报文后,直接根据对应的IP 路由表项把数据传输给目的主机4.4.4.2/32。