MPLS
MPLS
传统IP路由转发:
采用的是逐条转发。
数据报文在经过每一台路由器,都会解封装查看报文的网络层信息。
然后根据路由最长匹配原则去查找**路由表(RIB)**进行转发。
在这个过程中报文每经过一台路由器都会进行解封装、查路由和再封装的过程
特点:
所有路由器需要知道全网的路由信息
IP头部(20-60)不定长。处理效率低
在这个转发过程中是完全独立操作的,不是在转发之前去形成有连接的路径去转发。是面向无连接的,无法提供较好的端到端的Qos保证
MPLS
MPLS工作在**二层(数据链路层)和三层(网络层)**之间(2.5层),但可以向所有网络层提供服务

通过在二层和三层之间添加额外的MPLS头部,当一台MPLS路由器收到标签数据包在解封装的时候会只会解到2.5层,就不需要解封装到IP层面了。这时候就只需要看2.5层的标签去进行数据转发
MPLS的术语
MPLS域(MPLS Domain)
指的是多台连续的路由器设备运行了MPLS协议,所组成的网络,叫做MPLS域
LSR
Label Switching Router标签交换路由器:支持和运行MPLS的路由器或其他支持MPLS的设备。
区域内部的LSR称为:核心LSR(Core LSR)
LSR的分类
根据LSR在MPLS域中的位置进行分类外,还可以对数据的处理方式的不同来进行分类
- 入站LSR(Ingress LSR):向IP报文中压入MPLS头部并生成MPLS报文的LSR
- 中转LSR(Transit LSR):将收到的MPLS报文进行标签置换,并将报文继续在MPLS域中进行转发的LSR
- 出站LSR(Egress LSR):将收到的MPLS报文中的MPLS头部删除,还原为普通的IP报文的LSR
LER
Label Edge Router边沿路由器:一般位于MPLS域的边缘、连接其他网络的LSR
FEC
Forwarding Equivalence Class 转发等价类:是一组具有某些共性的数据流的集合。
共性:相同的特性,比如说转发到相同的下一跳或设备、打上相同的标签、数据表执行相同的标签策略。
这些数据流是属于同一种转发等价类在转发的过程中会被节点以相同的方式进行处理。
- 在MPLS网络中,FEC可以通过多种方式进行划分,比如基于:目的地址及掩码、DSCP(Qos的内容)值。
- 数据包属于那个LSR:由数据进入MPLS域的入站LSR决定的
- MPLS标签是跟FEC相对应的
LSP
Label Switched Path 标签转发路径:标签报文在MPLS网络中前往目的地址所走的路径
是一种有连接的转发路径
同一个FEC的报文通常采用相同的LSP来穿越MPLS域,所以对同一个FEC来说LSR总是采用相同的标签进行转发。
MPLS工作原理
MPLS标签

当IP报文进入到LER中会在二层和三层之间插入一个MPLS标签(也可以压入多个标签),变成一个MPLS报文。
- 标签(Label):用于携带标签值,长度20bit。
- EXP(ExperimentalUse):主要用于Cos(Class of Service)长度3bit。
- S(Bottomofstack):栈底位,用于指示该标签头部是否为最后一层标签,长度1bit。如果该字段为1,则表示当前标签头部为栈底;如果该字段为0,则表示当前标签头部之后依然还有其他标签头部。
- TTL(TimeTo Live):用于当网络出现环路时,防止标签报文被无限制转发,与IP报文头部中的TTL具有相同的意义,长度8bit。
MPLS标签栈

一个数据包中压入了多个MPLS标签,就称为标签栈
最靠近二层的标签是栈顶标签,标签中的S字段为0,标签头部之后依然还有其他标签头部。
最靠近IP头部的是栈底标签,S字段为1,标签头部之后没有其他标签头部。
MPLS标签空间
标签是一个短的、定长的、只具有本地意义的标识符。
标签空间就是标签的取值范围
| 标签值 | |
|---|---|
| 0-15 | 特殊标签值,0为IPV4的显式空标签(IPV4 Explicit NULL Label),3为隐式空标签(Implicit NULL Label) |
| 16-1023 | 静态LSP、静态CR-LSP共享标签空间 |
| 1024-1048575 | LDP、RSVP-TE、MP-BGP等动态信令的标签空间;动态信令标签的标空间不是共享的,是独立且连续的,互不影响 |
MPLS标签处理
压入(Push)、交换(Swap)、弹出(Pop)
- 压入:在IP报文进入MPLS域的边界设备时,在这个报文的二层头部和三层头部之间压入一个标签,MPLS中间设备也可以根据需要在标签协议栈中增加一个新的标签。
- 交换:在压入MPLS标签完成后,在MPLS域内进行转发时,中间设备根据标签转发表找到下一跳的标签替换到原本的MPLS报文的栈顶标签。
- 弹出:MPLS报文离开MPLS域时,LER会把MPLS报文中的标签信息去掉
MPLS转发
将数据归到对应的FEC并按照提前规划建立好的LSP进行转发
对于MPLS域,LSP是给某一FEC进入域和离开域的路径,是LSR有序集合
对单台LSR,需要建立标签转发表,用标签来标识FEC,并绑定相应的标签处理和转发行为
MPLS体系结构
主要由控制平面和转发平面组成

