MPLS LDP:标签分发协议

定义

  • 是MPLS的控制协议,类似于传统网络中的信令协议,负责FEC分类、标签分发以及LSP的建立和维护等一系列操作

MPLS可以使用多种标签分发协议

  1. LDP
  2. MP-BGP
  3. RSVP-TE

LDP的工作原理

  1. 发送hello报文发现邻居
  2. 建立TCP连接,基于TCP连接交互LDP会话消息,建立LDP会话
  3. 基于LDP会话交互标签分配信息,建立和维护LSP

术语解释

  • 邻接体:交互hello报文后,邻接体关系建立成功
  • 对等体:交互LDP会话消息后,LDP对等体关系建立成功
  • LSR ID:4B,在MPLS域中唯一标识一台运行了MPLS的路由器,通常采用loopback口地址(稳定)
  • LDP ID:6B,标识一台运行了LDP协议的LSR,由32bit的LSR id和16bit的label space id(标签空间标识符)组成
  • 表示形式:LSR ID:label space id
  • label space id
  • 决定本设备的入标签空间如何分配,是基于平台还是基于接口
  1. 基于平台(设备)标签空间:取值为0
  • 标签分配时不是在每个接口为唯一,对于同一条FEC从不同接口发布出去时,分配相同的标签
  • 帧模式下使用
  • 缺省情况下使用该模式,本课程也只是用该模式
  1. 基于接口标签空间:取值为非0
  • 每个接口通告的标签是唯一的,LSR为同一条FEC在不同接口通告的标签是不同的,极小概率会出现相同的情况
  • 信元模式下使用(如cell协议)

LDP报文格式

Ethernet-II头部

IP头

UDP/TCP头

LDP头部

LDP消息

  • LDP头部参数
  1. version:2B,版本号,此处为1
  2. PDU length:2B,表示除了LDP头部信息以外的LDP消息的长度
  3. LDP id:6B,用来标识LDP路由器,由LSR id和label space id组成
  • LDP消息报文参数
  1. u:1bit,unkno message,标识LDP路由器对于未知类型的LDP消息的处理方式
  • u=1时,对发送者发送通知报文
  • u=0时,忽略且不发送通知报文
  1. message length:2B,表示携带的参数的长度
  2. message id:4B,标识LDP报文
  3. mandatory parameters:可变长度的必须携带的参数
  4. optional parameters:可变长度的可选参数
  5. message type:2B,消息类型
  • 根据报文功能分类
  1. 发现报文
  • hello:用于邻居发现机制
  • 参数
  • lsr-id:本MPLS路由器的标识
  • label space id:当前必为0,表示基于平台标签空间
  • hello hold time(死亡间隔):15s
  • target hello
  • 基本发现机制取值为0
  • 扩展发现机制取值为1
  • transport address:传输地址
  • 用于建立TCP连接的IP地址,默认为lsr-id
  • 注意:配置时需要保证传输地址可达,否则TCP无法建立

两种发现机制

  1. 基于发现机制
  • 用于发现直连的LSR,通过周期发送hello消息,建立本地LDP邻接关系,采用UDP封装,目的端口号646,目的IP地址224.0.0.2.如果LSR在特定接口接收到LDP hello消息,则表明该接口存在LDP对等体
  • hello间隔:5s
  • hello死亡间隔:15s
  1. 扩展发现机制
  • 用于发现非直连的LSR,周期发送LDP target hello消息,建立远端的LDP会话,采用UDP封装,端口号646,目的地址为指定的IP地址。如果LSR接收到target hello消息,则认为粗在LDP对等体
  • hello间隔:15s
  • hello死亡间隔:45s

会话报文

  • initialization:初始化报文,用于协商建立会话参数
  • keepalive:表示协商成功和用于周期性维护TCP会话连接

通告报文

  • address:用来宣告接口IP地址
  • address withdraw:用来撤销接口IP地址
  • label mapping:用来通告FEC和标签的映射关系
  • label request:用来请求FEC和标签的映射关系
  • label abort request:用来终止未完成的标签请求
  • label withdraw:用来插销FEC和标签的映射关系
  • label release:用来释放标签

差错报文

  • notification:通知LDP对等体错误信息
总结
  • 此处除了hello报文使用UDP封装,实现邻居的快速发现
  • 其他LDP报文都采用TCP封装,为了标签信息交互的可靠性

