MPLS LSP Ping/Traceroute
文\陆强
1 前言
在MPLS网络中,标签交换路径(LSP)转发用户数据失败时,控制平面常常没有办法进行有效的故障检测,于是就需要一种能在短时间内发现和隔离路由黑洞或者路由丢失等故障的方法。本文介绍了一种能够对MPLS标签交换路径进行故障检测的简易而有效的机制──MPLS LSP Ping/Traceroute。
本文档包括三部分内容:MPLS转发路经故障、MPLS LSP Ping/Traceroute原理以及MPLS LSP Echo的报文格式。
2 MPLS转发路径故障
2.1 MPLS转发路径故障的产生
在MPLS网络中LSP发生故障总体来说有四种情况:LDP邻居关系中断、MPLS(全局或者接口)错误的去使能、标签分发错误以及软硬件故障等等。
2.2 MPLS网络中运用传统的故障检测面临的问题
在传统IP网络中,我们利用IP Ping来进行网络连通性检测,用Traceroute进行逐跳的错误定位和路径跟踪。在MPLS网络,如果我们继续用传统的IP Ping和Traceroute进行故障检测会面临如下问题:
1. 传统的Ping并不能够对MPLS LSP的连通性进行有效的检测。传统Ping能通只能说明IP转发是正常的,而不能够说明LSP是没有问题的。在IP路由正常而LSP中断的情况下,传统Ping报文依旧可以通过IP转发到达目的地。
2. 传统的Traceroute并不能够对MPLS LSP故障进行有效的逐跳定位和返回LSP的相关信息。因为IP转发通并不能够代表LSP是通的,并且标准ICMP报文不能返回诸如标签栈、下游映射等LSP的相关信息。
2.3 MPLS LSP Ping/Traceroute
与传统的Ping/Traceroute类似,MPLS LSP Ping/Traceroute同样是基于Echo request和Echo reply的模式;但是LSP Ping/Traceroute并不使用ICMP协议来实现,而是使用IPv4/IPv6的UDP协议来实现的。MPLS LSP Ping/Traceroute的基本思路是使用特定FEC转发类的分组来验证对应该FEC的LSP(从入口LSR到出口LSR)的完整性。
在LSP Ping Echo请求消息中携带所属FEC的信息。LSP Ping分组信息封装在UDP包中,包含序列号和时戳参数。MPLS在处理MPLS LSP Ping请求消息时采用了与该FEC分组相同的转发策略。在进行连通性测试时,分组将到达LSP的出口,出口LSR对分组进行检查,验证该LSR是否是该FEC的真正出口。
Traceroute模式可以作为故障定位的一种手段,发起测试的LSR向目的LSR发送Traceroute分组,该分组的TTL初始值为1,步进值为1。这些LSR对该分组执行各种检查,进一步返回相关控制和数据平面的信息。
如果Ping失败可以采用Traceroute对故障进行定位,也可以通过周期性的Traceroute FEC验证实际数据转发路径和控制平面路径是否一致。
3 MPLS LSP Ping/Traceroute原理
3.1 MPLS LSP Ping 原理
MPLS LSP Ping使用IPv4/IPv6的UDP协议来实现的,其中Echo Request的UDP端口为3503,需要说明的是只有使能MPLS的路由器才能够识别该端口号。我们以下图为例说明MPLS LSP Ping的一般过程。
图 1 MPLS LSP Ping
假设我们在R-1上操作LSP Ping 10.10.10.10(10.10.10.10为R-4的Loopback接口地址),执行步骤如下:
Step 1:在R-1上,应用程序先查找这条LSP是否存在(特别的,对于TE的Tunnel我们查找这个Tunnel接口是否存在,而且CR-LSP是否已经建立好),如果不存在,直接返回错误信息,停止Ping;否则进入Step 2;
Step 2:在R-1上,应用程序对Echo Request报文进行初始化,在IP头部填入127/8的地址作为目的地址,同时将10.10.10.10填入Echo Request报文中的Target FEC Stack中,然后查找标签转发表中对应项压入标签栈,将报文发送给R-2;
Step 3:在R-2和R-3上,采用和该FEC相同的转发策略,将Echo Request 当作普通MPLS数据报文进行转发;
Step 4:如果在上述过程中,MPLS转发失败,MPLS LSP Ping 应用程序会作相应处理,回应的Echo Reply携带相应的错误码(错误码请参见MPLS LSP Echo报文格式部分);
Step 5:如果在上述过程中,MPLS转发正常,该Echo Request到达R-4;
Step 6:在R-4上,应用程序检查Echo Request中的Target FEC Stack 包含的目的IP10.10.10.10为自己的Loopback接口地址,回应正确的Echo Reply后,整个LSP Ping过程结束,完成LSP的连通性检测。
从前面的例子我们可以看Echo Request报文的目的IP地址是127开头的地址,该地址是一个环回地址。为什么这样呢?这样做的目的是为了防止LSP断路时Echo Request进行IP转发,从而保证LSP的连通性测试。
3.2 MPLS LSP Traceroute 原理
和传统的Traceroute类似,MPLS LSP Traceroute通过连续发送一个TTL步进为1的Echo Request报文,让LSP沿途的每一个LSR都会收到TTL超时的Echo Request报文,同时回送一个携带下游信息(可选)以及相应返回码的Echo Reply 给发送者。这样发送者就会得到该LSP沿途每一个节点的信息。我们以下图为例说明MPLS LSP Traceroute的一般过程。
图 2 MPLS LSP Traceroute
假设我们在R-1上操作LSP Traceroute 10.10.10.10(10.10.10.10为R-4的Loopback接口地址),执行步骤如下:
Step 1:在R-1上,应用程序先查找这条LSP是否存在(特别的,对于TE的Tunnel我们查找这个Tunnel接口是否存在,而且CR-LSP是否已经建立好),如果不存在,直接返回错误信息,停止Ping;否则进入Step 2;
Step 2:在R-1上,应用程序对Echo Request报文进行初始化,在IP头部填入127/8的地址作为目的地址,同时将10.10.10.10填入Echo Request报文中的Target FEC Stack中。Echo Request报文可以包含Downstream Mapping TLV(用来携带LSP在当前节点的下游信息,主要包括下一跳地址、出标签等),然后查找标签转发表中对应项压入标签栈并且将TTL设置为1,将报文发送给R-2;
Step 3:在R-2上,将Echo Request中TTL减1为0发现TTL超时,应用程序检查是否存在该LSP,同时检查报文中Downstream Mapping TLV中的值(下一跳地址,出标签):
①比较其中的下一跳地址是否为本地接口地址;
②比较其中的出标签是否为本地该FEC的入标签;
如果存在该LSP并且比较值均为真,则回应正确的Echo Reply,并且报文中必须携带Downstream Mapping TLV 给发送者进行检查分析。如果上述检查不为真,则返回带有错误码的Echo Replay的报文;
Step 4:在R-1上,应用程序对Echo Reply进行相关处理,对第二个Echo Request进行初始化,初始化过程基本和Step 1中的初始化一样,值得指出的是这时候应用程序会将收到Echo Reply报文中的Downstream Mapping TLV复制到第二个MPLS Echo Request中并且TTL=2,然后发送给R-2;
Step 5:在R-2上,将TTL减1,采用和该FEC相同的转发策略,将Echo Request当作普通MPLS数据报文发送给R-3;
Step 6:在R-3上,进行和Step 3相同的程序步骤,返回Echo Reply给R-1;
Step 7:在R-1上,进行和Step 4相同的程序步骤,发送TTL=3的Echo Request给R-2,经R-3到达R-4;
Step 8:在R-4上,进行和Step 3相同的程序步骤,返回Echo Reply给R-1,因为R-4已经是该LSP的出口节点,因此不返回任何下游信息。至此整个LSP Traceroute 过程结束,在入口处也得到该LSP沿途每一个节点的信息。
4 MPLS LSP Echo报文格式
MPLS Echo Packet的版本号,当前版本为1。
消息类型,用来标识该MPLS Echo Packet是Echo Request还是Echo Reply。消息类型按如下定义:
Value Meaning
----- -------
1 MPLS Echo Request
2 MPLS Echo Reply
回应模式,指示Replier Router用什么方式来回应这个Echo Request。回应模式按如下定义:
Value Meaning
----- -------
1 Do not reply
2 Reply via an IPv4/IPv6 UDP packet
3 Reply via an IPv4/IPv6 UDP packet with Router Alert
下面分别对这三种模式进行简要介绍:
Do not reply:发送方不要求接收方作出应答;Do not reply模式可以用作单向的
连通性测试。
Reply via an IPv4/IPv6 UDP packet:发送方要求接收方作出应答。
Reply via an IPv4/IPv6 UDP packet with Router Alert:发送方要求接收方不仅要用UDP来回答,同时要启动Router Alert。Router Alert并不是MPLS自有的功能,是IP的功能。一般IP头有20字节,有时会在后面加一些Option,Router Alert就是其中一个Option。LSR收到一个IP包里面含有Router Alert这个Option,它并不会马上转发出去,而是交给上层协议栈进一步处理。
返回码,回应的LSR对Echo Request报文中的Target FEC Stack进行验证后返回相应的代码值给发送者。返回码按如下定义:
Value Meaning
----- -------
0 The Error Code Is Contained in the Error Code TLV
1 Malformed echo request received
2 One or more of the TLVs was not understood
3 Replying Router Is an Egress for the FEC
4 Replying Router Has No Mapping for the FEC
5 Replying Router Is Not One of the “Downstream Routers”
6 Replying Router Is One of the “Downstream Routers”, and Its Mapping for this FEC on the Received Interface Is the Given Label
发送者句柄,是用来标识一个MPLS Echo的,其值是在应用程序发送一个MPLS Echo Request时随机生成的。单次的LSP Ping操作可以产生多个Echo Request,但是这些Echo Request所包含的Sender’s Handle的值是相同,即单次LSP Ping操作仅能产生一个Sender’s Handle的Echo Request。
序列号,Sequence Number同样是用来标识MPLS Echo的,它是一个进程的概念,进程内有效,可以用来检测丢失的Reply的个数,从而可以对网络进行延时和抖动统计。
单次LSP Ping操作可以产生多个Sequence Number,其值一般从零开始逐一递增。
时间戳,采用NTP协议的时间格式,包含两部分:收到的时间戳和发送时间戳;可以用来计算报文从一个节点到另一个节点所需要花费的时间。
TLVs:
TLVs(Type-Length-Value tuples)的报文格式按下图定义:
其中类型(Type)值按如下定义,
Value Meaning
----- -------
1 Taget FEC Stack
2 Downstream Mapping
3 Pad
4 Error Code
5 Vendor Enterprise Code
长度(Length)包括Length字段后该TLV(包括子TLV)的所有内容,单位为字节。
值(Value)值由类型决定,它可以嵌套多个子TLV。
所谓的Target FEC Stack就是所要Ping或者Traceroute的对象,真正Ping/Traceroute的对象并不是填充在目标IP地址中,而是填充在Target FEC Stack中的。Target FEC Stack包含着下面一系列的sub-TLV,按如下定义:
Sub-Type Length Value Field
----- ------- -------
1 5 LDP IPv4 Prefix
2 17 LDP IPv6 Prefix
3 20 RSVP IPv4 Session Query
4 56 RSVP IPv6 Session Query
5 Not Assigned
6 13 VPN IPv4 Prefix
7 25 VPN IPv6 Prefix
9 10 L2 Circuit ID
我们看这样一个例子,假设今天要Ping一个LDP IPv4 Prefix(10.10.10.10/32)地址,那么该Echo Request报文中的Target FEC Stack的报文格式如下:
大家注意这个Target FEC Stack TLV仅仅会出现在Echo Request里面有,不会出现在Echo Reply里。
Downstream Mapping TLV主要包含了下游接口地址以及出标签栈等信息。在一个Echo Request中至多可以包含一个Downstram Mapping TLV。当接收LSR收到一个包含Downstram Mapping TLV的Echo Request 报文时,它回应请求报文时也应该包含相应的Downstream Mapping TLV。假如回应的LSR是该Echo Request中所请求的目的FEC的出口节点,那么该LSR在发送的Echo Reply报文中就不应该包含任何下游映射对象类,因为对于该FEC来说已经是终点LSR,不存在下游节点。
Downstream Mapping TLV的报文格式按如下定义:
Pad TLV当前并未对其用途进行详细地说明,仅对其作如下定义:
Value Meaning
----- -------
1 Drop Pad TLV from reply
2 Copy Pad TLV to reply
3 Reserved for future use
Error Code TLV当前未定义。
Vendor Enterprise Code TLV 包含各自厂家的私有信息,长度一般为4字节,其值为SMI Private Enterprise Numbers,由IANA指派。