控制平面:
- 负责产生和维护路由信息和标签信息
- 包括IP路由协议、路由信息表(RIB)、标签分发协议(LDP)、标签信息表(LIB)
转发平面:
- 负责把普通IP报文和MPLS标签报文进行转发
- 包括IP转发信息表(FIB)、标签转发信息表(LFIB)

LSP建立
当网络层协议为IP协议时,FEC所对应的路由必须存在于LSR的IP路由表中,这样才能去做标签的分配,否则该FEC的标签转发不生效
LSR使用标签去标识指定的FEC,当这个FEC发送数据到其他LSR时。需要携带正确的标签,才能被LSR处理。

如图:
一个FEC中,存在入标签(In Label)和出标签(Out Label)。这两个标签分别表示这个FEC的数据在被接收和发送时所携带的标签
在图中,R1去往R4的报文进入LER时,一开始是携带的IP报文。在R1上压入1027的出标签从R1发出去往R2。
其中,R1是R2的上游设备(Upstream)LSR,R3是R2的下游设备(Downstream)。
然后R2收到R1发出的入站标签报文后,会去查LFIB并交换对应标签后发出。
所以R1的出标签相当于R2的入标签。
建立的方式
MPLS需要为报文事先分配好标签建立LSP,才能进行报文穿法
LSP可分为:静态LSP****和动态LSP**
静态LSP
静态LSP是用户通过手工为各个FEC分配标签而建立的。
静态LSP不使用标签发布协议,不需要交互控制报文,因此消耗资源比较小。
通过静态方式建立的LSP不能根据网络拓扑变化动态调整,需要管理员干预。
上游节点出标签等于下游节点的入标签。
应用场景:
适用于拓扑结构简单并且稳定的小型网络。
动态LSP
标签发布协议是MPLS的控制协议(也可称为信令协议),负责FEC的分类、标签的分发以及LSP的建立和维护等一系列操作。
常用标签发布协议:标签分发协议(LDP:Label Distribution Protocol)
LDP是多协议标签交换MPLS的一种控制协议,负责转发等价类FEC的分类、标签的分配以及标签交换路径LSP的建立和维护等操作。
LDP规定了标签分发过程中的各种消息以及相关处理过程。
应用场景:
LDP广泛地应用在VPN服务上,集有组网、配置简单、支持基于路由动态建立LSP、支持大容量LSP等优点。
MPLS标签转发
LSR处理MPLS报文时,会查LFIB表(入站节点会查FIB),主要根据:FTN、NHLFE、ILM
FTN(FEC to NHLFE)
FTN在入站节点中,LSR收到IP报文后并进行MPLS转发时使用。
有:Tunnel ID、FEC到NHLFE的映射信息
NHLFE(Next hop Label Forwarding Entry下一跳标签转发表项)
在入站和中转节点中。LSR对MPLS报文或IP报文进行转发时使用。
有Tunnel ID、出接口、下一跳、出标签、标签操作类型
ILM(IncomingLabelMap入标签映射)
在中转、出站节点中用于指导MPLS报文的转发(MPLS转发或者IP转发)
有:Tunnel ID、入标签、入接口、标签操作类型
Ingress LSR的处理

当IP报文进入到入站节点时:
- 先查看自身的FIB表,检查目的地址对应的Tunnel ID是多少。不为0(0x00)进入转发流程
- 如果为0,则根据FIB表的Tunnel ID找到对应的NHLFE表项,并关联起来
- 通过查看NHLFE表现可以得出出接口、出标签、下一跳和标签操作类型。
- 查看标签操作类型为Push(压入),在IP报文中压入MPLS的入标签,同时处理TTL值,然后将封装好的报文发向出接口。
Transit LSR的处理

MPLS报文在MPLS域内转发时:
- 首先根据MPLS的标签值查看ILM表,找到Tunnel ID
- 在根据找到的Tunnel ID来找到对应的NHLFE表项
- 然后查看NHLFE表现找出出接口、下一跳、出标签和标签操作类型。标签操作类型为swap(交换标签)
- 交换标签后发向出接口
Egress LSR的处理

