LDP:标签分发协议 指动态分发
LDP协议
基于TLV架构
LDP负责FEC的分类、标签的分配以及LSP的建立和维护等操作。
LDP的工作过程:
- LSR之间建立LDP的会话
- LSR之间基于LDP会话动态交换标签与FEC的映射信息,根据信息建立LSP。
LDP会话分为:
本地LDP会话:LSR之间是直连的
远端LDP会话:LSR之间可以是直连的,也可以是非直连的
两台LSR之间交互了Hello消息之后,代表建立邻接体关系。建立了邻接体关系,并交互了LDP会话消息后,表示建立了LDP会话,两台设备之间形成LDP对等体关系。
LSR ID与LDP ID
LDP ID=LSR ID+空间标识符构成
例:
LSR ID:1.1.1.1 32bit
LDP ID:1.1.1.1:0 32bit+16bit
空间标识符的两种形态:
- 值为0:表示基于设备的标签空间
- 值非0:表示基于接口的标签空间
基于设备分配标签就是,一台设备使用了某个标签,就不能再继续使用了
基于接口分配标签就是,一个接口使用了某个标签,其他接口依然可以使用
例:
基于设备:R1的1号接口使用了0-1024标签,那么这些标签已经被使用了,其他接口就不能继续使用;
基于接口:R1的1号接口使用了0-1024标签,但只是这个接口使用过了,其他接口依然可以继续使用。
LDP消息
LDP消息分为四大类,发现消息、会话消息、通告消息、通知消息(错误)。
发现消息使用UDP,其他消息都使用TCP。UDP发现邻居,TCP建立邻居。
LDP会话的建立
1、LDP Hello发现邻居
使用LDP Hello报文发现邻居,使用物理接口地址向组播地址224.0.0.2发送Hello报文(源目端口都是646);
2、建立TCP连接
交互完LDP Hello报文后,进行主从选举,使用传输地址较大的一方作为主动方,发起TCP连接。(此时的源目地址都是传输地址,源端口是随机,目的端口是646)
3、协商参数
建立完TCP连接后,主动方发送LDP 初始化报文(init),协商LDP会话参数,被动方收到之后回应keepalive+init报文,主动方收到后,若接受该参数,则回复keepalive报文,此时会话建立成功。
4、标签映射
LDP对等体建立完成之后,使用标签映射报文相互通告标签映射。
建立成功之后,使用LDP Hello报文保活,每5秒发送一次,15秒没发送就down掉。
LDP标签分发
标签的发布和管理:
标签发布方式(产生标签):DU模式
下游自主方式:只要有这条路由,就可以在本地产生in方向的标签。 默认使用
下游按需方式:必须收到标签请求消息,才会产生标签。
标签分配控制方式(传输标签):
独立方式:本地LSR可以自主分配标签,发给上游,不用等待下游的标签。
有序方式:只有LSR具有下一跳的标签时,才可以向上游发送标签。默认使用
标签保持方式(保存标签):
自由方式:只要收到了标签,就会保留。 默认使用
保守方式:只有当邻居LSR是自己的下一跳发来的标签,才会保留。
PHP特性 ---次末跳弹出
隐式空标签:
在LSP的最后一跳节点,已不需要再进行标签交换。此时,可以配置倒数第二跳弹出特性PHP(Penultimate Hop Popping),在倒数第二跳节点处将标签弹出,最后一跳节点直接进行IP转发或者下一层标签转发,减少最后一跳标签交换的负担。
egress节点为本地路由分配标签的时候,会分配一个特殊标签 -3,称为隐式空标签。当LSR转发标签报文时,发现出标签为3的时候,会把标签头部弹出,只剩下了IP报文,转发给egress节点,egress节点就可以直接查询fib表转发出去了。
显式空标签: label advertise explicit-null
由于PHP特性默认存在,如果在部署QOS的场景下,MPLS路由器还需要通过标签中的EXP位获取QOS的信息,所以引入了显式空标签(值为0),当最后一跳路由器收到带有标签0的报文后,可直接读取标签中的QOS信息,读完之后直接移除标签,然后再直接通过fib表转发。
Egress分配的标签类型决定了倒数第二跳转发带标签报文的方式:
· 如果分配的是隐式空标签,则倒数第二跳根据标签找到下一跳转发信息后,直接弹出标签。
· 如果分配的是显式空标签,则倒数第二跳将标签值替换为显式空标签。
· 如果分配的是非空标签,则倒数第二跳将标签值替换为Egress分配的标签值。
隐式空标签:取值为3。当一个LSR发现下游LSR通告的标签为隐式空标签时,它并不用这个值替代栈顶原来的标签,而是直接弹出标签,并将报文转发给下游LSR(即Egress)。Egress接收到报文后,直接进行下一层的转发处理。
显式空标签:取值为0或2。0用于IPv4网络;2用于IPv6网络。在某些情况下,Egress需要根据标签栈中的TC等信息决定QoS策略,此时利用显式空标签就可以在保留标签栈信息的同时,简化Egress节点的转发处理。Egress为FEC分配显式空标签并通告给上游LSR后,上游LSR用这个值替代栈顶原来的标签,并将报文转发给下游LSR(即Egress)。Egress收到标签值为0或2的报文时,不会查找标签转发表,从标签中获取TC等信息后,直接弹出标签栈,进行下一层的转发处理。
总结:
隐式空标签:次末跳弹出默认存在,最后节点路由器给上游分配3号标签,当上游路由器转发时,发现出标签是3,就会弹出标签头部(通过swap弹出),变成IP报文,发给最后一跳路由。次末跳弹出丢失了EXP位,所以无法部署QOS;
显式空标签,最后节点路由器会向倒数第二跳分配0号标签,所以到最后一跳路由器时,可以通过该标签获取QOS信息,同时又因为是0号标签,所以不用查标签转发表,直接丢弃掉0号标签,再去查ip路由表转发。
隐式空标签在倒数第二跳就已经弹掉了标签,而显式空标签在最后一跳弹出标签。
BGP路由黑洞问题
在这张拓扑图上,R1-R2-R3底层使用OSPF打通,然后建立MPLS LDP,R1-R3又互为IBGP邻居。
同时,R1有个loopback10地址:10.1.1.1/32;R3有个loopback10地址:10.3.3.3/32。在R1和R3上分别使用BGP进行network
由于R2没有建立BGP,在R1去访问R3时间,在R2上会出现路由黑洞,丢弃数据包。
要求如下:10.1.1.1/32去访问10.3.3.3/32时,走MPLS隧道,而不使用IGP进行宣告,同时解决了BGP的路由黑洞问题。
可以在R1和R3上分别使用route recursive-lookup tunnel该命令,可将10.1.1.1-->10.3.3.3的流量引到MPLS中,从而使流量走隧道路径。
实现原理:由于R1和R3互为IBGP邻居,所以在R1的BGP路由表中,会有10.3.3.3的路由,下一跳指向R3,在R1去访问10.3.3.3时,R1查看FIB表,隧道ID为0,从而走IP路径,但由于到达R2时,R2没有这条路由,将数据包丢弃,由此可见走IP路径失败。但是R1与R3之间是有一条隧道的,在他们的BGP路由表的下一跳又互相指向对方,所以可借助R1和R3之间的隧道,将该流量引入到MPLS隧道中,从而实现10.1.1.1-->10.3.3.3走标签路径。
缺省情况下,非标签公网BGP路由、静态路由只能迭代到出接口和下一跳,不会迭代到隧道。可以通过配置此命令使上述路由优先迭代到隧道,如果没有隧道,上述路由也可以迭代到出接口和下一跳。