
1. LDP基本概念
Label Distribution Protocal标签分发协议为单播路由协议通告的前缀分配标签,并和LDP邻居交换标签。
- 其所产生的标签为本地标签,并非全局标签,因为每台路由器对相同的前缀分配的标签可能会不同。
- 会话建立使用UDP 646端口,交换LDP消息使用TCP 646端口。
- 对LIB有读写权限,对RIB有读权限。
1.1 上下游
- 标签传递的方向和路由传递的方向一致,即从直连目的网络的路由器始发。
- 标签传递的方向和数据流的方向相反。

以上图为例,标签从R1传递到R4。首先,R1将自己的管理地址分配了标签,并将其传给它的邻居R2。而R2自己会为这个前缀在本地分配自己的标签传给R3。这一传递过程一直到R4。而数据的发送方向则是从R4到R1。在这里R1离目的网络最近,它是下游;R4离数据源最近,它是上游。
1.2 标签空间
LDP对等体之间分配标签的数值范围被成为标签空间。LDP支持两种类型的标签空间:
- 每接口标签空间: 每个接口使用一个独立的标签空间。不同接口使用的标签空间中包括的标签值可以相同。
- 每平台标签空间:整个LSR统一使用一个标签空间。
实际中,大部分都是使用每平台标签空间。有些是软件就不支持每接口标签空间。
1.3 LDP标识
LDP Identifier由俩部分组成,示例: 172.16.0.0:0。
- 冒号前的4个字节为LDP的RID,通常是路由器的管理地址。
- 冒号后的2个字节为LDP的标签空间。对于每平台标签空间,这个值总是为0。
LDP的RID可以通过手工设置,在没有明确指定的情况下,以下面的方式选出。
- 检查所有的Up接口的IP地址。
- 如果有环回接口,选择环回接口中最大的IP地址。
- 如果没有环回接口,选择接口中最大的IP地址。
正常情况下,都是手工指定LDP的RID,使用环回接口地址。使用逻辑接口地址的好处,是不受物理接口状态的影响。在使用物理接口的地址作为LDP的RID的情况下,如果物理接口Down了,则LDP的RID变为无效状态,设备的LDP会话都会中断,释放所有从这些会话学到的FEC和标签绑定信息,直接影响设备的数据转发。
%% ## 1.4 LDP会话
两台LSR需要通过会话机制来进行标签的交换。如果有多个标签空间,则为每个标签空间建立一个LDP会话。
%%
2. LDP消息
2.1 LDP PDU
LDP Protocol Data Unit,即协议数据单元。所有的LDP信息都以PDU的形式通过TCP连接的形式发送的。它包括LDP PDU报头和LDP消息两部分。

2.2 LDP PDU报头格式
- 版本: 长度2字节,包括协议的版本号,现在为1。
- PDU长度:长度2字节,不包括版本和PDU长度本身的长度,最大为4096字节。
- LDP标识:参照1.3节内容
2.3 LDP消息格式

- U-bit:未知消息位。当收到未知消息的时候,如果是U-bit为0,则返回通知给消息产生者并忽略这条消息。如果是U-bit为1,则会直接忽略这个未知消息。
- 消息类型:后面详述。
- 消息长度:包括消息ID,必选和可选参数。
2.4 LDP消息类型

