LDP概述
LDP是MPLS的一种控制协议,相当于传统网络中的信令协议,负责FEC的分类、标签的分配以及LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程。
LDP的工作过程主要分为两部分:LSR之间建立LDP会话;LSR之间基于LDP会话动态交换标签与FEC的映射信息,并根据标签信息建立LSP。
LSR之间交互标签绑定消息之前必须建立LDP会话。LDP会话可以分为:
本地LDP会话(Local LDP Session):建立会话的两个LSR之间是直连的;
远程LDP会话(Remote LDP Session):建立会话的两个LSR之间可以是直连的,也可以是非直连的。
两台LSR之间交互Hello消息之后,即建立起邻接体(Adjacency)关系;
在建立邻接体关系的基础上,两台LSR之间交互LDP会话消息,建立起LDP会话,两台设备之间形成LDP对等体关系;
每一台运行了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视图
[R1]mpls ldp
接口下开启LDP
[R1-GigabitEthernet0/0/0]mpls ldp
配置LDP远端会话并进入会话配置视图
[R1]mpls ldp remote-peer R1toR3
配置LDP远端对等体IP地址
[R1-mpls-ldp-remote-r1tor3]remote-ip 3.3.3.3
LDP消息
运行LDP协议的LSR之间通过交换LDP消息来实现邻居发现、会话建立与维护以及标签管理等功能。
按照消息的功能,LDP消息一共可以分为四大类型:发现消息(Discovery Message),会话消息(Session Message),通告消息(Advertisement Message)和通知消息(Notification Message)。
发现消息:用来宣告和维护网络中一个LSR的存在;用于通告和维护网络中LSR的存在,如Hello报文。
会话消息:用于建立、维护和终止LDP对等体之间的会话,如Initialization报文、KeepAlive报文。
通告消息:用来生成、改变和删除FEC的标签映射;
通知消息:用来宣告告警和错误信息。
LDP消息承载在UDP或TCP之上,端口号均为646 。其中发现消息用来发现邻居,承载在UDP报文上。其他消息的传递要求可靠而有序,所以LDP使用TCP建立会话,会话、通告和通知消息都基于TCP传递。
消息类型 | 消息名称 | 传输层协议 | 作用 |
Discovery(发现) Message | Hello | UDP | LDP发现机制中宣告本LSR并发现邻居 |
Session(会话) Message | Initialization | TCP | 在LDP Session建立过程中协商参数 |
KeepAlive | 监控LDP Session的TCP连接的完整性 | ||
Advertisement(通告) Message | Address | 宣告接口地址 | |
Address Withdraw | 撤消接口地址 | ||
Label Mapping | 宣告FEC/Label映射信息 | ||
Label Request | 请求FEC的标签映射 | ||
Label Abort Request | 终止未完成的Label Request Message | ||
Label Withdraw | 撤消FEC/Label映射 | ||
Label Release | 释放标签 | ||
Notification(通知) Message | Notification | 通知LDP Peer错误信息 |
LDP报文
LDP协议报文包括了LDP头部和LDP消息两部分。
LDP头部中携带了LDP版本、报文长度等信息。
LDP头部长度为10Byte,包括Version,PDU Length和LDP Identifier三部分。
Version:占用2Byte,表示LDP版本号,当前版本号为1。
PDU Length:占用2Byte,以字节为单位表示除了Version和PDU Length以外的其他部分的总长度。
LDP Identifier:即LDP ID,长度6Byte,其中前4Byte用来唯一标识一个LSR,后2Byte用来表示LSR的标签空间。
LDP消息中携带了消息类型、消息长度等信息。
LDP消息包含五个部分。
U:占用1个bit,为Unknown Message bit。当LSR收到一个无法识别的消息时,该消息的U=0时,LSR会返回给该消息的生成者一个通告,当U=1时,忽略该无法识别的消息,不发送通告给生成者。
Type:表示具体的消息类型,目前LDP定义的常用的消息有Notification,Hello,Initialization,KeepAlive,Address,Address Withdraw,Label Mapping,Label Request,Label Abort Request,Label Withdraw,Label Release。
Message Length:占用2个bytes,以字节为单位表示Message ID、Mandatory Parameters和Optional Parameters的总长度。
Message ID:占用32个bit,用来标识一个消息。
Mandatory Parameters和Optional Parameters分别为可变长的该消息的必须的参数和可选的参数。
抓包观察---LDP报文
1 LDP版本为1
2 报文总长度,除了Version和PDU Length字段以外为40字节
3 LSR ID为1.1.1.1
4 标签空间为0,表示为平台内部标签
5 Initialization消息,用于在LDP Session建立过程中协商参数
6 KeepAlive消息,用于监控LDP Session的TCP连接的完整性
7 U位0,表示向源端发送通知(Notification)消息
8 消息类型为Initialization
9 消息长度为22字节
10 消息编号为0x000004f9
11 强制参数
12 协议版本号为1
13 TCP连接的保持时间为45(只要收到LDP就会刷新)
14 标签分发方式为DU
15 环路检测功能未开启
16 LDP的最大跳数为0(只有开启环路检测时才有效)
17 LDP PDU的最大长度为4096字节
18 接收者的LSR ID为2.2.2.2
19 接收者的空间标识符为0
LDP工作原理
LDP会话状态机
LDP使用5种状态描述LDP会话状态机。
LDP会话建立
发现阶段
设备通过周期性地发送LDP链路Hello报文(LDP Link Hello),实现LDP基本发现机制。
LDP链路Hello报文使用UDP报文,目的地址是组播地址224.0.0.2。如果LSR在特定接口接收到LDP链路Hello报文,表明该接口存在LDP邻接体。
TCP连接建立阶段
Hello报文中携带传输地址,双方后续将使用传输地址建立LDP会话。
传输地址较大的一方作为主动方,主动发起建立TCP连接。(缺省情况下,公网的LDP传输地址等于设备的LSR ID,私网的传输地址等于接口的主IP地址)
经过TCP三次握手之后,两者建立起TCP连接。
会话建立与保持
1 TCP连接建立成功后,主动方R2(传输地址大的一方)发送LDP初始化报文,协商建立LDP会话的相关参数。
2 LDP会话的相关参数包括LDP协议版本、标签分发方式、KeepAlive保持定时器的值、最大PDU长度和标签空间等。
3 被动方R1收到初始化报文后,若接受R2的相关参数,则回应KeepAlive报文作为确认,为了提高发送效率同时发送自己的初始化报文。
4 R2收到R1的初始化报文后,若接受相关参数,则回复KeepAlive报文给R1。
5 双方都收到对端的KeepAlive报文后,会话建立成功。后续通过周期性发送的KeepAlive报文保持会话。
相关报文
查看LDP对等体的信息
<R1>display mpls ldp peer
项目 | 描述 |
---|---|
PeerID | 对等体的LDP标识符,格式为<LSR ID>:<标签空间>,标签空间的取值为:
|
TransportAddress | LDP对等体的传输地址,用于建立TCP连接。 |
DiscoverySource | 发现LDP对等体的源端:
|
查看LDP对等体间的会话信息
<R1>display mpls ldp session
项目 | 描述 |
---|---|
PeerID | 对等体的LDP标识符,格式为<LSR ID>:<标签空间>。标签空间取值:
|
Status | LDP会话的状态:
|
LAM | LDP会话的标签发布方式,缺省的标签分发方式为DU。 |
SsnRole | LSR在LDP会话中的角色:
|
SsnAge | LDP会话从建立至今的时间间隔,格式为:“天:小时:分钟”。 |
KASent/Rcv | 会话发送和接收的keepalive消息数。 |
配置LSP触发策略
[R1-mpls]lsp-trigger ?
all Trigger all FEC for IGP
bgp-label-route Trigger Host FEC for public labeled BGP
host Trigger host FEC for IGP
ip-prefix Trigger IP-prefix list for IGP
none Do not trigger FEC for IGP
用来指定哪些静态路由及IGP路由会触发LDP LSP的建立,缺省情况下,根据32位地址的IP路由触发LDP建立LSP。
开启MPLS LDP后,LSP将自动建立,如果不通过策略控制,将有大量的LSP建立导致资源浪费。
配置此命令,可以设定LSP的建立策略,仅由关注的路由触发LDP建立LSP,从而控制LSP的数量,减少系统资源的浪费。
参数 | 参数说明 | 取值 |
---|---|---|
all | 所有静态路由和IGP路由项触发建立LSP。 | - |
host | 32位的主机IP路由触发建立LSP。 | - |
bgp-label-route | 使IBGP协议能够发放标签。 | |
ip-prefix ip-prefix-name | 根据IP地址前缀列表触发建立LSP。 | 必须是已存在的IP地址前缀列表名称。 |
none | 不触发建立LSP。 | - |
标签的发布和管理
在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。
标签发布方式
标签分配:LSR从本地标签空间中取出一个标签与FEC绑定。
标签分发:LSR将标签与FEC的绑定关系通知给上游LSR。
DU模式
标签发布方式为DU时,系统默认支持LDP为所有对等体分标签,即每个节点都可以向所有的对等体发布标签映射关系,不再区分上下游关系。因为在只给上游对等体分标签情况下,发送标签映射消息的时候,要根据路由信息对会话的上下游关系进行确认。
DoD模式
对于一个特定的FEC,LSR获得标签请求消息之后才进行标签分配与分发。
一般情况下,对特定FEC的访问需求会触发标签请求消息。
相关命令
配置LDP标签发布模式
[R1-GigabitEthernet0/0/0]mpls ldp advertisement ?
dod Downstream On Demand Advertisement Mode
du Downstream Unsolicited Advertisement Mode
标签分配控制方式
独立(Independent)模式
在使用DU作为标签分发方式的情况下,如图所示,R2和R3对192.168.4.0/24这条FEC,可以在上游LSR无请求,且自身没有收到下游LSR的标签绑定信息的情况下,主动向上游LSR通告标签绑定信息。
采用DoD作为标签发布方式时,如图所示,R2和R3对192.168.4.0/24这条FEC,只要收到上游LSR的标签请求消息,可以在自身没有收到下游LSR的标签绑定信息的情况下,向上游LSR通告标签绑定信息。
有序(Ordered)模式
当标签控制方式为Ordered,只有当LSR收到特定FEC下一跳发送的特定FEC标签映射消息或者LSR是LSP的出口节点时,LSR才可以向上游发送标签映射消息。
当标签分发方式为DU时,如图所示,对于192.168.4.0/24这条FEC,不论上游LSR是否有请求,必须收到下游LSR对此FEC的标签绑定信息才向上游LSR发布标签绑定信息,所以必须由Egress LSR,也就是R4作为LSP建立的“起点”。
当标签发布方式采用DoD时,如图所示,对于192.168.4.0/24这条FEC,只有收到上游LSR请求的请求,且自身已经收到下游LSR的标签绑定信息的情况下,才向上游LSR通告标签绑定信息。因此,必须由Ingress LSR(R1)发起请求,逐跳请求到Egress LSR(R4),最终由R4开始,向上游建立LSP。
标签保留
自由(Liberal)模式
LSR收到的标签映射可能来自下一跳,也可能来自非下一跳。 对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留。
Liberal方式的最大优点在于路由发生变化时能够快速建立新的LSP进行数据转发,因为Liberal方式保留了所有的标签。缺点是需要分发和维护不必要的标签映射。
DU标签分发方式下,如果采用Liberal保持方式,则R3保留所有LDP邻居 R2和R5发来的关于192.168.1.0/24这个FEC的标签,无论该R2和R5是否是IP路由表中到达192.168.1.0/24的下一跳。
DoD标签分发方式下,如果采用Liberal保持方式,LSR会向所有LDP邻居请求标签。但通常来说,DoD分发方式都会和Conservative保持方式搭配使用。
保守(Conservative)模式
对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留。
Conservative方式的优点在于只需保留和维护用于转发数据的标签,以达到节约标签的目的。
当使用DU标签分发方式时,LSR可能从多个LDP邻居收到到同一网段的标签映射消息,如图中R3会分别从R2和R5收到网段192.168.1.0/24的标签映射消息。如果采用Conservative保持方式,则R3只保留下一跳R2发来的标签,丢弃非下一跳R5发来的标签。
当使用DoD标签分发方式时, 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(采用原有的IP转发方式),而R3则仅需执行一次查询操作(查询FIB表)即可获得相应的转发信息,转发效率得到了提升。
隐式空标签与显式空标签
缺省情况下,Egress节点向倒数第二跳分配隐式空标签(implicit-null),即特殊标签3。
但在部署QoS的场景下,标签被弹出后,其中的优先级也会一并丢失。
显式空标签机制,Egress节点向倒数第二跳分配特殊标签0。 若出标签封装为0,则不会将标签头部弹出,标签头部中的QoS信息得以保存。
缺省情况下,Egress分配的是隐式空标签。
相关命令
配置PHP特性
[R1-mpls]label advertise ?
explicit-null Explicit-null
implicit-null Implicit-null
non-null Non-null
在MPLS视图下,执行命令label advertise { explicit-null | implicit-null | non-null },配置向倒数第二跳分配的标签。
缺省情况下,使用的是implicit-null,Egress向倒数第二跳节点分配隐式空标签,值为3。
如果配置的是explicit-null,Egress节点向倒数第二跳分配显式空标签,值为0。
当需要支持MPLS QoS属性时,可以选用explicit-null。 如果配置的是non-null,Egress向倒数第二跳正常分配标签,即分配的标签值不小于16。
配置举例
配置举例---LDP本地会话
需求:通过配置MPLS以及LDP,仅使得192.168.0.0/24网段和192.168.1.0/24网段可以通过标签交换的方式实现互访,其他地址不使用标签交换。
步骤:配置设备环回地址,接口IP地址,路由OSPF协议,开启MPLS和LDP,配置LSP触发过滤规则,配置LSP触发策略。
R1配置
#
sysname R1
#
mpls lsr-id 1.1.1.1
mpls
lsp-trigger ip-prefix PC1+2 \\配置LSP触发策略
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 10.1.0.1 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 192.168.0.254 255.255.255.0
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
#
ospf 1
silent-interface GigabitEthernet0/0/1
area 0.0.0.0
network 0.0.0.0 255.255.255.255
#
ip ip-prefix PC1+2 index 10 permit 192.168.0.0 24 \\配置LSP触发过滤规则
ip ip-prefix PC1+2 index 20 permit 192.168.1.0 24
#
R2配置
#
sysname R2
#
mpls lsr-id 2.2.2.2
mpls
lsp-trigger ip-prefix PC1+2
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 10.1.0.2 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 10.1.1.2 255.255.255.0
mpls
mpls ldp
#
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
#
ospf 1
area 0.0.0.0
network 0.0.0.0 255.255.255.255
#
ip ip-prefix PC1+2 index 10 permit 192.168.0.0 24
ip ip-prefix PC1+2 index 20 permit 192.168.1.0 24
#
R3配置
#
sysname R3
#
mpls lsr-id 3.3.3.3
mpls
lsp-trigger ip-prefix PC1+2
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 10.1.1.3 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 10.1.2.3 255.255.255.0
mpls
mpls ldp
#
interface LoopBack0
ip address 3.3.3.3 255.255.255.255
#
ospf 1
area 0.0.0.0
network 0.0.0.0 255.255.255.255
#
ip ip-prefix PC1+2 index 10 permit 192.168.0.0 24
ip ip-prefix PC1+2 index 20 permit 192.168.1.0 24
#
R4配置
#
sysname R4
#
mpls lsr-id 4.4.4.4
mpls
lsp-trigger ip-prefix PC1+2
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 10.1.2.4 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 192.168.1.254 255.255.255.0
#
interface LoopBack0
ip address 4.4.4.4 255.255.255.255
#
ospf 1
silent-interface GigabitEthernet0/0/1
area 0.0.0.0
network 0.0.0.0 255.255.255.255
#
ip ip-prefix PC1+2 index 10 permit 192.168.0.0 24
ip ip-prefix PC1+2 index 20 permit 192.168.1.0 24
#
查看LSP过滤效果
<R1>display mpls ldp lsp
LDP LSP Information
-------------------------------------------------------------------------------
DestAddress/Mask In/OutLabel UpstreamPeer NextHop OutInterface
-------------------------------------------------------------------------------
192.168.0.0/24 3/NULL 2.2.2.2 192.168.0.254 GE0/0/1
*192.168.0.0/24 Liberal/1027 DS/2.2.2.2
192.168.1.0/24 NULL/1029 - 10.1.0.2 GE0/0/0
192.168.1.0/24 1029/1029 2.2.2.2 10.1.0.2 GE0/0/0
-------------------------------------------------------------------------------
TOTAL: 3 Normal LSP(s) Found.
TOTAL: 1 Liberal LSP(s) Found.
TOTAL: 0 Frr LSP(s) Found.
A '*' before an LSP means the LSP is not established
A '*' before a Label means the USCB or DSCB is stale
A '*' before a UpstreamPeer means the session is stale
A '*' before a DS means the session is stale
A '*' before a NextHop means the LSP is FRR LSP
分析:可见除了PC1和PC2所在的网络以外的IP都过滤成功了。
配置举例---LDP远端会话
需求:使R1与R3建立LDP远端会话。
步骤:配置各接口IP地址,配置IP协议,开启MPLS LDP,在R1与R3上配置远端会话。
R1配置
#
sysname R1
#
mpls lsr-id 1.1.1.1
mpls
#
mpls ldp
#
#
mpls ldp remote-peer r3
remote-ip 3.3.3.3
#
interface GigabitEthernet0/0/0
ip address 10.1.0.1 255.255.255.0
mpls
mpls ldp
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
#
ospf 1 router-id 1.1.1.1
area 0.0.0.0
network 0.0.0.0 255.255.255.255
#
R2配置
#
sysname R2
#
mpls lsr-id 2.2.2.2
mpls
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 10.1.0.2 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 10.1.1.2 255.255.255.0
mpls
mpls ldp
#
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
#
ospf 1 router-id 2.2.2.2
area 0.0.0.0
network 0.0.0.0 255.255.255.255
#
R3配置
#
sysname R3
#
mpls lsr-id 3.3.3.3
mpls
#
mpls ldp
#
#
mpls ldp remote-peer r1
remote-ip 1.1.1.1
#
interface GigabitEthernet0/0/0
ip address 10.1.1.3 255.255.255.0
mpls
mpls ldp
#
interface LoopBack0
ip address 3.3.3.3 255.255.255.255
#
ospf 1 router-id 3.3.3.3
area 0.0.0.0
network 0.0.0.0 255.255.255.255
#