【干货】LDP:标签的那些事儿
上期我们学习了MPLS的原理,这期我们要学习MPLS的具体协议:LDP
LDP(Label Distribution Protocol):标签分发协议。
其实除了LDP之外,思科还有自己私有的标签分发协议(TDP标记分配协议),但是在思科设备上,默认使用的却是LDP,这是极少出现在思科设备上的一种行为,可见LDP的强大征服了思科。
上期所提到的一系列标签的操作都是由LDP完成的,LDP和我们常用的路由协议一样,都需要建立邻居,而其建立邻居需要依靠传输层,UDP和TCP都有用到,建邻居主要分为两个阶段,第一阶段:邻居发现阶段,基于UDP,第二阶段:会话建立阶段,基于TCP
第一阶段:邻居发现阶段
LDP通过UDP封装其hello报文(hello时间5s,超时时间15s),源IP为出接口IP,目的地址为224.0.0.2(代表所有路由器),源目的端口都是UDP 646端口。
在设备上可以使用show mpls ldp discovery查看LDP第一阶段的建立情况
其中Identity为身份标识,其实就是router-id,一般我们会将环回口设置为LDP的router-id,这是有原因的,这就和报文中最后一部分Transport Address传输地址有关了
默认情况下,LDP的传输地址会等于其router-id,这个传输地址是LDP建邻居第二阶段中TCP连接建立的源目的IP;既然需要在第二阶段建立TCP连接,所以LDP的router-id不像OSPF那样可以随便写了,必须保证其网络层的可达性;
在ID之后有一个”:0”,这个是对应报文中的Label Space标签空间,这部分在后面解释LDP的标签行为时会详细解释
其实第一阶段极其简单,主要目的是传递双方的传输地址,为第二阶段TCP连接做铺垫
第二阶段:会话建立阶段
第二阶段前期主要是完成TCP的三次握手,需要注意的是,TCP连接是传输地址较大的一端主动发起,主动发起方的端口是随机高端口,目的端口为TCP 646,不像第一阶段那样都是646了
使用show mpls ldp neighbor查看邻居建立情况
完成三次握手之后,开始传递LDP的Initialization Message初始化报文,互相传递结束后,则LDP邻居建立完成,开始互相传递每一个FEC(转发等价类,上期解释过)的标签,即其中的Label Mapping Message
咱们展开其中一个来仔细看一下里面有什么秘密
其实就是prefix和label,从图中可以看到prefix:1.1.1.1的label为0x00010,将其转换成10进制为16,在设备上使用show mpls ldp bindings可以看到也是16。
每台运行LDP的设备会对自己的每一个FEC分配本地标签,默认从16开始分配(0~15保留),然后通过LDP传递给邻居,邻居收到后将其存入远程标签中。
其中需要格外注意的是,如果FEC是自己本地的直连的话,则会分配一个保留的标签值(默认为3),比如下图中R2为自己的环回口2.2.2.2分配的标签值就是3,这是有特殊含义的,将该标签传递给邻居后,邻居在LFIB表中会显示远程标签为pop,用于实现倒数第二跳弹出(PHP,上期有详细解释),而在本地LIB中则会显示为imp-null(implication-null 隐含空)
下图为R1的LFIB(使用show mpls forwarding-table查看)
除了imp-null之外还有exp-null(explicit-null显式空),主要用在MPLS-TE(MPLS流量工程)中,原因是因为imp-null对应的pop会将顶层MPLS报头弹出,随着报头弹出也会将exp位的标识也弹出,导致流量工程无法延续,故在MPLS-TE中需要将这种默认行为修改,设置成exp-null(在全局使用mpls ldp explicit-null),这时在本地显示的local binding为exp-null,分配的标签值为0可以从报文和对端的LFIB中看得很清楚。
互相传递完标签后,LDP的任务就结束了,除非网络有新的变化,平时只保留轻量级的hello报文用于keepalive
小结:LDP为FIB中的每个条目分配本地标签,通过UDP传递彼此的传输地址,利用传输地址建立TCP连接,建立好TCP连接后交互彼此的标签,收到邻居传来的标签后,存入LIB,选择最优的放入LFIB
LDP的标签行为
LDP有两种模式:frame和cell,目前默认使用的是frame模式即帧模式
这关系到LDP的标签行为,主要是4个方面:标签的分配、标签的传递、标签的保存和标签空间
1、 标签分配:设备给FEC分配标签的行为
a) 独立控制模式
只要本地通过IGP学习到了路由前缀就可以立刻为这些前缀分配标签
b) 有序控制模式
本地通过IGP学到路由前缀后不能立刻分配标签,需要等待该前缀的下一跳设备分配完并且将标签传递给当前设备才可以为其分配标签
A---B---C
A产生一条192.168.1.0/24的路由传递给B,B传递给C,在独立控制模式中,ABC只要学到就可以立马分配标签;而在有序控制模式中,C如果要给192.168.1.0/24分配标签,必须等待B分配完标签并且传递给C,C才可以分配,而B需要等待A分配完标签并且传递给B,是有严格顺序的,所以叫有序控制模式
2、 分发模式:设备分配完标签后是如何传递给邻居的
a) 下游主动模式
在这个模式中,当前设备分配完标签后,不管邻居需不需要某条前缀的标签,都会一起传递给邻居
b) 下游按需模式
在这个模式中,设备分配完标签后,不会主动把所有标签传递给邻居,只有当邻居发出请求时,才会传递请求的前缀所对应的标签
3、 保留模式:邻居传递标签过来后,我是如何保存这些标签的
a) 自由模式
在这个模式中,设备会将所有邻居传递过来的所有标签都保存在LIB中,不管是否是最优的
b) 保守模式
在这个模式中,设备只会保存最优邻居的标签,其他标签都会被删除;这会导致如果网络出现抖动,IGP收敛之后,如果下一跳发生变化,就需要重新向邻居请求标签,导致LDP收敛较慢
4、 标签空间
a) 基于接口
在这个模式下,同一条前缀192.168.1.0/24,从不同的接口传递给邻居时的标签都是不一样的,这会导致每个接口都需要保存一个标签信息表,非常占用资源
b) 基于平台(前面查看邻居表里的:0就是基于平台的标签空间)
在这个模式下,同一条前缀不管从哪个接口传递出去,其标签值都是一样的,这样只需保存和维护一个标签信息表即可,大大节省资源。
而现在的LDP默认使用的为帧模式,帧模式在这4个标签行为中使用的分别是:独立控制、下游主动、自由模式和基于平台,都是较为合理的模式。
LDP的防环机制
LDP其实只有一个防环机制,就是报头中的TTL字段,当TTL为0时丢弃报文
之所以这个简单是因为LDP的标签是根据IGP学到的路由来进行分配的,只要这些路由不出现环路那么LDP分配的标签页不会出现环路,而IGP的路由防环机制已经非常健全了,所以LDP的防环就极其简单了
MPLS报头的TTL字段默认会复制IP报头的TTL,比如一个IP报文经过传递到达MPLS边界时,即将进入MPLS域,这时需要压入MPLS报头,那么MPLS报头中的TTL值会复制IP报头里的TTL值,在MPLS域中传递的时候,MPLS报头中的TTL值会逐条减一,IP的保持不变,这个动作称为TTL复制功能
TTL复制功能默认开启,但是会出现一些意外,如果在MPLS VPN网络中,客户传递过来的IP报文已经经过了很多跳,TTL值已经很小了,比如TTL=2,那么压入MPLS报头后,这个MPLS报头只能在MPLS域里传递1跳就会被丢弃,这是其中一个问题;另一个问题是由于MPLS报头中的TTL会延续IP的TTL递减规律,如果用户traceroute,则会获得完整的路径,这对运营商来说,内部网络结构是不想被客户知道的,这会导致一些安全问题,所以一般我们都会关闭TTL复制功能
如果关闭TTL复制功能,IP报文进入MPLS域时,不管IP报头的TTL是多少,MPLS的报头都会从255开始计数,用户在traceroute的时候就不会返回TTL递减的值,从而保护内部网络结构,唯一的问题是,如果MPLS域内部出现一些环路,这个报文会多传递几轮再丢弃,这是可以容忍的
关闭的方法:
全局下:no mpls ip propagate-ttl
MPLS的理论和LDP的详细内容我们就基本学习完毕了,其实MPLS一开始设计出来是为了加快报文转发的,这个问题我们在上期MPLS的文章里有说过,现在几乎没有速度上的优势了,在现网中MPLS一般也不会出现,都是配合MPLS VPN一起出现;但是MPLS在一个地方还是有不错的表现的,就是解决BGP的路由黑洞问题,下期给大家详细讲述如何用MPLS解决BGP的路由黑洞问题;
如图,R1、R2、R3运行OSPF,R1、R3建立IBGP邻居传递路由,R2不运行BGP,R4和R1建立EBGP邻居,R3和R5建立EBGP邻居,R4和R5各自宣告自己的环回口
BGP传递路由是基于TCP,可以做到跨设备传路由,这会导致中间没有运行BGP的设备没有路由,在传递数据时,中间不运行BGP的设备由于没有路由导致数据丢包,在CCNP中我们所了解的解决这个问题的方法有两个:
一、 所有设备都运行BGP,这样就都有路由了,但是问题是不是所有的设备都支持BGP,以及设备性能允不允许接收BGP的大量路由,所以不是一个完美的方案
二、 将BGP重分布进IGP,这也会出现问题,BGP通常是用来传递大量路由条目,如果将上万条路由重分布灌入IGP,会导致IGP算法崩溃,也不是一个完美的解决方案
在现网中一般是使用MPLS去解决BGP的路由黑洞问题,感兴趣的同学可以先自己用上面两个方法去做一下实验看看
MPLS的配置:
ip cef(默认,可不敲)
mpls label protocol ldp(默认,可不敲)
mpls ldp router-id loopback 0 (一般都指定为环回口,必敲)
mpls label range xxx xxx(制定标签分配的范围,可选)
接口下:mpls ip
在需要建立LDP邻居的接口下敲上mpls ip即可,比如上图BGP路由黑洞问题实验中,只需在R1和R2的F0/0以及R2和R3的F0/1接口下敲上mpls ip即可,具体原理和细节下期讲解