MPLS技术详解2:LDP标签分发协议原理与操作流程
本文系统讲解了MPLS网络中LDP(标签分发协议)的核心概念,包括标签空间、LDP标识、消息类型及TLV结构。详细解析了LDP的邻居发现、会话建立、标签分发及撤销流程,并介绍了标签分发和控制模式、预留标签、环路检测、认证与会话保护等机制,为理解和部署MPLS LDP提供了全面的技术参考。
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和标签绑定信息,直接影响设备的数据转发。
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. 标签处理模式
3.1 标签分发模式
- 下游自主模式:即使是上游LSR没有请求一个FEC的标签,下游LSR也会将它通告给上游的LSR。当一个LSR学到一条路由时,它会绑定一个标签并通告给所有的对等体。其中一个缺点是占用过多的标签,因为它可能学到非它下一跳的标签,而MPLS网络是逐跳交换标签来转递数据的。LDP和BGP-LU使用这种模式。
- 下游按需模式:只有上游LSR请求一个FEC的标签,下游LSR才会将它通告给请求的LSR。譬如RSVP-TE里,头端发送PATH请求给尾端,尾端回复RESV消息,里面包括面向头端的FEC和标签的映射信息。
- 上游分发模式:来自RFC 5331,它不是标准的LDP行为,因此不是所有的设备都支持上游分发的模式。它主要用于组播,一个组播源下面有很多的接收者。如果还是使用下游分发的模式,不同的出口LER分发不同的标签。这时连接组播源的LER下发一个到源的标签分发到所有的接收者连接的LER上。而在生产环境,运营商多会使用组播VPN,在核心网的客户组播流量要么使用入口复制或是核心网的组播来传递。
3.2 标签控制模式
它决定了LSR怎么回应一个标签请求。
- 顺序控制:在这种模式,LSR并不会通告一个FEC,除非它是这个FEC的出口LER或是它从下游对等体收到了这个FEC的标签。这种模式用于RSVP和BGP-LU。
- 独立控制:LSR不受下游LSR的影响独立分发标签。优点是响应标签请求比较快,缺点是可能会有流量黑洞。用于LDP(Cisco)。
3.3 标签保留模式
- 保守模式:只会分配和保留FEC下一跳的标签,它们用于数据的转发。但如果因路由变化有了新的下一跳,需要取得下一跳的标签之后才能转发数据。
- 自由模式:会要求所有的前缀的标签,也会接收所有的对等体发送的标签。优点是响应路有变化快,缺点是需要维持和通告不需要的标签映射,会增加内存的使用。
3.5 预留标签
在一个标签空间里
- 0-15是特殊标签。
- 16-1023为静态标签,虽然可以配置大于1023。
- 1024及以上:协议动态分配的标签区间。
其中有隐式空标签和显式空标签,用于管理LSP最后一步的行为。默认开启次末跳弹出,因此出口LER发送给上游LSR的是隐式空标签,标签值为3。因为QoS信息存在MPLS报文的EXP位,如果需要保留QoS信息,则不能在次末跳设备剥离最外层的标签,因此就有了显示空标签,IPv4为0,IPv6为2。
举个例子,譬如小的运营商自有的线路并不足与覆盖服务的地方,他们会像三大运营商租用线路。在这种Carrier Supporting Carrier (CSC)网络里,最外层的是大运营商的标签,有自己的QoS策略。如果次末跳弹出最外层标签,数据到达大运营商的PE的时候,外层标签变成了小运营商自己的标签,在大运营商的PE可以能据此有错误的QoS策略。因此需要关闭次末跳弹出功能,使用显示空标签。
4 LDP操作流程
4.1 邻居发现
4.1.1 直连邻居的发现
- MPLS接口发送Hello消息到224.0.0.2的组播地址,使用对端UDP 646端口。
- 如果对端也有MPLS接口,也会发送同样的消息。
- 这时双方都知道对方的存在,建立起Hello邻接关系。
4.1.2 远端邻居的发现
- 发送单播Hello消息到特定的地址,使用对端UDP 646端口。
- 发起请求的LSR发送目标Hello消息,目标LSR可以选择回应或是忽略这个Hello消息。
- 这时双方都知道对方的存在,建立起Hello邻接关系。
4.2 建立会话
4.2.1 建立传输连接
- 在两个LSR之间建立起Hello邻接之后,会尝试建立TCP连接。
- LDP RID大的一侧作为主动LSR,另一侧为被动LSR。
- 主动LSR发起到对端TCP端口646的连接。而被动LSR只能等待主动LSR先发起TCP连接。
4.2.2 初始化会话
- 在传输连接建立后,主动LSR发送初始化消息。
- 被动LSR接收到主动LSR发的初始化消息后,如果其携带的参数是可以接受的,则其也发送自己的初始化消息发给主动LSR,并发送保活消息。如果参数不可解决,则发送通知消息,主动LSR关闭TCP连接。
- 主动LSR收到被动LSR的初始化消息。如果接受其携带的参数,则发送保活消息。如果不接受其携带的参数,则发送通知消息并关闭TCP连接。
- 当双方都收到第一个保活消息后,则会话建立成功。
4.2.3 保持LDP会话和Hello邻接的关系
Hello和会话都有保活机制,那它们之间有什么关系呢?如果2个LSR之间有许多条链路,而且通告的标签空间也相同,则它们之间有一个LDP会话和多个Hello邻接。
如果Hello的保持计时器超时了,则会认为对端不想使用这条链路来进行标签转发,LDP会删除这条Hello邻接。如果这个会话的最后一个Hello邻接也被删除了,则会发送一个通告信息,并关闭传输连接。
4.3 标签操作
4.3.1 下游自主模式
- LSR收到新路由时,会立即为该路由(FEC)分配本地标签。
- SR会主动向所有LDP对等体发送标签映射消息,通告FEC和标签的绑定关系。
- 如果路由失效,LSR会发送标签撤销消息给对等体。
4.3.2 下游按需模式
- LSR收到新路由时,不会立即通告标签,而是等待上游LSR的标签请求。
- 当上游LSR需要标签时,它会向LSR发送标签请求消息。
- LSR收到请求后,会为该FEC分配标签,然后向请求方发送标签映射消息。
- 如果LSR的路由失效,它会发送标签撤销消息。
- 如果LSR不再使用某个标签,它会发送标签释放消息。
4.4 环路检测
环路检测是一个可选配置选项,用于检测和防止环路。机制是使用标签请求和标签映射消息中携带的路径矢量TLV和跳数TLV,它们在参数TLV中有提到。
- 路径矢量TLV: 它包含了经过的LSR的ID。当LSR传播一个包含此TLV的消息时,会将自己的LDP ID加到路径矢量列表中。如果一个LSR收到一个消息,里面包含自己的LDP ID,则会检测出环路。LDP支持路径列表列表的最大长度,超过此长度则认为经历了环路。
- 跳数TLV:如果LSR传播的消息里包含跳数TLV,则每经过一个LSR则跳数加1。如果超过了设置的最大跳数值,则认为经历了环路。
4.5 认证
LDP没有原生的认证机制,使用TCP的MD5签名选项来验证会话消息的有效性。RFC 5925定义了新的TCP-AO选项,使用更强的摘要验证码(Message Authentication Codes),算法包括AES和HMAC-SHA。认证的配置可以配置在邻居后面加密码,也可以全局配置再调用ACL和Keychain。
4.6 会话保护机制
除了链路Hello以外,还会使用远程Hello,两个Hello邻接维持一个会话。当直连链路出现故障时,会切换到非直连链路,链路恢复后切换回直连链路。这样可以避免会话终止和LSP的拆除和重新计算。它能在链路暂时性故障时保持LDP会话,从而避免了标签的撤销和重分发,大大加快了网络收敛速度。如果网络收敛前,直连链路还没恢复,这时会有新的最优路径。LSR会根据IGP计算的最优路径来转发数据。这个会话保护机制只是保护了会话的存在,并不会影响数据的转发。
📚 延伸阅读
更多内容持续更新于我的博客:https://www.zenseek.site