MPLS转发概要说明
在具有MPLS转发功能的网络环境中,MPLS数据转发大概可以用一下这张图来说明:
其中FIB(Forwarding Information Base)为传统IP路由表,负责IP报文转发;LFIB(Label Forwarding Information Base)为标签转发表,负责MPLS报文转发。路由选择模块一般为OSPF、ISIS等动态路由选择协议,负责生成IP路由表;MPLS信令模块一般为LDP、RSVP协议,负责每个MPLS节点的标签信息库的生成。
在MPLS-TP体系中,只是在IP/MPLS的基础上去掉了IP三层部分,再加上OAM等功能,而转发机制并没有变,因此无需重新定义IP/MPLS已经提供的功能,只需沿用已经定义好的MPLS/PWE3数据平面的转发功能。因此在PTN等MPLS-TP设备环境中,上层的IP数据转发可以不予考虑,只用考虑MPLS转发平面。
MPLS-TP数据转发过程说明
在MPLS-TP体系中,数据转发涉及到3张表的维护:NHLFE、FTN和ILM。下面分别进行说明。
NHLFE(Next Hop Label Forwarding Entry):下一跳标签转发单元。这张表维护了MPLS数据包下一跳该怎样走的相关信息,在标签交换中,报文的下一跳总是取自于该表。NHLFE描述了对标签的具体操作、报文的出标签、报文出接口等相关信息。每个LSR上都要维护NHLFE,不管是LER节点还是中间的P节点。
FTN(FEC to NHLFE):FEC到NHLFE映射。这张表只在LSP的入节点,即LER上维护,用于完成对相关FEC到NHLFE的映射,对不带标签的报文打上相关标签。当一个不带标签的报文进来后,首先分析其IP头或者二层报文头,来决定其FEC(在IP报文中,FEC通常为IP地址,在二层报文中通常为vlan-id或者vc-id)。然后利用FTN将FEC映射到NHLFE中,用来进行报文的出标签、标签操作和决定往何处发送该报文。
ILM(Incoming Loabel Map):入标签映射。这张表只在LSP的中间P节点上维护,LSP的入节点不维护该表。当LSR收到带标签的报文后,要利用ILM将报文映射到NHLFE,来决定该标签报文的标签操作和下一跳地址。
在这三张表结构的中间还有一个结构XC(cross-connect),用来将FTN和ILM链接到相关NHLFE中。在每个FTN和ILM节点中都要有一个XC指针指向对应的NHLFE,用来快速查找。
下面用一个具体的例子来说明:
现在二层报文从LSRA到LSRC,LSRA为该LSP的ingress,LSRC为该LSP的egress,LSRB负责中间的标签交换。现在已经在三个节点上分别通过静态配置的方法配好了标签转发表。当报文到达LSRA时,LSRA分析二层报文头中的vlan-id,利用FTN映射到NHLFE,打上入标签,然后从对应出接口发送出去。则在LSRA上应该有以下信息:
当报文到达LSRB后,LSRB检查报文头,发现是带标签的报文,因此利用ILM将入标签映射到NHLFE中,查找对应的下一跳、出接口、出标签和标签操作,完成标签交换后再发送给LSRC。在LSRB上应该有以下信息:
当报文到达LSRC后,LSRC检查报文头,发现是带标签的报文,因此利用ILM将入标签映射到NHLFE中,发现是栈底标签,因此弹出标签,然后按照二层转发的过程将报文从相关接口发送出去。在LSRC上应该有以下信息:
在映射的时候,FTN和ILM都是通过内部的XC将FEC和入标签链接到NHLFE,出标签和下一跳都是取自于NHLFE。
MPLS-TP数据转发平面设计
(1)MPLS-TP数据转发应包含以下几个元素:
一张全局的FTN表。转发平面利用这张表处理不带标签的报文。为了保证查询效率,FTN应该用Ptree、AVL等树形结构建立,每个树节点的key值应为对应的FEC。每个FTN表节点应至少包含以下内容:
ftn_ix。全局唯一的ftn索引号
fec_prefix。FTN对应的FEC。
out_lable。出标签,也就是要给不带标签报文打上的标签。
out_ifp_ix。出接口索引号,指明标签报文从哪个接口出去。
opcode。标签操作方式。
xc。XC指针,用来指明已经链接好的XC。
lsp_id。隧道ID,用在PWE3业务中,指明外层隧道标签所经过lsp的隧道ID号。
ILM表。一张ILM表对应一个标签空间,因此如果LSR上的所有接口都共用同一个标签空间,则只需创建一张ILM表。为了保证查询效率,ILM表也应该用AVL等树形结构存储,每个树节点的key值为in_lable和in_ifp_ix 。每个ILM表节点应至少包含以下内容:
ilm_ix。唯一的ilm索引号。
in_lable。入标签。
in_ifp_ix。入接口索引号。
out_lable。出标签,用来与入标签进行交换。
out_ifp_ix。出接口索引号,指明标签报文从哪个接口发送出去。
opcode。标签操作方式。
xc。XC指针,用来指明已经链接好的XC。
lsp_id。隧道ID,用在PWE3业务中,指明外层隧道标签所经过lsp的隧道ID号。
NHLFE表。每个MPLS报文的出标签和下一跳都从NHLFE中获取,也是一张表对应一个标签空间。NHLFE可以用树形结构来存储,也可以只用数组来存储,因为每个ftn和ilm都有对应nhlfe的xc索引号,因此直接用数组来查询也较快。每个NHLFE表节点至少包含以下内容:
nhlfe_ix。唯一的nhlfe索引号。
xc_ix。对应XC的索引号。
out_lable。出标签。
out_ifp_ix。出接口索引号。
opcode。标签操作方式。
refcount。引用计数,一个nhlfe表项可能被多个ftn和ilm引用,因此需指定一个引用计数。
XC(cross-connect)。XC用来将FTN和ILM与对应的NHLFE链接起来,应至少包含以下内容:
xc_ix。唯一的xc索引号。
nhlfe_ix。对应的nhlfe索引号。
in_label。入标签。
in_ifp_ix。入接口索引号。
refcount。引用计数。
(2)标签操作方式。为了转发需要和方便,应定义以下标签操作方式:
PUSH。当LSR在FTN表项中发现这个操作后,MPLS转发平面会创建一个标签,然后放到二层报文头之后
POP。当LSR在ILM表项中发现这个操作后,MPLS转发平面会从MPLS报文中弹出相关标签。如果此标签有栈底标识,则按照一般IP或者二层转发流程转发该报文。
SWAP。当LSR在ILM表项中发现这个操作后,MPLS转发平面会将顶层标签替换成一个新的出标签,然后按照MPLS转发方式发送该报文。
以上三种为最基本的操作,必须定义。以下的几种操作是为了后续的功能添加方便而制定,可提出来先参照一下。
POP_FOR_VC。当LSR在ILM表项中发现这个操作后,MPLS转发平面会从标签栈中弹出指定标签。此时这个标签必定为栈底标签,然后可以按照ILM表项中指定的出接口将已经不带标签的报文发送出去。
PUSH_FOR_VC。当LSR在FTN表项中发现这个操作后,MPLS转发平面会在以太网报文上创建标签。
SWAP_AND_LOOKUP。这个操作是在ILM上增加,为的是给已经带标签的报文上再打一层标签。
(3)MPLS报文转发流程。根据RFC3813提供的MIB,可以定义出标签报文的以下操作步骤,而且按照RFC3813提供的网管数据,可以实现从网管配置静态标签转发的需求。
不带标签的报文:
如果报文指定了cross-connect索引号,则查找对应的FTN进行标签操作。
如果报文指定了隧道索引,则根据隧道索引查找对应的FTN进行标签操作。
如果报文指定了出接口为对应到一条LSP隧道的虚拟网接口,则查找对应的FTN进行标签操作。
带标签的报文:
根据入接口确定标签空间。标签空间分为两种,一种是基于端口的标签空间,另一种是全局的标签空间。对于基于端口的标签空间,每个标签值只在每一个接口上有唯一性,在这种模式下报文的转发就不能单单根据标签,而应该同时根据入接口和标签。对于基于全局的标签空间,在这种情况下每个标签值并非是在每一个接口唯一,而是在整个LSR中唯一,这时报文的转发就可以纯粹根据标签而不考虑入接口;
根据标签空间、入接口和栈顶标签来查找ILM;
弹出栈顶标签;
根据ILM来查找对应的XC和NHLFE;
根据NHLFE中的内容压入新的栈顶标签,以及NHLFE中的下一跳将报文发送出去。
如果XC和NHLFE对应的出接口为0,则说明这个节点为LSP的egress出节点,需首先弹出栈底标签,然后将报文交给普通IP或者二层转发流程处理。