MPLS采用短而定长的标签进行数据转发,大大提高了硬件限制下的转发能力;而且MPLS可以扩展到多种网络协议(如IPv6,IPX等)。
MPLS概述
MPLS协议从各种链路层协议(如PPP、ATM、帧中继、以太网等)得到链路层服务,又为网络层提供面向连接的服务。MPLS能从IP路由协议和控制协议中得到支持,路由功能强大、灵活,可以满足各种新应用对网络的要求。
MPLS基本网络结构
LSP(Label Switched Path):标签交换路径,即到达同一目的地址的报文在MPLS网络中经过的路径。
FEC(Forwarding Equivalent Class):一般指具有相同转发处理方式的报文。在MPLS网络中,到达同一目的地址的所有报文就是一个FEC。
在MPLS网络中,路由器的角色分为两种:
LER(Label Edge Router): 在MPLS网络中,用于标签的压入或弹出。
LSR(Label Switched Router):在MPLS网络中,用于标签的交换。
根据数据流的方向,LSP的入口LER被称为入节点(Ingress);位于LSP中间的LSR被称为中间节点(Transit);LSP的出口LER被称为出节点(Egress)。
MPLS报文由Ingress发往Transit,则Ingress是Transit的上游节点,Transit是Ingress的下游节点;同理,Transit是Egress的上游节点,Egress是Transit的下游节点。
MPLS作为一种分类转发技术,将具有相同转发处理方式的报文分为一类,称该类报文为一个FEC。FEC的划分方式非常灵活,可以是以源地址、目的地址、源端口、目的端口、协议类型或VPN等为划分依据的任意组合。
MPLS体系结构
控制平面:负责产生和维护路由信息以及标签信息。
路由信息表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):简称标签转发表,由标签分发协议建立LFIB,负责带MPLS标签报文的转发。
MPLS路由器上,报文的转发过程:
当收到普通IP报文时,查找FIB表,如果Tunnel ID为0x0,则进行普通IP转发;如果查找FIB表,Tunnel ID为非0x0,则进行MPLS转发。
当收到带标签的报文时,查找LFIB表,如果对应的出标签是普通标签,则进行MPLS转发;查找LFIB表,如果对应的出标签是特殊标签,如标签3,则将报文的标签去掉,进行IP转发。
MPLS数据报文结构
MPLS标签封装在链路层和网络层之间,可以支持任意的链路层协议,MPLS标签的封装结构如图所示。
MPLS标签的长度为4个字节,共分4个字段:
Label:20bit,标签值域;
Exp:3bit,用于扩展。现在通常用做CoS(Class of Service),当设备发生阻塞时,优先发送优先级高的报文;
S:1bit,栈底标识。MPLS支持多层标签,即标签嵌套。S值为1时表明为最底层标签;
TTL:8bit,和IP报文中的TTL(Time To Live)意义相同。
标签空间是指标签的取值范围。标签空间划分如下:
0~15:特殊标签。如标签3,称为隐式空标签,用于倒数第二跳弹出;
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)等动态信令协议的标签空间。
LSP建立方式
建立LSP的方式有两种:
静态LSP:用户通过手工方式为各个转发等价类分配标签建立转发隧道;
动态LSP:通过标签发布协议动态建立转发隧道。
静态LSP
静态LSP的特点:
不使用标签发布协议,不需要交互控制报文,资源消耗比较小;
通过静态方式建立的LSP不能根据网络拓扑变化动态调整,需要管理员干预。
静态LSP适用于拓扑结构简单并且稳定的网络。
配置静态LSP时,管理员需要为各路由器手工分配标签,需要遵循的原则是:前一节点出标签的值等于下一个节点入标签的值。
如图所示拓扑,MPLS网络中有一个100.1.1.1/32的用户,静态为该路由建立一条LSP,配置过程如下:
配置LSR ID用来在网络中唯一标识一个MPLS路由器。缺省没有配置LSR ID,必须手工配置。为了提高网络的可靠性,推荐使用LSR某个Loopback接口的地址作为LSR ID。
配置命令:mpls lsr-id lsr-id
在MPLS域的所有节点与相应的接口上开启MPLS协议。
配置命令:
mpls
interface interface-type interface-number
mpls
在Ingress进行以下配置:
static-lsp ingress lsp-name destination ip-address { mask-length | mask } { nexthop next-hop-address | outgoing-interface interface-type interface-number } * out-label out-label
在Transit进行以下配置:
static-lsp transit lsp-name [ incoming-interface interface-type interface-number ] in-label in-label { nexthop next-hop-address | outgoing-interface interface-type interface-number } * out-label out-label
在Egress进行以下配置:
static-lsp egress lsp-name [ incoming-interface interface-type interface-number ] in-label in-label [ lsrid ingress-lsr-id tunnel-id tunnel-id ]
完成上述配置后,只是完成了RTA到RTD的单条LSP,RTD返回RTA的LSP路径也需要配置才能实现RTA正常访问RTD100.1.1.1/32的路由。
动态LSP
动态LSP通过LDP协议实现对FEC的分类、标签的分配及LSP的建立和维护等操作。
动态LSP的特点:
组网配置简单,易于管理和维护;
支持基于路由动态建立LSP,网络拓扑发生变化时,能及时反映网络状况。
如图所示拓扑:
Egress路由器RTD为本地存在的路由分配标签,并将路由和标签的绑定关系主动发送给上游邻居路由器RTC;
路由器RTC收到下游邻居路由器RTD的路由和标签的绑定关系后,将其记录到LIB中,并将自己分配的标签和路由的绑定关系发送给上游邻居路由器RTB;
RTB执行相同的动作将标签和路由的绑定关系发送给上游邻居路由器RTA,RTA为Ingress路由器,没有上游邻居,因此动态的LSP完成建立。
LDP邻居发现
LDP邻居建立
标签的发布方式
DU(Downstream Unsolicited,下游自主方式):对于一个到达同一目地址报文的分组,LSR无需从上游获得标签请求消息即可进行标签分配与分发。
DoD(Downstream on Demand,下游按需方式):对于一个到达同一目的地址报文的分组,LSR获得标签请求消息之后才进行标签分配与分发。
标签的分配控制方式
Independent(独立标签分配控制方式):本地LSR可以自主地分配一个标签绑定到某个IP分组,并通告给上游LSR,而无需等待下游的标签。
Ordered(有序标签分配控制方式):只有当该LSR已经具有此IP分组的下一跳的标签,或者该LSR就是该IP分组的出节点时,该LSR才可以向上游发送此IP分组的标签。
标签的保持方式
Liberal(自由标签保持方式):对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留。
Conservative(保守标签保持方式):对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留。
当网络拓扑变化引起下一跳邻居改变时:
使用自由标签保持方式,LSR可以直接利用原来非下一跳邻居发来的标签,迅速重建LSP,但需要更多的内存和标签空间。
使用保守标签保持方式,LSR只保留来自下一跳邻居的标签,节省了内存和标签空间,但LSP的重建会比较慢。
华为设备默认采用自由标签保持方式保存标签。
LDP建立LSP过程
如图所示拓扑,LDP动态建立LSP的过程如下:
RTD上存在100.1.1.1/32的主机路由,因为RTD是Egress节点,所以直接向自己上游邻居RTC发布100.1.1.1/32与标签的绑定关系;
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分配的标签作为备用标签;
RTB收到下游邻居RTC分配的100.1.1.1/32与标签的绑定关系后,执行与RTC相同的动作;
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完成建立。
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能力。MPLS数据转发过程
如图所示拓扑,MPLS数据转发过程如下:
RTA上收到访问100.1.1.1/32的数据包,如果数据包为普通的IP报文,则查找FIB表,因为Tunnel ID为非0x0,封装已分配的标签1027进行MPLS转发;如果数据包为带标签的报文,查找LFIB表,封装已分配的标签1027进行MPLS转发;
RTB收到RTA发送的带标签1027的报文,查找LFIB表,封装已分配的出标签1026进行MPLS转发给RTC;
RTC收到RTB发送的带标签1026的报文,查找LFIB表,封装已分配的出标签1025进行MPLS转发给RTD;
RTD收到RTC发送的带标签1025的报文,查找LFIB表,出标签为Null,表明数据包已经到达Egress节点,所以路由器将数据包的标签信息去掉,并对数据包进行三层处理,查找IP路由表发现100.1.1.1/32的路由为自己本地的路由,根据IP路由表中的出接口进行IP数据的封装并转发。
如果MPLS网络中的业务量很大,则每次数据包在Egress节点都要进行两次处理才能进行正确的路由转发,这样会导致Egress节点的处理压力增加,路由器的处理性能降低。我们希望在Egress节点上只处理一次就能将数据包正确转发,以提高Egress的转发性能,所以提出了PHP技术。
Penultimate Hop Popping
PHP(Penultimate Hop Popping,倒数第二跳弹出),具体过程如下:
RTC收到RTB发送的带标签1026的报文,查找LFIB表,发现分配的出标签为隐式空标签3,于是执行弹出标签的动作,并将IP数据包转发给下游路由器RTD;
RTD收到RTC发送的IP报文,直接查找自己的FIB表,根据FIB表中的出接口进行IP数据的封装并转发。
实验
要求
本实验模拟BGP路由黑洞环境,使用MPLS LDP解决路由黑洞。
完成以下需求:
1.设备IP地址已配置,请测试直连。
2.AS200内配置OSPF,进程1,RID手动设置为Lo0地址,区域0,network通告接口使用通配符0.0.0.0
不宣告与其他AS互联接口。
3.建立BGP邻居关系
3.1 R2/4使用Lo0建立ibgp邻居。
3.2 R1/2,R4/5分别使用物理口建立ebgp邻居。
3.3 R1宣告1.1.1.1/32,R5宣告5.5.5.5/32,起源属性为“i”。
4.配置MPLS LDP
AS200为MPLS域,在R2/3/4上配置LDP。
4.1 LSR-ID为Lo0地址。
4.2 R2/3,R3/4分别建立LDP邻居关系,并自动分发标签。
4.3 R2/4上配置以下命令,使得BGP路由可以“借用”下一跳地址的标签。
route recursive-lookup tunnel
4.4 测试1.1.1.1访问5.5.5.5,并查看R2/3/4的LSP。
display mpls lsp
具体过程
1.设备IP地址已配置,请测试直连。
2.AS200内配置OSPF,进程1,RID手动设置为Lo0地址,区域0,network通告接口使用通配
符0.0.0.0
不宣告与其他AS互联接口。
R2:
ospf 1 router-id 2.2.2.2
area 0.0.0.0
network 2.2.2.2 0.0.0.0
network 23.1.1.2 0.0.0.0
R3:
ospf 1 router-id 3.3.3.3
area 0.0.0.0
network 3.3.3.3 0.0.0.0
network 23.1.1.3 0.0.0.0
network 34.1.1.3 0.0.0.0
R4:
ospf 1 router-id 4.4.4.4
area 0.0.0.0
network 4.4.4.4 0.0.0.0
network 34.1.1.4 0.0.0.0
3.建立BGP邻居关系
3.1 R2/4使用Lo0建立ibgp邻居。
3.2 R1/2,R4/5分别使用物理口建立ebgp邻居。
3.3 R1宣告1.1.1.1/32,R5宣告5.5.5.5/32,起源属性为“i”。
R1:
bgp 100
peer 12.1.1.2 as-number 200
network 1.1.1.1 255.255.255.255
R2:
bgp 200
peer 4.4.4.4 as-number 200
peer 4.4.4.4 connect-interface LoopBack0
peer 12.1.1.1 as-number 100
peer 4.4.4.4 enable
peer 4.4.4.4 next-hop-local
R4:
bgp 200
peer 2.2.2.2 as-number 200
peer 2.2.2.2 connect-interface LoopBack0
peer 45.1.1.5 as-number 300
peer 2.2.2.2 enable
peer 2.2.2.2 next-hop-local
R5:
bgp 300
peer 45.1.1.4 as-number 200
network 5.5.5.5 255.255.255.255
4.配置MPLS LDP
AS200为MPLS域,在R2/3/4上配置LDP。
4.1 LSR-ID为Lo0地址。
4.2 R2/3,R3/4分别建立LDP邻居关系,并自动分发标签。
R2:
mpls lsr-id 2.2.2.2
mpls
mpls ldp
interface GigabitEthernet0/0/1
mpls
mpls ldp
R3:
mpls lsr-id 3.3.3.3
mpls
mpls ldp
interface GigabitEthernet0/0/1
mpls
mpls ldp
interface GigabitEthernet0/0/0
mpls
mpls ldp
R4:
mpls lsr-id 4.4.4.4
mpls
mpls ldp
interface GigabitEthernet0/0/0
mpls
mpls ldp
4.3 R2/4上配置以下命令,使得BGP路由可以“借用”下一跳地址的标签。
route recursive-lookup tunnel
R2/4
route recursive-lookup tunnel
4.4 测试1.1.1.1访问5.5.5.5,并查看R2/3/4的LSP。
display mpls lsp
BGP路由5.5.5.5/32并没有直接获得标签,而是与
下一跳地址4.4.4.4“共用”了一个标签,这样一来去
往5.5.5.5的流量与去往4.4.4.4的流量对于R3来说都
是标签1024,属于同一个FEC(转发等价类)。
R3根据标签1024查找LFIB,出站标签为3(空标
签),弹出标签后从G0/0/1口转发。
R4直接收到IP包,查找FIB转发。