LDP的状态机

  1. non-existent:LDP最初状态
  • 在该状态下发送hello报文,建立TCP连接
  1. initialized:感知到TCP建立完成,进入该状态。传输地址大的一方成为主动方,主动方发送初始报文,用于协商参数(LDP协议版本、标签分发方式、keepalive定时器、最大的PDU长度、标签空间ID等)
  2. opensent:发送初始化报文后进入该状态
  3. openrec:当接收到初始化报文且认同携带的参数,发送keepalive报文后进入该状态
  4. operational:接收到keepalive报文后进入该状态,表示LDP会话建立完成,在该状态下才可以交互LDP其他报文

LDP会话建立过程

  • non-existent状态下
  1. 两台LSR之间互相发送hello报文触发LDP会话建立
  1. hello携带传输地址,用于建立TCP连接
  2. 传输地址大的一方作为主动发,主动发起TCP连接
  1. TCP连接建立完成后,进入initialized状态,由主动方主动发送初始化报文,协商建立LDP会话的相关参数,进入opensent状态
  2. 被动方接收到初始化报文后,如果接受相关参数,则恢复keepalive报文,同时发送自己的初始化报文,状态置为openrec;如果不接受参数,则发送notification报文,终止LDP会话的建立
  3. 主动方接收到被动方发送的初始化报文后
  • 如果接收则回复keepalve报文,状态置为openrec
  • 如果不接收则回复notification报文,终止LDP会话建立
  1. 当双方都收到对方的keepalive报文后,LDP会话建立完成,状态置为operational
  • 计时器
  • hello间隔
  • 基本:5s
  • 扩展:15s
  • hello死亡间隔
  • 基本:15s
  • 扩展:45s
  • keepalive:用于维护LDP会话和TCP连接
  • 发送间隔:15s
  • 死亡间隔:45s

上游和下游

  • MPLS根据数据传输的方向确定上游设备和下游设备
  • 上游:数据的起源方向的设备
  • 下游:数据目的方向的设备
  • 对于同一FEC,下游设备分配的入标签会作为上游设备的出标签

分配和发布

  • 分配
  • 运行了LDP的LSR从自身的标签空间中为FEC提取出一个空闲的标签,形成映射关系
  • 发布
  • 将自己为FEC分配好的标签映射信息形成映射表项通过label mapping消息通告给LDP对等体(上游设备)

★标签的发布和管理

  • 标签的发布和管理由标签的发布方式、标签的分配管理方式和标签的保持方式决定
  1. 标签的发布方式
  1. 下游自主方式:DU,华为默认的发布方式
  • 对于—特定FEC,下游设备无需等待上游设备的label request报文,主动将FEC和标签的映射信息通过label mapping消息通告给上游设备
  1. 下游按需方式:DOD,downstream on demand
  • 对于—特定FEC,由上游设备向下游设备发送标签请求消息(label request),下游设备接收到后才会向上游设备发送标签映射消息(label mapping)
  • label request消息由对特定FEC的访问需求触发
  1. 标签的分配管理方式
  1. 独立模式:independent
  • 对于一特定FEC,LSR在没有接收到下游设备给自己发送的标签映射信息的情况下,独立完成标签的分配
  1. 有序模式:order,华为默认
  • 对于一特定FEC。LSR只有在接收到下游设备发布的标签映射信息后本设备才会为该FEC分配标签
  1. 标签的保持方式
  1. 自由保持方式:liberal,华为默认
  • 所有下游设备通告给本设备的标签映射信息,本设备都会接收并保持在LIB表中
  • 优点
  • 当IP路由收敛或下一跳改变时,减少LSP的收敛时间
  • 缺点
  • 占用更多的设备内存资源和标签空间
  1. 保守保持方式:conservative
  • 只保留下一跳对等体给本设备发送的标签映射信息
  • 优点
  • 节约内存资源和标签空间
  • 缺点
  • 当IP路由收敛或者下一跳改变时,LSP收敛时间变慢,需要发送标签请求报文,重新建立LSP
  1. 缺省情况下
  • 如果发布方式为DU,那么保持方式为自由
  • 如果发布方式为DOD,那么保持方式为保守
  • 总结
  • 华为设备默认,DU+ordered+liberal
  • 注意
  • LDP缺省情况下只为32位主机路由分配标签,如果想要为所有的IGP路由和静态路由分标签,可以通过手工配置实现,命令如下
