LDP基础详解

2024-04-27 15:32
文章标签 基础 详解 ldp

本文主要是介绍LDP基础详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述:

标签分发协议LDP是多协议标签交换MPLS的一种控制协议,相当于传统网络中的信令协议,负责转发等价类FEC(一条路由)的分类、标签的分配以及标签交换路径LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程。

LDP术语:

  1. LDP对等体
    LDP对等体是指相互之间存在LDP会话、使用LDP来交换标签消息的两个LSR。LDP对等体通过它们之间的LDP会话获得对方的标签。

  2. LDP邻接体
    当一台LSR接收到对端发送过来的Hello消息后LDP邻接体建立。LDP邻接体存在两种类型∶
    • 本地邻接体(Local Adjacency ):以组播形式发送Hello消息(即链路Hello消息)发现的邻接体叫做本地邻接体。
    • 远端邻接体(Remote Adjacency ) ∶以单播形式发送Hello消息(即目标Hello消息)发现的邻接体叫做远端邻接体。

  3. LDP会话
    LDP会话用于LSR之间交换标签映射、释放等消息。只有存在对等体才能建立LDP会话,LDP会话分为两种类型∶
    • 本地LDP会话(Local LDP Session ):建立会话的两个LSR之间是直连的。
    • 远端LDP会话(Remote LDP Session)∶建立会话的两个LSR之间可以是直连的,也可以是非直连的。
    本地LDP会话和远端LDP会话可以共存。

  4. 标签空间
    一种是基于接口的标签空间:每个接口通告的标签范围是唯一的,如图所示,LER1为同一条FEC在不同接口通告的标签是不同的:
    在这里插入图片描述
    二是基于平台的标签空间:标签分配时并不是在每个接口下唯一,而是从整台LSR中来分配标签的,如图所示,LER1为同一条FEC通告一个标签:
    在这里插入图片描述
    华为设备默认采用平台方式分配标签。

标签空间的取值范围如下划分如下:

  1. 0~15:特殊标签。如标签3,称为隐式空标签,用于倒数第二跳弹出(后面详细分析);标签0,称为显示空标签,如果标签为0,则倒数第二跳LSR需要将值为0的标签正常压入报文标签值顶部,转发给出节点。出节点发现报文携带的标签值为0,则直接将标签弹出(和普通标签不同的地方在于,这里不用查看LFIB表进行操作,节约了对应的时间),使用显示空标签的目的是做Qos。
  2. 16~1023:静态LSP和静态CR-LSP(共享的标签空间)。
  3. 1024及以上:LDP、RSVP-TE、MP-BGP等动态信令协议的标签空间。

报文格式分析:

LDP协议主要使用四类消息:

  1. 发现(Discovery)消息:用于通告和维护网络中邻居的存在,如Hello消息。
  2. 会话(Session)消息:用于建立、维护和终止LDP对等体之间的会话,如Initialization消息、Keepalive消息。
  3. 通告(Advertisement)消息:用于创建、改变和删除FEC的标签映射,如Address消息、Label Mapping消息。
  4. 通知(Notification)消息:用于提供建议性的消息和差错通知。

LDP PDU报头格式:
在这里插入图片描述
LDP报文是基于TCP的(Hello报文基于UDP),端口号为646,并且报文格式是基于TLV的方式来封装的,LDP报文分为头部和报文内容两部分,LDP报头格式如图所示:
在这里插入图片描述
对其中的字段解释如下:

  1. Version:2Byte无符号整数值,表示 LDP协议版本号,目前LDP协议版本号为Ox01。
  2. PDU Length: 2Byte整数值,以字节为单位表示PDU长度,不包括版本号和PDU长度字段。PDU最大长度在会话初始化时协商确定,默认最大长度为4096Byte。
  3. LDP ldentifier: 6Byte,唯一标识 PDU所属发送LSR的标签空间。前4Byte表示LSR-ID地址,后2Byte指定LSR中的特定标签空间。

