多协议标签交换MPLS(Multiprotocol Label Switching)是一种IP(Internet Protocol)骨干网技术。MPLS在无连接的IP网络上引入面向连接的标签交换概念,将第三层路由技术和第二层交换技术相结合,充分发挥了IP路由的灵活性和二层交换的简捷性。
MPLS起源于IPv4(Internet Protocol version 4),其核心技术可扩展到多种网络协议,包括IPv6(Internet Protocol version 6)、IPX(Internet Packet Exchange)和CLNP(Connectionless Network Protocol)等。MPLS中的“Multiprotocol”指的就是支持多种网络协议。
由此可见,MPLS并不是一种业务或者应用,它实际上是一种隧道技术。这种技术不仅支持多种高层协议与业务,而且在一定程度上可以保证信息传输的安全性。
MPLS网络的典型结构如下图所示。MPLS基于标签进行转发,下图中进行MPLS标签交换和报文转发的网络设备称为标签交换路由器LSR(Label Switching Router);由LSR构成的网络区域称为MPLS域(MPLS Domain)。位于MPLS域边缘、连接其他网络的LSR称为边缘路由器LER(Label Edge Router),区域内部的LSR称为核心LSR(Core LSR)。
IP报文进入MPLS网络时,MPLS入口的LER分析IP报文的内容并且为这些IP报文添加合适的标签,所有MPLS网络中的LSR根据标签转发数据。当该IP报文离开MPLS网络时,标签由出口LER弹出。
IP报文在MPLS网络中经过的路径称为标签交换路径LSP(Label Switched Path)。LSP是一个单向路径,与数据流的方向一致。
如上图,LSP的入口LER称为入节点(Ingress);位于LSP中间的LSR称为中间节点(Transit);LSP的出口LER称为出节点(Egress)。一条LSP可以有0个、1个或多个中间节点,但有且只有一个入节点和一个出节点。
根据LSP的方向,MPLS报文由Ingress发往Egress,则Ingress是Transit的上游节点,Transit是Ingress的下游节点。同理,Transit是Egress上游节点,Egress是Transit的下游节点。
MPLS的体系结构如下图所示,它由控制平面(Control Plane)和转发平面(Forwarding Plane)组成。
MPLS将具有相同特征的报文归为一类,称为转发等价类FEC(Forwarding Equivalence Class)。属于相同FEC的报文在转发过程中被LSR以相同方式处理。
FEC可以根据源地址、目的地址、源端口、目的端口、VPN等要素进行划分。例如,在传统的采用最长匹配算法的IP转发中,到同一条路由的所有报文就是一个转发等价类。
标签(Label)是一个短而定长的、只具有本地意义的标识符,用于唯一标识一个分组所属的FEC。在某些情况下,例如要进行负载分担,对应一个FEC可能会有多个入标签,但是一台设备上,一个标签只能代表一个FEC。
MPLS报文与普通的IP报文相比增加了MPLS标签信息,MPLS标签的长度为4个字节。MPLS标签封装在链路层和网络层之间,可以支持任意的链路层协议。MPLS标签的封装结构如下图所示:
标签共有4个字段:
Label:20bit,标签值域。
Exp:3bit,用于扩展。现在通常用做CoS(Class of Service),当设备阻塞时,优先发送优先级高的报文。
S:1bit,栈底标识。MPLS支持多层标签,即标签嵌套。S值为1时表明为最底层标签。
TTL:8bit,和IP报文中的TTL(Time To Live)意义相同。
TTL:8bit,和IP报文中的TTL(Time To Live)意义相同。
标签栈(Label Stack)是指标签的排序集合。靠近二层首部的标签称为栈顶MPLS标签或外层MPLS标签(Outer MPLS label);靠近IP首部的标签称为栈底MPLS标签或内层MPLS标签(Inner MPLS label)。理论上,MPLS标签可以无限嵌套。目前MPLS标签嵌套主要应用在MPLS VPN、TE FRR(Traffic Engineering Fast ReRoute)中。
标签栈按后进先出方式组织标签,从栈顶开始处理标签。
标签空间就是指标签的取值范围。标签空间划分如下:
0~15:特殊标签。
16~1023:静态LSP和静态CR-LSP(Constraint-based Routed Label Switched Path)共享的标签空间。
1024及以上:LDP、RSVP-TE(Resource Reservation Protocol-Traffic Engineering)、MP-BGP(MultiProtocol Border Gateway Protocol)等动态信令协议的标签空间。
特殊标签表:
标签值 | 含义 | 描述 |
---|---|---|
0 | IPv4 Explicit NULL Label | 表示该标签必须被弹出(即标签被剥掉),且报文的转发必须基于IPv4。如果出节点分配给倒数第二跳节点的标签值为0,则倒数第二跳LSR需要将值为0的标签正常压入报文标签值顶部,转发给最后一跳。最后一跳发现报文携带的标签值为0,则将标签弹出。 |
1 | Router Alert Label | 只有出现在非栈底时才有效。类似于IP报文的“Router Alert Option”字段,节点收到Router Alert Label时,需要将其送往本地软件模块进一步处理。实际报文转发由下一层标签决定。如果报文需要继续转发,则节点需要将Router Alert Label压回标签栈顶。 |
2 | IPv6 Explicit NULL Label | 表示该标签必须被弹出,且报文的转发必须基于IPv6。如果出节点分配给倒数第二跳节点的标签值为2,则倒数第二跳节点需要将值为2的标签正常压入报文标签值顶部,转发给最后一跳。最后一跳发现报文携带的标签值为2,则直接将标签弹出。 |
3 | Implicit NULL Label | 倒数第二跳LSR进行标签交换时,如果发现交换后的标签值为3,则将标签弹出,并将报文发给最后一跳。最后一跳收到该报文直接进行IP转发或下一层标签转发。 |
4~13 | 保留 | - |
14 | OAM Router Alert Label | MPLS OAM(Operation Administration & Maintenance)通过发送OAM报文检测和通告LSP故障。OAM报文使用MPLS承载。OAM报文对于Transit LSR和倒数第二跳LSR(penultimate LSR)是透明的。 |
15 | 保留 | - |
MPLS需要为报文事先分配好标签,建立一条LSP,才能进行报文转发。LSP分为静态LSP和动态LSP两种。
静态LSP是用户通过手工为各个转发等价类分配标签而建立的。由于静态LSP各节点上不能相互感知到整个LSP的情况,因此静态LSP是一个本地的概念。
静态LSP不使用标签发布协议,不需要交互控制报文,因此消耗资源比较小,适用于拓扑结构简单并且稳定的小型网络。但通过静态方式分配标签建立的LSP不能根据网络拓扑变化动态调整,需要管理员干预。
配置静态LSP时,管理员需要为各LSR手工分配标签,需要遵循的原则是:前一节点出标签的值等于下一个节点入标签的值。
动态LSP的标签发布协议
动态LSP通过标签发布协议动态建立。标签发布协议是MPLS的控制协议(也可称为信令协议),负责FEC的分类、标签的分发以及LSP的建立和维护等一系列操作。
动态LSP的基本建立过程
标签由下游LSR分配,按从下游到上游的方向分发。如下图,由下游LSR在IP路由表的基础上进行FEC的划分,并根据FEC分配标签,通告给上游的LSR,以便建立标签转发表和LSP。
在MPLS基本转发过程中涉及的相关概念如下:
标签操作类型包括标签压入(Push)、标签交换(Swap)和标签弹出(Pop),它们是标签转发的基本动作。
Push:当IP报文进入MPLS域时,MPLS边界设备在报文二层首部和IP首部之间插入一个新标签;或者MPLS中间设备根据需要,在标签栈顶增加一个新的标签(即标签嵌套封装)。
Swap:当报文在MPLS域内转发时,根据标签转发表,用下一跳分配的标签,替换MPLS报文的栈顶标签。
Pop:当报文离开MPLS域时,将MPLS报文的标签剥掉。
在最后一跳节点,标签已经没有使用价值。这种情况下,可以利用倒数第二跳弹出特性PHP(Penultimate Hop Popping),在倒数第二跳节点处将标签弹出,减少最后一跳的负担。最后一跳节点直接进行IP转发或者下一层标签转发。
默认情况下,设备支持PHP特性,支持PHP的Egress节点分配给倒数第二跳节点的标签值为3。
以支持PHP的LSP为例,说明MPLS基本转发过程。
如上图所示,MPLS标签已分发完成,建立了一条LSP,其目的地址为4.4.4.2/32。则MPLS基本转发过程如下:
在MPLS详细转发过程中涉及的相关概念如下:
Tunnel ID
为了给使用隧道的上层应用(如VPN、路由管理)提供统一的接口,系统自动为隧道分配了一个ID,也称为Tunnel ID。该Tunnel ID的长度为32比特,只是本地有效。
NHLFE
下一跳标签转发表项NHLFE(Next Hop Label Forwarding Entry)用于指导MPLS报文的转发。
NHLFE包括:Tunnel ID、出接口、下一跳、出标签、标签操作类型等信息。
FEC到一组NHLFE的映射称为FTN(FEC-to-NHLFE)。通过查看FIB表中Tunnel ID值不为0x0的表项,能够获得FTN的详细信息。FTN只在Ingress存在。
ILM
入标签到一组下一跳标签转发表项的映射称为入标签映射ILM(Incoming Label Map)。
ILM包括:Tunnel ID、入标签、入接口、标签操作类型等信息。
ILM在Transit节点的作用是将标签和NHLFE绑定。通过标签索引ILM表,就相当于使用目的IP地址查询FIB,能够得到所有的标签转发信息。
MPLS的详细转发过程如上图所示:
当IP报文进入MPLS域时,首先查看FIB表,检查目的IP地址对应的Tunnel ID值是否为0x0。
在MPLS转发过程中,FIB、ILM和NHLFE表项是通过Tunnel ID关联的。
Ingress的处理:通过查询FIB表和NHLFE表指导报文的转发。
Transit的处理:通过查询ILM表和NHLFE表指导MPLS报文的转发。
Egress的处理:通过查询ILM表指导MPLS报文的转发或查询路由表指导IP报文转发。
MPLS对TTL的处理包括MPLS对TTL的处理模式和ICMP响应报文这两个方面。
MPLS标签中包含一个8比特的TTL字段,其含义与IP头中的TTL域相同。MPLS对TTL的处理除了用于防止产生路由环路外,也用于实现Traceroute功能。
RFC3443中定义了两种MPLS对TTL的处理模式:Uniform和Pipe。缺省情况下,MPLS对TTL的处理模式为Uniform。
Uniform模式
IP报文经过MPLS网络时,在入节点,IP TTL减1映射到MPLS TTL字段,此后报文在MPLS网络中按照标准的TTL处理方式处理。在出节点将MPLS TTL减1后映射到IP TTL字段。如下图所示:
Pipe模式
在入节点,IP TTL值减1,MPLS TTL字段为固定值,此后报文在MPLS网络中按照标准的TTL处理方式处理。在出节点会将IP TTL字段的值减1。即IP分组经过MPLS网络时,无论经过多少跳,IP TTL只在入节点和出节点分别减1。如下图所示:
在MPLS网络中,当LSR收到TTL为1的含有标签的MPLS报文时,LSR生成ICMP的TTL超时消息。
通常情况下,收到的MPLS报文只带一层标签时,LSR可以采用第一种方式回应TTL超时消息;收到的MPLS报文包含多层标签时,LSR采用第二种方式回应TTL超时消息。
但是,在MPLS VPN中,ASBR(Autonomous System Boundary Router,自治系统边界路由器)和HoVPN组网应用中的SPE(Superstratum PE or Sevice Provider-end PE,上层PE或运营商侧PE),接收到的承载VPN报文的MPLS报文可能只有一层标签,此时,这些设备上并不存在到达报文发送者的路由,则采用第二种方法回应TTL超时消息。
在MPLS网络中,如果通过LSP转发数据失败,负责建立LSP的MPLS控制平面将无法检测到这种错误,加大了网络维护的难度。MPLS Ping/MPLS Tracert为用户提供了发现LSP错误、并及时定位失效节点的机制。
MPLS Ping主要用于检查LSP的连通性。MPLS Tracert在检查LSP的连通性的同时,还可以分析网络什么地方发生了故障。类似于普通IP的Ping/Tracert,MPLS Ping/MPLS Tracert使用MPLS回显请求(Echo Request)报文和MPLS回显应答(Echo Reply)报文检测LSP的可用性。这两种消息都以UDP报文格式发送,其中Echo Request的UDP端口号为3503,该端口号只有使能MPLS功能的设备才能识别。
MPLS Echo Request中携带需要检测的FEC信息,和其他属于此FEC的报文一样沿LSP发送,从而实现对LSP的检测。MPLS Echo Request报文通过MPLS转发给目的端,而MPLS Echo Reply报文则通过IP转发给源端。另外为了防止LSP断路时Echo Request进行IP转发,从而保证LSP的连通性测试,将Echo Request消息的IP头中目的地址设置为127.0.0.1/8(本机环回地址),IP头中的TTL值为1。
如上图,LSR_1上建立了一条目的地为LSR_4的LSP。从LSR_1对该LSP进行MPLS Ping时的处理如下:
从LSR_1对4.4.4.4/32进行MPLS Tracert时的处理如下:
通过上述步骤中返回携带下游信息的MPLS Echo Reply报文,在LSR_1上就获取了该LSP沿途每一个节点信息。
参考资料:华为HedEx文档