简介
MPLS LSP Ping是一个基本工具,用于验证入口和出口之间的标签交换路径(LSP)的运行状况。 本文档旨在说明LSP树跟踪中发起方和响应方之间的多路径信息交互。有关此工具可用的详细选项,请参阅本文档将很有用。
背景信息
MPLS EM - MPLS LSP多路径树跟踪功能的此实施基于RFC 4379,Detecting Multi-Protocol Label Switched(MPLS)Data Plane Failures。
通过将探测数据包的IP目标地址设置为环回地址(127.x.x.x),LSP树跟踪可用于检测LSP中的故障,从而避免数据包被路由到IP。因此,无论何时出现端到端连接问题,使用LSP Ping作为消除任何LSP故障的第一步都很有帮助。
在多路径情况下,LSP ping可能并非总能帮助识别所有LSP故障。如前所述,任何标签交换路由器(LSR)在接收标记数据包时都使用来自数据包的特定密钥和输入到散列算法来确定出口接口,该数据包可以发送到多个出口接口。根据供应商、硬件等,散列时可能会考虑以下任何选项:
- 仅传入标签堆栈。
- 传入标签堆栈和IP报头详细信息(如果负载为IP)。
- 传入标签堆栈、IP报头和传输报头详细信息。
通常,如果堆栈的大小小于或等于3(将IP作为负载),思科路由器会考虑标签堆栈和IP报头的组合。
采用以下拓扑。

R1-R7是路由器。在上述拓扑中,有3条从R1到R5的等价多路径(ECMP)路由,如下所示,
路径1:R1-R2-R3-R4-R5
路径2:R1-R2-R6-R4-R5
路径3:R1-R2-R6-R7-R5
假设R6和R7之间存在问题(如损坏的标签分发协议(LDP)或标签误编程等),导致通过PATH3从R1到R5的流量丢弃。如果从R1对LSP执行Ping操作时选择了PATH1或PATH2,则最终您可能认为R1和R5之间的路径是正常的。
LSP Ping允许将IP目标地址设置为127.0.0.0/8范围内的任意地址。虽然一个简单的选项是手动尝试发送具有不同目标地址的多个ping数据包,但不能保证所有可能的ECMP路径都将被验证。您需要一种查询和验证源与目标之间所有可能路径的方法。LSP多路径树跟踪利用RFC4379第3.3.1节中定义的“多路径信息编码”,帮助您验证所有ECMP路径。
LSP树跟踪 — 工作原理
常规的MPLS ping或traceroute可能表示不存在故障,具体取决于传输路由器如何通过ECMP负载共享数据包,但LSP树跟踪提供了一种更佳的方法来验证所有路径是否真的在工作。
在LSP树跟踪中,发起方路由器通过以增量方式(从1开始)在顶部标签中设置TTL,向每一跳发送MPLS回应请求。回应请求将携带多路径信息TLV,该信息携带IP地址范围(在127.0.0.0/8范围内)或熵标签范围。目前Cisco设备支持IP目标选项,因此我们的示例将详细介绍IP地址范围。
收到请求数据包时,每个中转LSR将回复所有ECMP传出接口,并将来自每个接口的请求的IP地址范围(或熵标签)关联。
LSP树跟踪 — 详细示例
假设如下所示的拓扑。

为简单起见,本示例使用地址范围127.0.0.0-127.0.0.200。以下是LSP树跟踪中的步骤的详细信息。
1)发起方(R1)发送回应请求,详细信息如下:
- IP目的地为127.0.0.0
- 地址范围从127.0.0.0到127.0.0.200的多路径信息TLV。
- 顶部标签的TTL将设置为1。
2)R2收到相同数据包后,将用每个出口接口的多路径信息作出回复。在本例中,它将按如下方式回复:
- 如果IP目的地址在127.0.0.0到127.0.0.100之间,则数据包将发送到R3。
- 如果IP目的地址在127.0.0.101到127.0.0.200之间,则数据包将发送到R6。
3)R1意识到有2条可能的ECMP路径,因此它需要发送2条回应请求,TTL设置为2。从各种测试中发现,启动器始终先以1路径结束再进入下一路径。(但对特定实施来说可能确实如此)。

4)R1现在发送回应请求,详细信息如下:
- IP目的地为127.0.0.0
- 地址范围从127.0.0.0到127.0.0.100的多路径信息TLV。
- 顶部标签的TTL将设置为2。
5)R2会将数据包转发到R3(因为目的地址为127.0.0.0)。收到相同信息时,R3将回复相同的多路径信息,因为只有一个出口接口。
在到达R5之前,情况也是如此。

