一、MPLS概述


1.1 传统IP转发

1.png

  • 传统的IP转发采用的是逐跳转发,数据到达每一节点都要进行数据的解封装过程,并查询路由表,速度缓慢。
  • 传统IP转发是面向连接的,无法提供好的QOS保证。

  • 同时传统IP转发在流量工程方面也有缺陷。

2.png

  • 流量工程方面的缺陷
    • 所谓流量工程,就是操控流量的走向,依据IGP的cost或策略路由,但还是IP层面上的
    • 上面累死,下面闲死。
    • 即使做负载,也只是局部网络的而已,新加入网络之后,又要进行负载的配置。

1.2 MPLS转发特点

3.png

  • MPLS是一种标签转发技术,它采用无连接的控制平面和面向连接的数据平面
    • 无连接的控制平面实现路由信息的传递和标签的分发。
    • 面向连接的数据平面实现报文在建立的标签转发路径上传送。
  • MPLS域内,路由器不需要查看每个报文的目的IP地址,只需要根据封装在IP头外部的标签进行转发即可。

1.3 MPLS应用

  • MPLS VPN
  • MPLS TE(MPLS流量工程)
  • MPLS QOS

说明:

  • 最初提出MPLS是为了解决三层IP报文转发时速度慢的问题,因为当时的三层IP报文转发是基于软件实现的。但是往后发展,都实现了硬件转发。所以目前来看,MPLS的意义在于高层的应用,比如MPLS VPN和MPLS TE
  • MPLS,多协议标签交换,指的是除了可以支持IP协议,还可以支持HDLC,FR等。

二、MPLS基本原理

2.1 MPLS基本结构


2.1.1 MPLS网络模型

4.png

  • 在IP网络内进行传统的IP转发,在MPLS域内进行标签转发。
  • 在MPLS网络中,位于网络边缘的路由器称为LER。网络内的路由器称为LSR,MPLS报文经过的路径称为LSP。
  • 一条LSP总是起于一台被称为Ingress即入节点的LER,止于另一台被称为Egress即出节点的LER,中间经过若干台被称为Transit的LSR。
  • LSP具有单向性,且有静态LSP和动态LSP之分,静态LSP需要人工进行固定的标签分配,动态LSP需要利用诸如LDP这样的协议进行动态标签分配。

LDP这样的协议进行动态标签分配

  • LSP的入口LER:入节点(Ingress)
  • LSP中间的LSR:中间节点(Transit)
  • LSP的出口LER:出节点(Egress)

2.1.2 MPLS结构

5.png

  • 控制平面负责产生和维护路由信息以及标签信息。
  • 数据平面负责普通IP报文转发以及带MPLS标签报文的转发。
  • 控制平面中路由协议模块(Routing Protocol)用来传递路由信息,生成路由信息表,标签分发协议模块(Lable Distribution Protocol)用来完成标签信息的交换,建立标签转发路径。

  • 补充1

    • 控制平面就各种协议去做的,然后IGP形成路由表和转发表,LDP形成标签转发表
    • 数据平面采用形成的表进行数据转发
    • FIB:Forwarding Information Based
      • IP Forwarding Table:FIB
      • Label Forwarding Table:LFIB
  • 补充2:FIB和LFIB之间的箭头

    • 实际上,如果没有运行MPLS那么FIB中是没有标签信息的,但是如果运行MPLS协议,可以在FIB中也会看到有标签信息,因为当收到IP报文去查找FIB时,有可能发出去的是带标签的报文,所以也就需要在FIB中有标签信息了。
  • 补充3:查看FIB表和LFIB表

    • FIB表:可以使用命令dis fib x.x.x.x mask verbose查看
      • 在华为的教程中,要求我们查看NHLFE表(Next Hop Lable Forwarding Entry),即使用命令mpls lsp include x.x.x.x mask verbose,实际上是弄得有些复杂了。
      • LFIB表:可以使用命令dis mpls lsp查看
        • 在华为的教程中,要求我们查看ILM(Incoming Lable Map),即使用命令dis mpls lsp include x.x.x.x mask in-lable x verbose,实际上ILM表也是LFIB表的一部分。

