[学习笔记] - MPLS

MPLS 一种在开放的通信网上利用标签引导数据高速、高效传输的新技术。

数据交换方式

  • 进程交换(Process Switch)
    • 把包放进系统缓存,拿目的地址到路由表中查询对比
    • CPU进行CRC校验,重写第二层MAC地址
  • 快速交换(Fast Switch)
    • 采用路由缓存来储存关于某条数据流的特定信息
    • 第一次还是需要执行进程交换,得到的信息写入缓存,以后用缓存进行交换
  • Cisco Express Forwarding
    • 基于硬件平台,不仅仅把数据写入缓存,而是把整个路由表,拓扑表,以及所有下一跳的地址,MAC地址全部预存
    • CEF表称为FIB(转发信息库)

概述

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

当一个(无状态的)网络层协议数据包(例如IP协议报文)在路由器之间游荡时,每个路由器都是独立的对这个数据包做出路由决策:路由决策就是路由器决定数据包如何路由转发的过程。

在这里指,每个路由器都需要分析包头,根据网络协议层的数据进行运算,再基于这些分析和运算,独立的为数据包选择下一跳(next hop),最后通过next hop将数据包发送出去。

  • 分类,将特定的数据包归属为一个等价转发类(Forwarding Equivalence Classes,FEC)
  • 查找,查找FEC对应的下一跳

具体到IP协议报文,当多个IP协议报文的目的地址都对应路由器的一条路由,且这条路由是所有路由里面最长匹配(longest match)的路由,那么对于这个路由器来说,就会认为这两个IP协议报文属于一个FEC。因此,这两个数据包就会走同一条路径出这个路由器。这就是我们最常见到的路由转发。

多链路负载均衡的情况下,一个FEC也可能对应一组下一跳,但是逻辑上还是能看成是一个下一跳

对于同一个路由器来说,同一个FEC必然对应同一个下一跳,那么属于同一个FEC的所有网络数据包必然会走同一条路径转发出去。

传统的路由决策,路由器需要对网络数据包进行解包,再根据目的IP地址计算归属的FEC。而MPLS提出,当网络数据包进入MPLS网络时,对网络数据包进行解包,计算归属的FEC,生成标签(Label)。当网络数据包在MPLS网络中传输时,路由决策都是基于Label,路由器不再需要对网络数据包进行解包。并且Label是个整数,以整数作为key,可以达到O(1)的查找时间。大大减少了路由决策的时间。这里的Label就是MPLS里面的L。需要注意的是Label在MPLS网络里面,是作为网络数据包的一部分,随着网络数据包传输的。

也就是说,在MPLS网络里面,数据被封装在了盒子里,上面贴了标签,每个经手的人只需要读标签就知道盒子该送到哪

一旦进入了MPLS网络,那么网络数据包的内容就不再重要,路由决策(包括FEC归属的计算,下一跳的查找)都是基于Label来进行的

  • 采用MPLS,可避免IP路由的逐跳转发情况,减少对数据包的深入分析,借助标签建立二层的快速转发路径,使得数据沿着一条预先建立的路径快速的转发
  • 数据包在进入MPLS网络的入口路由器上被进行一次三层查找,而在此后的LSR只是进行简单的标签交换动作,无需进一步分析三层信息
  • 每个LSR必须在数据转发之前建立好LIB,以及LFIB,当LSR收到一个标签数据帧时,将数据帧中的标签在LFIV表中进行查找,再根据LFIB表中指示的相关动作对标签进行压入,弹出,交换,移除等动作

  • Multi-Protocol:支持多三层协议,如:IP,IPv6,IPX
  • Label Switch:在所承载的报文前加上标签栈,基于标签做转发

在MPLS域中,MPLS在三层数据包的基础上,加上一个标签头,依据这个标签头进行交换

  • MPLS是一种新的转发机制,数据在MPLS网络中是根据标签信息进行转发
  • 一般而言,MPLS的标签对应目的地址
  • MPLS依赖IP路由及CEF交换
  • MPLS基于报文头部的标签进行数据转发
  • MPLS能够支持或者说承载多种三层协议