LDP报文格式如图所示:
在这里插入图片描述
对其中的字段解释如下:

  1. U: 1bit,未知 TLV bit,U=0返回通知,U=1忽略该报文。
  2. Message Type: 14bit,表示报文所属的类型。
  3. Message Length: 2Byte,以字节为单位表示报文长度,包括报文标识符、必选参数、可选参数等几部分。
  4. Message ID:报文标识符,4Byte,用于标识报文。
  5. 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个状态,状态之间的切换如下图所示:
在这里插入图片描述

  1. Non Existent状态:LDP协议的初始状态,类似BGP的IDLE状态。开始时双方用组播地址224.0.0.2发送Hello报文,并且选举主动方和被动方(LSR IP地址高的被选为主动方)。双方收到对方的Hello报文后,则开始建立TCP连接,接着是建立TCP连接三次握手的过程,当TCP会话建立成功后,双方进入到Initialized状态。
  2. Initialized 状态:该状态下主动方和被动方的工作有点不同。主动方先发送Initialization报文,随后便转入Opensent状态,并等待被动方回应Initialization报文。被动方在这个状态下会等待主动方发送Initialization报文过来,如果收到的Initialization 报文中的参数都能接受,会给主动方回应Initialization和 KeepAlive报文,随后便转入Openrec状态。主动方和被动方在该状态下收到非Initialization报文或等待超时都会跳转至Non Existent状态。
  3. Opensent 状态:这个状态是主动方发出 initialization报文后的状态,该状态下还会等待邻居的initialization和KeepAlive报文。如果收到的 initialization报文中的参数都能接受,则会向邻居回应KeepAlive报文,并且状态跳变至Openrec状态;如果参数不能接受或等待时间超时,则会断开TCP会话连接而进入到Non Existent状态。
  4. Openrec状态:不管是主动方还是被动方,在收到参数正确的initialization报文后都会转入此状态,并且在该状态下已经向对方回应了KeepAlive报文并等待着邻居回应KeepAlive报文。如果从邻居那边按时接收到了KeepAlive报文,则转入Operational状态;如果收到其他报文或等待时间超时,则转入Non Existent状态。
  5. Operational状态:到达此状态就意味着LDP会话已经建立成功,可以发送和交换所有其他的LDP报文了。在该状态下双方通过周期性KeepAlive报文交换来维护邻居会话,如果KeepAlive超时,则立刻断开LDP会话并进入Non Existent状态;当收到错误通知报文时,也会断开LDP会话并转入Non Existent状态。

LSP的建立与维护:

LSP的建立过程实际就是将FEC和标签进行绑定,并将这种绑定通告LSP上相邻LSR。这个过程是通过LDP实现的,以DU模式、有序标签控制方式为例,主要步骤如下:
在这里插入图片描述
如图所示拓扑,LDP动态建立LSP的过程如下:

  1. RTD上存在100.1.1.1/32的主机路由,因为RTD是Egress节点,所以直接向自己上游邻居RTC发布100.1.1.1/32与标签的绑定关系。
  2. 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分配的标签作为备用标签。
  3. RTB收到下游邻居RTC分配的100.1.1.1/32与标签的绑定关系后,执行与RTC相同的动作。
  4. 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会话时使用不同的定时器:

  1. Hello保持定时器:LDP对等体之间,通过周期性发送Hello消息表明自己希望继续维持这种邻接关系。如果Hello保持定时器超时仍没有收到新的Hello消息,则删除Hello邻接关系。
  2. Keepalive定时器:LDP对等体之间通过LDP会话连接上传送的Keepalive消息来维持LDP会话。如果会话保持定时器超时仍没有收到任何Keepalive消息,则关闭连接,结束LDP会话。

可以看出来Hello报文控制邻居关系,Keepalive控制会话关系。

LDP标签分发的基本规则:

