作者:https://blog.51cto.com/361531/1693692
01-MPLS标签报文的格式.
实际上,之所以要叫MPLS 为2.5层协议,是因为标签是处于IP报文头和二层报头之间的.图中是嵌套了三层标签.
靠近二层头的标签叫顶部,考近IP报文头的标签叫底部.
如果有多个标签,数据报文在被转发的时候是利用顶部标签进行转发.当顶部移除以后,再利用下一层标签进行转发.
而每个标签的格式为:
每个标签为32 bit(4个字节). 分为4个字段,每个字段都有分工.
LABEL: 头20个bit,是标签范围.cisco定义的标签的是<16-1048575>.
0-15是保留为系统用.
EXP: 3 bit. 用于IP precedence字段值的携带,用于QOS. 范围0-7.
S: 1 bit, 为了标示该标签是否为最后一个标签再IP头中.
前面已经说明,最靠近二层帧头的,那么最先被转发。最靠近IP包头的,最后被转发使用.
S bit就是提供了这样一个功能.
S=1, 栈底. S=0,非栈底.从下面的抓包也能看到,S=0的话,靠近二层帧头,S=1,靠近3层IP报文头.
TTL: 8 bit, 范围0-255,这个定义和IP里面的time to live是一样的。
和IP不同的是,MPLS的TTL,
有可能初始化的时候就是255.
也有可能是从IP包头中直接复制过来的.
下面是一个MPLS报文的抓包.可以看到这里嵌套了2层标签.
02-LDP协议的作用
LDP-label distribute protocol.
标签分发协议,前身是TDP.cisco私有.
----------一直都在说, LDP标签分发,必须基于IGP(ospf,RIP,EIGRP),因为标签分发表,其实就是IGP路由表的一个映射.所以必须现有IGP,才会有标签转发表.
路由表与标签之间存在的映射关系-----FEC.
LDP要工作,必须要有底层的IGP.
CISCO的行为是,IGP路由表里面每一条路由,都会有一个对应的标签存在于标签转发表.
03-MPLS 标签报文转发过程的相关动作
下面的图,R1--R2--R3--R4为MPLS域,左边和右边都为IP域.
在IP域中数据包是没有携带标签的。而在MPLS域中数据包是携带了标签的.
接下来说明一下一个数据包从左到右的过程:IP:A-->R1-->R2-->R3-->R4-->IP:B
需要说明的是,本地收到的标签,始终是上游或者下游路由器分配过来的。
这样说吧,如果本地路由器有一个路由明细达到1.1.1.0/24. 那么从对端就会逐跳向我本端分配相关的标签.所以,标签永远是别人发给我的。我把本地的直连路由映射成本地标签,再分发给我的上下游路由器。那么,一个双向的标签FEC就建立好了。
04-数据平面和控制平面.
这是理解MPLS转发的重要基础.
Control plane:控制平面.
简单来说,就是凡是处理协议,路由表,标签交换表,这些内部表项和协议的时候都是用的控制平面.
Data plane:数据平面.
而数据平面,意思是说,IP转发,标签转发报文的时候,会用数据平面。
对于数据平面的理解如下:
这里,有几种情况组合:
1, 收到IP,转发出以后依然是IP.是纯IP报文转发,那么用的是FIB表项.(CISCO的CEF表)
2, 收到MPLS 报文,转发出去依然是MPLS 报文,走的是LFIB.标签转发表.
3, 有可能收到IP报文,但是需要路由器压标签转发. 那么依然走FIB(CEF)表---所以为什么CEF标是会携带标签的.
4, 收到MPLS 报文, 转出是IP报文,这种情况用于次莫节点弹出,input走LFIB表,output会使用FIB(CEF)表.
关于cisco的流程:
之前我一直都不知道为什么CEF表会有标签.经过和老师确认,设计的确实很有道理.
如果接收到一个IP报文,转出去的时候是MPLS标签报文。这个时候首先路由器收到以后会查CEF表,cisco会将LFIB中需要压入标签的条目,将标签复制到CEF表中,这样收到IP报文,只需要查一次CEF表就知道应该压入哪个标签进行转发,而不是说首先查CEF表,知道了需要压标签,但是CEF表中又没有标签,从而进一步查询LFIB表,查两次表项和查一次表项,对于节约路由器的性能资源的意义是完全不一样的。
连老师总结版:
LIB------show mpls ldp binding 查看LIB表项.
FIB------show ip cef detail 查看FIB.注意,一定要加上detail,否则不能看到label的分发情况.
LFIB-----show mpls forwarding table.
在故障排查的时候.外层标签交换,查的一定是mpls forwarding table(LFIB表)
比如.R1-----R2----R3----R4.
R1将mpls 报文转给R2,R2要查的就是LFIB.如果LFIB(mpls forwarding table)没有标签,这个时候,根据两个层面的映射原理,你需要查看LIB表(show mpls ldp binding),在那里面会有原因为什么R2的mpls forwarding table没有分发标签.
例如,大家都知道,LDP的tranport ID是会用loopback来做的.如果IGP是OSPF.不管你环回口配置为32位掩码,还是24位掩码,ospf都会将其通告为32位掩码出去(除非修改ip ospf network point-to-point)才会通告真实掩码.
这个时候,本地是24位掩码,通告到对端是32位。上游路由器为本端的32位分发标签.明显是错的.因为24位掩码的没有得到标签,而32位的得到了。转发的时候,mpls forwarding table一定有问题.因为LFIB是基于LIB建立的,所以最后一定得查LIB才能找初真实的原因.
将3个路由器的环回口掩码都修改为24位的.
然后在R2上面,看到3.3.3.3的标签是:
这个时候,R2上面,3.3.3.3的outgoing不是pop label.是no-label.
然后再show LIB表,根本就没有标签,正常的情况下,对端R3应该分配一个implit-label过来.问题就已经出来了.
这就是传的32位路由,分的是32位路由。没有对24位路由分配标签.
原因在于,R3上面,对自己的3.3.3.3分了implit-null,24位的标签. 到R2就变成32位的标签了。已经错位了.
方案:
1, 建议环回都是用loopback /32的掩码.
2, 要不在loop interface下面加上ip ospf network point-to-point.