MPLS的原理与配置

前言

早期的路由器转发数据通过IP路由表匹配查找条目时,需要做一个动作,将32位的二进制IP地址与掩码地址相与来得到一个网段信息,让后再在路由表中一一对应查找,这种方式对于路由器的机能要求过高,而在早期的路由器设备性能不足的情况下,当路由条目非常多的时候设备转发速度就会变慢。因此需要一个技术来提高当时路由器转发数据的速度。这就是我们的MPLS协议。

标签

IP地址由于有掩码的概念因此在比对时常常会出现比对的数据大小不一致,因此系统要进行过多的计算来实现比对。而在交换机上MAC地址是定长的且没有什么掩码的概念,因此交换机转发数据的速度是非常快的,而MPLS协议学习了交换机转发数据的方式,采用短而定长的标签进行数据转发,这样路由器在比对时直接进行匹配而不必做过多的计算操作。

MPLS报文

MPLS以为向交换机的工作机制靠拢,因此MPLS报文也封装在靠近二层的地方,MPLS头部封装在二层头部与三层头部之间,这样他能从二层头部中得到相关的链路层服务,而在三层头部之前,因此在路由器匹配网标签后直接进行转发而不必过问IP头部中的信息。
MPLS报文头部:
MPLS的原理与配置

字段 含义
Label 标签的值,20bit,0-15为特殊标签,16-1023位静态建立使用的标签,1024往后为LDP使用。
Exp 用于Cos,当链路发生堵塞,优先发送优先级高的报文。3bit
S 栈底表示,用来表示后续是否还是MPLS头部,0表示后续还是MPLS头部,1表示后续是IP头部,1bit
TTL 与IP地址中的相同

MPLS的相关术语

术语 含义
LSR 表示运行MPLS的路由器
LSP 表示运行MPLS的路由器间转发带有标签数据的路劲
LER 表示用来压入标签和弹出标签的设备
FEC 去往同一个目的地址的带标签的数据

MPLS的结构体系

MPLS的原理与配置
路由器有控制平面和转发平面,控制平面用来运行相关路由协议,创建通过路由协议获取到的路由信息表,而将相关路由信息表中最优的路径填入转发平面中的转发表中用作实际数据转发的路径。这是使用IP路由转发的路由器的结构体系,而运行了MPLS协议的路由器在上述2个表中控制层面还增加了一个通过LDP即标签分发协议生成的标签信息表,而转发层面有多了一个用来使用标签进行转发数据的标签信息转发表。因此运行了MPLS协议的路由器可以查看到2个转发表。

LSP的建立

MPLS的原理与配置
路由器想要使用MPLS标签进行转发数据,首先的建立一条LSP即标签交换路径,而建立LSP有两种方式,分为了静态LSP和动态LSP:

LSP 建立方式
静态LSP 用户通过手工方式为各个转发等价类分配标签建立转发隧道;
动态LSP 通过标签发布协议动态建立转发隧道。

静态LSP

MPLS的原理与配置
拓扑图如上图所示,相关配置也如图!用OSPF进行互通,现在希望R1的环回口0能ping通R4上的环回口,并且通过静态建立LSP。
相关配置为:
R1上配置mpls lsr-id,类似于OSPF中的router id,不同的是在MPLS中lsr-id必须要手工进行分配,并且未分配时无法使能mpls功能。因此首先第一步就是配置lsr-id,然后使能mpls
然后配置相关的静态LSP
在R1上建立一条去往4.4.4.4/32地址的静态lsp,因此R1属于这条路的出发点,相关配置为:
static-lsp ingress 1 destination 4.4.4.4 32 outgoing-interface Serial0/0/0 nexth
op 12.12.12.2 out-label 102
这条命令的意思是建立一条静态LSP链路叫做1,且R1为出发点,目的为4.4.4.4/32,下一跳为12.12.12.2,且出接口为s0/0/0,然后压入标签位102.
然后我们在R2上也要进行配置:
static-lsp transit 1 incoming-interface Serial0/0/0 in-label 102 outgoing-interf
ace Serial0/0/1 nexthop 23.23.23.3 out-label 203
R2作为标签转发的中转站,只需要做的事情就是收到标签数据后更换标签再发出去,因此上面的命令意思为在1这条LSP链路从s0/0/0接口收到标签位102的数据后,从s0/0/1接口转发出去,且标签改为203.
同理R3与R2一致,仅仅是标签值改一下。
最后到了R4,R4属于这条链路的终点,因此R4的配置为:
static-lsp egress 1 incoming-interface Serial0/0/0 in-label 304
这样一条R1去往R4的标签转发路径就完成了,但是我们只配了R1去往4.4.4.4这个地址,而没有配置R4回来的路,因此我们还得反过来再配一次回来的静态LSP

