MPLS LDP原理
LDP协议基本概念
LDP是MPLS的一种控制协议,相当于传统网络中的信令协议,负责FEC的分类、标签的分配以及LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程
LDP的工作过程主要分为两部分
- LSR之间建立LDP会话
- LSR之间基于LDP会话动态交换标签与FEC的映射信息,并根据标签信息建立LSP
LDP会话、LDP邻接体、LDP对等体
LSR之间交互标签绑定消息之前必须建立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
- LDP ID的长度为48bit,由32bit的LSR ID与16bit的标签空间标识符(Label Space ID)构成
- LDP ID以"LSR ID:标签空间标识"的形式呈现。例如2.2.2.2:0
标签空间标识一般存在两种形态:
- 值为0:表示基于设备(或基于平台)的标签空间
- 值非0:表示基于接口的标签空间
LDP消息
按照消息的功能,LDP消息一共可以分为四大类型:
- 发现消息(Discovery Message):用来宣告和维护网络中一个LSR的存在
- Hello(UDP:646):LDP发现机制中宣告本LSR并发现邻居
- 会话消息(Session Message):用于建立、维护和终止LDP对等体之间的会话
- Initialization(TCP:646):在LDP Session建立过程中协商参数
- KeepAlive(TCP:646):监控LDP Session的TCP连接的完整性
- 通告消息(Advertisement Message):用来生成、改变和删除FEC的标签映射
- Address(TCP:646):宣告接口地址
- Address Withdrew(TCP:646):撤销接口地址
- Label Mapping(TCP:646):宣告FEC/Label映射信息
- Label Request(TCP:646):请求FEC的标签映射
- Label Abort Request(TCP:646):终止未完成的Label Request Message
- Label Withdraw(TCP:646):撤销FEC/Label映射
- Label Release(TCP:646):释放标签
- 通知消息(Notification Message):用来宣告告警和错误信息
- Notification(TCP:646):通知LDP Peer错误信息
LDP报文封装
LDP协议报文包括了LDP头部和LDP消息两部分
- LDP头部中携带了LDP版本、报文长度等信息
- LDP消息中携带了消息类型,消息长度等信息
LDP报文字段介绍:
- LDP头部长度为10Byte
- Version(2Byte):表示LDP版本号,当前版本号为1
- PDU Length(2Byte):以字节为单位表示除了Version和PDU Length以外的其他部分的总长度
- LDP Identifier(6Byte):即LDP ID,长度6Byte,其中前4Byte用来唯一标识一个LSR,后2Byte用来标识LSR的标签空间
- LDP消息
- U占用1个bit,为Unknown Message bit。当LSR收到一个无法识别的消息时,该消息的U=0时,LSR会返回给该消息的生成者一个通告,当U=1时,忽略该无法识别的消息,不发送通告给生成者
- Message Length(2Byte):以字节为单位标识Message ID、Mandatory Parameters和Optional Parameters的总长度
- Message ID(4Byte):用来标识一个消息
- Mandatory Parameters和Optional Parameters分别为可变长的该消息的必须的参数和可选参数
- Message Type(2Byte):表示具体的消息类型,目前LDP定义的常用消息有Notification、Hello、Initialization、KeepAlive、Address、Address Withdraw、Label Mapping、Label Request、Label Abort Request、Label Withdraw,Label Release
LDP工作原理
LDP会话建立
LDP会话状态机
如图所示,有5种状态
- Non-Existent状态:该状态为LDP Session最初的状态,在此状态双方发送Hello消息,选举主动方,在收到TCP连接建立成功事件的触发后变为Initialized状态
- Initialized状态:该状态下分为主动方和被动方两种情况
- 主动方将主动发送Initialization消息,转向OpenSent状态,等待回应的Initialization消息
- 被动方在此状态等待主动方发给自己的Initialization消息,如果收到的Initialization消息的参数可以接受,则发送Initialization和KeepAlive转向OpenRec状态。主动方和被动方在此状态下收到任何非Initialization消息或等待时间超时,都会转向Non-Existent状态
- OpenSent状态:此状态为主动方发送Initialization消息后的状态,在此状态等待被动方回答Initialization消息和KeepAlive消息,如果收到的Initialization消息中的参数可以接受在转向OpenRec状态,如果参数不能接受或Initialization消息超时则断开TCP连接转向Non-Existent状态
- OpenRec状态:在此状态不管主动方还是被动方都是发出KeepAlive后的状态,在等待对方回应KeepAlive,只要收到KeepAlive消息就转向Operational状态;如果收到其他消息或KeepAlive超时则转向Non-Existent状态
- Operational状态:该状态是LDP Session成功建立的标志。在此状态下可以发送和接收所有其它的LDP消息。在此状态如果KeepAlive超时或收到致命错误的Notification消息(Shutdown消息)或者自己主动发送Shutdown消息主动结束会话,都会转向Non-Existent状态
发现阶段与TCP连接建立
会话建立与保持
LDP邻居状态
LDP会话状态
LDP会话状态:
- Non-Existent:表示LDP会话的最初状态。在此状态双方互相发送Hello消息,在收到TCP连接建立成功事件的出发后变为Initialized状态
- Initialized:表示LDP会话处于初始化状态
- OpenSent:表示LDP会话进入初始化状态后,主动方给被动方发送了Initialized消息,并等待对方的回应
- OpenRecv:表示LDP会话进入初始化状态后,当双方都收到对方发送的KeepAlive消息后,LDP会话进入Operational状态
- Operational:表示LDP会话建立成功
LDP标签分发
标签的发布和管理
- 在MPLS网络中,下游LSR决定标签和FEC的绑定关系,并将这种绑定关系发布给上游LSR
- LDP通过发送标签请求和标签映射消息,在LDP对等体之间通告FEC和标签的绑定关系来建立LSP
标签的发布和管理由标签发布方式、标签分配控制方式和标签保持方式来决定
- 标签发布方式(Label Advertisement Mode)
- 下游自主方式(Downstream Unsolicited,DU):对于一个特定的FEC,LSR无需从上游获得标签请求消息即进行标签分配与分发。(是默认方式)
- 下游按需方式(Downstream on Demand,DoD):对于一个特定的FEC,LSR获得标签请求消息之后才进行标签分配与分发
- 标签分配方式(Label Distribution Control Mode)
- 独立方式(Independent):本地LSR可以自主的分配一个标签绑定到某个FEC,并通告给上游LSR,而无需等待下游的标签
- 有序方式(Ordered):对于LSR上某个FEC的标签映射,只有当该LSR已经具有此FEC下一跳的标签映射消息,或者该LSR就是此FEC的出节点时,该LSR才可以向上游发送此FEC的标签映射(是默认方式)
- 标签保持方式(Label Retention Mode)
- 自由方式(Liberal):对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留(是默认方式)
- 保守模式(Conservative):对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留
上游与下游
MPLS根据数据的转发方向确定上、下游关系。标签报文从上游LSR发出,被下游LSR接收并处理
如图:对于到达192.168.3.0/24的LSP而言,R3是R2的下游LSR,R1是R2的上游LSR
标签发布方式
DU模式
- 对于一个特定的FEC,LSR无需从上游获得标签请求消息即进行标签分配与分发
- LSR会主动将自己为FEC捆绑的标签通告给上游邻居,无需邻居先发起请求再通告
DoD模式
- 对于一个特定的FEC,LSR获得标签请求消息之后才进行标签分配与分发
- 一般情况下,对特定FEC的访问需求会触发标签请求消息
标签分配控制方式
独立模式(Independent Mode)
本地LSR可以自主地分配一个标签绑定到某个FEC,并通告给上游LSR,而无需等待下游的标签
有序模式(Ordered Mode)
对于LSR上某个FEC的标签映射,只有当该LSR已经具有此FEC下一跳的标签映射消息、或者该LSR就是此FEC的出节点时,该LSR才可以向上游发送此FEC的标签映射
标签保留
自由模式(Liberal Mode)
LSR收到的标签映射可能来自下一跳,也可能来自非下一跳。对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留
保守方式(Conservative Mode)
对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留
保持方式总结
当网络拓扑变化引起下一跳邻居改变时:
- 使用自由标签保持方式,LSR可以直接利用原来非下一跳邻居发来的标签,迅速重建LSP,但需要更多的内存和标签空间
- 使用保守标签保持方式,LSR只保留来自下一跳邻居的标签,节省了内存和标签空间,但LSP的重建会比较慢
- 保守标签保持方式通常与DoD方式一起,用于标签空间有限的LSR
PHP特性
PHP(Penultimate Hop Popping,次末跳弹出),如果激活了PHP特性,那么egress节点在位本地路由分配标签的时候,会分配一个特殊标签"3",该标签被称为隐式空标签(Implicit NULL Label)。当LSR转发一个标签报文时,如果发现对应的出标签值为"3",则LSR会将栈顶标签弹出,并将里面所封装的数据转发给下游LSR
如图所示:
- 在标签发布时,R3作为192.168.3.0/24这条FEC的Egress LSR。分配标签时,R3为该FEC分配了标签"3"并将该标签绑定信息通告给R2
- 在数据转发时,R2作为到达192.168.3.0的次末跳(倒数第二跳),发现出标签值为"3",于是将标签头部弹出,将IP报文转发给R3,而R3则仅需执行一次查询操作(查询FIB表)即可获得相应的转发信息,转发效率得到了提升
隐式空标签与显示空标签
缺省情况下,Egress节点向倒数第二跳分配隐式空标签(implicit-null),即特殊标签"3"
但在部署QoS的场景下,标签被弹出后,其中的优先级也会一并丢失,这时候就要使用显示空标签。
显式空标签机制,Egress节点向倒数第二跳分配特殊标签"0"
如图所示:R3在转发标签报文时,若出标签封装为0,则不会将标签头部弹出,标签头部中的QoS信息得以保存。R4在收到带"0"标签的报文的时候,直接弹出标签,不用去查找ILM表项
根据参数的不同,可以配置Egress向倒数第二跳分配不同的标签:
- 缺省情况下,使用的是implicit-null,Egress向倒数第二跳节点分配隐式空标签,值为"3"
- 如果配置的是explicit-null,Egress节点向倒数第二跳分配显示空标签,值为"0",当需要支持MPLS QoS属性时,可以选用explicit-null
- 如果配置的是non-null,Egress向倒数第二跳正常分配标签,即分配的标签值不小于"16"
LDP工作过程详情
组网介绍
- 网络中已经部署OSPF路由协议且各设备之间能够正常学习到对方的路由信息
- 已在各设备及相应接口上激活MPLS及LDP,且在相邻的设备之间已正常建立本地LDP会话
- 所有LSR均采用DU + Independent + Liberal方式
标签分发
Egress LSR
如图所示:R4直连网段192.168.4.0/24,R4将主动为到达该网络的路由分配标签,如1041,并主动通过LDP协议报文将标签映射通告给LDP对等体R2和R3
注:缺省情况下,根据32位的主机IP路由触发LDP建立LSP。可以通过手工配置触发非32位路由的LSP建立
Transit LSR
如图所示:以R2为例,在其路由表中,192.168.4.0/24路由的下一跳为R4,当它从R4收到关于192.168.4.0/24的标签映射通告时,由于该通告来自下游LDP邻居,因此这将触发它自己为该路由分配标签1021,并将标签映射通告给LDP邻居(如:R1)。R3同理
Ingress LSR
如图所示:R1收到LDP邻居R2及R3通告过来的关于192.168.4.0/24路由的标签映射后,将这两个标签都存储起来,但是由于在自己的路由表中,到达192.168.4.0/24的下一跳是R2,因此当前它只会使用R2所通告的标签1021
注:当R2发生故障时,OSPF路由将会重新收敛,此时R1的路由表中192.168.4.0/24路由的下一跳将会切换成R3,此时R1将启用R3所通告的,关于192.168.4.0/24的标签
标签转发
Ingress LSR
如图所示:当R1收到发往192.168.4.1的IP报文时,首先在其FIB表中查询该目的的IP地址,它发现所匹配的表项的Tunnel ID为非0,因此继续在NHLFE中查询该Tunnel ID,然后意识到需要对该IP报文压入标签并进行标签转发,出接口为GE0/0/0,下一跳为R2,出站标签为1021,于是为报文插入标签头部并转发出去
Transit LSR
当R2收到携带1021标签的标签报文时,查询ILM,根据ILM对应到NHLFE中的表项。于是,R2对该标签报文通过Swap操作将标签更换为1041,并从相应的接口转发出去
Egress LSR
当R4收到1041标签的标签报文时,查询ILM,根据ILM查询到操作为Pop。于是,R4对该标签报文通过Pop操作将最外层标签剥离,此时该报文已经变成了标准IP报文,R4对该IP报文执行标准的IP转发流程
在MPLS中,运行LDP协议的了SR的操作小结
- LSR首先通过运行IGP协议(例如OSPF、IS-IS等)来构建路由表、FIB表
- LDP根据相应的模式,为路由表中的路由前缀(FEC)分配标签
- LDP根据相应的模式,将自己为路由前缀分配的标签,通过LDP标签映射报文通告给LDP邻居
- LSR将自己为路由前缀分配的标签,以及LDP邻居为该路由前缀通告的标签存储起来,并与出接口、下一跳地址等信息形成关联(标签转发表项)
- 当LSR转发到达目的网络的标签报文时,所使用的出站标签总是下游LDP邻居所通告的标签,此处所指的下游邻居,是设备的路由表中到达该目的网络的下一跳设备