MPLS介绍

    • Multi-Protocol Label Switching (多协议标签交换)

           Multi-Protocol:支持多三层协议,如IPIPv6IPX

            Label Switching:在所承载的报文前加上标签栈、基于标签做转发 

    • MPLS是一种新的转发机制,数据在MPLS网络中是根据标签进行转发

    • 一般而言MPLS的标签对应的是目的地址(路由前缀)

    • MPLS依赖IP路由及CEF交换




MPLS术语:

    • RIB:路由表

    • FIBCEF数据转发表

    • LIB:标签数据库

    • LFIB:标签转发数据库,它的信息来源,由LIBFIB共同维护而来的

    • 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网络的好处:

  1.  采用MPLS,可避免IP路由的逐跳转发情况,减少对数据包的深入分析,借助标签建立二层的快速转发路径,使得数据沿着一条预先建立的路径快速转发

  2.  数据包在进入MPLS网络的入口,路由器将进行一次三层查找,而在此之后的LSR只进行简单的标签交换动作,不需要在进一步分析三层的信息

  3. MPLS可以部署MPLS-×××,传递不同×××客户端的路由信息。


 LDP协议概述:

  • LDP协议叫标签分发协议,IP路由表中的每一条IGPIP前缀来说,每一台运行LDP协议的LSR都会进行本地捆绑,也就是说,为IPv4前缀分配标签,然后LSR再将该分配的标签分发给所有的LSR邻居。从邻居接收到的标签转换为远程标签remote label,之后将远程标签和本地标签存储于标签信息库LIB

  • 在所有捆绑某一特定前缀remote label中,LSR只使用其中一个标签来确定该前缀的出栈标签。FIB表来决定该前缀的下一跳是什么。LSR用这样的信息来创建它自己的标签转发数据库LFIB  

  • LDP不会为BGP路由前缀捆绑标签


LDP邻居建立:两个阶段,邻居发现阶段和邻居会话阶段  

            


邻居发现阶段:

  1.     在接口上激活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,目的端口是TCP646

   


LDP会话建立过程:

  1.    传输IP大的首先发送初始化的消息,就好比BGPOPPEN消息一样,里边携带了一些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-ID6个子节(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标签的处理方式:insertimposer or push压入Swap(置换)、PoP(弹出)、untagged(移除)、Aggregate(聚合)

  1. insertimposer or push压入对数据包压入标签,压入的动作常见于在MPLS域边界由ingress LSR路由器所完成压入标签,可以同时压入多个标签。

  2. Swap(置换):对收到的标签数据包,要将它转发出去之前,需要把出栈标签替换成邻居的标签,完成置换动作,常见于处于MPLS域中间的LSR路由器所操作。

  3. PoP(弹出)将标签数据包最顶层标签弹出,常见于某条路由前缀的倒数第二跳路由器(如果大家不理解这句话也没关系,下边会提及到PHP次末跳弹出机制,大家就会懂PoP是怎么回事)

  4. untagged(移除):将整个标签栈移除,不管上边有多少层标签。  untagged(移除)动作其实是一个很诡异的动作,它存在有时候是很合理的,有时候是很不合理的,还需大家自己慢慢体会

  5. 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是有特定的标签值对应的,而untaggedaggregate是没有特定的标签的

         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地址可达

  1. 以R4为观察点,R4路由器有一个4.4.4.4/32路由前缀,R4会为它进行本地捆绑标签,由于是直连,它为该前缀捆绑的标签值为3,然后传递给上游邻居R3

  2. R3从邻居收到的标签叫remote label(远程标签)装在进LIB表中。R3也会为该前缀分配标签,假设是300,它会把这个捆绑了300的标签4.4.4.4/32路由前缀通过LDP协议传递给上游邻居R2和R5,同时也会传递给R4。   这个时候不会有环路,还记得上边LDP协议概述的一句话吗?是这么讲的:在所有捆绑某一特定前缀remote label中,LSR只使用其中一个标签来确定该前缀的出栈标签。FIB表来决定该前缀的下一跳是什么。(如果暂时不理解这句话,没关系,下边讲到数据层面就会理解)

  3. 剩下的路由器(R2、R5、R1)都会做和R3相同的动作,为该前缀捆绑标签,然后通过LDP协议把捆绑的本地标签传递给邻居。

  4. 控制层面很简单,就是IGP路由的学习传递,LDP标签的捆绑和传递。



数据层面:

  1. 以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将防止标签包无止尽的被转发

    • 标签头中的TTLIP头中的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就讲到这里,有其他问题欢迎留言!

写这个也是一把辛酸泪啊,这是第三次才写成功,前两次手残了,点到了关闭浏览器按钮····

仝越~