LDP LSP的建立是通过接收下游设备为FEC(一般为一条路由表项)分配的标签,建立FEC与MPLS标签、出接口之间映射关系后完成的。所以要建立基于FEC的LSP,首先就要为对应FEC分配标签。标签的分配必须符合以下原则:

  1. 入标签的分配是按由大到小(最小值1024)的顺序分配的,分配当前未分配的最小标签。
  2. 同一链路下游设备为FEC分配的入标签一定要与上游设备的出标签对应。
  3. 在一台设备上针对同一FEC所接收的出标签可能有多个(它们之间可以相同,也可以不同),分别来自不同下游对等体,也就是一个FEC可以映射多个出标签和出接口。
  4. 在一台设备上针对同一FEC只会分配一个入标签,即对于入标签,每个FEC在同一设备上是唯一的。
  5. 在直接连接某FEC对于的网段(缺省仅为32位掩码的主机路由,可以使用lsp-trigger命令修改,后续笔记补充)的节点上会为该FEC仅创建一个包含入标签的LSP。此LSP并无出标签,也无出接口,因为这是此LSP隧道的终点。
  6. 在其他节点上都会对非直连网段FEC同时创建两个LSP:其中一个是用于指导从本地节点访问FEC所代表的目的主机的LSP,仅包括出标签和出接口;另一个则是以本地节点为中间节点(Transit)的LSP,用于指导上游设备访问FEC所代表的目的主机,同时包括入标签、出标签和出接口。

LDP的标签发布和管理:

一、标签的发布方式:
DU(Downstream Unsolicited,下游自主方式):对于一个到达同一目地址报文的分组,LSR无需从上游获得标签请求消息即可进行标签分配与分发。

DoD(Downstream on Demand,下游按需方式):对于一个到达同一目的地址报文的分组,LSR获得标签请求消息之后才进行标签分配与分发。
在这里插入图片描述
如图所示拓扑:

  1. 采用DU方式分发标签,对于目的地址为100.1.1.1/32的分组,下游RTD(Egress)通过标签映射消息主动向上游RTC(Transit)通告自己主机路由100.1.1.1/32的标签。
  2. 采用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方式:

  1. 如果标签发布方式为DU,且标签分配控制方式为Independent,则RTC(Transit)无需等待下游RTD(Egress)的标签,就会直接向上游RTB分发标签。
  2. 如果标签发布方式为DoD,且标签分配控制方式为Independent,则发送标签请求的RTB(Transit)的直连下游RTC(Transit)会直接回应标签,而不必等待来自下游RTD(Egress)的标签。

采用Ordered方式:

  1. 如果标签发布方式为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是自己的下一跳时才保留。
在这里插入图片描述
如图所示拓扑,当网络拓扑变化引起下一跳邻居改变时:

  1. 使用自由标签保持方式,LSR可以直接利用原来非下一跳邻居发来的标签,迅速重建LSP,但需要更多的内存和标签空间。
  2. 使用保守标签保持方式,LSR只保留来自下一跳邻居的标签,节省了内存和标签空间,但LSP的重建会比较慢。

华为设备默认采用自由标签保持方式保存标签。

目前华为设置支持如下组合方式:

  1. 下游自主方式(DU)+有序标签分配控制方式(Ordered)+自由标签保持方式(Liberal),该方式为默认方式。也就是LSR在收到下游标签映射后,可自主向上游分配标签,且收到的标签全保留。(灵活但是资源消耗较多)
  2. 下游按需方式(DoD)+有序标签分配控制方式(Ordered)+保守标签保持方式(Conservative)。即LSR在同时收到上游标签请求和下游标签映射后,才向上游分配标签,且只保留自己下一跳分配的标签。(消耗资源较少但不灵活)

整理资料来源:《HCIE路由交换学习指南》、华为HCIE培训资料

这篇关于LDP基础详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940870

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1