Technorati 标签: MPLS,LDP,标签,labelide
01-MPLS标签报文的格式.oop
实际上,之因此要叫MPLS 为2.5层协议,是由于标签是处于IP报文头和二层报头之间的.图中是嵌套了三层标签.性能
靠近二层头的标签叫顶部,考近IP报文头的标签叫底部.设计
若是有多个标签,数据报文在被转发的时候是利用顶部标签进行转发.当顶部移除之后,再利用下一层标签进行转发.3d
而每一个标签的格式为:blog
每一个标签为32 bit(4个字节). 分为4个字段,每一个字段都有分工.ip
LABEL: 头20个bit,是标签范围.cisco定义的标签的是<16-1048575>.ci
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.