流程

  • 路由器允许IGP路由协议,维护路由表及CEF表
  • 路由器运行标签分发协议(LDP),维护LIB表(标签信息库)
    • 每个路由器为每条路由前缀捆绑标签
    • 把自己捆绑的标签通过LDP协议通告给LDP邻居
  • 路由器更新CEF表,同时维护LFIB表(FIB+LIB)
1
200 -> 300 S0/1

在MPLS域边界上的路由器,会先查FIB表,然后压入标签,进行转发
进来的包是200,则修改200为300发放下一跳

IP包查FIB,CEF表,MPLS查LFIB表

架构

  • Control plane
    • 交换三层路由信息及标签
    • TDP,LDP,BGP,RSVP
  • Data plane
    • 基于标签进行数据转发

角色

  • LSR(Label Switch Router):标签交换路由器
    • LER(Label Edge Router):边界标签交换路由器
      • Ingress LSR:进入MPLS网络的节点
      • Egress LSR:出MPLS网络的节点
    • Intermediate LSR:中间标签交换路由器
  • LSP(Label Switching Path):特定的FEC中的IP协议报文所经过的LSR的集合
    • 单向路径
  • FEC:等价转发类
    • 可通过地址,隧道,CoS等方式标识
    • 属于同一个FEC具有相同的转发操作,但是不是所有用于相同标签的报文都属于同一个FEC
    • 决定报文属于哪一个FEC是入站FEC

标签

  • Label:标签
  • EXP:实验位,用于QoS
  • BoS:栈底位
    • 1:则表示最后一个标签,可以给一个数据包压多层标签
  • TTL:最大255,一般直接复制IP报文

MPLS可以嵌套,压入多个标签

  • 二层帧头都有一个字段用于标识上层协议,对于以太网帧中,协议字段使用0x8847(单播)或0x8848(组播)来标识承载的是MPLS报文
    • 如果上层是IPv4报头,则为0x0800
    • 在PPP帧中,有一种NCP为MPLSCP
  • 允许多标签存在,标签中BoS标识是否为最后一个标签
  • 路由器只处理最顶层的标签

标签处理方式

  • Insert:压入
  • Swap:置换
  • Remove:弹出

都只对顶层标签操作

应用

  • 单播
  • 组播
  • 流程工程
  • QoS
  • VPN
  • AToM

LDP

对IP路由表的每一条IGP的IP前缀来说,每一台运行LDP协议的LSR都会进行本地捆绑,也就是说,为IPv4前缀分配标签,然后LSR再将该分配的标签分发给所有邻居。这些接收到的标签转换为远程标签,之后邻居将该标签和本地标签存储于一张特殊的表中,这个表就是标签信息库LIB,通常一台LDP路由器会有多个LDP邻居,那么这些邻居都会给路由分配标签然后将这些标签传给自己

在所有捆绑某一特定前缀的远程标签中,LSR只使用其中一个标签来确定该前缀的出站标签,RIB,也就是路由表来决定IPv4前缀的下一跳是什么,而LSR从下游LSR收到的远程标签中选择其路由表中到达该前缀的下一跳的标签。LSR用这样的信息来创建它自己的标签转发信息库LFIB

邻居发现

  • 由传输地址大的一方发起TCP连接
  • 组播:224.0.0.2
  • Hello包使用UDP的646端口
  • 其他包使用TCP的646端口

双方需要由到对方的传输接口的路由

            sequenceDiagram
            R1->>R2: UDP(Hello) 组播
R2->>R1: UDP(Hello) 组播
R2->>R1: TCP SYN
R1->>R2: TCP SYN ACK
R2->>R1: TCP ACK
          

3个IP

  • 接口IP
  • 传输IP
  • RouterID

Hello包

  • IP Header
    • 源地址
    • 目的地址
  • UDP Header
    • 源端口:646
    • 目的端口:646
  • LDP Hello Msg
    • Transport addr
    • LDP ID

  • LDP邻居建立首先发送Hello包
  • LDP ID为6个字节,4字节IP——2字节Label SpaceID
  • 两个路由器建立LDP零件,要保证双方LDP ID三层可达
  • Transport addr一般等于LDP ID
  • LDP ID的选举和OSPF RouterID一样

