0-15是保留标签,数据流进行转发的时候,不使用这些标签。
0-显式空NULL标签.
3-隐式空标签.
1-路由器报警标签.
14-OAM报警标签。
CISCO的IOS里面用的是隐式空标签.
R4#show mpls ldp bindings
tib entry:2.1.1.0/24,rev 6
local binding:tag :16
remote binding:tsr:4.1.1.1:0,tag:imp-null
remote binding:tsr:6.1.1.1:0,tag:17
tib entry:3.1.1.0/24,rev 4
local binding:tag:imp-null
remote binding:tsr:4.1.1.1:0,tag:imp-null
remote binding:tsr:6.1.1.1:0,tag:16
implicit-Null.
在以前的时间里,我一直没有真正的理解显示空和隐式空真正的含义。今天找了一个相关的开发老师把这个概念理清楚了。
下面是我总结出来的一些概念,不对的请达人些指教.
隐式空标签:
该标签的标签号固定为3,该标签我理解就是一个概念上的东西,用show命令show mpls forwarding-table都看不到这个3,那么为什么要用这个标签呢?好处在哪里?
这里涉及到另外一个概念是PHP次末节点弹出机制.
这里随便借用了一个拓扑图。假设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标签报文的结构:
其中,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一定会比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 报文头的一些相关内容.