概述:
标签分发协议LDP是多协议标签交换MPLS的一种控制协议,相当于传统网络中的信令协议,负责转发等价类FEC(一条路由)的分类、标签的分配以及标签交换路径LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程。
LDP术语:
- LDP对等体
LDP对等体是指相互之间存在LDP会话、使用LDP来交换标签消息的两个LSR。LDP对等体通过它们之间的LDP会话获得对方的标签。 - LDP邻接体
当一台LSR接收到对端发送过来的Hello消息后LDP邻接体建立。LDP邻接体存在两种类型∶
• 本地邻接体(Local Adjacency ):以组播形式发送Hello消息(即链路Hello消息)发现的邻接体叫做本地邻接体。
• 远端邻接体(Remote Adjacency ) ∶以单播形式发送Hello消息(即目标Hello消息)发现的邻接体叫做远端邻接体。 - LDP会话
LDP会话用于LSR之间交换标签映射、释放等消息。只有存在对等体才能建立LDP会话,LDP会话分为两种类型∶
• 本地LDP会话(Local LDP Session ):建立会话的两个LSR之间是直连的。
• 远端LDP会话(Remote LDP Session)∶建立会话的两个LSR之间可以是直连的,也可以是非直连的。
本地LDP会话和远端LDP会话可以共存。 - 标签空间
一种是基于接口的标签空间:每个接口通告的标签范围是唯一的,如图所示,LER1为同一条FEC在不同接口通告的标签是不同的:
二是基于平台的标签空间:标签分配时并不是在每个接口下唯一,而是从整台LSR中来分配标签的,如图所示,LER1为同一条FEC通告一个标签:
华为设备默认采用平台方式分配标签。
标签空间的取值范围如下划分如下:
- 0~15:特殊标签。如标签3,称为隐式空标签,用于倒数第二跳弹出(后面详细分析);标签0,称为显示空标签,如果标签为0,则倒数第二跳LSR需要将值为0的标签正常压入报文标签值顶部,转发给出节点。出节点发现报文携带的标签值为0,则直接将标签弹出(和普通标签不同的地方在于,这里不用查看LFIB表进行操作,节约了对应的时间),使用显示空标签的目的是做Qos。
- 16~1023:静态LSP和静态CR-LSP(共享的标签空间)。
- 1024及以上:LDP、RSVP-TE、MP-BGP等动态信令协议的标签空间。
报文格式分析:
LDP协议主要使用四类消息:
- 发现(Discovery)消息:用于通告和维护网络中邻居的存在,如Hello消息。
- 会话(Session)消息:用于建立、维护和终止LDP对等体之间的会话,如Initialization消息、Keepalive消息。
- 通告(Advertisement)消息:用于创建、改变和删除FEC的标签映射,如Address消息、Label Mapping消息。
- 通知(Notification)消息:用于提供建议性的消息和差错通知。
LDP PDU报头格式:
LDP报文是基于TCP的(Hello报文基于UDP),端口号为646,并且报文格式是基于TLV的方式来封装的,LDP报文分为头部和报文内容两部分,LDP报头格式如图所示:
对其中的字段解释如下:
- Version:2Byte无符号整数值,表示 LDP协议版本号,目前LDP协议版本号为Ox01。
- PDU Length: 2Byte整数值,以字节为单位表示PDU长度,不包括版本号和PDU长度字段。PDU最大长度在会话初始化时协商确定,默认最大长度为4096Byte。
- LDP ldentifier: 6Byte,唯一标识 PDU所属发送LSR的标签空间。前4Byte表示LSR-ID地址,后2Byte指定LSR中的特定标签空间。
LDP报文格式如图所示:
对其中的字段解释如下:
- U: 1bit,未知 TLV bit,U=0返回通知,U=1忽略该报文。
- Message Type: 14bit,表示报文所属的类型。
- Message Length: 2Byte,以字节为单位表示报文长度,包括报文标识符、必选参数、可选参数等几部分。
- Message ID:报文标识符,4Byte,用于标识报文。
- Mandatory Parameters:必选参数可变长度,必选参数集。Option Parameters:可选参数可变长度,可选参数集。
一、hello报文
LDP的Hello报文用于发现邻居并用作后期邻居关系的维护,基于UDP来发送,发送的目标地址是224.0.0.2,在启用了LDP 的接口上会周期性地发送(默认周期=5s)。格式如下:
Hello包携带了一些通用参数,比如保持时间等,还有发送方的传输地址。保持时间是删除一个邻居前的等待时间,默认是15s (Hello*3),如果双方设置的保持时间不一样,则使用较短的那个时间。传输地址是用来建立TCP连接的地址,默认是跟LSR-ID一样的,所以默认情况下,两台LSR 要能成功建立LDP邻居会话关系,各自的LSR-ID一定要路由可达。传输地址可以修改成其他地址,华为设备修改方法如下:
[LSR1-GigabitEthernet0/0/0]mpls ldp transport-address interface
但是,在修改传输地址时会导致LDP 邻居关系中断,会影响上层的业务,所以要谨慎配置。可以使用下面的方式来查看保持时间和传输地址,如下输出所示:
二、Initialization报文
Initialization报文用来协商LDP 邻居会话参数,包括标签的分发方式、防环机制和标签空间,如图所示:
标签分发方式后续进行分析。
三、Address报文
Address报文用来向LDP邻居通告本端的所有接口IP地址,以便邻居可以通过IP转发表的下一跳地址来决定出站标签,如图所示:
如果一台LDP路由器从不同邻居接收到相同FEC的标签映射,那么需要为该FEC
先择一个最佳的out标签,这时就需要综合查看IP转发表和标签表的信息来决定out标签。
四、标签通告报文
标签通告报文用来向LDP邻居发布FEC和标签的绑定内容,一个标签通告可以发布多个标签信息,如图所示:
标签通告报文还包括了标签请求、标签撤销和标签释放报文,这里就不一一赘述。
五、Keepalive报文
LDP邻居会话建立后,双方会定期地交互KeepAlive报文,用来对TCP会话的保活检测,默认检测周期为15s,超时时间为45s。KeepAlive报文没有具体内容,格式非常简单,如图所示:
六、Notification报文
通知报文分为错误通知或查询通知。在发生以下事件时会发出通知报文:收到的数据包格式错误、无法识别的TLV、会话超时等,报文中会向邻居报告具体的差错类型,如图所示:
报文使用流程图如下:
LDP邻接关系建立过程:
一、发现邻居:
本地LDP会话(Local LDP Session):建立会话的两个LSR之间是直连的。
在启动LDP协议后,路由器发出Hello报文,相邻路由器之间会通过交换Hello报文来完成相互“问候”,通过Hello报文可以获知邻居的基本信息,比如用来建立会话的地址(传输地址)等。
LDP的Hello消息使用UDP封装。UDP是无连接的协议,为了保证邻居的有效性和可靠性,Hello消息周期发送,发送周期为5s,使用组播224.0.0.2作为目的IP地址,意思是“发送给网络中的所有路由器”。
然后,由地址大的一方发起TCP连接并最终建立邻居会话,这种方式的LDP会话就叫本地会话。如果以手工的方式指定邻居地址,然后建立的会话称为远端的LDP会话。
远端LDP会话(Remote LDP Session):建立会话的两个LSR之间可以是直连的,也可以是非直连的。
如果邻居是非直连的设备,Hello会以单播的方式来交换,用于完成远端LDP会话的建立,如上图图所示。
二、会话建立:
LDP邻居之间相互发现或直接指定了邻居地址后,开始建立TCP连接,建立完TCP连接后,相互发送初始化报文进行参数协商,如图所示:
如果接受对方的参数,则会回复KeepAlive报文,完成LDP会话的建立;如果期间发生错误,则会发送Notification报文来报告相应的错误,最终导致连接被关闭。可以通过以下命令检查LDP会话的建立情况:
状态为Operational表示 LDP会话已经建立成功,邻居之间可以交换标签通告等报文了。在会话建立后,双方会定期发送Hello报文以检测邻居状态,也会定期发送KeepAlive报文来检测 TCP连接状态。
LDP状态机:
LDP协议从邻居发现到会话建立过程历经了4个状态,状态之间的切换如下图所示:
- Non Existent状态:LDP协议的初始状态,类似BGP的IDLE状态。开始时双方用组播地址224.0.0.2发送Hello报文,并且选举主动方和被动方(LSR IP地址高的被选为主动方)。双方收到对方的Hello报文后,则开始建立TCP连接,接着是建立TCP连接三次握手的过程,当TCP会话建立成功后,双方进入到Initialized状态。
- Initialized 状态:该状态下主动方和被动方的工作有点不同。主动方先发送Initialization报文,随后便转入Opensent状态,并等待被动方回应Initialization报文。被动方在这个状态下会等待主动方发送Initialization报文过来,如果收到的Initialization 报文中的参数都能接受,会给主动方回应Initialization和 KeepAlive报文,随后便转入Openrec状态。主动方和被动方在该状态下收到非Initialization报文或等待超时都会跳转至Non Existent状态。
- Opensent 状态:这个状态是主动方发出 initialization报文后的状态,该状态下还会等待邻居的initialization和KeepAlive报文。如果收到的 initialization报文中的参数都能接受,则会向邻居回应KeepAlive报文,并且状态跳变至Openrec状态;如果参数不能接受或等待时间超时,则会断开TCP会话连接而进入到Non Existent状态。
- Openrec状态:不管是主动方还是被动方,在收到参数正确的initialization报文后都会转入此状态,并且在该状态下已经向对方回应了KeepAlive报文并等待着邻居回应KeepAlive报文。如果从邻居那边按时接收到了KeepAlive报文,则转入Operational状态;如果收到其他报文或等待时间超时,则转入Non Existent状态。
- Operational状态:到达此状态就意味着LDP会话已经建立成功,可以发送和交换所有其他的LDP报文了。在该状态下双方通过周期性KeepAlive报文交换来维护邻居会话,如果KeepAlive超时,则立刻断开LDP会话并进入Non Existent状态;当收到错误通知报文时,也会断开LDP会话并转入Non Existent状态。
LSP的建立与维护:
LSP的建立过程实际就是将FEC和标签进行绑定,并将这种绑定通告LSP上相邻LSR。这个过程是通过LDP实现的,以DU模式、有序标签控制方式为例,主要步骤如下:
如图所示拓扑,LDP动态建立LSP的过程如下:
- RTD上存在100.1.1.1/32的主机路由,因为RTD是Egress节点,所以直接向自己上游邻居RTC发布100.1.1.1/32与标签的绑定关系。
- RTC收到下游邻居RTD分配的100.1.1.1/32与标签的绑定关系后,将标签记录在自己的LIB表中,并向上游邻居RTB发布100.1.1.1/32与标签的绑定关系,同时RTC查看自己IP路由表中到达100.1.1.1/32的下一跳是否为RTD,如果IP路由表中的下一跳为RTD,则RTC使用RTD分配的标签封装到达100.1.1.1/32的数据;如果IP路由表中的下一跳不是RTD,则RTC保留RTD分配的标签作为备用标签。
- RTB收到下游邻居RTC分配的100.1.1.1/32与标签的绑定关系后,执行与RTC相同的动作。
- RTA收到下有邻居RTB分配的100.1.1.1/32与标签的绑定关系后,查看自己IP路由表中到达100.1.1.1/32的下一跳是否为RTB,如果IP路由表中的下一跳为RTB,则RTA使用RTB分配的标签封装到达100.1.1.1/32的数据;如果IP路由表中的下一跳不是RTB,则RTA保留RTB分配的标签作为备用。因为RTA为Ingress,最终到达100.1.1.1/32的LSP完成建立。
会话撤销:
LDP通过检测Hello消息来判断邻接关系;通过检测Keepalive消息来判断会话的完整性。
LDP在维持邻接关系和LDP会话时使用不同的定时器:
- Hello保持定时器:LDP对等体之间,通过周期性发送Hello消息表明自己希望继续维持这种邻接关系。如果Hello保持定时器超时仍没有收到新的Hello消息,则删除Hello邻接关系。
- Keepalive定时器:LDP对等体之间通过LDP会话连接上传送的Keepalive消息来维持LDP会话。如果会话保持定时器超时仍没有收到任何Keepalive消息,则关闭连接,结束LDP会话。
可以看出来Hello报文控制邻居关系,Keepalive控制会话关系。
LDP标签分发的基本规则:
LDP LSP的建立是通过接收下游设备为FEC(一般为一条路由表项)分配的标签,建立FEC与MPLS标签、出接口之间映射关系后完成的。所以要建立基于FEC的LSP,首先就要为对应FEC分配标签。标签的分配必须符合以下原则:
- 入标签的分配是按由大到小(最小值1024)的顺序分配的,分配当前未分配的最小标签。
- 同一链路下游设备为FEC分配的入标签一定要与上游设备的出标签对应。
- 在一台设备上针对同一FEC所接收的出标签可能有多个(它们之间可以相同,也可以不同),分别来自不同下游对等体,也就是一个FEC可以映射多个出标签和出接口。
- 在一台设备上针对同一FEC只会分配一个入标签,即对于入标签,每个FEC在同一设备上是唯一的。
- 在直接连接某FEC对于的网段(缺省仅为32位掩码的主机路由,可以使用lsp-trigger命令修改,后续笔记补充)的节点上会为该FEC仅创建一个包含入标签的LSP。此LSP并无出标签,也无出接口,因为这是此LSP隧道的终点。
- 在其他节点上都会对非直连网段FEC同时创建两个LSP:其中一个是用于指导从本地节点访问FEC所代表的目的主机的LSP,仅包括出标签和出接口;另一个则是以本地节点为中间节点(Transit)的LSP,用于指导上游设备访问FEC所代表的目的主机,同时包括入标签、出标签和出接口。
LDP的标签发布和管理:
一、标签的发布方式:
DU(Downstream Unsolicited,下游自主方式):对于一个到达同一目地址报文的分组,LSR无需从上游获得标签请求消息即可进行标签分配与分发。
DoD(Downstream on Demand,下游按需方式):对于一个到达同一目的地址报文的分组,LSR获得标签请求消息之后才进行标签分配与分发。
如图所示拓扑:
- 采用DU方式分发标签,对于目的地址为100.1.1.1/32的分组,下游RTD(Egress)通过标签映射消息主动向上游RTC(Transit)通告自己主机路由100.1.1.1/32的标签。
- 采用DoD方式分发标签,对于目的地址为100.1.1.1/32的分组,上游RTC(Transit)向下游发送标签请求消息,下游RTD(Egress)收到标签请求消息后,才会向上游发送标签映射消息。
华为设备默认采用DU的方式发布标签。DU无需等待上游的请求消息,可以直接向邻居分配标签。在网络拓扑发生变化时,采用DU方式可以快速反应为新的拓扑分发标签,收敛时间相对于DoD方式较短。
二、标签的分配控制方式:
Independent(独立标签分配控制方式):本地LSR可以自主地分配一个标签绑定到某个IP分组,并通告给上游LSR,而无需等待下游的标签。
Ordered(有序标签分配控制方式):只有当该LSR已经具有此IP分组的下一跳的标签,或者该LSR就是该IP分组的出节点时,该LSR才可以向上游发送此IP分组的标签。
如图所示拓扑:
采用Independent方式:
- 如果标签发布方式为DU,且标签分配控制方式为Independent,则RTC(Transit)无需等待下游RTD(Egress)的标签,就会直接向上游RTB分发标签。
- 如果标签发布方式为DoD,且标签分配控制方式为Independent,则发送标签请求的RTB(Transit)的直连下游RTC(Transit)会直接回应标签,而不必等待来自下游RTD(Egress)的标签。
采用Ordered方式:
- 如果标签发布方式为DU,且标签分配控制方式为Ordered,则RTC(Transit)只有收到下游RTD(Egress)的标签,才会向上游RTB分发标签。
2.如果标签发布方式为DoD,且标签分配控制方式为Ordered,则发送标签请求的RTB(Transit)的直连下游RTC(Transit)只有收到下游RTD(Egress)的标签,才会向上游RTB分发标签。
华为设备默认采用Ordered的方式分配标签。采用Ordered方式,只有当该LSR已经具有此IP分组的下一跳的标签时,才能向上游分发标签,这样是为了避免下游IP分组的标签未分配或收敛时间较长,上游的标签已分配,数据开始转发造成的数据丢失。
三、标签的保持方式:
Liberal(自由标签保持方式):对于从邻居LSR收到的标签映射,无论邻居LSR是不是自己的下一跳都保留。(但是最后组成LSP的时候只会使用自己下一跳发送来的标签)
Conservative(保守标签保持方式):对于从邻居LSR收到的标签映射,只有当邻居LSR是自己的下一跳时才保留。
如图所示拓扑,当网络拓扑变化引起下一跳邻居改变时:
- 使用自由标签保持方式,LSR可以直接利用原来非下一跳邻居发来的标签,迅速重建LSP,但需要更多的内存和标签空间。
- 使用保守标签保持方式,LSR只保留来自下一跳邻居的标签,节省了内存和标签空间,但LSP的重建会比较慢。
华为设备默认采用自由标签保持方式保存标签。
目前华为设置支持如下组合方式:
- 下游自主方式(DU)+有序标签分配控制方式(Ordered)+自由标签保持方式(Liberal),该方式为默认方式。也就是LSR在收到下游标签映射后,可自主向上游分配标签,且收到的标签全保留。(灵活但是资源消耗较多)
- 下游按需方式(DoD)+有序标签分配控制方式(Ordered)+保守标签保持方式(Conservative)。即LSR在同时收到上游标签请求和下游标签映射后,才向上游分配标签,且只保留自己下一跳分配的标签。(消耗资源较少但不灵活)
整理资料来源:《HCIE路由交换学习指南》、华为HCIE培训资料