LDP是MPLS的一种控制协议,相当于传统网络中的信令协议,负责FEC的分类、标签的分配以及LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程。
LDP的工作过程主
LDP的工作过程主要分为两部分:
①LSR之间建立LDP会话。
②LSR之间基于LDP会话动态交换标签与FEC的映射信息,并根据标签信息建立LSP。
LDP会话、LDP邻接体、LDP对等体
LSR之间交互标签绑定消息之前必须建立LDP会话。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的长度为48 bit,由32 bit的LSR ID与16 bit的标签空间标识符(Label Space ID)构成。
- LDP ID以“LSR ID : 标签空间标识”的形式呈现。例如2.2.2.2:0。
标签空间标识一般存在两种形态:
- 值为0:表示基于设备(或基于平台)的标签空间;
- 值非0:表示基于接口的标签空间。
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传递;会话消息、通告消息、通知消息都基于TCP传递。
LDP报文封装
LDP协议报文包括了LDP头部和LDP消息两部分。
- LDP头部中携带了LDP版本、报文长度等信息;
- LDP消息中携带了消息类型、消息长度等信息。
LDP头部长度为10 Byte,包括Version,PDU Length和LDP Identifier三部分。
- Version占用2 Byte,表示LDP版本号,当前版本号为1。
- PDU Length占用2 Byte,以字节为单位表示除了Version和PDU Length以外的其他部分的总长度。
- LDP Identifier,即LDP ID,长度6 Byte,其中前4 Byte用来唯一标识一个LSR,后2 Byte用来表示LSR的标签空间。
• LDP消息包含五个部分。
- U占用1个 bit,为Unknown Message bit。如果对端收到的LDP消息中“Message type”字段为未知的LDP消息类型,且“U”字段的值为“0”,则向源端发送通知消息;如果对端收到的LDP消息中“Message type”字段为未知的LDP消息类型,且“U”字段的值为“1”,则忽略该未知消息。
- Message Length占用2 Bytes,以字节为单位表示Message ID、Mandatory Parameters和Optional Parameters的总长度。
- Message ID占用32 bit,用来标识一个消息。
- Mandatory Parameters和Optional Parameters分别为可变长的该消息的必须的参数和可选的参数。
- Message Type表示具体的消息类型,目前LDP定义的常用的消息有Notification, Hello,Initialization,Keepalive,Address,Address Withdraw,Label Mapping,Label Request,Label Abort Request,Label Withdraw,Label Release。
LDP会话状态机
LDP使用5种状态描述LDP会话状态机。
LDP Session协商过程可以通过状态机来描述。
如图所示,有5种状态。分别是Non-Existent,Initialized,OpenRec,OpenSent,Operational。
- 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状态。
LDP状态切换信息可以通过指令debug mpls ldp session看到。
LDP会话建立
发现阶段与TCP连接建立
• 除了基本发现机制外,可以通过拓展发现机制发现非直连的远端邻接体,该内容不属于课程的重点,详细内容可以查阅RFC5036相关内容。
• LDP的传输地址用于与邻居建立TCP连接。
- 两台LSR之间在建立LDP会话之前,需要先建立TCP连接,以便进行LDP协议报文的交换。
- 设备的传输地址被包含在LDP Hello报文中,LSR通过Hello报文知晓邻居的传输地址。
- 在使用Hello报文发现邻居并且知道了对方的传输地址后,邻居之间就会开始尝试TCP三次握手(基于传输地址),并且交互LDP的初始化报文、标签映射报文等,这些报文都使用双方的传输地址作为源、目的IP地址。
- LSR必须拥有到达邻居的传输地址的路由。
会话建立与保持
LDP邻居状态
LDP会话状态
- NonExistent:表示LDP会话的最初状态。在此状态双方互相发送Hello消息,在收到TCP连接建立成功事件的触发后变为Initialized状态。
- Initialized:表示LDP会话处于初始化状态。
- Open Sent:表示LDP会话进入初始化状态后,主动方给被动方发送了Initialized消息,并等待对方的回应。
- Open Recv:表示LDP会话进入初始化状态后,当双方都收到了对方发送的Keepalive消息后,LDP会话进入Operational状态。
- Operational:表示LDP会话建立成功。
标签的发布和管理
在MPLS网络中,下游LSR决定标签和FEC的绑定关系,并将这种绑定关系发布给上游LSR。
LDP通过发送标签请求和标签映射消息,在LDP对等体之间通告FEC和标签的绑定关系来建立LSP
标签的发布和管理由标签发布方式、标签分配控制方式和标签保持方式来决定。
MPLS根据数据的转发方向确定上、下游关系。标签报文从上游LSR发出,被下游LSR接收并处理。
标签发布方式
DU模式
对于一个特定的FEC,LSR无需从上游获得标签请求消息即进行标签分配与分发。LSR会主动将自己为FEC捆绑的标签通告给上游邻居,无需邻居先发起请求再通告。
• 标签分配:LSR从本地标签空间中取出一个标签与FEC绑定。
• 标签分发:LSR将标签与FEC的绑定关系通知给上游LSR。
• 标签发布方式为DU时,系统默认支持LDP为所有对等体分标签,即每个节点都可以向所有的对等体发布标签映射关系,不再区分上下游关系。因为在只给上游对等体分标签情况下,发送标签映射消息的时候,要根据路由信息对会话的上下游关系进行确认。
DoD模式
对于一个特定的FEC,LSR获得标签请求消息之后才进行标签分配与分发。一般情况下,对特定FEC的访问需求会触发标签请求消息。只有上游邻居向自己请求标签映射时,LSR才会通告标签映射给该邻居。
标签分配控制方式
独立模式
本地LSR可以自主地分配一个标签绑定到某个FEC,并通告给上游LSR,而无需等待下游的标签。
标签分配控制方式需要与标签发布方式结合使用:
- 在使用DU作为标签分发方式的情况下,如图所示,R2和R3对192.168.4.0/24这条FEC,可以在上游LSR无请求,且自身没有收到下游LSR的标签绑定信息的情况下,主动向上游LSR通告标签绑定信息。
采用DoD作为标签发布方式时,如图所示,R2和R3对192.168.4.0/24这条FEC,只要收到上游LSR的标签请求消息,可以在自身没有收到下游LSR的标签绑定信息的情况下,向上游LSR通告标签绑定信息。
有序模式
对于LSR上某个FEC的标签映射,只有当该LSR已经具有此FEC下一跳的标签映射消息、或者该LSR就是此FEC的出节点时,该LSR才可以向上游发送此FEC的标签映射。
• 当标签控制方式为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。
标签保留
自由模式
LSR收到的标签映射可能来自下一跳,也可能来自非下一跳。对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留。
• 当基于IP网络部署MPLS时,LSR根据IP路由表判断接收到的标签映射是否来自下一跳。
• Liberal方式的最大优点在于路由发生变化时能够快速建立新的LSP进行数据转发,因为Liberal方式保留了所有的标签。缺点是需要分发和维护不必要的标签映射。
▫ DU标签分发方式下,如果采用Liberal保持方式,则R2保留所有LDP邻居 R3和R5发来的关于192.168.4.0/24这个FEC的标签,无论R3和R5是否是IP路由表中到达192.168.4.0/24的下一跳。
▫ DoD标签分发方式下,如果采用Liberal保持方式, LSR会向所有LDP邻居请求标签。但通常来说,DoD分发方式都会和Conservative保持方式搭配使用。
保守模式
保守(Conservative)模式对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留。
Conservative方式的优点在于只需保留和维护用于转发数据的标签,以达到节约标签的目的。
- 当使用DU标签分发方式时,LSR可能从多个LDP邻居收到到同一网段的标签映射消息,如图中R2会分别从R3和R5收到网段192.168.4.0/24的标签映射消息。如果采用Conservative保持方式,则R2只保留下一跳R3发来的标签,丢弃非下一跳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,而R3则仅需执行一次查询操作(查询FIB表)即可获得相应的转发信息,转发效率得到了提升。
隐式空标签与显式空标签
缺省情况下,Egress节点向倒数第二跳分配隐式空标签(implicit-null),即特殊标签3。但在部署QoS的场景下,标签被弹出后,其中的优先级也会一并丢失。
显式空标签机制,Egress节点向倒数第二跳分配特殊标签0。
R3在转发标签报文时,若出标签封装为0,则不会将标签头部弹出,标签头部中的QoS信息得以保存。R4在收到带0标签的报文时,直接弹出标签,不用去查找ILM表项。
缺省情况下,Egress分配的是隐式空标签。
• 在MPLS视图下,执行命令label advertise { explicit-null | implicit-null | non-null },配置向倒数第二跳分配的标签。
• 根据参数的不同,可以配置Egress向倒数第二跳分配不同的标签。
- 缺省情况下,使用的是implicit-null,Egress向倒数第二跳节点分配隐式空标签,值为3。
- 如果配置的是explicit-null,Egress节点向倒数第二跳分配显式空标签,值为0。当需要支持MPLS QoS属性时,可以选用explicit-null。
- 如果配置的是non-null,Egress向倒数第二跳正常分配标签,即分配的标签值不小于16。