ICMP响应报文:
LSR将TTL超时消息给报文发送者的方式有两种(ICMP ping的回复报文相同):
- 如果LSR上存在到达报文发送者的路由,则可以通过IP路由,直接向发送者回应TTL超时消息。
- 如果LSR上不存在到达报文发送者的路由,则ICMP响应报文将按照LSP继续传送,到达LSP出节点后,由Egress节点将该消息返回给发送者。(原路返回,不使用路由表)
使用标准:
通常情况下,收到的MPLS报文只带一层标签时,LSR可以采用第一种方式回应TTL超时消息;收到的MPLS报文包含多层标签时,LSR采用第二种方式回应TTL超时消息。但在MPLS VPN中,ASBR接收到的承载VPN报文的MPLS报文可能只有一层标签,此时,这些设备上并不存在到达报文发送者的路由,则采用第二种方法回应TTL超时消息。(标签个数+是否有路由一起考虑,默认是通过路由进行回复)
LSP连通性检测:
前提:源目检测地址需要在整个MPLS环境中。
在MPLS网络中,如果通过LSP转发数据失败,负责建立LSP的MPLS控制平面将无法检测到这种错误,加大了网络维护的难度。MPLS Ping/MPLS Tracert为用户提供了发现LSP错误、并及时定位失效节点的机制。
MPLS Ping主要用于检查LSP的连通性。MPLS Tracert在检查LSP的连通性的同时,还可以分析网络什么地方发生了故障。类似于普通IP的Ping/Tracert,MPLS Ping/MPLS Tracert使用MPLS回显请求(Echo Request)报文和MPLS回显应答(Echo Reply)报文检测LSP的可用性。这两种消息都以UDP报文格式发送,其中Echo Request的UDP端口号为3503,该端口号只有使能MPLS功能的设备才能识别。
MPLS Echo Request中携带需要检测的FEC信息,和其他属于此FEC的报文一样沿LSP发送,从而实现对LSP的检测。MPLS Echo Request报文通过MPLS转发给目的端,而MPLS Echo Reply报文则通过IP转发给源端。另外为了防止LSP断路时Echo Request进行IP转发,从而保证LSP的连通性测试,将Echo Request消息的IP头中目的地址设置为127.0.0.1/8(本机环回地址),IP头中的TTL值为1。
一、MPLS Ping:
如图,LSR_1上建立了一条目的地为LSR_4的LSP。从LSR_1对该LSP进行MPLS Ping时的处理如下:
- LSR_1查找该LSP是否存在。如果不存在,返回错误信息,停止Ping。如果存在,则继续进行以下操作。
- LSR_1构造MPLS Echo Request报文,IP头中的目的地址为127.0.0.1/8,IP头中的TTL值为1,同时将4.4.4.4填入Echo Request报文中的目的FEC中。然后查找相应的LSP,压入LSP的标签,将报文发送给LSR_2。
- 中间节点LSR_2和LSR_3对MPLS Echo Request报文进行普通MPLS转发。如果中间节点MPLS转发失败,则中间节点返回带有错误码的MPLS Echo Reply报文。
- 当MPLS转发路径无故障,则MPLS Echo Request报文到达LSP的出节点LSR_4。然后检查目的FEC中包含的目的地址4.4.4.4是否为自己的Loopback接口地址,以此来确认LSR_4是该FEC的真正出口后,返回正确的MPLS Echo Reply报文。至此整个MPLS Ping过程结束。
实验:
[R2]ping lsp -a 2.2.2.2 ip 5.5.5.5 32
在R2g0/0/1处抓包:
请求报文:带有标签
且目的地址为127.0.0.1(保证LSP不存在时不通过IP转发):
压入的标签为5.5.5.5对应的标签:1025。
同样IP报文的TTL值为1,避免通过IP转发:
回复报文:没有带有标签,因为有对应路由条目,可以直接通过查看IP路由表返回:
源目地址恢复正常(5.5.5.5和2.2.2.2)。
二、MPLS Tracert:
如图,从LSR_1对4.4.4.4/32进行MPLS Tracert时的处理如下:
- LSR_1检查LSP是否存在。如果不存在,返回错误信息,停止Tracert,否则继续进行如下处理。
- LSR_1构造MPLS Echo Request报文,IP头中的目的地址为127.0.0.1/8,同时将4.4.4.4填入MPLS Echo Request报文中的目的FEC中,然后查找相应的LSP,压入LSP的标签并且将MPLS TTL设置为1,将报文发送给LSR_2。此MPLS Echo Request报文中包含Downstream Mapping TLV(用来携带LSP在当前节点的下游信息,主要包括下一跳地址、出标签等)。
- LSR_2收到LSR_1发送来的报文后,将MPLS Echo Request中MPLS TTL减1为0后发现TTL超时,然后LSR_2需要检查是否存在该LSP,同时检查报文中Downstream Mapping TLV的下一跳地址、出标签是否正确,如果两项检查都正确,返回正确的MPLS Echo Reply报文,并且报文中必须携带LSR_2本身的包含下一跳和出标签的Downstream Mapping TLV给LSR_1。如果检查有不正确,则返回错误的MPLS Echo Reply报文。
- LSR_1收到正确的MPLS Echo Reply报文后再次发送MPLS Echo Request报文,报文的封装方式跟步骤2类似,只是将LSP标签的MPLS TTL设置为2,此时的MPLS Echo Request报文中的Downstream Mapping TLV是从MPLS Echo Reply报文中复制过来的。然后LSR_2收到该报文后进行普通MPLS转发。LSR_3收到此报文,标签的TTL超时,跟步骤3同样的处理方式后返回MPLS Echo Reply报文。
- LSR_1收到正确的MPLS Echo Reply报文后重复步骤4把LSP标签的MPLS TTL设置为3,复制Downstream Mapping TLV后发送MPLS Echo Request报文。LSR_2和LSR_3对该报文进行普通MPLS转发。LSR_4收到此报文,重复步骤3处理方式对报文进行处理,同时检查目的FEC中包含的目的IP 4.4.4.4为自己的Loopback接口地址,以此来发现已经是该LSP的出节点,因此返回不带下游信息的MPLS Echo Reply报文,至此整个MPLS Tracert过程结束。
通过上述步骤中返回携带下游信息的MPLS Echo Reply报文,在LSR_1上就获取了该LSP沿途每一个节点信息。
实验:
环境相同,我们可以看到内部的路径,对应标签,下一跳等。
同理,请求报文抓包:带有标签,目的地址为127.0.0.1。
回复报文:没有标签。
测试命令:
- 执行命令ping lsp [ -a source-ip | -c count | -exp exp-value | -h ttl-value | -m interval | -r reply-mode | -s packet-size | -t time-out | -v ] * ip destination-address mask-length [ ip-address ] [ nexthop nexthop-address ],进行MPLS Ping测试。
- 执行命令tracert lsp [ -a source-ip | -exp exp-value | -h ttl-value | -r reply-mode | -t time-out ] * ip destination-address mask-length [ ip-address ] [ nexthop nexthop-address ],进行MPLS Traceroute测试。
MPLS对TTL的处理:
MPLS也需要环路防止,但是对TTL有两种处理的模式:Uniform(统一,也是缺省模式)和Pipe(管道).
- Uniform模式
IP报文经过MPLS网络时,在入节点,IP TTL减1映射到MPLS TTL字段,此后报文在MPLS网络中按照标准的TTL处理方式处理。在出节点将MPLS TTL减1后映射到IP TTL字段。如图所示:
- Pipe模式(隐藏网络结构)
在入节点,IP TTL值减1,MPLS TTL字段为固定值,此后报文在MPLS网络中按照标准的TTL处理方式处理。在出节点会将IP TTL字段的值减1。即IP分组经过MPLS网络时,无论经过多少跳,IP TTL只在入节点和出节点分别减1(相当于将整个隧道里的LSR看做一个设备即可)。如图所示:
在MPLS VPN应用中,出于网络安全的考虑,需要隐藏MPLS骨干网络的结构,这种情况下,对于私网报文,Ingress上使用Pipe模式。
配置MPLS对TTL的处理模式 :
执行命令mpls mode { short-pipe [ ttl ttlvalue exp expvalue ] | uniform },配置MPLS TTL的处理模式。 (此命令在eNSP模拟器上无法执行)
参考资料:《华为hedex文档》