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:中间标签交换路由器
- LER(Label Edge Router):边界标签交换路由器
- 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
- 如果上层是IPv4报头,则为
- 允许多标签存在,标签中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 | # 查看邻居 |
帧模式标签分配
帧模式的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 | A 1.1.1.0/24 -> 234:1: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:nn
,nn
是提供商分配的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,静态路由
- 如果和内部协议不一样,需要重发布