编辑
2025-10-11
网工之路
00

目录

1. LDP基本概念
1.1 上下游
1.2 标签空间
1.3 LDP标识
2. LDP消息
2.1 LDP PDU
2.2 LDP PDU报头格式
2.3 LDP消息格式
2.4 LDP消息类型
2.4.1 Hello
2.4.2 Initialization
2.4.3 Keepalive
2.4.4 Address相关消息
2.4.5 Label相关消息
2.4.6 Notification
2.5 参数TLV
3 LDP操作流程
3.1 邻居发现
3.1.1 直连邻居的发现
3.1.2 远端邻居的发现
3.2 建立会话
3.2.1 建立传输连接
3.2.2 初始化会话

mpls000.jpeg

1. LDP基本概念

Label Distribution Protocal标签分发协议为单播路由协议通告的前缀分配标签,并和LDP邻居交换标签。

  • 其所产生的标签为本地标签,并非全局标签,因为每台路由器对相同的前缀分配的标签可能会不同。
  • 会话建立使用UDP 646端口,交换LDP消息使用TCP 646端口。
  • 对LIB有读写权限,对RIB有读权限。

1.1 上下游

  • 标签传递的方向和路由传递的方向一致,即从直连目的网络的路由器始发。
  • 标签传递的方向和数据流的方向相反。

mpls201.jpeg

以上图为例,标签从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消息两部分。

mpls202.jpeg

2.2 LDP PDU报头格式

  • 版本: 长度2字节,包括协议的版本号,现在为1。
  • PDU长度:长度2字节,不包括版本和PDU长度本身的长度,最大为4096字节。
  • LDP标识:参照1.3节内容

2.3 LDP消息格式

mpls203.jpeg

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

2.4 LDP消息类型

mpls205.jpeg

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

mpls204.jpeg

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 直连邻居的发现

mpls206.jpeg

  • MPLS接口发送Hello消息到224.0.0.2的组播地址,使用对端UDP 646端口。
  • 如果对端也有MPLS接口,也会发送同样的消息。
  • 这时双方都知道对方的存在,建立起Hello邻接关系。

3.1.2 远端邻居的发现

  • 发送单播Hello消息到特定的地址,使用对端UDP 646端口。
  • 发起请求的LSR发送目标Hello消息,目标LSR可以选择回应或是忽略这个Hello消息。
  • 这时双方都知道对方的存在,建立起Hello邻接关系。

3.2 建立会话

mpls207.jpeg

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连接。
  • 当双方都收到第一个保活消息后,则会话建立成功。

本文作者:潘晓可

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!