2.2 MPLS标签格式

2.2.1 帧模式MPLS

6.png

  • MPLS有两种封装模式:帧模式和信元模式。帧模式封装是直接在报文的二层头部和三层头部之间增加一个MPLS标签头。
  • 以太网,PPP采用这种封装模式。
  • ATM采用信元模式封装

2.2.2 MPLS Header

7.png

  • MPLS Header总长度为32bit

  • LABEL:20bit,该标签用于报文转发。

  • EXP:3bit,通常用来承载IP报文中的优先级
  • S:1bit:栈底标志,用来表明是否是最后一个标签(MPLS标签可以多层嵌套)
    • 如果有多层标签,那么靠近IP报头的MPLS标签的该标志被置为1,其它的为0
  • TTL:8bit,作用类似IP头部的TTL,用来防止报文环路等

2.2.3 MPLS标签嵌套——标签栈(Lable Stack)

8.png

补充说明1:

  • Lable 3:内层标签(或低层标签)
  • Lable 1:外层标签(或高层标签),简单情况下,作为转发依据


1.协议字段PID标识二层头部后面的报文类型

  • Ethernet
    • 0x0800:IPv4(没有标签)
    • 0x8847:MPLS单播报文
    • 0x8848:MPLS多播报文
  • PPP
    • 0x8021:IPv4
    • 0x8281:MPLS单播报文
    • 0x8283:MPLS多播报文

2. 标签嵌套应用

  • MPLS VPN:会使用两个标签(复杂情况下,会用到三个标签),外层标签用于公网转发,内层标签用来标识报文属于哪个VPN。
  • MPLS TE:也会使用两个或多个标签,最外层标签标识TE隧道内层标签表明报文的目的地
  • 如果只使用MPLS,不考虑高级应用的话,那么只有一层标签

9.jpg
3. 这里的Lable1,Lable2,Lable3都指的是2.2.2中的4个Bytes的MPLS头部,其中包含有20bit的标签信息。


2.3 MPLS转发过程

2.3.1 Ingress LER(FEC+NHLFE)

9.png

  • 当一个IP报文进入MPLS域时,入口LER(SWA)会分析报文,根据该报文的特点(一般根据目的地址前缀分析)决定应该给该报文封装哪个标签以及应该从哪个接口转发给哪个下一跳。