2.4.1 Hello
- 用于发现和维持对等体的Hello邻接。对于直连的对等体,发送Hello包到224.0.0.2的组播地址。如果是远端对等体,则直接发送单播Hello包。
- Hello消息包括消息ID,通用Hello参数TLV和其他可选参数。
- 对于直连链路,默认的Hello间隔是15秒;对于远端对等体,默认的单播Hello间隔是45秒。
- 除了Hello的计时器外,还有保持的计时器,RFC推荐不小于3倍Hello间隔。
- 如果两端的LSR没有此标签空间的LDP会话,则建立LDP会话。
2.4.2 Initialization
在LDP建立会话时会交换初始化消息,包括消息ID,通用会话参数TLV和其他可选参数。
通用会话参数TLV包括的一些重要参数:
- KeepAlive时间:从对等体收到的连续PDU的间隔的最长时间。在收到新的PDU后,保活计时器重置。
- 标签分发方式:A位为0是下游自主分发;为1是下游按需分发。
- 环路检测:D位为0表示禁用;为1表示启用。
- 路径矢量限制:如果环路检测禁用了则为0;如果设置了其他值,LSR检测经过的LSR的数量超过了设定值,则认为是出现了环路。
- 最大PDU长度
- 接收方LDP标识:标识接收方的标签空间。
2.4.3 Keepalive
LSR发送保活消息来检测LDP会话的有效性,包括消息ID和可选参数(实际无)。在会话保持时间,任何的LDP消息都会重置计时器,如果没有,则需要发送保活消息。
2.4.4 Address相关消息
- Address: LSR发送地址消息通告它的接口地址给LDP对等体,包括消息ID和地址列表TLV。
- Address Withdraw:LSR发送地址撤回消息给LDP对等体来撤回原来通告的接口地址,包括包括消息ID和地址列表TLV。
2.4.5 Label相关消息
- Label Mapping:发送自己FEC和标签的绑定条目,包括消息ID,FEC TLV,Label TLV和可选参数。
- Label Request:请求LDP对等体关于某条FEC的标签,包括消息ID,FEC TLV和可选参数。
- Label Abort Request: 放弃向LDP对等体请求某条FEC的标签请求的消息,包括消息ID,FEC TLV和可选参数。如果LDP对等体在收到放弃的消息之前就已经发送了该FEC的标签绑定,则忽略这条放弃消息。否则,它需要发送一条已放弃的通知信息,其包括放弃请求信息的信息ID。
- Label Withdraw:向LDP对等体发送FEC和标签的绑定的撤回消息,意味着这个FEC已经不对应这个标签了,包括消息ID,FEC TLV,Label TLV(可选)和可选参数。
- Label Release:告知LDP对等体自己不需要某个FEC的标签了,包括消息ID,FEC TLV,Label TLV(可选)和可选参数。
2.4.6 Notification
LSR发送通知消息给LDP对等体,消息包括关键错误或是建议信息,包括消息ID,Status TLV和可选参数。
2.5 参数TLV

U-bit:未知TLV位。行为同上。但不影响这条LDP消息里的其他TLV。
F-bit:转发未知TLV位。如果为0,则不转发。为1,则在转发这条LDP消息的时候携带这条TLV。
Type:TLV类型,决定了怎么解码Value的值。
Value:具体信息。
当TLV的U和F都为1,这条TLV可以作为透明信息传输,不识别这条TLV的节点依然可以转发它。
常用的TLV有:
- FEC TLV:包含一个或多个FEC要素,譬如前缀地址和掩码。
- Label TLV:用于通告,请求,放弃以及撤回标签映射。
- Address List TLV:出现在地址及地址撤回的消息里,包括地址和地址家族。
- Hop Count TLV:用于在创建LSP时计算LSP的跳数。
- Path Vector TLV:用在标签请求消息时,记录请求消息经过的LSR。用在标签映射消息时,记录标签传播时经过的LSR。
- Status TLV:通知消息携带事件的状态。
3 LDP操作流程
3.1 邻居发现
3.1.1 直连邻居的发现

- MPLS接口发送Hello消息到224.0.0.2的组播地址,使用对端UDP 646端口。
- 如果对端也有MPLS接口,也会发送同样的消息。
- 这时双方都知道对方的存在,建立起Hello邻接关系。
3.1.2 远端邻居的发现
- 发送单播Hello消息到特定的地址,使用对端UDP 646端口。
- 发起请求的LSR发送目标Hello消息,目标LSR可以选择回应或是忽略这个Hello消息。
- 这时双方都知道对方的存在,建立起Hello邻接关系。
3.2 建立会话

3.2.1 建立传输连接
- 在两个LSR之间建立起Hello邻接之后,会尝试建立TCP连接。
- LDP RID大的一侧作为主动LSR,另一侧为被动LSR。
- 主动LSR发起到对端TCP端口646的连接。而被动LSR只能等待主动LSR先发起TCP连接。
3.2.2 初始化会话
- 在传输连接建立后,主动LSR发送初始化消息。
- 被动LSR接收到主动LSR发的初始化消息后,如果其携带的参数是可以接受的,则其也发送自己的初始化消息发给主动LSR,并发送保活消息。如果参数不可解决,则发送通知消息,主动LSR关闭TCP连接。
- 主动LSR收到被动LSR的初始化消息。如果接受其携带的参数,则发送保活消息。如果不接受其携带的参数,则发送通知消息并关闭TCP连接。
- 当双方都收到第一个保活消息后,则会话建立成功。