MPLS LDP:标签分发协议
定义
- 是MPLS的控制协议,类似于传统网络中的信令协议,负责FEC分类、标签分发以及LSP的建立和维护等一系列操作
MPLS可以使用多种标签分发协议
- LDP
- MP-BGP
- RSVP-TE
LDP的工作原理
- 发送hello报文发现邻居
- 建立TCP连接,基于TCP连接交互LDP会话消息,建立LDP会话
- 基于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
- 决定本设备的入标签空间如何分配,是基于平台还是基于接口
- 基于平台(设备)标签空间:取值为0
- 标签分配时不是在每个接口为唯一,对于同一条FEC从不同接口发布出去时,分配相同的标签
- 帧模式下使用
- 缺省情况下使用该模式,本课程也只是用该模式
- 基于接口标签空间:取值为非0
- 每个接口通告的标签是唯一的,LSR为同一条FEC在不同接口通告的标签是不同的,极小概率会出现相同的情况
- 信元模式下使用(如cell协议)
LDP报文格式
Ethernet-II头部 | IP头 | UDP/TCP头 | LDP头部 | LDP消息 |
- LDP头部参数
- version:2B,版本号,此处为1
- PDU length:2B,表示除了LDP头部信息以外的LDP消息的长度
- LDP id:6B,用来标识LDP路由器,由LSR id和label space id组成
- LDP消息报文参数
- u:1bit,unkno message,标识LDP路由器对于未知类型的LDP消息的处理方式
- u=1时,对发送者发送通知报文
- u=0时,忽略且不发送通知报文
- message length:2B,表示携带的参数的长度
- message id:4B,标识LDP报文
- mandatory parameters:可变长度的必须携带的参数
- optional parameters:可变长度的可选参数
- message type:2B,消息类型
- 根据报文功能分类
- 发现报文
- hello:用于邻居发现机制
- 参数
- lsr-id:本MPLS路由器的标识
- label space id:当前必为0,表示基于平台标签空间
- hello hold time(死亡间隔):15s
- target hello
- 基本发现机制取值为0
- 扩展发现机制取值为1
- transport address:传输地址
- 用于建立TCP连接的IP地址,默认为lsr-id
- 注意:配置时需要保证传输地址可达,否则TCP无法建立
两种发现机制
- 基于发现机制
- 用于发现直连的LSR,通过周期发送hello消息,建立本地LDP邻接关系,采用UDP封装,目的端口号646,目的IP地址224.0.0.2.如果LSR在特定接口接收到LDP hello消息,则表明该接口存在LDP对等体
- hello间隔:5s
- hello死亡间隔:15s
- 扩展发现机制
- 用于发现非直连的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的状态机
- non-existent:LDP最初状态
- 在该状态下发送hello报文,建立TCP连接
- initialized:感知到TCP建立完成,进入该状态。传输地址大的一方成为主动方,主动方发送初始报文,用于协商参数(LDP协议版本、标签分发方式、keepalive定时器、最大的PDU长度、标签空间ID等)
- opensent:发送初始化报文后进入该状态
- openrec:当接收到初始化报文且认同携带的参数,发送keepalive报文后进入该状态
- operational:接收到keepalive报文后进入该状态,表示LDP会话建立完成,在该状态下才可以交互LDP其他报文
LDP会话建立过程
- non-existent状态下
- 两台LSR之间互相发送hello报文触发LDP会话建立
- hello携带传输地址,用于建立TCP连接
- 传输地址大的一方作为主动发,主动发起TCP连接
- TCP连接建立完成后,进入initialized状态,由主动方主动发送初始化报文,协商建立LDP会话的相关参数,进入opensent状态
- 被动方接收到初始化报文后,如果接受相关参数,则恢复keepalive报文,同时发送自己的初始化报文,状态置为openrec;如果不接受参数,则发送notification报文,终止LDP会话的建立
- 主动方接收到被动方发送的初始化报文后
- 如果接收则回复keepalve报文,状态置为openrec
- 如果不接收则回复notification报文,终止LDP会话建立
- 当双方都收到对方的keepalive报文后,LDP会话建立完成,状态置为operational
- 计时器
- hello间隔
- 基本:5s
- 扩展:15s
- hello死亡间隔
- 基本:15s
- 扩展:45s
- keepalive:用于维护LDP会话和TCP连接
- 发送间隔:15s
- 死亡间隔:45s
上游和下游
- MPLS根据数据传输的方向确定上游设备和下游设备
- 上游:数据的起源方向的设备
- 下游:数据目的方向的设备
- 对于同一FEC,下游设备分配的入标签会作为上游设备的出标签
分配和发布
- 分配
- 运行了LDP的LSR从自身的标签空间中为FEC提取出一个空闲的标签,形成映射关系
- 发布
- 将自己为FEC分配好的标签映射信息形成映射表项通过label mapping消息通告给LDP对等体(上游设备)
★标签的发布和管理
- 标签的发布和管理由标签的发布方式、标签的分配管理方式和标签的保持方式决定
- 标签的发布方式
- 下游自主方式:DU,华为默认的发布方式
- 对于—特定FEC,下游设备无需等待上游设备的label request报文,主动将FEC和标签的映射信息通过label mapping消息通告给上游设备
- 下游按需方式:DOD,downstream on demand
- 对于—特定FEC,由上游设备向下游设备发送标签请求消息(label request),下游设备接收到后才会向上游设备发送标签映射消息(label mapping)
- label request消息由对特定FEC的访问需求触发
- 标签的分配管理方式
- 独立模式:independent
- 对于一特定FEC,LSR在没有接收到下游设备给自己发送的标签映射信息的情况下,独立完成标签的分配
- 有序模式:order,华为默认
- 对于一特定FEC。LSR只有在接收到下游设备发布的标签映射信息后本设备才会为该FEC分配标签
- 标签的保持方式
- 自由保持方式:liberal,华为默认
- 所有下游设备通告给本设备的标签映射信息,本设备都会接收并保持在LIB表中
- 优点
- 当IP路由收敛或下一跳改变时,减少LSP的收敛时间
- 缺点
- 占用更多的设备内存资源和标签空间
- 保守保持方式:conservative
- 只保留下一跳对等体给本设备发送的标签映射信息
- 优点
- 节约内存资源和标签空间
- 缺点
- 当IP路由收敛或者下一跳改变时,LSP收敛时间变慢,需要发送标签请求报文,重新建立LSP
- 缺省情况下
- 如果发布方式为DU,那么保持方式为自由
- 如果发布方式为DOD,那么保持方式为保守
- 总结
- 华为设备默认,DU+ordered+liberal
- 注意
- LDP缺省情况下只为32位主机路由分配标签,如果想要为所有的IGP路由和静态路由分标签,可以通过手工配置实现,命令如下
lsp-trigger all
//不建议开启,一旦开启,需要占用更多的内存和消耗更多的标签空间
MPLS数据转发的过程
- 当IP报文进入MPLS域中
- ingress:入节点接收到IP报文后,先查FIB表项,找到对应的tunnel id
- 如果tunnel id为非0,查LFIB表项进行标签压入操作,形成MPLS报文并转发
- 如果tunnel为全0,则IP转发
- transit:中转节点收到MPLS报文后,查找LFIB表对应的表项,执行swap动作,重新封装成MPLS报文并转发
- 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防环机制
- 控制平面防环
- IGP防环
- 转发平面
- TTL防环,有两种模式:uniform模式和pipe模式
- uniform:统一模式
- 当IP报文进入MPLS域时,将TTL值减1并粘贴仅MPLS头部中
- 在MPLS域中转发时,MPLS头部中的TTL值递减,IP头部中的TTL不减
- 当MPLS报文离开MPLS域时,MPLS头部中的TTL值减1并粘贴仅IP头部中
- 优点:便于排障
- 缺点:安全性低
- pipe模式:隧道模式
- 当IP报文进入MPLS域时,将TTL减1并粘贴仅MPLS头部中
- 在MPLS域中转发时,MPLS头部中的TTL递减,IP头部中的TTL值不减
- 当MPLS报文离开MPLS域时,不会将MPLS头部中的TTL值粘贴到IP头部中,之江IP头部中的TTL值减1再转发
- 优点:安全性高
- 缺点:不易于排障
MPLS LDP的配置步骤
- 配置IGP,保证全网IGP可达
- 配置MPLS lsr-id,确保lsr-id唯一且全域IGP可达
- 全局使能MPLS
- 全局使能MPLS LDP
- 接口上使能MPLS
- 接口使能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