当MPLS报文离开MPLS域时:
- 根据ILM表查找该标签对应标签操作类型为Pop(弹出标签)
- 然后去查LFIB、FIB表
- 然后根据下一层报文的头部进行处理
- 如果S=1为栈底标签,进行IP转发
- 如果S=0表示还有下一层标签,然后根据下一层标签的信息再次进行MPLS标签转发
LDP
LDP是MPLS的一种控制协议。相当于传统网络中的信令协议,负责FEC的分类,标签的分配、LSP的建立和维护。
工作过程:
两台或多台路由器之间运行LDP会话。
LSR之间基于LDP会话动态的交换标签和FEC的映射信息,并根据标签信息建立LSP
LDP会话
- 本地LDP会话(local LDP Session):两个LSR之间是直连的
- 远程LDP会话(Remote LDP Session):两个LSR之间可以是直连的,也可以是非直连的。
两台LSR之间交互Hello信息后,建立起邻接体(Adjacency)关系
建立邻接体关系后,两台LSR之间开始交互LDP会话消息,建立起LDP会话。最终在两台设备之间形成LDP对等体关系。
LSR ID和LDP ID
每一台运行了LDP协议的LSR设备,都必须要配置LSR ID 和LDP ID
LSR ID:长度为32bit,一般是环回口
LDP ID:长度为48bit,由LSR ID和16bit的标签空间标识符(Label Space ID)组成。一般以“LSR ID:标签空间标识符”的形式呈现(2.2.2.2:0)。
标签空间标识符一般存在两种状态:
-
值为0:基于设备(或平台)的标签空间
-
值为1:基于接口的标签空间
LDP的消息类型
Discovery Message
使用UDP发送Hello信息,用于LDP的发现机制中宣告本LSR并发现邻居。
Session Message
使用TCP发送Initalization、keepalive
- Initalization:用于在LDP 会话建立过程中协商参数
- keepalive:监控LDP 会话在TCP连接中的完整性
Advertisement Message
使用TCP发送:
- Address:宣告接口地址
- Address Withdraw:撤销接口地址
- Label Mapping:宣告FEC/Label映射信息
- Label Request:请求FEC的标签映射信息
- Label Abort Request:终止未完成的Label Request Message
- Label Withdraw:撤销FEC/Label映射信息
- Label Release:释放标签
Notification Message
使用TCP发送Notification:通知LDP 对等体错误信息
LDP的状态机

-
Non-Existent
双方互相发送 Hello 消息,选举主动方,当收到 TCP连接建立成功事件后状态变为 initialized
-
Initialized
分为两种情况:主动方和被动方
-
主动方:发送 Initi消息,然后转向 OpenSent 状态,然后等待对方回应Initi消息。
-
被动方:等待主动方发给自己的 Init 消息。如果收到 Init消息,且相关的参数可以接受,则发送 Init 消息和 Keepalive 消息,转向OpenRec 状态。
-
如果主动方和被动方在此状态下收到报文不是 Init 消息或等待超时,则转向 Non-Existent 状态。
-
-
OpenSent
主动方主动发送 Init 消息后的状态,等待被动方回应Init消息。
如果收到 Init消息中的参数可以接受,则转向 OpenRec 状态。
如果收到 Initialization 消息中的参数不能接受或 Init消息超时,则断开TCP连接转到 Non-Existent 状态
-
OpenRec
主动方收到被动方的Init消息后,接受相关参数,发送Keepalive后。由OpenSent状态转为OpenRec状态
收到 Keepalive 消息就转向 Operationl 状态。
如果收到的消息不是 Keepalive 或超时,则转向 Non-Existent 状态。
-
Operational
LDP会话已经建立,在此状态下可以发送或接受所有其它的LDP消息
如果Keepalive超时或收到致命错误的Notification消息、或自己主动发送Shudown消息,都会结束会话,转为Non-Existent状态
LDP会话建立
发现和建立LDP会话

设备通过周期性地发送LDP链路Hello报文,实现LDP发现机制。
LDP链路Hello报文使用UDP报文,目的地址是组播地址224.0.0.2。如果LSR在特定接口接收到LDP链路Hello报文,表明该接口存在LDP邻接体。
Hello报文中携带传输地址,双方后续将使用传输地址建立LDP会话。
传输地址较大的一方作为主动方,主动发起建立TCP连接
经过TCP三次握手之后,两者建立起TCP连接。
建立和保持LDP会话

