• MPLS转发概要说明

在具有MPLS转发功能的网络环境中,MPLS数据转发大概可以用一下这张图来说明:

wKiom1SH9p7ykVHgAAFX-K4hKCs167.jpg

    其中FIB(Forwarding Information Base)为传统IP路由表,负责IP报文转发;LFIB(Label Forwarding Information Base)为标签转发表,负责MPLS报文转发。路由选择模块一般为OSPFISIS等动态路由选择协议,负责生成IP路由表;MPLS信令模块一般为LDPRSVP协议,负责每个MPLS节点的标签信息库的生成。

    在MPLS-TP体系中,只是在IP/MPLS的基础上去掉了IP三层部分,再加上OAM等功能,而转发机制并没有变,因此无需重新定义IP/MPLS已经提供的功能,只需沿用已经定义好的MPLS/PWE3数据平面的转发功能。因此在PTNMPLS-TP设备环境中,上层的IP数据转发可以不予考虑,只用考虑MPLS转发平面。


  • MPLS-TP数据转发过程说明

MPLS-TP体系中,数据转发涉及到3张表的维护:NHLFEFTNILM。下面分别进行说明。

  • NHLFE(Next Hop Label Forwarding Entry):下一跳标签转发单元。这张表维护了MPLS数据包下一跳该怎样走的相关信息,在标签交换中,报文的下一跳总是取自于该表。NHLFE描述了对标签的具体操作、报文的出标签、报文出接口等相关信息。每个LSR上都要维护NHLFE,不管是LER节点还是中间的P节点。

  • FTN(FEC to NHLFE)FECNHLFE映射。这张表只在LSP的入节点,即LER上维护,用于完成对相关FECNHLFE的映射,对不带标签的报文打上相关标签。当一个不带标签的报文进来后,首先分析其IP头或者二层报文头,来决定其FEC(在IP报文中,FEC通常为IP地址,在二层报文中通常为vlan-id或者vc-id)。然后利用FTNFEC映射到NHLFE中,用来进行报文的出标签、标签操作和决定往何处发送该报文。

  • ILM(Incoming Loabel Map):入标签映射。这张表只在LSP的中间P节点上维护,LSP的入节点不维护该表。当LSR收到带标签的报文后,要利用ILM将报文映射到NHLFE,来决定该标签报文的标签操作和下一跳地址。

  • 在这三张表结构的中间还有一个结构XC(cross-connect),用来将FTNILM链接到相关NHLFE中。在每个FTNILM节点中都要有一个XC指针指向对应的NHLFE,用来快速查找。

下面用一个具体的例子来说明:

wKioL1SH-GDB8t_yAABgZdKcDgE189.jpg

现在二层报文从LSRALSRCLSRA为该LSPingressLSRC为该LSPegressLSRB负责中间的标签交换。现在已经在三个节点上分别通过静态配置的方法配好了标签转发表。当报文到达LSRA时,LSRA分析二层报文头中的vlan-id,利用FTN映射到NHLFE,打上入标签,然后从对应出接口发送出去。则在LSRA上应该有以下信息:

wKiom1SH-AmDKOiTAACon7DNetc419.jpg

当报文到达LSRB后,LSRB检查报文头,发现是带标签的报文,因此利用ILM将入标签映射到NHLFE中,查找对应的下一跳、出接口、出标签和标签操作,完成标签交换后再发送给LSRC。在LSRB上应该有以下信息:

wKioL1SH-LiTaEjzAACuO9UWmQs322.jpg

当报文到达LSRC后,LSRC检查报文头,发现是带标签的报文,因此利用ILM将入标签映射到NHLFE中,发现是栈底标签,因此弹出标签,然后按照二层转发的过程将报文从相关接口发送出去。在LSRC上应该有以下信息:

wKiom1SH-DizjWNxAACbnGicfAc787.jpg

在映射的时候,FTNILM都是通过内部的XCFEC和入标签链接到NHLFE,出标签和下一跳都是取自于NHLFE

 

  • MPLS-TP数据转发平面设计

