MPLS LDP原理

LDP协议基本概念

LDP是MPLS的一种控制协议,相当于传统网络中的信令协议,负责FEC的分类、标签的分配以及LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程

LDP的工作过程主要分为两部分

  1. LSR之间建立LDP会话
  2. 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邻居所通告的标签,此处所指的下游邻居,是设备的路由表中到达该目的网络的下一跳设备
posted @ 2022-09-06 16:47  hongliang888  阅读(966)  评论(0编辑  收藏  举报