Lable Space

  • Label Space ID一般为0,表示标签是基于平台发送的
  • LFIB表不包含入接口信息
  • 为前缀分配的标签在本地任意MPLS接口可用并且会分发给所有LSR邻居
  • 本地分配的标签会分发给邻居,如果单个邻居有多条连接,则该标签在所有连接上均有效,而且值是一样的
  • 基于平台的标签空间相对于基于接口的标签空间安全性要更低

  • LSR为每个标签空间只维护一个LDP session
    • 基于平台的标签空间只需要一条LDP session,即使在LDP邻居间存在多条冗余链路
  • 基于平台的标签空间Label Space ID为0

会话建立

            sequenceDiagram
            R2->>R1: 初始化消息,协商相关参数
R1->>R2: 如果接受这些参数,则发初始化信息并发keepalive
R2->>R1: 如果接受这些参数,发keepalive
          

标签映射消息交互

            sequenceDiagram
            R2->>R1: 标签映射消息
R1->>R2: 标签映射消息
          

指令

1
2
3
4
5
6
# 查看邻居
R1#show mpls ldp neighbor
# 查看FIB表
R1#show ip cef detail
# 查看LFIB表
R1#show mpls forwarding-table

帧模式标签分配

帧模式的MPLS网络标签分配遵循

  • 依赖IP路由协议构建IP路由表
  • 所有的LSR为路由表中的每条路由前缀分配标签
  • LSR将自己针对前缀分配的标签都传递给所有其他LDP邻居
  • 每个LSR建立自己的LIB,LFIB及FIB表

  • 构建IP路由表
  • 分配并分发标签,维护LIB
    • 所有LSR会为自己本地路由表中的路由前缀分配标签
    • 这些关于路由前缀的标签会被分发给其他LDP邻居
  • 维护LFIB
    • 所有LSR会为自己本地路由表中的路由前缀分配标签
    • 这些关于路由前缀的标签会被分发给其他的LDP邻居

  • 依赖IP路由协议构建IP路由表
  • 所有的LSR为路由表中的每条路由前缀分配标签
  • LSR将自己针对前缀分配的标签都传递给所有的其他LDP邻居
  • LSR将自己针对前缀分配的标签,以及邻居发来的标签存储在LIB中
  • 路由前缀的下一跳LSR发送过来的标签,用于填充FIB表中的标签信息以及LFIB表中的outgoing label

次末跳弹出

PHP before

  • 如果没有次末跳弹出,出口LSR会收到标签包,查看LFIB,弹出标签,然后发现是IP包,又查找FIB,最后按此转发,效率不高
  • 所以在前一跳就把包弹出,这样就可以加快效率
  • 出口路由器为直连路由分配的label为implicit null
  • 次末端收到出口路由器pop标签(值为3)

如果想保留EXP等字段可以使用explicit null,标签会变为0,会保留头

路由汇总影响

如果进行了路由汇总,会为原先路由分发一个标签,还会对汇总路由分发一个pop标签,从而造成误pop。如果路由器没有IP路由(只是根据标签进行判断),这个时候误弹会造成丢包

保留标签

0-15是保留标签

序号 说明
0 显示空标签
1 路由器报警
3 隐式空标签
14 OAM报警

环路避免

  • LDP环路检测机制依赖于IGP协议
  • 如果出现环路,标签头的TTL将防止标签包无止尽的被转发
  • LDP的TTL和IP包TTL相同(TTP propatation)
    • 压入的时候复制,之后不改变IP里的TTL
    • 弹出的时候复制到IP包里

MPLS BGP

BGP一个AS里面的路由,可能没有运行IBGP,导致没有路由,产生路由黑洞,MPLS可以通过标签解决这个问题
MPLS通过打标签,这样即使AS内路由器不运行EGP,也能够转发包

但是BGP的边界路由一般是不会宣告和AS之外的路由的,所以会对本AS的IBGP邻居宣告下一跳是自己,这样会导致MPLS的次末端弹出提前一个路由,从而丢包。解决方法是,IBGP的邻居关系,需要建立在loopback上,而不是直连的网段上,这样标签会分给回路IP上,就不会造成提前的次末端弹出。

