在MPLS基本转发过程中涉及到一些标签操作,主要包括标签压入(Push)、标签交换(Swap)和标签弹出(Pop)这三个动作。
标签压入动作是指在IP报文的二层协议头和IP报头之间插入一个MPLS标签(如图1-13的上图所示),或者是在现有标签栈顶部再增加一个新的出标签(如图1-13的下图所示),即标签嵌套封装,如在BGP/MPLS IP VPN的Ingress节点可能会在一个IP报文中同时压入多层公网或私网MPLS标签。
图1-13 标签压入动作的两种情形
当MPLS报文在MPLS域内转发时,Transit节点根据标签转发表LFIB的查找,匹配到相应的表项后,用下一跳分配的出标签交换MPLS报文中原有的栈顶标签。原有MPLS报文中可以携带有一层或多层MPLS标签,但仅交换最外层的标签。如图1-14中上、下图所示分别是对携带单层标签、双层标签MPLS报文中的栈顶标签进行交换的示例。
图1-14 标签交换动作的两种情形
当MPLS报文离开MPLS域时,Egress节点将MPLS报文外层的标签剥离掉,使后续的报文转发按照IP路由进行(当弹出标签后报文中无标签时,如图1-15中的上图所示),或者按照余下的标签进行(当弹出标签后报文仍有其他标签时,如图1-15中的下图所示)。也可以利用PHP(Penultimate Hop Popping,倒数第二跳弹出)特性,在倒数第二跳节点处将标签弹出,减少最后一跳的负担,使最后一跳节点直接进行IP路由转发或者下一层标签转发。
图1-15 标签弹出动作的两种情形
默认情况下,华为设备支持PHP特性,支持PHP的Egress节点分配给倒数第二跳节点的标签值为3。
以下以支持PHP的LSP为例,说明MPLS报文的基本转发过程。在单纯的LDP LSP隧道环境下,MPLS报文最多仅带一层MPLS标签,从上游节点进入本地节点的入接口时携带的是上游节点分配给该FEC的出标签(也是本地节点对应的入标签),从本地节点出接口向下游节点发送时携带的是本地节点分配给对应FEC的出标签。
下面举一个关于以上介绍的几种标签动作应用于MPLS报文转发的示例。如图1-16所示,MPLS标签已分发完成,建立了一条LSP,其目的地址为4.4.4.2/32,MPLS报文在转发过程中的标签动作如下:
(1)Ingress节点收到目的地址为4.4.4.2的IP报文后,首先根据FIB找到对应的下一跳,发现下一跳是LSR标签设备(如果发现下一跳是IP设备时会直接按FIB表项进行IP转发),并且因为本节点是入节点,所以在进行报文转发前需要进行标签压入动作,需压入的标签是根据FEC 4.4.4.2与标签的映射关系找到的(为Z,作为出标签),然后把MPLS报文从压入的标签所映射的出接口转发出去。
图1-16 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。