MPLS介绍
-
Multi-Protocol Label Switching (多协议标签交换)
Multi-Protocol:支持多三层协议,如IP、IPv6、IPX等
Label Switching:在所承载的报文前加上标签栈、基于标签做转发
MPLS是一种新的转发机制,数据在MPLS网络中是根据标签进行转发
一般而言MPLS的标签对应的是目的地址(路由前缀)
MPLS依赖IP路由及CEF交换
MPLS术语:
-
RIB:路由表
FIB:CEF数据转发表
LIB:标签数据库
LFIB:标签转发数据库,它的信息来源,由LIB和FIB共同维护而来的
LSP:标签交换通道,数据流走的路径就是LSP
FEC:相当于IP网络中的网络前缀,一个路由条目对应一个FEC。每一个FEC生成一个对应的标签,属于一个FEC的流量具有相同的转发方式、转发路径和转发待遇,但是并不是所有拥有相同标签的报文都属于一个FEC,因为这些报文的EXP值可能不相同,执行方式可能不同,因此它们可能属于不同的FEC
决定报文属于哪一个FEC的路由器是入栈LSR因为是它对报文进行分类和压入标签
MPLS 路由器名称
-
label switch router(LSR)标签交换路由器,一台支持MPLS的路由器。能够理解MPLS标签并且能够在数据链路层面对MPLS标签数据包进行交换。有三种类型LSR:
ingress LSR:处于MPLS路由域的边界,主要针对数据来的方向
Egress LSR:处于MPLS路由域的边界,主要针对数据出栈方向来说的
intermediate LSR:在MPLS中间的,没有直接连接IP网络
MPLS数据包格式:
Label(标签):标签有两种,保留标签和可用标签
保留标签:范围:0~15 常见保留标签:0和3 标签为0表示它是一个显示空 标签为3表示它是一个隐含空(imp-null)
可用标签:范围:16~2^20次方减1 标签空间还是很大的,标签具有本地意义,所以说标签是可以重叠的。
BoS(栈底):MPLS网络允许对一个数据包压入多个标签 比如:MPLS-×××网络环境,就有两个标签,分别是:外层标签(LDP协议分配)和内层标签(MP-BGP分配)
TTL:MPLS域内的TTL值一般是在MPLS域边界由ingress LSR路由器直接Copy(拷贝)IP报文里的TTL字段
EXP(实验位):用于QoS流量工程,其实QOS流量工程中,就有使用到保留标签0。
部署MPLS网络的好处:
采用MPLS,可避免IP路由的逐跳转发情况,减少对数据包的深入分析,借助标签建立二层的快速转发路径,使得数据沿着一条预先建立的路径快速转发
数据包在进入MPLS网络的入口,路由器将进行一次三层查找,而在此之后的LSR只进行简单的标签交换动作,不需要在进一步分析三层的信息
MPLS可以部署MPLS-×××,传递不同×××客户端的路由信息。
LDP协议概述:
LDP协议叫标签分发协议,对IP路由表中的每一条IGP的IP前缀来说,每一台运行LDP协议的LSR都会进行本地捆绑,也就是说,为IPv4前缀分配标签,然后LSR再将该分配的标签分发给所有的LSR邻居。从邻居接收到的标签转换为远程标签remote label,之后将远程标签和本地标签存储于标签信息库LIB
在所有捆绑某一特定前缀remote label中,LSR只使用其中一个标签来确定该前缀的出栈标签。FIB表来决定该前缀的下一跳是什么。LSR用这样的信息来创建它自己的标签转发数据库LFIB
LDP不会为BGP路由前缀捆绑标签
LDP邻居建立:两个阶段,邻居发现阶段和邻居会话阶段
邻居发现阶段:
在接口上激活LDP以后,开始发送LDP的hello包,hello包的源地址是发送该hello包的接口IP,发向224.0.0.2,目的端口号是UDP的646端口,两边都是一样的。互相发送完hello包形成LDP邻居关系。hello包里包含了三个地址: 第一个是自己的接口IP地址,第二个是传输IP地址,第三个是自己的LDP Route-ID
传输IP地址默认等同于LDP Route-ID 传输IP地址可以进行手工修改,不管改成什么一定要保证两端的传输IP地址三层是可达的
2.传输地址大的一方,发起TCP三次握手。发起TCP的源就是它的传输IP,端口是TCP的随机端口,目的地址是对端的传输IP,目的端口是TCP的646。
LDP会话建立过程:
传输IP大的首先发送初始化的消息,就好比BGP的OPPEN消息一样,里边携带了一些LDP运行的一些参数,要和对方协商。对方收到初始化消息,如果对方接受,对方会回给自己一个keep alive消息,同时对方也会把自己的初始化参数发送给自己。如果自己也接受了对方的参数,自己会回给对方一个keep alive消息,当对方收到keep alive消息后,最终LDP会话就建立完成
2. LDP标签映射消息交互,传输IP大的首先会把自己的本地标签映射消息发送给对方, 对方收到以后放在自己的LIB表中,对方也会把自己的标签映射表发送给自己。至此双方维护各自的LIB表 。LIB稳定后,同时生成LFIB表,标签转发数据库。下图就是标签映射表的交互报文
LDP Hello包头部报文:真实抓包hello包在上边:邻居发现阶段第一个图就是LDP 的hello包报文
l LDP邻居建立首先发送hello包(基于UDP源和目的端口都是646)
l LDP Router-ID为6个子节(4字节IP+2字节的LABEL Space ID) 我有在上图的hello包里标识出来,粉色字体就是Space-ID
l 两个路由器建立LDP邻居,要保证双方到对方的LDP Router-ID三层可达
l Transport addr除非手工指定,否则等于LDP Router-ID
l LDP router-ID 的选举和OSPF router-ID一样
什么是基于平台的Space-ID?
比如以上的拓扑图为例,R6路由器有一个6.6.6.6/32的路由前缀传递给了R2路由器。 R2会为6.6.6.6/32路由前缀分配一个标签假设是200。 基于平台就是,R2会把这个标签为200的6.6.6.6/32信息 传递给它所有的LDP邻居,也就是说,R1,R3,R4,R5,R6他们收到R2的关于6.6.6.6/32所捆绑的标签都是200。这就是基于平台的标签,当然也有基于接口的,就是R2为6.6.6.6/32路由前缀,捆绑标签,每个接口,它都会捆绑一个关于该前缀路由不一样的标签传递给它的LDP邻居。
上边就是MPLS和LDP的介绍,下边介绍:LDP标签的处理方式、PHP次末跳弹出机制、MPLS控制层面和数据层面传递、MPLS网络收敛、MPLS防环、MPLS配置等
LDP标签的处理方式:insert(imposer or push)压入、Swap(置换)、PoP(弹出)、untagged(移除)、Aggregate(聚合)
insert(imposer or push)压入:对数据包压入标签,压入的动作常见于在MPLS域边界由ingress LSR路由器所完成压入标签,可以同时压入多个标签。
Swap(置换):对收到的标签数据包,要将它转发出去之前,需要把出栈标签替换成邻居的标签,完成置换动作,常见于处于MPLS域中间的LSR路由器所操作。
PoP(弹出):将标签数据包最顶层标签弹出,常见于某条路由前缀的倒数第二跳路由器(如果大家不理解这句话也没关系,下边会提及到PHP次末跳弹出机制,大家就会懂PoP是怎么回事)
untagged(移除):将整个标签栈移除,不管上边有多少层标签。 untagged(移除)动作其实是一个很诡异的动作,它存在有时候是很合理的,有时候是很不合理的,还需大家自己慢慢体会
Aggregate(聚合):这个动作也是移除所有标签,但是它常见于做了汇总路由器身上。
Aggregate的诱因:
第一:在做了汇总的环境下,做汇总的路由器会把汇总的路由的动作设置为Aggregate动作,因为我既然能做汇总,那么我就认为这条路由就是本地始发的路由
第二:在MPLS-×××环境下,PE路由器在和CE路由器直连的网段动作也是Aggregate,因为它是VRF的直连原因
Untagged的诱因:
第一:下游路由器在传递一个IP数据包时,没有给该IP数据包捆绑任何的标签值,上游路由器关于该IP数据包就会是Untagged动作
第二:我到下游路由器的传输IP地址不可达,或者就是下游路由器根本没运行LDP协议,也是造成Untagged动作原因,我们可以试验下,看图。
R3路由器其实已经发现了R4路由器,因为我修改了R4的LDP Router-ID,所以R4的传输IP地址也跟着改变。R3就是ping不通R4的传输IP地址,显示 no route
关注蓝色圈起来的4.4.4.4/32的路由前缀,Outgoing(出栈动作)是Untagged
总结:
与pop不同,pop是有特定的标签值对应的,而untagged及aggregate是没有特定的标签的
Untagged动作,是弹出所有标签栈,并且跟据LFIB表提示的出接口和下一跳做转发。
而Aggregate动作则是弹出标签栈,同时再做进一步的IP查找,可以看到上图,Aggregate它在LFIB表中没有直接指示,出接口和下一跳信息
PHP:PHP叫次末跳弹出机制,也可以叫倒数第二跳弹出。简单来讲就是,所有路由器在为本地直连路由前缀捆绑标签的时候,都会捆绑一个保留标签值,值为3 就是隐含空(imp-null)
下图R3路由器就是4.4.4.4/32路由前缀的倒数第二跳。 所有路由器收到一个标签值为3的保留标签,那么路由器关于该前缀的Outgoing(出栈)动作就是PoP
MPLS控制层面和数据层面传递:
MPLS环境:IP地址规划已经标识了,例如:R1的f0/0接口IP地址:192.168.12.1/24 R1的换回口:1.1.1.1/32 剩下路由器依此类推
为了实验,我把每台路由器的标签空间做了限制,例如:R1路由器标签范围:100~199 R2路由器标签范围:200~299 剩下路由器依此类推
控制层面:所有路由器运行IGP动态路由协议,假设运行OSPF动态路由协议。运行OSPF协议好处很多,比如第一:保证全网路由可达,第二:保证LDP传输IP地址可达
以R4为观察点,R4路由器有一个4.4.4.4/32路由前缀,R4会为它进行本地捆绑标签,由于是直连,它为该前缀捆绑的标签值为3,然后传递给上游邻居R3
R3从邻居收到的标签叫remote label(远程标签)装在进LIB表中。R3也会为该前缀分配标签,假设是300,它会把这个捆绑了300的标签4.4.4.4/32路由前缀通过LDP协议传递给上游邻居R2和R5,同时也会传递给R4。 这个时候不会有环路,还记得上边LDP协议概述的一句话吗?是这么讲的:在所有捆绑某一特定前缀remote label中,LSR只使用其中一个标签来确定该前缀的出栈标签。FIB表来决定该前缀的下一跳是什么。(如果暂时不理解这句话,没关系,下边讲到数据层面就会理解)
剩下的路由器(R2、R5、R1)都会做和R3相同的动作,为该前缀捆绑标签,然后通过LDP协议把捆绑的本地标签传递给邻居。
控制层面很简单,就是IGP路由的学习传递,LDP标签的捆绑和传递。
数据层面:
以R1为观察点,假设R1下边有台PC要去往4.4.4.4/32地址,R1收到了一个普通的IP报文,首先会去查找它的FIB表(CEF数据转发表) imposed: {203} 要压入一个203的标签,所以R1在转发出去之前压入一个203标签
2.数据包到了R2路由器,R2收到一个带标签的数据包,会直接查找它的LFIB表(标签转发数据库) R2只会先看Local列表,因为R2是从邻居收到的标签数据包,邻居的标签数据包不就是 R2自己Local(本地)捆绑的吗? LDP协议本地捆绑的标签是给邻居使用的,不是给自己使用的。 R2发现Outgoing(出栈)动作要压入一个303的标签,303标签很明显是R3给的,那R2明明还有R5路由器,它为什么一定要用R3路路由器的标签而不用R5路由器的标签呢? 还是那句话:在所有捆绑某一特定前缀remote label中,LSR只使用其中一个标签来确定该前缀的出栈标签。FIB表来决定该前缀的下一跳是什么。
因为R2的FIB表中关于4.4.4.4/32的路由下一跳是R3,所以它使用R3的标签,而不用R5。不知道你们能不能理解,这也就是为什么R3先开始把4.4.4.4/32捆绑的标签传给R4,而不会产生 环路原因,因为R4清楚的知道,4.4.4.4/32是我直连路由网段,我FIB表决定一个标签数据包的Outgoing(出栈)动作。
3.数据包到了R3路由器后,R3收到了一个带标签的数据包,也是直接查找LFIB表(标签转发数据库) R3同样只会先看Local列表,发现303的标签Outgoing(出栈)标签是PoP弹出。 R3就会在转发这个数据包时候将303标签弹出,剩一个IP包传给R4路由器
4.数据包到了R4路由器,R4由于收到的是一个普通的IP包,会直接查找自己的FIB表(CEF转发表) 发现是connected(直连)然后转发出去
上边这就是整个控制层面和数据层面的全部过程,不知道大家有没有疑惑,R1怎么知道它收到的是IP包,R2有怎么知道它收到的是标签包,这个和它数据包的二层封装有关系,下边我们看下报文的二层封装
首先我们查看R1的报文:二层的封装有一个Type(类型)字段,这个字段用来标识上层也就是网络层运行的是什么协议。R1的Type(类型)字段是:0X0800 这是一个承载的是IPv4报文
我们去查看R2路由器的报文:R2的二层Type(类型)封装的是MPLS label (0X8847)也就是上层承载的是单播MPLS
MPLS网络收敛:
假设R2和R3之间链路故障,最先收敛的肯定是底层的IGP动态路由协议,只有IGP协议收敛完毕后,LDP才能进行收敛。原因其实很简单,还是那句话:在所有捆绑某一特定前缀remote label中,LSR只使用其中一个标签来确定该前缀的出栈标签。FIB表来决定该前缀的下一跳是什么。从这句可以看出来其实LFIB表(标签转发数据库)是由FIB表(CEF转发表)和LIB表(标签信息库)共同维护而来的,因为LFIB表中的Outgoing(出栈)标签是由FIB表决定
MPLS防环:
-
LDP的环路检测机制依赖于IGP协议
如果出现环路(一般是IGP出了问题,如静态路由的配置错误),标签头中的TTL将防止标签包无止尽的被转发
标签头中的TTL与IP头中的TTL是一样的,通常拷贝IP头中的TTL值(当一个IP包进入MPLS网络时)
MPLS配置:
R1(config)#ip cef 必做:一定要打开CEF交换,貌似CCIE TS考试,会帮你关掉····· 然后你惊喜发现标签分发会有问题
R1(config)#mpls ldp router-id loopback 0 force 指定LDP的Route-ID (建议使用loopback 接口) 传输IP地址默认等于LDP的Route-ID
R1(config-if)#mpls ip 在接口激活MPLS和LDP协议
上边是必须配置,下边是选配!!!
R1(config)#mpls label range 100 199 修改可用标签空间范围:选则配置,做实验看效果可以配置
R1(config)#mpls ldp neighbor 1.1.1.1 password cisco 配置认证(选配)无所谓······
R1(config)#mpls ldp neighbor 6.6.6.6 targeted 跨设备单播建立邻居关系
R1(config)#mpls label protocol ldp | tdp 修改标签分发协议 tdp是cisco私有的标签分发协议 ldp和tdp不能互相兼容,也就是一个MPLS网络只能运行一种协议
查看及验证命令:
R1#show mpls ldp parameters 查看LDP的相关参数
R1#show mpls interfaces fastEthernet 0/0 查看MPLS接口及相关参数
R1#show mpls ldp discovery detail 查看是否发现邻居
R1#show mpls ldp neighbor 1.1.1.1 detail 查看MPLS LDP邻居
R1#show mpls ldp bindings 查看LIB表
R1#show mpls forwarding-table 查看LFIB表
R1#show ip cef 查看CEF表
整个MPLS就讲到这里,有其他问题欢迎留言!
写这个也是一把辛酸泪啊,这是第三次才写成功,前两次手残了,点到了关闭浏览器按钮····
仝越~