路由汇总,会造成汇总路由器为路由始发路由器,从而造成没有必要的次末端弹出

MPLS VPN

单纯部署MPLS没有什么意义,IPv6已经改善了转发速度。MPLS VPN结合了overlay vpn和p2p vpn的优势

  • PE路由器与CE路由器运行动态路由协议
  • PE为每个客户维护一个独立的路由表
  • 允许客户使用重叠的地址空间

需要解决问题

  • 用什么协议来承载客户路由
  • 怎么区别客户之间的路由
  • 怎么维护这些路由

MPLS VPN架构

  • PE:运营商边界设备
    • 与客户边界设备相连接,允许MPLS,同时在PE上,使用VRF对VPN客户进行隔离
  • P:运营商设备
    • 运营商设备不直接与客户设备向连接,运行MPLS,P设备往往不知道VPN客户网络以及客户的路由,只负责运载标签数据
  • CE:客户机边界设备
    • 客户网络中,与PE直接连接的设备,主要功能是将VPN客户的路由通告给PE,以及从PE学习同一个VPN下其他站点的路由

虚拟路由转发VRF

相当于在物理路由器上,创建一台虚拟路由器,虚拟路由器可以分配接口,也就有了路由表,这个路由表是虚拟的路由表,这个路由表和全局路由表隔离,不互相干扰,同时有自己的CEF表,可以运行自己的动态路由协议。

  • 路由表
  • CEF转发表
  • 路由协议参数
  • 接口
    • 一个VRF可以有多个接口
    • 一个接口只能属于一个VRF

PE根据每个客户,创建一个VRF,相当于每个客户都单独连接一台虚拟服务器。这样客户之间的路由就可以重叠。
但是在运营商的网络内传播的时候,还是无法区分,那么就需要对路由做一定标记(VPNv4前缀)

1
2
A 1.1.1.0/24 -> 234:1:1.1.1.0/24
B 1.1.1.0/24 -> 234:2:1.1.1.0/24

标记叫做RD值(64bit),用来标识每个用户的路由,保证路由的唯一性。
这个时候,提供商BGP内就需要做改动来可以传递VPNv4路由,就利用到了扩展BGP,叫做MP-BGP(多协议BGP)

  • BGP能够承载大批量的路由前缀
  • BGP拥有丰富的路径属性及丰富的策略部署工具
  • BGP能够再非直连的Peer之间交互路由信息,因此P路由器无需运行BGP即无需维护客户的路由信息,大大减轻了负担

MP-BGP在MPLS VPN中用于在PE路由器之间交互VPNv4路由,同时为VPNv4路由分配标签

现在还需要传递给另一端路由器,哪一个用户对应哪个RD值。就由需要一个RT值来标志VPNv4路由属于哪个VRF。RT值属于扩展Community。RD和RT一起传递。再对端PE路由器上配置RT import。对应RT值导入到对应CRF里

  • RT(Route Targets):区分VPN客户
    • RT说明路由属于哪一个VRF,区分VPN
    • 本质是BGP扩展Community属性
    • 一条路由可以有多个RT值
    • import对应export
  • RD(Route Distinguisher):区分路由
    • RD并不会说明该前缀属于哪一个VRF
    • RD只用于确保路由唯一性
    • 一般为AS:nn或者IP:nnnn是提供商分配的VRF唯一号码
  • VRF:虚拟路由器

直接只用RT的话,LDP需要不同路由打标签,所以路由也需要有全局唯一性

数据传输

现在数据包进行发送,会被压入标签,可以在提供商BGP内传递,但是到PE的时候,无法区分是给哪个用户的包。此时MP-iBGP就在发路由前缀的时候,同时捆绑上标签,此时对端PE发数据的时候,先压入MP-iBGP给的标签(用于识别给哪个用户),然后再压入一层标签(用于传递)

使用2层标签,内层标签由出站PE用MP-iBGP通告,外层标签为LDP标签,用于下一条传递

PE需要配置以下

  • IGP 全局路由表
  • VRF
  • MP-BGP
  • MPLS LDP
  • PE-CE动态路由协议
    • EBGP,OSPF,RIPv2,静态路由
    • 如果和内部协议不一样,需要重发布

参考