10.png

  • 在入节点时,查找的表项为FIB,上面显示的信息NHLFE的内容,实际上大部分已经同步到FIB中,可以查看补充的信息。

  • FEC(Forwarding Equivalence Class):在转发过程中以等价的方式处理一组数据分组,例如目的地址前缀相同的数据分组。通常对一个FEC分配唯一的标签。如本例中目的地址前缀为10.2.0.0/24的报文属于一个FEC,该FEC分到的标签为1030。(该例子中以IP地址的前缀作为FEC,默认情况下,华为设备认为不同的前缀就是不同的FEC

11.jpg

  • NHLFE(Next Hop Lable Forwarding Entry):进行标签转发时用到,NHLFE包含这样一些基本信息:
    • 报文的下一跳
    • 如何进行标签操作
      • 包括压入新的标签push
      • 弹出标签pop
      • 用新的标签替代原有的标签swap
    • 出接口
    • NHLFE还可能包含一些其它信息,如发送报文使用的链路层封装等。如本例中下一跳为10.1.1.2,标签操作为压入标签。

2.3.2 Ingress LER(SWA)

12.png

  • FEC代表了同一类报文,NHLFE包含了下一跳和标签操作等信息。
  • 只有将FEC和NHLFE关联起来,才能实现对于同一类报文进行特定的标签转发。
  • FTN实现这个功能,FTN(FEC-to-NHLFE)将FEC映射到NHLFE。当LER将一个不带MPLS标签的IP报文转发给MPLS LSR时需要使用FTN。如果网络中存在等值路径,那么一个FEC可能会映射到多个NHLFE。
  • FTN只在LSP的入节点处使用

2.3.3 LSR(SWB)

13.png

  • SWB从SWA收到带有MPLS标签1030的报文,根据MPLS标签进行转发

14.png

  • 本例中SWB收到带有标签1030的数据包,根据标签转发,找到下一跳为10.1.1.6,并用出标签替换(SWAP)入标签,继续转发。(本例情况特殊,出标签和入标签相同,只要本地分配的标签不会冲突就可以了)。
  • ILM:将每个入标签映射到NHLFE,当LSR转发带有标签的报文时使用ILM。同样,如果存在等价路径时一个入标签会映射多个NHLFE。

2.3.4 LSR(SWC)

15.png

  • 与SWB类似,SWC收到带有标签1030的报文后,根据标签进行转发,并用新出标签替换原来标签。

16.png

  • 本例中,SWC用出标签1032替换(SWAP)入标签,然后从出接口Vlanif3转发,下一跳为10.1.1.10。

2.3.5 Egress LER(SWD)

17.png

  • Egress LSR SWD收到带有标签1032的报文后,去掉(POP)标签,查找IP路由表转发。

18.png

  • 本例中,SWD去掉标签1032,转发报文到下一跳10.2.0.2.

2.3.6 MPLS数据转发详解

19.jpg
20.jpg

  • NHLFE使用命令dis mpls lsp include x.x.x.x mask verbose
  • ILM使用命令dis mpls lsp include x.x.x.x mask in-label x
  • 实际上,NHLFE已经迭代到FIB中,而ILM其实也是dis mpls lsp的一部分

21.jpg
22.jpg


2.4 LSP

2.4.1 LSP介绍

  • 在MPLS网络中,位于网络边缘的路由器称为LER,网络内的路由器称为LSR,MPLS报文经过的路径称为LSP。
  • 一条LSP总是起于一台被称为Ingress即入节点的LER,止于另一条被称为Egress即出节点的LER,中间经过若干台被称为Transit的LSR。
  • LSP具有单向性,且有静态LSP和动态LSP之分,静态LSP需要人工进行固定的标签分配,动态LSP需要利用诸如LDP这样的协议进行动态标签分配。
    • LSP的入口LER:入节点(Ingress)
    • LSP中间的LSR:中间节点(Transit)
    • LSP的出口LER:出节点(Egress)

2.4.2 动态LSP

23.jpg

  • LDP根据前缀对FEC进行分类。
  • 下游为上游分配标签。(对于目的地3.3.3.3/24)

24.jpg

2.4.3 动态LSP LDP标签分配实验

  • LDP标签分配原则

25.jpg
更新为:
26.jpg
下面的实验体现原则3b时,也可以体现原则4

  • 实验拓扑1说明

27.png
现在,只对R4和R5做分析。(即只有R4的G0/0/1和R5的G0/0/1启用了MPLS和LDP)。

  • R4与R5标签情况

1.首先,R4和R5肯定都会为自己的I0分配标签,同时发送该标签映射消息(R5的就不看了)
28.png
29.png
这里的话就遵循原则1,2,3a,实际上R4的路由条目为L:
30.png

2.R4也会为R5的Loopback0分配标签
31.png
这里的话就要遵循原则3b,看路由表:
32.png

不像RIP的水平分割,收到了peer发送过来的标签后,R5自己也会分配一个标签,同时也会把这个分配的标签发送给自己的peer,此时R5上是可以看到这个标签的:
33.png
只是,有*表示不使用的,因为10.1.5.5对R5来说已经时直连的了,在R5的LFIB中,就看不到它了:
34.png

  • 深刻理解原则3b

35.png
现在,R6不启用MPLS,R2~R5都启用
查看R2上的标签转发数据库
36.png
可以发现R2没有为10.5.5.5分配标签,回顾原则3b,查看R2上去往10.1.5.5的路由表:
37.png
因为标签时从R3发来的,但是去往10.1.5.5的下一跳是走R6,所以R2没有为10.1.5.5分配标签,也没有使用R3发来的标签。
这时可以把R2的G0/0/2接口shutdown,再查看标签分发情况:
38.png
现在就正常了,这也就再次验证了原则3b

验证命令

  • ping lsp ip
  • tracert lsp ip

39.png
40.png

2.4.4 静态LSP

27.jpg

  • 配置静态LSP时,在以太链路中,必须要写下一跳。
  • 动态比静态优先。
  • 如果只配置了单向静态LSP,则在IP域ping时,去往目的地的数据包走的是LSP的路径,但是回的数据包只是普通的IP数据包。

2.4.5 标签分配完成实例

41.png
下面分别查看R2~R5上的标签数据库和标签情况,一定要清楚每个标签到底时怎么来的。

R2
42.png
R3
43.png
R4
44.png
R5
45.png


三、MPLS环路检测

  • IGP环路检测机制:如OSPF的SPF算法本身防环
  • TTL环路检测
    • 帧模式的MPLS中使用TTL
    • 信元模式的MPLS中无TTL
  • LDP环路检测机制

    • 距离向量法
    • 最大跳数法


    后面主要介绍MPLS中对TTL的处理、LDP的距离向量法最大跳数法
    **


3.1 MPLS TTL环路检测

MPLS对于TTL的处理有两种方式:

  • 一种是IP报文在进入MPLS网络的时候MPLS头部的TTL拷贝IP TTL值
  • 另外一种是在入口LER将MPLS头部的TTL统一设置为255.

3.1.1 处理1——拷贝TTL

46.png

  • 这是华为设备对TTL的默认处理方式
  • SWA从IP网络收到IP报文,IP TTL=11,SWA首先将IP TTL减1然后拷贝的MPLS的TTL域(IP TTL=10,Label TTL=10)
  • SWB收到带有标签的报文,不处理IP TTL,只将MPLS的TTL减1(IP TTL=10,Label TTL=9),然后发送给SWC
  • SWC收到带有标签的报文,将MPLS的TTL减1(Label TTL=8),由于SWC为倒数第二跳,所以弹出标签,同时将MPLS的TTL拷贝到IP TTL中(IP TTL=8)
  • SWD从SWC接收IP报文,按照普通IP转发将IP TTL减1后发送(TTL=7)

  • 拷贝TTL的特点是:MPLS域不会隐藏其中的LSR,tracert时会追踪到域内的每个LSR节点,这对于定位MPLS域内的故障时有帮助的,可以使用TTL propagation来开启此功能。

    • 如果MPLS域是ISP的话,那么对于ISP来说,是不愿看到这种现象的,这种情况下可以使用下一种TTL处理方式。

3.1.2 处理2——TTL255

47.png

  • SWA从IP网络收到IP报文,IP TTL=11,SWA将IP TTL减1,但并不将IP TTL拷贝到MPLS的TTL域,而是设置MPLS TTL为255(IP TTL=10,Label TTL=255)
  • SWB收到带有标签的报文,不处理IP TTL,只将MPLS的TTL减1(IP TTL=11,Label TTL=254),然后发送给SWC
  • SWC收到带有标签的报文,将MPLS的TTL减1(Label TTL=253),由于SWC为倒数第二跳,所以弹出标签,将普通IP报文(TTL=10)发送给SWD,发送到SWD。
  • SWD从SWC接收IP报文,按照普通IP转发将IP TTL减1后发送(TTL=9)
  • 特点:隐藏MPLS域内LSR,tracert追踪时只能看到LER
  • 问题:当进入MPLS域的IP数据包的TTL为2时,数据在MPLS域内的传输是无意义的

48.png
补充1:配置方式
[AR1]mpls
[AR1-mpls]undo ttl propagate public

3.1.3 TTL和环路检测

49.png

  • 如果在SWB和SWC之间存在环路,带有标签的报文将会被SWB和SWC循环反复转发,每次MPLS TTL都会减1,直到 TTL=0,报文被丢弃。
  • 即Label TTL为0时,LSR也会丢弃该报文

3.2 LDP环路检测

  • LDP路径向量法和最大跳数法分别通过两类TLV实现:Path Vector TLV 和 Hop Count TLV
  • 如果配置使用这两类方法检测环路,那么在标签请求消息(Label Request Message)和标签映射消息(Label Mapping Message)中都会携带这两种TLV

3.2.1 LDP路径向量法

50.png

  • 每个LSR在发送标签请求消息(标签映射消息)中,包含一个Path Vector TLV,并且入口(出口)LSR产生的路径长度值为1,并且把自己的LSR ID加到TLV的列表中,标签请求消息(标签映射消息)每经过一跳长度值加1
  • 接收端LSR如果收到的标签请求消息(标签映射消息),发现长度值达到预先设定的最大值或者发现LSR ID列表中有自己的LSR ID,认为发现环路,发出通知消息,拒绝LSP的建立

3.2.2 LDP最大跳数法

51.png

  • 每个LSR在发送标签请求消息(标签映射消息)中,包含一个hop count TLV,并且入口(出口)LSR产生的初始跳数值为1,标签请求消息(标签映射消息)每经过一跳跳数值加1;
  • 接收端LSR如果在收到的标签请求消息中(标签映射消息),发现跳数值达到预先设定的最大值,认为发现环路,发出通知消息,拒绝LSP的建立

四、MPLS中路由汇总带来的问题

52.jpg

  • 拓扑说明:实际上R5也在MPLS域中,所以R4才为次末跳

  • 问题分析

    • 如果不做汇总,基本LSP的访问是没有问题的,而且对于10.1.1.0/24的LSP,路径就为R1到R5;
    • 做了汇总之后(/16位的汇总),对于华为设备,在R3上是不会产生/16指向空接口的路由,而在思科设备上是会产生这样的路由的,这是为了防止环路。
      • 假如R3有个指向R2的默认路由,R1发往10.1.2.0/24的数据,那么由于在R1和R2上都会收到R3发送过来的/16的汇总路由,所以数据会沿着R1~R3的方向发送;
      • 但是当数据来到R3后,实际上R3只有10.1.1.0/24的明细路由,所以这时候路由查找失败,会把数据发到默认路由指向的下一跳,也就是R2;
      • 这样的话,就会产生环路了;
      • 如果这时候在R3上产生一条10.1.0.0/16指向NULL 0的路由条目,发来10.1.2.0/24的数据,在R3上没有该明细路由,那么这时会先匹配到10.1.0.0/16指向NULL 0的路由,这样的话R3就会把数据丢弃,也就避免了环路的问题。
    • R3~R5的LSP依然是10.1.1.0/24的,但是对于R1~R3的,则要看情况:
      • 在华为设备上,R3上没有产生10.1.0.0/16指向NULL 0的路由(虽然R3汇总后将该汇总路由发给了R3,但是在其路由表上并没有该路由条目),那么R3也就没有办法为该前缀分配标签,自然R2也不会收到/16的标签,所以这时,R1~R2的路径上,是没有10.1.0.0/16的LSP的。(R3实际上还是会给R2发送10.1.1.0/24的标签,但是并不匹配R2收到的10.1.0.0/16的前缀)
        • 这种情况下,R1发往10.1.1.0/24的数据,在R1~R3上传送的是IP数据报文,而在R3~R5上传送的是MPLS的数据报文;
        • 对于纯的MPLS网络,报文的转发是没有问题的,但是如果在该网络环境中存在高层应用,比如MPLS VPN,那么就会出现问题。
      • 在思科设备上,或者在华为设备R3上手动配置了10.1.0.0/16指向NULL 0的路由,那么R3就会为10.1.0.0/16分配标签,也就会发给R2,这时,R1~R3有10.1.0.0/16的LSP,R3~R5有10.1.1.0/24的LSP,但是需要注意的是,这是两条不同的LSP,虽然在数据的转发过程中都有标签存在。
        • 这是两条不同的LSP,在R3上,10.1.1.0/24的标签是R4给R3分发的,但是对于10.1.0.0/16的标签,是R3作为给自己的直连路由分发标签而分发的,这是完全不同的。