本文档说明 traceroute 命令在多协议标签交换 (MPLS) 环境中的工作方式。
Cisco 建议您了解以下主题:
基本 MPLS 知识
有关详细信息,请参阅 MPLS 初学者常见问题。
本文档不限于特定的软件和硬件版本。
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
本部分介绍传统 traceroute 命令的工作原理。此图显示了一个服务提供商设置,其中,路由器 1 (R1) 和路由器 4 (R4) 是提供商边缘 (PE) 路由器,而路由器 2 (R2) 和路由器 3 (R3) 是提供商 (P) 路由器。
本示例从R1对R4环回14执行traceroute。R1使用目标端口值大于32000的用户数据报协议(UDP)数据报。如果为端口号选择如此高的值,它将确保目标接收方上不存在此端口。它会将数据报置于 IP 数据包中。
注意:在本文中,每当提到IP数据包时,它都是包含UDP数据报的IP数据包。
这是正常 traceroute 命令的事件序列:
R1 通过其 eth1 接口发送目标地址为 14 且存活时间 (TTL) 为 1 的 IP 数据包。
R2收到该数据包并注意到它不是预期接收方,数据包的TTL为1。它丢弃该数据包并向R1发送TTL过期的Internet控制消息协议(ICMP)消息。此ICMP消息的源地址是R2 eth0的IP地址(接收原始数据包的接口的地址)。
接收 ICMP 消息时,R1 会通过其 eth1 接口发送另一个目标为 14 且 TTL 为 2 的 IP 数据包。
R2收到该数据包并注意到它不是预期接收方,可以通过R3到达预期接收方。它将TTL从2递减到1,然后将数据包转发到R3。R3收到该数据包,并发现它不是预期接收方。TTL为1。它丢弃数据包,并向R1发送TTL过期的ICMP消息,其eth0地址作为源地址。
R1收到ICMP消息,并通过其eth1接口将另一个IP数据包发送到14,其TTL值为3。在此过程中,R2和R3递减TTL并将其传递给R4。R4获取该数据包,发现它是预期接收方,并尝试连接到UDP数据报中的端口值。R4 发现此端口不存在,并向 R1 发送 ICMP port unreachable 错误消息。
与以前一样,此ICMP消息的源地址是R4的eth0。traceroute程序现在具有所有ICMP错误消息以及相应的源地址,并且具有到达目的地的完整路由。
请考虑正常 traceroute 命令部分中详细介绍的这一相同方案,只不过所有路由器(R1 到 R4)现在进行标签交换而不是进行 IP 转发。下图中显示了试验床设置。试验床中显示的所有接口都处于 10.13.0.0 网络中。
对于本文档而言,假设:
R1 使用标签 47 到达 R4 并将数据包转发到 R2。
R2 使用标签 45 到达 R4 并将数据包转发到 R3。
R3 弹出标签并将数据包转发到 R4。
R4 使用标签 28 到达 R1 并将数据包转发到 R3。
R3 使用标签 26 到达 R1 并将数据包转发到 R2。
R2 弹出标签并将数据包转发到 R1。
以下步骤说明了执行从 R1 到 R4 环回 10.13.1.51 的 traceroute 时的事件序列。
R1将标签为47且TTL为1的标签交换数据包发送到R2。IP数据包的TTL字段被复制到标签报头的TTL字段。
R2发现它不是预期接收方,TTL为1。它会丢弃该数据包并创建TTL过期的ICMP消息,就像常规IP数据包一样。在这种情况下,将针对 MPLS 的每个 ICMP 扩展生成 ICMP 消息数据包。
R2 将标签 47(过期的传入标签)附加到 ICMP 消息。它不直接将数据包发送到 R1。相反,它查询其标签转发信息库(LFIB),发现它应使用标签45来接收标签为47的数据包。它在数据包上放置标签45,并将TTL过期的ICMP消息发送到R3。
R3弹出该标签并将其发送到R4。R4发现目的地为R1,为该消息提供28的标签,并通过R3和R2将其发送到R1。
ICMP错误消息在发回R1之前一直传输到另一端。此示例提供了一个图示:
R4以太网接口上嗅探到的数据包确认了步骤1-5。在嗅探器输出中,帧1是入站数据包,帧2是R4的出站数据包。输出格式化以反映此讨论,需要注意的点以粗体显示。
Frame 1 (182 on wire, 182 captured) Ethernet II Destination: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Source: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Type: IP (0x0800) Internet Protocol Version: 4 Header length: 20 bytes Time to live: 254 Protocol: ICMP (0x01) Header checksum: 0x1b8e (correct) Source: 10.13.2.33 (10.13.2.33) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e19 0000 0111 044a 0a0d 0222E..........J..." 100a0d 0133 989d 829a 0008 cd37 0000 0000...3.......7.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 edf2 0008 0101 0002 f101........... Frame 2 (186 on wire, 186 captured) Ethernet II Destination: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Source: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Type: MPLS label switched packet (0x8847) MultiProtocol Label Switching Header MPLS Label: Unknown (28) MPLS Experimental Bits: 6 MPLS Bottom Of Label Stack: 1 MPLS TTL: 253 Internet Protocol Version: 4 Header length: 20 bytes Time to live: 253 Protocol: ICMP (0x01) Header checksum: 0x1c8e (correct) Source: 10.13.2.33 (10.13.2.33) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e19 0000 0111 044a 0a0d 0222E..........J..." 100a0d 0133 989d 829a 0008 cd37 0000 0000...3.......7.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 edf2 0008 0101 0002 f101...........
在输出的第1帧中,R4接收的第一个数据包是从R2(接收原始数据包的接口10.13.2.33)到R1(10.13.2.34)的TTL过期ICMP消息。 在ICMP消息的数据部分,字节为0x89,字节为0x8A的第一个半字节为0x8A,MPLS标签(20字节)已过期,其值为0x02F或47。这是TTL为1的数据包的传入标签。R2在ICMP错误消息中附加此标签。
在该输出的 Frame 2 中,type 显示为 MPLS label switched packet,这表示它是 MPLS 数据包。R4 将标签 28 置于 Frame 1 上,并通过标签交换路径将其转发到 R1。该帧中的 MPLS 报头用粗体表示。此外,如果您参考数据包的TTL部分,则在帧1中,其值为254,在帧2中,其值为253。R4将其减1。
R1收到ICMP消息,并向R2发送另一个标签为47且TTL为2的数据包。R2交换标签,递减TTL(从2减到1)并转发到R3。与步骤2一样,R3将TTL过期的ICMP消息附加到R4,然后R4将其发回R31。
此处显示的 R4 处的嗅探器输出确认步骤 6:
Frame 3 (182 on wire, 182 captured) Ethernet II Destination: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Source: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Type: IP (0x0800) Internet Protocol Version: 4 Header length: 20 bytes Time to live: 255 Protocol: ICMP (0x01) Header checksum: 0x146f (correct) Source: 10.13.3.134 (10.13.3.134) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e1b 0000 0211 0348 0a0d 0222E..........H..." 100a0d 0133 9292 829b 0008 d341 0000 0000...3.......A.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 0df3 0008 0101 0002 d101........... Frame 4 (186 on wire, 186 captured) Ethernet II Destination: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Source: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Type: MPLS label switched packet (0x8847) MultiProtocol Label Switching Header MPLS Label: Unknown (28) MPLS Experimental Bits: 6 MPLS Bottom Of Label Stack: 1 MPLS TTL: 254 Internet Protocol Version: 4 Header length: 20 bytes Time to live: 254 Protocol: ICMP (0x01) Header checksum: 0x156f (correct) Source: 10.13.3.134 (10.13.3.134) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 11 (Time-to-live exceeded) Code: 0 (TTL equals 0 during transit) Checksum: 0x0c88 (correct) Data (140 bytes) 04500 001c 9e1b 0000 0211 0348 0a0d 0222E..........H..." 100a0d 0133 9292 829b 0008 d341 0000 0000...3.......A.... 200000 0000 0000 0000 0000 0000 0000 0000................ 300000 0000 0000 0000 0000 0000 0000 0000................ 400000 0000 0000 0000 0000 0000 0000 0000................ 500000 0000 0000 0000 0000 0000 0000 0000................ 600000 0000 0000 0000 0000 0000 0000 0000................ 700000 0000 0000 0000 0000 0000 0000 0000................ 802000 0df3 0008 0101 0002 d101...........
从帧3输出中,您可以确定帧3是从R3到R1的ICMP数据包。源地址(10.13.3.134)是接收原始数据包的地址。ICMP 错误消息在数据部分末尾包含过期的标签信息。其值为0x02d,即45。第4帧是从R4发送到R1的MPLS数据包。
收到ICMP消息后,R1发送另一个标签为47且TTL为3的数据包。R2和R3在发送过程中递减TTL并将数据包转发到R4。R4指出它是预期接收方,并发现UDP数据报端口无法到达。它通过 R3 和 R2 将 ICMP port unreachable 消息发送到 R1。
在此嗅探器输出中,要注意的重点用粗体表示:
Frame 5 (60 on wire, 60 captured) Ethernet II Destination: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Source: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Type: IP (0x0800) Trailer: 00000000000000000000000000000000... Internet Protocol Version: 4 Header length: 20 bytes Time to live: 1 Protocol: UDP (0x11) Header checksum: 0x0446 (correct) Source: 10.13.2.34 (10.13.2.34) Destination: 10.13.1.51 (10.13.1.51) User Datagram Protocol Source port: 37647 (37647) Destination port: 33436 (33436) Length: 8 Checksum: 0xd2c3 (correct) Frame 6 (74 on wire, 74 captured) Ethernet II Destination: 00:03:fd:1c:86:84 (Cisco_1c:86:84) Source: 00:04:4e:7a:74:00 (Cisco_7a:74:00) Type: MPLS label switched packet (0x8847) MultiProtocol Label Switching Header MPLS Label: Unknown (28) MPLS Experimental Bits: 6 MPLS Bottom Of Label Stack: 1 MPLS TTL: 255 Internet Protocol Version: 4 Header length: 20 bytes Time to live: 255 Protocol: ICMP (0x01) Header checksum: 0x5694 (correct) Source: 10.13.5.10 (10.13.5.10) Destination: 10.13.2.34 (10.13.2.34) Internet Control Message Protocol Type: 3 (Destination unreachable) Code: 3 (Port unreachable) Checksum: 0x1485 (correct) Data (28 bytes) 04500 001c 9e1d 0000 0111 0446 0a0d 0222E..........F..." 100a0d 0133 930f 829c 0008 d2c3...3........
帧5显示UDP数据报由R1发送到R4。UDP数据报中的目的端口值是33436(大于32000),如Normal traceroute Command一节中所述。
在第6帧中,R4向R1发送目的不可达ICMP类型和端口不可达代码。来自R2和R3的所有早期ICMP消息的类型字段均设置为超出生存时间。扩展 traceroute 命令的输出如下所示:
R1#traceroute Protocol [ip]: Target IP address: 10.13.1.51 Source address: 10.13.2.34 Numeric display [n]: Timeout in seconds [3]: Probe count [3]: 1 Minimum Time to Live [1]: Maximum Time to Live [30]: Port Number [33434]: Loose, Strict, Record, Timestamp, Verbose[none]: Type escape sequence to abort. Tracing the route to 10.13.1.51 1 10.13.2.33 [MPLS: Label 47 Exp 0] 0 msec 2 10.13.3.134 [MPLS: Label 45 Exp 0] 0 msec 3 10.13.5.10 4 msec R1#
默认情况下,traceroute 命令针对每个 TTL 值使用三个探测。它发送三个 TTL 为 1 的数据包,三个 TTL 为 2 的数据包,依此类推。此 traceroute 命令随单个探测发出,因此易于跟踪和调试。如输出中所示,traceroute 命令还显示出过期标签值。
当您配置 MPLS 时,会在将 IP 数据包转发到 MPLS 域中时由标签交换路由器 (LSR) 附加一个标签。此标签必须在 TTL 字段中含有值。默认情况下,LSR 读取传入数据包的 IP 报头中的 TTL 字段,将其递减 1,然后将剩余内容复制到 MPLS 报头的 TTL 字段中。核心 LSR 仅查看最上面的标签。如果 TTL 值未达到 0,则转发该数据包。弹出标签的输出边缘 LSR 将标签 TTL 字段的剩余内容复制到 IP 报头的 TTL 字段中,然后将 IP 数据包转发出 MPLS 域。
此行为可使用 no mpls ip propagate-ttl configuration 配置命令来更改。附加标签时,输入边缘 LSR 使用值 255 作为标签中的 TTL 值。弹出标签时,输出边缘 LSR 不会将标签 TTL 值复制到 IP 报头中。最终结果是 IP 报头 TTL 不会反映跨 MPLS 核心所使用的跳数;因此,当用户从其网络的一端到另一端执行 traceroute 时,MPLS 核心网络中的路由器不会出现在 traceroute 信息中。在输入和输出边缘 LSR 中禁用 TTL 传播十分重要。否则,IP 报头在离开 MPLS 域时所具有的值可能高于进入该域时所具有的值。
下面是一个示例:
C1对C2执行traceroute。使用默认的IP TTL传播操作,C1中的traceroute如下所示:
C1#traceroute C2.cust.com Tracing the route to C2.cust.com 1 A.provider.net 44 msec 36 msec 32 msec 2 B provider.net 164 msec 132 msec 128 msec 3 C.provider.net 148 msec 156 msec 152 msec 4 C2.cust.com 180 msec * 181 msec
此输出说明了 MPLS 网络中的典型 traceroute 行为。当带有标记的数据包的标签报头带有来自原始 IP 数据包的 TTL 值时,该路径中的路由会丢弃超出 TTL 的数据包。因此,traceroute 显示出该路径中的所有路由器。行为如下:
第一个数据包是TTL等于1的IP数据包。路由器A会递减TTL并丢弃该数据包,因为它达到0。会向源发送ICMP TTL超出消息。
发送的第二个数据包为 TTL 等于 2 的 IP 数据包。路由器 A 递减该 TTL,对数据包进行标记,然后将该数据包转发到路由器 B。
路由器 B 递减 MPLS 报头中的 TTL 值,丢弃该数据包,并向源发送一个 ICMP TTL 超出消息。由于它是已丢失的 MPLS 数据包,因此 ICMP 消息的返回地址必须派生自该 MPLS 数据包内 IP 报头中的源地址。但是,该 IP 地址实际上对于路由器 B 可能是未知的,因此,路由器 B 会沿已丢弃数据包所经过的相同标签交换路径 (LSP)(朝着路由器 C 的方向)转发 ICMP 消息。 在 LSP 末尾处,将会删除标签,并根据 IP 报头中的目标地址转发 ICMP 消息(朝着路由器 C1)。
第三个数据包(TTL 为 3)会经历与前面的数据包类似的处理,只不过路由器 C 现在是丢弃数据包的路由器(基于 IP 报头中的 TTL)。路由器 B 之前因倒数第二跳弹出而删除了标签,并且在 IP 报头中复制了 TTL。
第四个数据包(TTL 为 4)到达检查 IP 报头的 TTL 的最终目标。
如果在全局配置模式下使用no mpls ip propagate-ttl命令禁用IP TTL传播,则TTL值不会复制在IP报头中,C1到C2的traceroute如下所示:
C1#traceroute C2.cust.com Tracing the route to C2.cust.com 1 A.provider.net 44 msec 36 msec 32 msec 2 C2.cust.com 180 msec * 181 msec
当在这种情况下使用 traceroute 命令时,只会从看到 IP 报头中存储的实际 TTL 的那些路由器接收 ICMP 回复。在这种情况下,路由器 C1 执行 traceroute 命令(如所示的那样),但核心路由器不会将 TTL 复制到标签或从标签复制 TTL。这会导致以下行为:
第一个数据包是 TTL 等于 1 的 IP 数据包。路由器 A 递减 TTL,丢弃数据包,并向源发送 ICMP TTL 超出消息。
第二个数据包是 TTL 等于 2 的 IP 数据包。路由器 A 递减 TTL,对数据包进行标记,并将 MPLS 报头中的 TTL 设置为 255。
路由器 B 将 MPLS 报头中的 TTL 递减为 254,删除 MPLS 标签,并将 MPLS 报头中的 TTL 值复制到 IP 报头的 TTL 字段中。
路由器C递减IP TTL并将数据包发送到下一跳路由器C2。该数据包已到达最终目的地。