MPLS
MPLS概述
MPLS(Multiprotocol Label Switching)多协议标签交换协议:MPLS以标签交换替代IP转发,标签是一个短而定长的、只具有本地意义的连接标识符。
MPLS位于TCP/IP协议栈中的链路层和网络层之间,用于向IP层提供连接服务,同时又从链路层得到服务。
MPLS实际是一种隧道技术,这种技术不仅支持高层协议与业务,而且在一定程度上可以保证信息传输的安全性。
MPLS是一种分类转发技术,将具有相同转发处理方式的报文分为一类,称该类报文为一个转发等价类FEC。
MPLS基本原理
MPLS网络模型
LER(label edge router):标签边缘路由器,用于MPLS标签的压入或弹出。
LSR(label switch router):标签交换路由器,用于MPLS标签的交换。
LSP(label switch path):标签交换路径,报文在MPLS网络中经过的路径。
FEC(forwarding equivalent class):转发同价类,具有相同转发处理方式的报文,在MPLS网络中到达同一目的地址的报文就是一个FEC。
MPLS体系结构
控制平面:负责产生和维护路由信息及标签信息。
RIB(routing information base):路由信息表,由IP路由协议生成,用于选择路由。
LDP(label distribution protocol):标签分发协议,负责标签的分配、标签转发信息表的建立、标签交换路径的建立、拆除等工作。
LIB(label information base):标签信息表,由标签分发协议生成,用于管理标签信息。
转发平面:即数据平面,负责普通IP报文的转发以及带MPLS标签报文的转发。
FIB(forwarding information base):转发信息表,从RIB中提取必要的路由信息生成,负责普通IP报文的转发。
LFIB(label forwarding information base):标签转发信息表,由标签分发协议建立LFIB,负责带MPLS标签报文的转发。
MPLS数据报文结构
MPLS标签是在报文的二层头和三层头之间插入一个MPLS头。
MPLS头部长度为32bit。
LABEL:用于报文转发,如标签为3表示隐式空标签用于倒数第二跳弹出则此时将报文标签去掉。
EXP:通常用来承载IP报文中的优先级。
S:标识栈底表明是否是最后一个标签(MPLS支持标签嵌套),值为1表示是栈底是最后一个标签。
TTL:防止报文环路。
MPLS标签嵌套
这里的label1、label2、label3分别表示一个MPLS头部,通过每个MPLS头部的S标识来判断是否是栈底(最后一个标签)。
标签嵌套一般应用于MPLS VPN、MPLS TE。
LSP标签交换路径建立的方式
静态LSP
静态LSP:通过手工的方式为各个转发等价类分配标签建立转发隧道。
静态LSP特点:不需要交互控制报文,资源消耗小。不能根据网络拓扑的变化动态调整,需要认为干预。
配置静态LSP时需要遵循的原则是:前一节点出标签的值等于下一节点入标签的值。
动态LSP
动态LSP:通过标签发布协议动态建立转发隧道。
动态LSP特点:组网配置简单,易于管理和维护。支持基于路由动态建立LSP,网络拓扑变化时能及时反映网络状况。
标签的发布方式
DU(downstream unsolicited):下游自主方式,对于一个到达同一目的地址报文的分组,LSR无需从上游获得标签请求消息即可进行标签的分配和分发。
DOD(downstream on demand):下游按需方式,对于一个到达同一目的地址报文的分组,LSR获得标签请求信息之后才进行标签的分配和分发。
注意:华为设备默认采用DU方式。
标签的分配控制方式
independent(独立标签分配控制方式):本地LSR可以自主的分配一个标签绑定到某个IP分组,并通告给上游LSR,无需等待下游的标签。
ordered(有序标签控制方式):只有当该LSR已经有此IP分组的下一跳的标签,或者该LSR就是该IP分组的出节点时,该LSR才可以向上游发送此IP分组的标签。
注意:华为设备默认采用ordered方式。
标签的保持方式
liberal(自由标签保持方式):对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留。
能迅速重建LSP,但需要更多的内存和标签空间。
conservative(保守标签保持方式):对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留。
节省内存和标签空间,但重建LSP比较慢。
注意:华为默认采用自由标签保持方式。
LDP建立LSP过程
如上图所示,LDP建立LSP的过程如下:
1.RTD上存在100.1.1.1/32的主机路由,因为RTD是egress节点,所以直接向上游邻居RTC发布100.1.1.1/32与标签的绑定关系。
2.RTC收到下游邻居RTD分配的100.1.1.1/32与标签的绑定关系后,将标签记录在自己的LIB表中,并向上游邻居RTB发布100.1.1.1/32与标签的绑定关系,同时RTC查看自己IP路由表中到达100.1.1.1/32的下一跳是否是RTD,如果IP路由表中的下一跳是RTD,则RTC使用RTD分配的标签封装到达100.1.1.1/32的数据;如果IP路由表中的下一跳不是RTD,则RTC保留RTD分配的标签作为备用标签。
3.RTB收到下游邻居RTC分配的100.1.1.1/32与标签的绑定关系后,执行与RTC相同的动作。
4.RTA收到下游邻居RTB分配的100.1.1.1/32与标签的绑定关系后,查看自己IP路由表中到达100.1.1.1/32的下一跳是否是RTB,如果IP路由表中的下一跳是RTB,则RTA使用RTB分配的标签封装到达100.1.1.1/32的数据;如果IP路由表中的下一跳不是RTB,则RTA保留RTB分配的标签作为备用。因为RTA为ingress,最终到达100.1.1.1/32的LSP完成建立。
MPLS数据转发过程
如图所示,MPLS数据转发过程如下:
1.RTA上收到访问100.1.1.1/32的数据包,如果数据包为普通的IP报文,则查找FIB表,因为tunnel ID为非0X0,封装已经分配的标签1027进行MPLS转发;如果数据包为带标签的报文,查找LFIB表,封装已经分配的标签1027进行MPLS转发。
2.RTB收到RTA发送的带标签1027的报文,查找LFIB表,封装已经分配的出标签1026进行MPLS转发给RTC。
3.RTC收到RTB发送的带标签1026的报文,查找LFIB表,封装已经分配的出标签1025进行MPLS转发给RTD。
4.RTD收到RTC发送的带标签1025的报文,查找LFIB表,出标签为null,表明数据包已经到达egress节点,所以路由器将数据包的标签信息去掉,并对数据包进行三层处理,查找IP路由表发现100.1.1.1/32的路由是自己本地的路由,根据IP路由表中的出接口进行IP数据的封装并转发。
PHP倒数第二跳弹出
PHP(penultimate hop popping),使用隐式空标签3,执行弹出标签的动作,并将数据包发给下游路由器。
LDP的基本配置
执行命令mpls lsr-id lsr-id,配置本节点的LSR ID;执行命令mpls,使能全局MPLS功能,并进入MPLS视图;
执行命令mpls ldp,使能全局的LDP功能,并进入MPLS-LDP视图;
执行命令interface interface-type interface-number,进入需要建立LDP会话的接口视图;
执行命令mpls,使能接口的MPLS能力;
执行命令mpls ldp,使能接口的MPLS LDP能力。