R1:

mpls lsr-id 1.1.1.1
mpls

interface Serial0/0/0
link-protocol ppp
ip address 12.12.12.1 255.255.255.0
mpls

interface LoopBack0
ip address 1.1.1.1 255.255.255.255

ospf 1 router-id 1.1.1.1
area 0.0.0.0
network 12.12.0.0 0.0.255.255
network 1.1.1.1 0.0.0.0

static-lsp ingress 1 destination 4.4.4.4 32 outgoing-interface Serial0/0/0 nexth
op 12.12.12.2 out-label 102
static-lsp egress 2 incoming-interface Serial0/0/0 in-label 201

R2:

mpls lsr-id 2.2.2.2
mpls

interface Serial0/0/0
link-protocol ppp
ip address 12.12.12.2 255.255.255.0
mpls

interface Serial0/0/1
link-protocol ppp
ip address 23.23.23.2 255.255.255.0
mpls

interface LoopBack0
ip address 2.2.2.2 255.255.255.255

ospf 1 router-id 2.2.2.2
area 0.0.0.0
network 12.12.0.0 0.0.255.255
network 23.23.23.0 0.0.0.255
network 2.2.2.2 0.0.0.0

static-lsp transit 1 incoming-interface Serial0/0/0 in-label 102 outgoing-interf
ace Serial0/0/1 nexthop 23.23.23.3 out-label 203
static-lsp transit 2 incoming-interface Serial0/0/1 in-label 302 outgoing-interf
ace Serial0/0/0 nexthop 12.12.12.1 out-label 201

R3:

mpls lsr-id 3.3.3.3
mpls

interface Serial0/0/0
link-protocol ppp
ip address 23.23.23.3 255.255.255.0
mpls

interface Serial0/0/1
link-protocol ppp
ip address 34.34.34.3 255.255.255.0
mpls

interface LoopBack0
ip address 3.3.3.3 255.255.255.255

ospf 1 router-id 3.3.3.3
area 0.0.0.0
network 23.23.23.0 0.0.0.255
network 34.34.34.0 0.0.0.255
network 3.3.3.3 0.0.0.0

static-lsp transit 1 incoming-interface Serial0/0/1 in-label 203 outgoing-interf
ace Serial0/0/1 nexthop 34.34.34.4 out-label 304
static-lsp transit 2 incoming-interface Serial0/0/1 in-label 403 outgoing-interf
ace Serial0/0/0 nexthop 23.23.23.2 out-label 302

R4:

mpls lsr-id 4.4.4.4
mpls

interface Serial0/0/0
link-protocol ppp
ip address 34.34.34.4 255.255.255.0
mpls

interface LoopBack0
ip address 4.4.4.4 255.255.255.255

ospf 1 router-id 4.4.4.4
area 0.0.0.0
network 34.34.34.0 0.0.0.255
network 4.4.4.4 0.0.0.0

static-lsp egress 1 incoming-interface Serial0/0/0 in-label 304
static-lsp ingress 2 destination 1.1.1.1 32 outgoing-interface Serial0/0/0 nexth
op 34.34.34.3 out-label 403

然后在R1上ping -a 1.1.1.1 4.4.4.4,进行抓包测试:
MPLS的原理与配置
MPLS的原理与配置

动态LSP(LDP)

LDP工作过程

LDP类似动态路有协议,因此也需要发现邻居建立邻居关系,不过不同的是,LDP发现邻居和建立邻居使用的底层协议不同,在发现邻居是用的是UDP,每隔5s发送一次,使用组播地址224.0.0.2,发往网络中所有路由器。而连接的建立使用的TCP进行建立。其中Transport Address字段为配置的lsr-id,且TCP连接由lsr-id大的一方先发起。
MPLS的原理与配置
当邻居建立完后,LDP会建立回话session,类似BGP中的opensent状态,互相发送协商报文来协商相关字段。
MPLS的原理与配置
TCP连接建立成功后,由主动方RTB发送初始化消息,协商建立LDP会话的相关参数。LDP会话的相关参数包括LDP协议版本、标签分发方式、Keepalive保持定时器的值、最大PDU长度和标签空间等。被动方RTA收到初始化消息后,如果RTA接受相关参数,则发送初始化消息,同时发送Keepalive消息给主动方RTB。如果被动方RTA不能接受相关参数,则发送Notification消息终止LDP会话的建立。主动方RTB收到初始化消息后,接受相关参数,则发送Keepalive消息给被动方RTA。如果主动方RTB不能接受相关参数,则发送Notification消息给被动方RTA终止LDP会话的建立。当双方都收到对端的Keepalive消息后,LDP会话建立成功。LDP会话建立成功后,进行FEC的创建与标签的分发。最后Notification的作用与BGP中的类似,用来通告错误。