TCP连接建立成功后,主动方R2(传输地址大的一方)发送LDP初始化报文,协商建立LDP会话的相关参数。
LDP会话的相关参数包括LDP协议版本、标签分发方式、Keepalive保持定时器的值、最大PDU长度和标签空间等。
被动方R1收到初始化报文后,若接受R2的相关参数,则回应Keepalive报文作为确认,为了提高发送效率同时发送自己的初始化报文。
R2收到R1的初始化报文后,若接受相关参数,则回复Keepalive报文给R1。
双方都收到对端的Keepalive报文后,会话建立成功。后续通过周期性发送的Keepalive报文保持会话。
LDP邻居状态
邻居建立成功,不代表邻接建立成功。
display mpls ldp peer
LDP Peer Information in Public network
A '*' before a peer means the peer is being deleted.
---------------------------------------------------------------------------
PeerID TransportAddress DiscoverySource
---------------------------------------------------------------------------
2.2.2.2:0 2.2.2.2 GigabitEthernet0/0/0
---------------------------------------------------------------------------
TOTAL: 1 Peer(s) Found.
-
Peer ID:LDP邻居的LDP ID;
2.2.2.2代表的是邻居节点的LSR ID;
0代表的是标签空间是基于平台的。
-
TransportAddress:LDP邻居的传输地址;
2.2.2.2代表邻居用来建立TCP连接的IP地址。
LDP会话状态
通过查看会话状态来查看是否处于邻接状态
<R1>display mpls ldp session
LDP Session(s) in Public Network
Codes: LAM(Label Advertisement Mode), SsnAge Unit(DDDD:HH:MM)
A '*' before a session means the session is being deleted.
---------------------------------------------------------------------------
PeerID Status LAM SsnRole SsnAge KASent/Rcv
---------------------------------------------------------------------------
2.2.2.2:0 Operational DU Passive 0000:00:33 133/133
---------------------------------------------------------------------------
TOTAL: 1 session(s) Found.
-
Status:LDP会话的状态;
Operational表示LDP会话建立成功;
-
LAM(Label Advertisement Mode,标签发布模式):
标签发布模式有DU和DoD两种模式;
-
SsnRole:LSR在LDP会话中的角色;
Active表示建立LDP会话的主动方;
Passive表示建立LDP会话的被动方。
标签的发布和管理
在MPLS网络中,下游LSR决定标签和FEC的绑定关系,并将这种绑定关系发布给上游LSR。
LDP通过发送标签请求和标签映射消息,在LDP对等体之间通告FEC和标签的绑定关系来建立LSP
标签的发布和管理由标签发布方式、标签分配控制方式和标签保持方式来决定。
标签发布方式
下游自主方式(Downstream Unsolicited,DU),华为设备默认方式

对于一个特定的FEC,LSR无需从上游获取标签请求信息。进行标签分配与分发
LSR会主动的将自己为FEC捆绑的标签通过给上游邻居,不需要邻居发起请求再通告
下游按需方式(Downstream on Demand,DOD)

对于一个特定的FEC,LSR获得标签请求消息后才进行标签分发
一般情况下,对特定的FEC的请求会触发标签请求信息
标签分配控制方式
独立方式(Independent),华为默认方式

本地LSR可以自主分配一个标签给某个FEC,并通过给上游LSR,不需要等待下游标签
有序方式(Ordered)

对于LSR上的某个FEC的标签映射,只有该LSR已经具有这个FEC的下一跳标签映射信息、或者出节点时。才会向上游路由器发送该FEC的标签映射
标签保持方式
自由方式(Liberal),华为默认方式

从邻居LSR收到的标签映射,无论邻居是LSR是不是自己的下一跳都保留
保守方式(Conservative)

只有从邻居LSR收到的标签映射,只有当邻居是自己的下一跳时才保留
PHP特性
Penultimate Hop Popping,次末跳弹出,华为默认打开
egress节点在为本地路由分配标签的时候,会分配一个特殊标签(3),该标签被称为隐式空标签(Implicit NULL Label)。

当LSR转发一个标签报文时,如果发现对应的出标签值为3,则LSR会将栈顶标签弹出,并将里面所封装的数据转发(IP包)给下游LSR。
隐式空标签和显式空标签
默认(缺省)情况下,Egress LSR向倒数第二跳的设备分配隐式空标签(implicit-null),3
但如果部署了QOS,标签弹出后,对于的QOS策略信息也会失效,优先级也会一起失效。
所以在最后一台设备上,为R3分配一个显式空标签0
R3在转发标签报文时,若出标签封装为0,则不会将标签头部弹出,标签头部中的QoS信息得以保存。
R4在收到带0标签的报文时,直接弹出标签,不用去查找ILM表项。
缺省情况下,Egress分配的是隐式空标签。通过label advertise explicit-null使能Egress节点向倒数第二跳分配显式空标签。
MPLS LDP的操作步骤
- LSR运行IGP来构建路由表和FIB表
- LDP根据对应的模式,为路由表中的FEC分配标签
- 将FEC分配的标签,通过LDP标签映射报文通告给LDP邻居
- LSR将自己为FEC分配到的标签,以及LDP邻居通告的FEC的标签储存起来,并与出接口、下一跳地址等信息关联起来
- 当LSR转发的目的网络的标签报文到达时,利用标签信息进行转发