标签有三种工作模式:交换/添加/移除。
2、当一个路由器收到一个IP报文的时候,进行的查找是IP查找。在cisco IOS中,进行IP查找的报文进行的是CEF(cisco express forwarding)的查找。而路由器收到一个带标签报文的时候,查找是在该路由器的LFIB中进行的.(show mpls forwarding-table).
通过LFIB(标签查找)的方式进行转发的话,那么该报文离开路由器时就应该是带上标签的.
下面就是查找CEF表的IP报文的转发和查找LFIB表的MPLS报文转发的操作:
3、下面有几种情况分别会用到上面的图,需要建立概念:
■如果一台入站LSR收到一个IP报文,并且要将标记后进行转发,那么就是图中的IP-to-Local转发实例。
■如果一个LSR收到一个带标签的报文,他需要将标签去掉转发出去,就是Label-to-IP转发实例.
■收到报文携带有标签,转发出去需要压入新的上游分发给自己的新标签,Label-to-label.
■最后就是IP-to-IP,没有标签,直接走快转表转发了。也就是传统的IP转发,逐跳进行。
下面来看看,目的指向6.1.1.2/24的IP报文进入LSR后,被打上标签18(18是下游分配给本端的标签),然后从接口G2/0转发出去的实例
4、从CEF表和LFIB表都可以看到,到目的6.1.1.2的报文,tag imposed 18,是下游分配给本端的标签,所以18作为G2/0的出标签.
CEF交换是唯一一种可以用于标记的报文的IP转发模式,其他的注入IP快速交换之类的IP转发模式都是不能用来标记报文的,所以,CEF交换是唯一一种可以与MPLS相结合的IP转发模式,所以在启用MPLS功能的时候,首要任务是一定要是能IP CEF(当然现在的版本都是默认CEF打开的,不用手工打开,但需要了解CEF的作用。)
接下来看看LFIB,标签转发表。在MPLS中,这个表是相当重要的,就相当于IP中的路由表一样,通过LFIB建立转发等价类FEC,相同目的的数据流走一样的标签。
5、这里有些概念需要澄清一下。
local: 是由LSR自己分配的,但是分配到哪里?是从自己分配给上游的路由器。
Outgoing: 是由下游路由器分配给本端的标签。
这里一共有6个条目,一条条来说。
(1), 16 Pop tag [T] 10.1.1.2/32 0 Tu0 point2point //这个是给MPLS TE流量工程tunnel接口相关的,这里暂时不做解释。有专题解释关于MPLS TE的。
可以参考MPLS TE专题系列:
或者下载已经整理好的PDF文档:
(2), 17 Pop tag 4.1.1.0/24 0 Gi2/0 2.1.1.2
如果收到标签是17的报文,移除所有的标签,然后以IP转发的形式进行传输,目的地是4.1.1.0网络。由接口G2/0作为出接口.
(3), 18 Pop tag 3.1.1.0/24 0 Gi2/0 2.1.1.2
如果收到标签是18的报文,移除所有的标签,然后以IP转发的形式进行传输,目的地是3.1.1.0网络。由接口G2/0作为出接口
(4), 19 19 5.1.1.0/24 0 Gi2/0 2.1.1.2
如果收到标签是19的报文,首先删除19这个标签,然后用19来进行替换(虽然这里标签都为19,但是,一定要注意,第一个local=19是我发给上游路由器的标签,而第二个19是下游路由器发给我的,标签可以一样,但是替换的过程路由器是不会省略的,所以标签只是本地有效,并不冲突),然后以MPLS报文转发的形式进行传输,目的地是5.1.1.0网络。由接口G2/0作为出接口
(5), 20 18 6.1.1.0/24 0 Gi2/0 2.1.1.2
如果收到标签是20的报文,首先删除20这个标签,然后用18来进行替换,以MPLS报文转发的形式进行传输,目的地是6.1.1.0网络。由接口G2/0作为出接口
(6), 21 Aggregate 1.1.1.0/24[V] 416
这个是分配给VRF的标签.聚合属性.
说了那么多标签,有一种情况是未知标签,意思就是在本地LFIB数据库中找不到相关的信息。
按常理来说,上游路由器发送到本端的MPLS 报文,标签部分实际是本端路由器通告给上游路由器的,所以一定在本端本地LFIB表中能够找到的,但是因为一些错误或者网络问题的故障,这些送过来的报文的标签在本地库里面没有找到。
这个时候,怎么处理这些报文呢?
LSR可以采取两种措施,移除以后尽力转发报文,或者丢弃报文。
CISCO IOS中采取的措施是丢弃行为。原因是,如果LSR移除标签进行尽力转发,他根本就不知道标签后面携带的是什么报文。是IPv4?IPv6?二层帧?还是其他报文?即使现在转发出去,也不能保证下游路由器能顺利转发,而且还浪费了硬件资源。
所以,丢,是丢得相当正确的.
在现实生活中,大家都有这样的经历,如果一个事情从头到尾都已经了完整的计划和精密的部署,都不一定能成功。要保证一个事情99%是相当困难的,一个细微的环节出问题,就会导致失败,所以说CISCO丢得好,至少不要去浪费自己或者其他设备的资源。对于运营商来说,每个设备都已经跑到了极限,他们只会更加高兴。
我们已经知道了MPLS报文的格式:
0-20位是标签位.一共可以组合出1048575个标签出来。
0-15是保留标签,数据流进行转发的时候,不使用这些标签。
0-显式空NULL标签.
3-隐式空标签.
1-路由器报警标签.
14-OAM报警标签。
CISCO的IOS里面用的是隐式空标签.
implicit-Null.
在以前的时间里,我一直没有真正的理解显示空和隐式空真正的含义。今天找了一个相关的开发老师把这个概念理清楚了。
下面是我总结出来的一些概念,不对的请达人些指教.
隐式空标签:
该标签的标签号固定为3,该标签我理解就是一个概念上的东西,用show命令show mpls forwarding-table都看不到这个3,那么为什么要用这个标签呢?好处在哪里?
这里涉及到另外一个概念是PHP次末节点弹出机制.
6、这里随便借用了一个拓扑图。假设R3是P设备,R4和R5是PE.
那么当MPLS报文送到R3往R4和R5进行转发的时候,在R3上面就会把标签pop出去,剥离标签以后,用隐式空标签3安装在报文前面,实际上已经就是纯IP报文了,然后转发给R4或者R5,那么两个PE设备负责的事情就是纯粹的IP转发了,减轻了PE设备的压力。
否则的话,PE设备需要做的事情是收到了报文以后首先剥离标签,然后查找路由表进行IP报文的转发,这样加大了设备工作流程。
凡是做过工程的朋友都知道,运营商的P设备一般都是很强悍的至少是CISCO7200级别的设备,或者是7600.GSR等等,但是对于PE来说,CISCO 3800/2800都可以来做。这也就是为什么PE的需求不是那么要求高的原因了。不知道这样说是否说明清楚了。
正是因为有了PHP的设计思路,所以才有了隐式空标签的出现。
简单说来,为了减轻PE的压力,在倒数第二跳直接将标签弹出,以纯IP的报文格式传送给PE.让PE直接走IP转发.
显式空标签:
有了隐式空标签以后,其实隐式空标签也有缺陷的。我们都知道MPLS标签报文的结构:
7、其中,0-20位是标签位,S位和TTL位先不管,还有8位的EXP位,这就是其中的QOS位。
相当于IP报头中的IP precedence和DSCP一样,是用来着色的。但是这里试想一下,如果客户需要做端到端的QOS,那么一定会从头到尾都需要有相关的着色位是有色的。PHP工作机制在倒数第二跳弹出以后,会把整个MPLS报文头移除,而不是单纯的移除标签,那么如果原来有的EXP假如是8,这个时候EXP也会随MPLS报头一起删除,试问,在MPLS骨干网中,下一跳PE如何来做QOS呢?
所以为什么之前说的隐式空标签是一个概念。因为MPLS报文头被移除了。而现在需要用0这个显示空标签来进行替代,实际上是保留MPLS报文头,标签为0,EXP/S/TTL全部都保留下来传递到下一跳,最后就是PE来做P的工作,收到报文,先经过QOS队列,然后剥离标签进行IP转发。虽然这样可以做端到端的QOS,但是弊端就是对PE设备的性能压力比较大。
PS:对于IPv6来说,显示空标签不是0,而是2.
对于隐式空和显示空标签,我还有一个疑问,咨询了研究院的老师以后,就更加清楚了,这里也分享出来:
以前我在做工程的时候,我记得运营商的PE,从VRF收到客户侧的数据报文以后,会加上MPLS报文头从骨干网传输出去,当时我做实验证明了一个理论就是,设备(cisco/MAIPU)会自动根据从VRF接收到的报文的IP precedence或者是DSCP复制出来,然后粘贴为MPLS报文头的EXP字段。也就是说,IP报文经过PE到骨干网,PE设备会将IP的TOS那8个字节复制到MPLS header的EXP中去。那么从PE出来的时候是否也会复制呢?
如果要复制,那也就是说不需要显示空标签。按照这个逻辑应该是标准为只对进设备的报文进行复制,PHP倒数第二跳出去的报文不会从MPLS头里EXP再复制到IP的TOS去。也就是IP的服务类型service type里面去。所以这里才有了显示空标签的应用.这个是和研发老师进行确认了的。
下面是在迈普的设备和CISCO设备上的配置方式。
我们都知道设备默认的是隐式空标签。所以不需要配置。
在迈普的设备上面,要先显示空标签,需要在MPLS LDP下面进行配置:
这里迈普的设备用显示空标签是全局的能力,也就是说,在mpls ldp下面配置了explicit-null以后,该设备作为P在对于所有的PE都会用显示空标签,并不能针对哪些特殊的对象进行选择性的操作。
cisco设备的操作方式是:
请参考图中的mpls ldp explicit-null to bbb,bbb是一个ACL的名字。
这样比较灵活。
当然也可以让整个设备都做显示空0出去:
mpls ldp explicit-null
还要提一下TTL,这个也是MPLS 报头中的一个东西,在IPV4报头中,TTL是如此的重要。TTL通常是255,每经过一跳(三层设备)就会减少1,知道最后为0就会丢弃,发送ICMP type=11和0.在MPLS中,IP的TTL会减1,然后复制到MPLS TTL中,在用MPLS转发的时候IP的TTL不会变化。最后当标签被剥离的时候,会在MPLS TTL减1,然后再复制到IP的TTL中。
下面要看得是MPLS MTU,关于这个专题,这里只是略微带过。有一个详细的解释在:
总结一下:
MPLS的MTU一定会比IP的MTU要大,如果你想不分片传输报文的话,下面我自己整理了一个公式:
MPLS MTU=IP MTU+4*N (N代表标签的个数)
再用一个以前做的实验来阐述MPLS MTU的设置:
IP MTU=1500,MPLS MTU=1503, 源地址ping目的-f不分片-l 1500。结果掉包不通。
IP MTU=1500,MPLS MTU=1504, 源地址ping目的-f不分片-l 1500。结果通。
其实这里就验证了那个公式,MPLS MTU一定大于IP MTU.因为还要加上4*N个标签.
那么这里再想一下,如果IP MTU=1500, MPLS =1500.
那么数据报文在什么情况下就会分片?答案是:IP 长度在1496的时候就会分片。如果ping x.x.x.x -l 1500 -f
一定是掉包。大家可以做实验进行验证 :)
还要提到的一点是,命令为:
在默认情况下,ip MTU=1500,MPLS MTU=1500.意味着在IP MTU=1496的时候,就会分片。
(IP MTU+4*N)>MPLS MTU的话,一定会掉包。
这就是今天的主题。关于MPLS 报文头的一些相关内容.