lsp-trigger all
//不建议开启,一旦开启,需要占用更多的内存和消耗更多的标签空间

MPLS数据转发的过程

  • 当IP报文进入MPLS域中
  1. ingress:入节点接收到IP报文后,先查FIB表项,找到对应的tunnel id
  • 如果tunnel id为非0,查LFIB表项进行标签压入操作,形成MPLS报文并转发
  • 如果tunnel为全0,则IP转发
  1. transit:中转节点收到MPLS报文后,查找LFIB表对应的表项,执行swap动作,重新封装成MPLS报文并转发
  2. egress:出节点接收到MPLS报文后,先查LFIB表项,找到对应表项发现出标签为null,则执行pop动作,清除标签,再查FIB表,进行IP转发
  • 问题
  • 在出节点上,需要查两次表项,对出节点造成负担
  • 解决方法
  • 采用PHP特性减轻出节点的工作压力
  • PHP:次末跳弹出
  • 由于最后一跳LDP设备收到MPLS报文后,需要先查LFIB再查FIB,执行的工作过多,造成最后一跳路由器压力过大,可能影响业务转发效率,于是通过次末跳弹出缓解最后一跳LSR的压力
  • 实现原理
  • 最后一跳LSR产生标签值为3的标签,将其通告给次末跳设备,当次末跳设备发现标签为3时,执行标签弹出的动作

隐式空标签:3,默认通告

  • 当LSR发现出标签是3时,直接执行弹出动作
  • 导致的问题
  • 在部署了QOS的场景中,标签弹出会导致丢失标签信息中的EXP(优先级)字段
  • 解决的方法:
  • 使用显示空标签
  • 0:IPv4路由
  • 2:IPv6路由
  • 当次末跳设备发现出标签为0/2时,正常封装成MPLS报文转发给最后一跳LSR
  • 当出节点接收到MPLS报文中携带的标签为0/2时,无需查找LFIB表,直接执行弹出动作,因此既减轻了最后一跳LSR的压力,也不会因为次末跳弹出导致QOS信息丢失

MPLS防环机制

  1. 控制平面防环
  • IGP防环
  1. 转发平面
  • TTL防环,有两种模式:uniform模式和pipe模式
  1. uniform:统一模式
  • 当IP报文进入MPLS域时,将TTL值减1并粘贴仅MPLS头部中
  • 在MPLS域中转发时,MPLS头部中的TTL值递减,IP头部中的TTL不减
  • 当MPLS报文离开MPLS域时,MPLS头部中的TTL值减1并粘贴仅IP头部中
  • 优点:便于排障
  • 缺点:安全性低
  1. pipe模式:隧道模式
  • 当IP报文进入MPLS域时,将TTL减1并粘贴仅MPLS头部中
  • 在MPLS域中转发时,MPLS头部中的TTL递减,IP头部中的TTL值不减
  • 当MPLS报文离开MPLS域时,不会将MPLS头部中的TTL值粘贴到IP头部中,之江IP头部中的TTL值减1再转发
  • 优点:安全性高
  • 缺点:不易于排障

MPLS LDP的配置步骤

  1. 配置IGP,保证全网IGP可达
  2. 配置MPLS lsr-id,确保lsr-id唯一且全域IGP可达
  3. 全局使能MPLS
  4. 全局使能MPLS LDP
  5. 接口上使能MPLS
  6. 接口使能MPLS LDP

查看命令

dis mpls ldp lsp//查看LDP的LIB
dis mpls lsp//查看MPLS的LFIB
dis mplp ldp session//查看MPLS LDP会话信息
在接口视图下指定传输地址
	mpls ldp transport-address g/lo 0/null/int
		g:指定一个物理接口IP地址为传输地址
		lo 0:指定传输地址为换回测试接口IP地址
		null:指定传输地址为空
		int:指定传输地址为本接口IP地址
在接口视图下指定标签发布方式,默认为DU
	mpls ldp adverti DU\DOD
配置扩展邻居发现机制,建立远程LDP会话
	系统视图下配置
		mpls ldp rempte-peer name
			//创建远端对等体视图并命名
		remote-ip 1.1.1.1
			//指定远端对等体的传输地址为1.1.1.1(hello报文的目的IP地址)
	检测LSP转发路径的连通性
		ping lsp ip 目的地址 掩码(FEC)
		ping lsp ip 6.6.6.6 32