1MPLS-TP数据转发应包含以下几个元素:

  • 一张全局的FTN表。转发平面利用这张表处理不带标签的报文。为了保证查询效率,FTN应该用PtreeAVL等树形结构建立,每个树节点的key值应为对应的FEC。每个FTN表节点应至少包含以下内容:

  • ftn_ix。全局唯一的ftn索引号

  • fec_prefixFTN对应的FEC

  • out_lable。出标签,也就是要给不带标签报文打上的标签。

  • out_ifp_ix。出接口索引号,指明标签报文从哪个接口出去。

  • opcode。标签操作方式。

  • xcXC指针,用来指明已经链接好的XC

  • lsp_id。隧道ID,用在PWE3业务中,指明外层隧道标签所经过lsp的隧道ID号。

  • ILM表。一张ILM表对应一个标签空间,因此如果LSR上的所有接口都共用同一个标签空间,则只需创建一张ILM表。为了保证查询效率,ILM表也应该用AVL等树形结构存储,每个树节点的key值为in_lablein_ifp_ix 。每个ILM表节点应至少包含以下内容:

  • ilm_ix。唯一的ilm索引号。

  • in_lable。入标签。

  • in_ifp_ix。入接口索引号。

  • out_lable。出标签,用来与入标签进行交换。

  • out_ifp_ix。出接口索引号,指明标签报文从哪个接口发送出去。

  • opcode。标签操作方式。

  • xcXC指针,用来指明已经链接好的XC

  • lsp_id。隧道ID,用在PWE3业务中,指明外层隧道标签所经过lsp的隧道ID号。

  • NHLFE表。每个MPLS报文的出标签和下一跳都从NHLFE中获取,也是一张表对应一个标签空间。NHLFE可以用树形结构来存储,也可以只用数组来存储,因为每个ftnilm都有对应nhlfexc索引号,因此直接用数组来查询也较快。每个NHLFE表节点至少包含以下内容:

  • nhlfe_ix。唯一的nhlfe索引号。

  • xc_ix。对应XC的索引号。

  • out_lable。出标签。

  • out_ifp_ix。出接口索引号。

  • opcode。标签操作方式。

  • refcount。引用计数,一个nhlfe表项可能被多个ftnilm引用,因此需指定一个引用计数。

  • XC(cross-connect)XC用来将FTNILM与对应的NHLFE链接起来,应至少包含以下内容:

  • xc_ix。唯一的xc索引号。

  • nhlfe_ix。对应的nhlfe索引号。

  • in_label。入标签。

  • in_ifp_ix。入接口索引号。

  • refcount。引用计数。

   

2)标签操作方式。为了转发需要和方便,应定义以下标签操作方式:

  • PUSH。当LSRFTN表项中发现这个操作后,MPLS转发平面会创建一个标签,然后放到二层报文头之后

  • POP。当LSRILM表项中发现这个操作后,MPLS转发平面会从MPLS报文中弹出相关标签。如果此标签有栈底标识,则按照一般IP或者二层转发流程转发该报文。

  • SWAP。当LSRILM表项中发现这个操作后,MPLS转发平面会将顶层标签替换成一个新的出标签,然后按照MPLS转发方式发送该报文。

以上三种为最基本的操作,必须定义。以下的几种操作是为了后续的功能添加方便而制定,可提出来先参照一下。

  • POP_FOR_VC。当LSRILM表项中发现这个操作后,MPLS转发平面会从标签栈中弹出指定标签。此时这个标签必定为栈底标签,然后可以按照ILM表项中指定的出接口将已经不带标签的报文发送出去。

  • PUSH_FOR_VC。当LSRFTN表项中发现这个操作后,MPLS转发平面会在以太网报文上创建标签。

  • SWAP_AND_LOOKUP。这个操作是在ILM上增加,为的是给已经带标签的报文上再打一层标签。

 

3MPLS报文转发流程。根据RFC3813提供的MIB,可以定义出标签报文的以下操作步骤,而且按照RFC3813提供的网管数据,可以实现从网管配置静态标签转发的需求。

  • 不带标签的报文:

  • 如果报文指定了cross-connect索引号,则查找对应的FTN进行标签操作。

  • 如果报文指定了隧道索引,则根据隧道索引查找对应的FTN进行标签操作。

  • 如果报文指定了出接口为对应到一条LSP隧道的虚拟网接口,则查找对应的FTN进行标签操作。

  • 带标签的报文:

  • 根据入接口确定标签空间。标签空间分为两种,一种是基于端口的标签空间,另一种是全局的标签空间。对于基于端口的标签空间,每个标签值只在每一个接口上有唯一性,在这种模式下报文的转发就不能单单根据标签,而应该同时根据入接口和标签。对于基于全局的标签空间,在这种情况下每个标签值并非是在每一个接口唯一,而是在整个LSR中唯一,这时报文的转发就可以纯粹根据标签而不考虑入接口;

  • 根据标签空间、入接口和栈顶标签来查找ILM

  • 弹出栈顶标签;

  • 根据ILM来查找对应的XCNHLFE

  • 根据NHLFE中的内容压入新的栈顶标签,以及NHLFE中的下一跳将报文发送出去。

  • 如果XCNHLFE对应的出接口为0,则说明这个节点为LSPegress出节点,需首先弹出栈底标签,然后将报文交给普通IP或者二层转发流程处理。