LDP标签的发布方式

通过动态LSP建立,则LDP需要进行动态的发布标签给邻居,而在LDP中有2中发布标签的方式:

发布方式 工作原理
DU(Downstream Unsolicited,下游自主方式) 对于一个到达同一目地址报文的分组,LSR无需从上游获得标签请求消息即可进行标签分配与分发。
DoD(Downstream on Demand,下游按需方式) 对于一个到达同一目的地址报文的分组,LSR获得标签请求消息之后才进行标签分配与分发。

MPLS的原理与配置
当路由器使用了DU自主发布方式来发布标签是,给路由条目分配标签后不需要等待上游发起请求,直接向上游发送自己的到达某个IP地址的标签配置,而DOD则是需要上游设备发起请求后才发送相关的标签,DU方式对设备性能要求高,但是收敛速度快,不需要等到业务数据发送时才来请求标签,并且网络环境发生变化时也能更快的做出相应的改变,并自主向邻居发送变更后的标签。
华为设备默认采用DU的方式发布标签。DU无需等待上游的请求消息,可以直接向邻居分配标签。在网络拓扑发生变化时,采用DU方式可以快速反应为新的拓扑分发标签,收敛时间相对于DoD方式较短。

LDP标签的分配控制方式

Independent(独立标签分配控制方式) 本地LSR可以自主地分配一个标签绑定到某个IP分组,并通告给上游LSR,而无需等待下游的标签。
Ordered(有序标签分配控制方式) 只有当该LSR已经具有此IP分组的下一跳的标签,或者该LSR就是该IP分组的出节点时,该LSR才可以向上游发送此IP分组的标签。
MPLS的原理与配置

华为设备默认采用Ordered的方式分配标签。采用Ordered方式,只有当该LSR已经具有此IP分组的下一跳的标签时,才能向上游分发标签,这样是为了避免下游IP分组的标签未分配或收敛时间较长,上游的标签已分配,数据开始转发造成的数据丢失。

标签的保持方式

MPLS的原理与配置

如上图所示,RTB收到了2条标签都是去往100.1.1.1/32这个地址的,那么对于RTB来说它该选取那条作为自己的下一跳呢,在这里RTB会根据IP路由表中去往100.1.1.1/32这个地址的下一跳来选择,如果RTB在IP路由表中下一跳为RTD,那么这里标签就会选择RTD的标签,而RTC的标签呢?直接丢弃嘛?不一定!

标签保持方式 说明
Liberal(自由标签保持方式) 对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留。
Conservative(保守标签保持方式) 对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留。

在这种情况下有2中方式,一种是Liberal保存RTC的标签,一种是Conservative,只保存RTD的,丢弃RTC的,对性能上考虑是Conservative要优,因为不用保存无用的条目,减少了相关的开销,但是一旦RTD与RTB直接的链路方式了故障,RTB在IP路由表中的下一跳变更为RTC,而这时候使用了Conservative方式,则需要RTC重新发送一次自己的标签,增加了收敛时间。因此Liberal在这种情况下更合适。而华为默认采用Liberal的方式来保存标签。

Penultimate Hop Popping

MPLS的原理与配置

如图,当数据从RTA到达RTD是,在RTD上先查找相关的LFIB表发现RTD就是LSP的终点了,因此需要弹出标签进行FIB的查找,这时候就会产生2次表的查询,在业务数据量大的环境下会极大的降低设备转发的性能,因此能否减少一次查找表的次数呢?标签数据在RTD上查找2次表主要是因为在RTD上是LSP的终点因此需要标签的弹出,那么我们可不可以提前一步弹出呢?比如说在RTC上就弹出,到了RTD上就是普通的IP数据,正常的查找FIB即可。这就是Penultimate Hop Popping,倒数第二跳弹出,当RTD发现自己就是LSP的终点时在给上游发送标签时就换将标签改为3,3 表示隐式空标签,当数据转发到RTC时查看LFIB发现下一跳标签为3,那么这时候就不会压入标签而是弹出标签直接正常发送IP数据,RTD收到后发现是个正常的IP数据就根据FIB表进行转发,这样就减少了查表的次数,出了3隐式空标签,还有一个0,表示显式空标签,3的话是在RTC上做弹出的操作,而0的话是在RTD上收到标签为0的数据就直接弹出,然后查找正常的FIB表查询。显式空标签用在做Qos时使用,因为标签字段中包含了Exp如果在RTC上就弹出那么无法做到端到端的Qos服务了。