6)完成PATH1跟踪后(收到出口回复后),发起方现在将查询PATH2。这通过发送带有以下详细信息的回应请求来执行:
- IP destination as 127.0.0.101
- 地址范围从127.0.0.101到127.0.0.200的多路径信息TLV
- 顶部标签的TTL设置为2。
7)R2会将数据包转发到R6(因为目的地址为127.0.0.101)。R6收到相同信息后将回复多路径信息,如下所示:
- 如果IP目的地址在127.0.0.101到127.0.0.150之间,则数据包将发送到R4。
- 如果IP目的地址在127.0.0.151到127.0.0.200之间,则数据包将发送到R7。
8)R1发现还有一个ECMP路径,因此所有可能的路径都为3。R1继续查询PATH2,方法是发送下一个回应请求,详细信息如下:
- IP destination as 127.0.0.101
- 地址范围从127.0.0.101到127.0.0.150的多路径信息TLV
- 顶部标签的TTL设置为3。
9)R2会将数据包转发到R6(因为目的地为127.0.0.101),R6会将其转发到R4(因为目的地为127.0.0.101)。R4没有任何ECMP路径,因此将使用相同的多路径信息回复。下一个数据包将到达出口R5。
10)由于PATH2跟踪已完成,R1将继续查询PATH3。这通过发送带有以下详细信息的回应请求来执行:
- IP destination as 127.0.0.151
- 地址范围从127.0.0.151到127.0.0.200的多路径信息TLV
- 顶部标签的TTL设置为3。
11)R2将数据包转发到R6,R6又将数据包转发到R7。R7将使用相同的多路径信息TLV进行回复。下一个数据包到达出口路由器R5。
完成这些步骤后,R1将具有以下详细信息:

通过在127.0.0.0和127.0.0.100中使用目的地址,PATH1上的数据包转发将受到影响,而使用其他范围的地址将影响数据包在相应路径上的转发。
12)现在,Initiator将发送3个回应请求数据包,其中TTL设置为255,并从每个范围中选择地址,以便端到端验证所有路径。
用于ECMP跟踪的命令是traceroute mpls multipath ipv4 <prefix> <mask>。以下是示例输出。
R1#traceroute mpls multipath ipv4 10.1.5.5 255.255.255.255
Starting LSP Multipath Traceroute for 10.1.5.5/32
Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
'L' - labeled output interface, 'B' - unlabeled output interface,
'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
'M' - malformed request, 'm' - unsupported tlvs, 'N' - no label entry,
'P' - no rx intf label prot, 'p' - premature termination of LSP,
'R' - transit router, 'I' - unknown upstream index,
'l' - Label switched with FEC change, 'd' - see DDMAP for return code,
'X' - unknown return code, 'x' - return code 0
Type escape sequence to abort.
LLL!
Path 0 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.4
LL!
Path 1 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.2
L!
Path 2 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.0
Paths (found/broken/unexplored) (3/0/0)
Echo Request (sent/fail) (9/0)
Echo Reply (received/timeout) (9/0)
Total Time Elapsed 27 ms
请注意,上述输出显示有3条路径,并且所有路径都工作正常。在上述命令中使用详细命令将列出所有跃点,如下所示:
R1#traceroute mpls multipath ipv4 10.1.5.5 255.255.255.255 verbose
Starting LSP Multipath Traceroute for 10.1.5.5/32
Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
'L' - labeled output interface, 'B' - unlabeled output interface,
'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
'M' - malformed request, 'm' - unsupported tlvs, 'N' - no label entry,
'P' - no rx intf label prot, 'p' - premature termination of LSP,
'R' - transit router, 'I' - unknown upstream index,
'l' - Label switched with FEC change, 'd' - see DDMAP for return code,
'X' - unknown return code, 'x' - return code 0
Type escape sequence to abort.
LLL!
Path 0 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.4
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.23.3 MRU 1500 [Labels: 23 Exp: 0] ret code 8 multipaths 2
L 2 10.1.23.3 10.1.34.4 MRU 1500 [Labels: 22 Exp: 0] ret code 8 multipaths 1
L 3 10.1.34.4 10.1.45.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.45.5, ret code 3 multipaths 0
LL!
Path 1 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.2
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.26.6 MRU 1500 [Labels: 16 Exp: 0] ret code 8 multipaths 2
L 2 10.1.26.6 10.1.46.4 MRU 1500 [Labels: 22 Exp: 0] ret code 8 multipaths 2
L 3 10.1.46.4 10.1.45.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.45.5, ret code 3 multipaths 0
L!
Path 2 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.0
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.26.6 MRU 1500 [Labels: 16 Exp: 0] ret code 8 multipaths 2
L 2 10.1.26.6 10.1.67.7 MRU 1500 [Labels: 17 Exp: 0] ret code 8 multipaths 2
L 3 10.1.67.7 10.1.57.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.57.5, ret code 3 multipaths 0
Paths (found/broken/unexplored) (3/0/0)
Echo Request (sent/fail) (9/0)
Echo Reply (received/timeout) (9/0)
Total Time Elapsed 29 ms