MPLS基础
基础简介
定义:多协议标签交换MPLS(Multiprotocol Label Switching)是一种IP骨干网技术。MPLS位于TCP/IP协议栈中的链路层和网络层之间,用于向IP层提供连接服务,同时又从链路层得到服务。
MPLS以标签交换替代IP转发,标签是一个短而定长的、只具有本地意义的连接标识符。MPLS在无连接的IP网络上引入面向连接的标签交换概念,将第三层路由技术和第二层交换技术相结合,充分发挥了IP路由的灵活性和二层交换的简捷性。
IP技术凭借技术简单和成本低廉实现快速发展,Internet数据海量增长。但由于硬件技术存在限制,基于最长匹配算法的IP技术必须使用软件查找路由,转发性能低下,因此IP技术的转发性能成为当时限制网络发展的瓶颈。
为了适应网络的发展,ATM(Asynchronous Transfer Mode)技术应运而生。ATM采用定长标签(即信元),并且只需要维护比路由表规模小得多的标签表,能够提供比IP路由方式高得多的转发性能。
然而,ATM协议相对复杂,且ATM网络部署成本高,这使ATM技术很难普及。多协议标签交换技术MPLS(Multiprotocol Label Switching)就是在这种背景下产生的。
MPLS最初是为了提高路由器的转发速度而提出的。与传统IP路由方式相比,它在数据转发时,只在网络边缘分析IP报文头,而不用在每一跳都分析IP报文头,节约了处理时间。
随着ASIC技术的发展,路由查找速度已经不是阻碍网络发展的瓶颈,这使得MPLS在提高转发速度方面不再具备明显的优势。但是MPLS支持多层标签和转发平面面向连接的特性,
使其在VPN(Virtual Private Network)、流量工程、QoS(Quality of Service)等方面得到广泛应用。
MPLS起源于IPv4,其核心技术可扩展到多种网络协议,包括IPv6、IPX(Internet Packet Exchange)和CLNP(Connectionless Network Protocol)等。MPLS中的“Multiprotocol”指的就是支持多种网络协议。
由此可见,MPLS并不是一种业务或者应用,它实际上是一种隧道技术。这种技术不仅支持多种高层协议与业务,而且在一定程度上可以保证信息传输的安全性。
MPLS不局限于任何特定的链路层协议,能够使用任意二层介质传输网络分组。
基本概念
1. 转发等价类,FEC(Forwarding Equivalence Class)
MPLS作为一种分类转发技术,将具有相同转发处理方式的分组归为一类,称为FEC。相同FEC的分组在MPLS网络中将获得完全相同的处理。
FEC的划分方式非常灵活,可以是以源地址、目的地址、源端口、目的端口、协议类型或VPN等为划分依据的任意组合。例如,在传统的采用最长匹配算法的IP转发中,到同一个目的地址的所有报文就是一个FEC。
2.标签(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)意义相同。
标签栈(Label Stack)是指标签的排序集合。如上图所示,靠近二层首部的标签称为栈顶MPLS标签或外层MPLS标签(Outer MPLS label);靠近IP首部的标签称为栈底MPLS标签或内层MPLS标签(Inner MPLS label)。
理论上,MPLS标签可以无限嵌套。目前MPLS标签嵌套主要应用在MPLS VPN中。标签栈按后进先出方式组织标签,从栈顶开始处理标签。
3. 标签交换路由器,LSR(标签交换路由器)
LSR是进行MPLS标签交换和报文转发的网络设备,也是MPLS网络中的基本元素。由LSR构成的网络区域称为MPLS域(MPLS Domain)。
位于MPLS域边缘、连接其他网络的LSR称为边缘路由器LER(Label Edge Router),区域内部的LSR称为核心LSR(Core LSR)。
4. 标签交换路径,LSP(Label Switched Path)
一个转发等价类在MPLS网络中经过的路径称为LSP。在一条LSP上,沿数据传送的方向,相邻的LSR分别称为上游LSR和下游LSR。
LSP在功能上与ATM和帧中继(Frame Relay)的虚电路相同,是从MPLS网络的入口到出口的一个单向路径。LSP中的每个节点由LSR组成。
5. 标签分发协议,LDP(Label Distribution Protocol)
LDP是MPLS的控制协议,它相当于传统网络中的信令协议,负责FEC的分类、标签的分配以及LSP的建立和维护等一系列操作。
MPLS可以使用多种标签发布协议,包括专为标签发布而制定的协议,例如:LDP、CR-LDP(Constraint-Based Routing using LDP,基于约束路由的LDP);
也包括现有协议扩展后支持标签发布的,例如:BGP、RSVP(Resource Reservation Protocol,资源预留协议)。同时,还可以手工配置静态LSP。
6. LSP隧道技术
MPLS支持LSP隧道技术。一条LSP的上游LSR和下游LSR,尽管它们之间的路径可能并不在路由协议所提供的路径上,但是MPLS允许在它们之间建立一条新的LSP。
这样上游LSR和下游LSR分别就是这条LSP的起点和终点。这时,上游LSR和下游LSR间的LSP就是LSP隧道,它避免了采用传统的网络层封装隧道。
如果隧道经由的路由与逐跳从路由协议中取得的路由一致,这种隧道就称为逐跳路由隧道(Hop-by-Hop Routed Tunnel);否则称为显式路由隧道(Explicitly Routed Tunnel)。
7. 多层标签栈
如果分组在超过一层的LSP隧道中传送,就会有多层标签,形成标签栈(Label Stack)。在每一隧道的入口和出口处,进行标签的入栈(PUSH)和出栈(POP)操作。
标签栈按照“后进先出”(Last-In-First-Out)方式组织标签,MPLS从栈顶开始处理标签。
MPLS对标签栈的深度没有限制。若一个分组的标签栈深度为m,则位于栈底的标签为1级标签,位于栈顶的标签为m级标签。未压入标签的分组可看作标签栈为空(即标签栈深度为零)的分组。
原理描述
1.基本结构
1)网络结构
MPLS网络的典型结构如下所示。
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的下游节点。
2)体系结构
MPLS的体系结构如下图所示,它由控制平面(Control Plane)和转发平面(Forwarding Plane)组成。
※控制平面:负责产生和维护路由信息以及标签信息。
– 路由信息表RIB(Routing Information Base):由IP路由协议(IP Routing Protocol)生成,用于选择路由。
– 标签分发协议LDP(Label Distribution Protocol):负责标签的分配、标签转发信息表的建立、标签交换路径的建立、拆除等工作。
– 标签信息表LIB(Label Information Base):由标签分发协议生成,用于管理标签信息。
※转发平面:即数据平面(Data Plane),负责普通IP报文的转发以及带MPLS标签报文的转发。
– 转发信息表FIB(Forwarding Information Base):从RIB提取必要的路由信息生成,负责普通IP报文的转发。
– 标签转发信息表LFIB(Label Forwarding Information Base):简称标签转发表,由标签分发协议在LSR上建立LFIB,负责带MPLS标签报文的转发。
2.MPLS标签的发布和转发
1)LSP 的建立
MPLS需要为报文事先分配好标签,建立一条LSP,才能进行报文转发。LSP的建立过程实际就是将FEC和标签进行绑定,在LSR上建立标签转发表的过程。LSP既可以通过手工配置的方式静态建立,也可以利用标签分发协议动态建立。
手工配置的方式建立静态LSP
建立静态LSP需要用户在报文转发路径中的各个LSR上手工配置为FEC分配的标签。建立静态LSP消耗的资源比较少,但静态建立的LSP不能根据网络拓扑变化动态调整。因此,静态LSP适用于拓扑结构简单并且稳定的小型网络。
动态LSP的标签发布协议
动态LSP通过标签发布协议动态建立。标签发布协议是MPLS的控制协议(也可称为信令协议),负责FEC的分类、标签的分发以及LSP的建立和维护等一系列操作。
MPLS可以使用多种标签发布协议:
- LDP(Label Distribution Protocol):是专为标签发布而制定的协议。LDP根据IGP、BGP路由信息通过逐跳方式建立LSP。
- MP-BGP(Multiprotocol Border Gateway Protocol):是在BGP协议基础上扩展的协议。MP-BGP支持为MPLS VPN业务中私网路由和跨域VPN的标签路由分配标签。
动态LSP的基本建立过程
标签由下游LSR分配,按从下游到上游的方向分发。如下图,由下游LSR在IP路由表的基础上进行FEC的划分,并根据FEC分配标签,通告给上游的LSR,以便建立标签转发表和LSP。
2)MPLS 转发
MPLS 基本转发过程
MPLS标签转发的3个基本动作:包括标签压入(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基本转发过程如下:
1. Ingress节点收到目的地址为4.4.4.2的IP报文,压入标签Z并转发。
2. Transit节点收到该标签报文,进行标签交换,将标签Z换成标签Y。
3. 倒数第二跳Transit节点收到带标签Y的报文。因为Egress分给它的标签值为3,所以进行PHP操作,弹出标签Y并转发报文。从倒数第二跳转发给Egress的报文以IP报文形式传输。
4. Egress节点收到该IP报文,将其转发给目的地4.4.4.2/32。
LDP
LDP是标签发布协议的一种,用来动态建立LSP。通过LDP,LSR可以把网络层的路由信息映射到数据链路层的交换路径上。
1.基本概念
- LDP会话:LDP会话建立在TCP连接之上,用于在LSR之间交换标签映射、标签释放、差错通知等消息。
- LDP对等体:LDP对等体是指相互之间存在LDP会话,并通过LDP会话交换标签-FEC映射关系的两个LSR。
2.LDP协议的四类消息:
- 发现(Discovery)消息:用于通告和维护网络中LSR的存在;
- 会话(Session)消息:用于建立、维护和终止LDP对等体之间的会话;
- 通告(Advertisement)消息:用于创建、改变和删除“标签—FEC”映射关系;
- 通知(Notification)消息:用于提供建议性的消息和差错通知。
为保证LDP消息的可靠发送,除了发现消息使用UDP传输外,LDP的会话消息、通告消息和通知消息都使用TCP传输。
3.LDP工作过程的四个阶段:
1)发现阶段
所有希望建立LDP会话的LSR都周期性地发送Hello消息,通告自己的存在。通过Hello消息,LSR可以自动发现它的LDP对等体。
LDP对等体发现机制分为两种:
- 基本发现机制:用于发现本地的LDP对等体,即通过链路层直接相连的LSR,并与其建立Link hello邻接关系。这种方式下,LSR周期性地向“子网内所有路由器”的组播地址224.0.0.2发送LDP链路Hello消息,以便链路层直接相连的LSR发现此LDP对等体。
- 扩展发现机制:用于发现远端的LDP对等体,即不通过链路层直接相连的LSR,并与其建立Targeted hello邻接关系。这种方式下,LSR周期性地向指定的IP地址发送LDP目标Hello消息,以便指定IP地址对应的LSR发现此LDP对等体。
两个LSR为基本发现机制和扩展发现机制配置的传输地址(用来建立TCP连接的源IP地址)相同时,这两个LSR之间可以同时建立Link hello邻接关系和Targeted hello邻接关系,
并且Link hello邻接关系和Targeted hello邻接关系关联到同一个会话。在LDP对等体之间存在直连(只有一跳)和非直连(多于一跳)多条路径的组网环境中,
同时建立Link hello邻接关系和Targeted hello邻接关系可以实现利用扩展发现机制来保护与对等体的会话。当直连链路出现故障时,Link hello邻接关系将被删除。
如果此时非直连链路正常工作,则Targeted hello邻接关系依然存在,因此,LDP会话不会被删除,基于该会话的FEC—标签绑定等信息也不会删除。直连链路恢复后,不需要重新建立LDP会话、重新学习FEC—标签绑定等信息,
从而加快了LDP收敛速度。两个LSR为基本发现机制和扩展发现机制配置的传输地址不同时,如果在这两个LSR之间已经建立了一种邻接关系,则无法再建立另一种邻接关系。
2)会话建立与维护
发现LDP对等体后,LSR开始建立会话。这一过程又可分为两步:
- 建立传输层连接,即在LSR之间建立TCP连接;
- 对LSR之间的会话进行初始化,协商会话中涉及的各种参数,如LDP版本、标签发布方式、Keepalive定时器值等。
会话建立后,LDP对等体之间通过不断地发送Hello消息和Keepalive消息来维护这个会话。
3) LSP建立与维护
LDP通过发送标签请求和标签映射消息,在LDP对等体之间通告FEC和标签的绑定关系,从而建立LSP。
4)会话撤销
在以下情况下,LSR将撤销LDP会话:
- LSR通过周期性发送Hello消息表明自己希望与邻居LSR继续维持这种邻接关系。如果Hello保持定时器超时仍没有收到新的Hello消息,则删除Hello邻接关系。一个LDP会话上可能存在多个Hello邻接关系。当LDP会话上的最后一个Hello邻接关系被删除后,LSR将发送通知消息,结束该LDP会话。
- LSR通过LDP会话上传送的LDP PDU(LDP PDU中携带一个或多个LDP消息)来判断LDP会话的连通性。如果在会话保持定时器(Keepalive定时器)超时前,LDP对等体之间没有需要交互的信息,LSR将发送Keepalive消息给LDP对等体,以便维持LDP会话。如果会话保持定时器超时,没有收到任何LDP PDU,LSR将关闭TCP连接,结束LDP会话。
- LSR还可以发送Shutdown消息,通知它的LDP对等体结束LDP会话。因此,LSR收到LDP对等体发送的Shutdown消息后,将结束与该LDP对等体的会话。
基于MPLS的VPN
传统VPN一般是通过GRE(Generic Routing Encapsulation)、L2TP(Layer 2 Tunneling Protocol)、PPTP(Point to Point Tunneling Protocol)等隧道协议来实现私有网络间数据在公网上的传送,
而MPLS LSP是通过标签交换形成的隧道,数据报文不再经过封装或者加密,因此,用MPLS实现VPN具有天然的优势。
基于MPLS的VPN可以创建一个安全性类似于FR(Frame Relay)网络的专用网。用户设备无需为VPN配置GRE、L2TP等隧道,网络时延被降到最低。
基于MPLS的VPN通过LSP将私有网络的不同分支联结起来,形成一个统一的网络,如下图所示。基于MPLS的VPN还支持对不同VPN间的互通控制。下图中:
-
CE(Customer Edge)是用户边缘设备,可以是路由器,也可以是交换机或主机。
-
PE(Provider Edge)是IP/MPLS骨干网的边缘设备。
-
P(Provider)是IP/MPLS骨干网的骨干设备,不与CE直接相连。P设备只需要具备基本MPLS转发能力,不维护VPN信息。
基于MPLS的VPN具有以下特点:
-
PE负责对VPN用户进行管理、建立各PE间LSP连接、同一VPN用户各分支间路由信息发布。
-
PE之间发布VPN用户路由信息通常是用MP-BGP协议实现。
-
支持不同分支间IP地址复用和不同VPN间互通。
MPLS 对TTL 的处理
MPLS对TTL的处理模式
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 VPN应用中,出于网络安全的考虑,需要隐藏MPLS骨干网络的结构,这种情况下,对于私网报文,Ingress上使用Pipe模式。
ICMP响应报文
在MPLS网络中,当LSR收到TTL为1的含有标签的MPLS报文时,LSR生成ICMP的TTL超时消息。
- 如果LSR上存在到达报文发送者的路由,则可以通过IP路由,直接向发送者回应TTL超时消息。
- 如果LSR上不存在到达报文发送者的路由,则ICMP响应报文将按照LSP继续传送,到达LSP出节点后,由Egress节点将该消息返回给发送者。
通常情况下,收到的MPLS报文只带一层标签时,LSR可以采用第一种方式回应TTL超时消息;收到的MPLS报文包含多层标签时,LSR采用第二种方式回应TTL超时消息。
但是,在MPLS VPN中,ASBR(Autonomous System Boundary Router,自治系统边界路由器),接收到的承载VPN报文的MPLS报文可能只有一层标签,此时,这些设备上并不存在到达报文发送者的路由,则采用第二种方法回应TTL超时消息。
LSP连通性检测
在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。
MPLS Ping
如上图,LSR_1上建立了一条目的地为LSR_4的LSP。从LSR_1对该LSP进行MPLS Ping时的处理如下:
- LSR_1查找该LSP是否存在。如果不存在,返回错误信息,停止Ping。如果存在,则继续进行以下操作。
- LSR_1构造MPLS Echo Request报文,IP头中的目的地址为127.0.0.1/8,IP头中的TTL值为1,同时将4.4.4.4填入Echo Request报文中的目的FEC中。然后查找相应的LSP,压入LSP的标签,将报文发送给LSR_2。
- 中间节点LSR_2和LSR_3对MPLS Echo Request报文进行普通MPLS转发。如果中间节点MPLS转发失败,则中间节点返回带有错误码的MPLS Echo Reply报文。
- 当MPLS转发路径无故障,则MPLS Echo Request报文到达LSP的出节点LSR_4。然后检查目的FEC中包含的目的地址4.4.4.4是否为自己的Loopback接口地址,以此来确认LSR_4是该FEC的真正出口后,返回正确的MPLS Echo Reply报文。至此整个MPLS Ping过程结束。
MPLS Tracert
如上图,从LSR_1对4.4.4.4/32进行MPLS Tracert时的处理如下:
- LSR_1检查LSP是否存在。如果不存在,返回错误信息,停止Tracert,否则继续进行如下处理。
- LSR_1构造MPLS Echo Request报文,IP头中的目的地址为127.0.0.1/8,同时将4.4.4.4填入MPLS Echo Request报文中的目的FEC中,然后查找相应的LSP,压入LSP的标签并且将MPLS TTL设置为1,将报文发送给LSR_2。此MPLS Echo Request报文中包含Downstream Mapping TLV(用来携带LSP在当前节点的下游信息,主要包括下一跳地址、出标签等)。
- LSR_2收到LSR_1发送来的报文后,将MPLS Echo Request中MPLS TTL减1为0后发现TTL超时,然后LSR_2需要检查是否存在该LSP,同时检查报文中Downstream Mapping TLV的下一跳地址、出标签是否正确,如果两项检查都正确,返回正确的MPLS Echo Reply报文,并且报文中必须携带LSR_2本身的包含下一跳和出标签的Downstream Mapping TLV给LSR_1。如果检查有不正确,则返回错误的MPLS Echo Reply报文。
- LSR_1收到正确的MPLS Echo Reply报文后再次发送MPLS Echo Request报文,报文的封装方式跟步骤2类似,只是将LSP标签的MPLS TTL设置为2,此时的MPLS Echo Request报文中的Downstream Mapping TLV是从MPLS Echo Reply报文中复制过来的。然后LSR_2收到该报文后进行普通MPLS转发。LSR_3收到此报文,标签的TTL超时,跟步骤3同样的处理方式后返回MPLS Echo Reply报文。
- LSR_1收到正确的MPLS Echo Reply报文后重复步骤4把LSP标签的MPLS TTL设置为3,复制Downstream Mapping TLV后发送MPLS Echo Request报文。LSR_2和LSR_3对该报文进行普通MPLS转发。LSR_4收到此报文,重复步骤3处理方式对报文进行处理,同时检查目的FEC中包含的目的IP 4.4.4.4为自己的Loopback接口地址,以此来发现已经是该LSP的出节点,因此返回不带下游信息的MPLS Echo Reply报文,至此整个MPLS Tracert过程结束。
通过上述步骤中返回携带下游信息的MPLS Echo Reply报文,在LSR_1上就获取了该LSP沿途每一个节点信息。