TTL=1的IP报文能否到达交换机的loopback接口?

网络工程 ip
2021-08-01 21:38:15

这是一个很困扰我的问题。我不能与同事争论,因为我看到的所有交换机都可以响应 ping 请求,即使我的 TTL=1。

所以我的问题是,交换机上的接口之间的 TTL 会减少吗?例如,我在接口 0/1 上有 192.168.1.1/24,在接口 0/2 上有 192.168.2.1/24 和一个带有 1.1.1.1/32 的环回接口。如果我在接口 0/1 上连接我的 PC,我应该能够 ping 接口 0/2 和交换机上的环回接口吗?

编辑:我上面提到的交换机实际上是一个路由器。抱歉问了一个令人困惑的问题。

4个回答

TTL 在入口数据包上进行检查,并在转发(=路由)数据包时减少。因此,发送 TTL=1 的数据包将使其能够到达本地目的地,但不会被路由。

TTL 是第 3 层 (IP) 方案,交换机不会递减它(除非它们是路由)。以太网帧具有任何和而L2段内切换IP TTL没有变化没有TTL值。

是的,TTL 值为 1 就足够了。

根据IPv4 的RFC791IPv6 的RFC2460,每当数据包由节点转发时,TTL 值都会递减 1。由于数据包在传递到环回接口时不会被转发,因此 TTL 不会递减并且 TTL 为 1 就足够了。IP 数据报不会在接口上出口,因此不会转发到另一个节点。

当网络堆栈处理数据包时,第 3 层设备(路由器、PC 等)应该减少 IPv4 数据包的 TTL(有关完整解释,请参阅此答案)。大多数 PC 操作系统实际上并没有这样做,但路由器会这样做。IPv4 TTL 确实应该反映处理时间。

另一方面,二层交换机是透明设备,只查看封装数据包的帧。交换机不知道或不关心数据包中的任何内容。这让它们甚至可以同时承载任何类型的第 3 层协议(IPv4、IPX、IPv6、AppleTalk 等)。例如,在添加或更改为 IPv6 时,您不会想要替换所有交换机,IPv6 的 IP 标头与 IPv4 不同。

您的环回示例就像不同网络上的主机,您的数据包必须路由到不同的网络,因此 TTL 将递减。当达到 时0,数据包将被丢弃。基本上,任何具有1到达路由器的 TTL的数据包都将被丢弃,除非数据包是针对它进入路由器的路由器接口的。

另一方面,如果交换机使用 SVI,则 SVI 将与源位于同一 LAN,并且帧在第 2 层交换,因此 TTL 永远不会递减。


编辑:

下面是一个示例,我 ping 下一跳路由器 VLAN 接口,然后我 ping 路由器 Loopback0 接口,TTL 为 1。我每次 ping 尝试都收到 ICMP 回复,但对环回的 ping 在传输过程中过期:

D:\>ping 198.18.1.1

Pinging 198.18.1.1 with 32 bytes of data:
Reply from 198.18.1.1: bytes=32 time<1ms TTL=128
Reply from 198.18.1.1: bytes=32 time<1ms TTL=128
Reply from 198.18.1.1: bytes=32 time<1ms TTL=128
Reply from 198.18.1.1: bytes=32 time<1ms TTL=128

Ping statistics for 198.18.1.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

D:\>ping -i 1 198.0.0.8

Pinging 198.0.0.8 with 32 bytes of data:
Reply from 198.18.1.1: TTL expired in transit.
Reply from 198.18.1.1: TTL expired in transit.
Reply from 198.18.1.1: TTL expired in transit.
Reply from 198.18.1.1: TTL expired in transit.

Ping statistics for 198.0.0.8:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

正如其他人评论的那样,TTL 为 0 的 IP 数据包将被丢弃,并且每当处理/重写 IP 标头时都会更新 TTL,并且通常会递减 1。实际上,每当数据包通过物理路由离开路由器时,TTL 都会递减界面。

为了更具体地回答您的问题,仅当它离开路由器时 TTL 才会递减。在您的情况下,对于发往环回接口或接口 0/2 的数据包,数据包不会退出路由器,IP 标头不会更新,因此 TTL 不会递减并返回 ping。

查看使用您的拓扑的几个示例:

  • 从主机 192.168.1.50 到 1.1.1.1 或 192.168.2.1 的 Ping:ping 由接口 0/1 上的路由器接收,TTL 为 1,因此数据包被接受,ping 目的地为本地接口,因此 IP 标头未更新且 TTL 未递减,数据包由 IP 接口(1.1.1.1 或 192.168.2.1)接收。平成功。

  • 从主机 192.168.1.50 到 192.168.2.50(LAN 上的主机)的 Ping:ping 由接口 0/1 上的路由器接收,TTL 为 1,因此数据包被接受,做出路由决定,数据包将从接口 0/2 路由到目的地 (192.168.2.50),在此阶段更新 IP 标头,递减 TTL 并丢弃数据包,因为 TTL 为 0。Ping 失败。

总之,如果您将 PC 连接到接口 0/1,是的,您应该能够 ping 接口 0/2 或环回接口。使用相同的设置,如果您尝试 ping 192.168.2.0/24 上的另一台主机(不是路由器),则 ping 将失败。

我已经使用 Cisco 7200 路由器进行了设置,以证明它在现实生活中是如何工作的:

  • PC1连接到路由器接口E1/1,IP地址为192.168.1.50/24
  • PC2连接到路由器接口E1/2,IP地址为192.168.2.50/24
  • 路由器在 E1/1 上有 IP 192.168.1.1/24
  • 路由器在 E1/2 上有 IP 192.168.2.1/24
  • 路由器有环回地址 1.1.1.1/32

首先,从 PC1 (192.168.1.50) ping 路由器 E1/2 (192.168.2.1),TTL 为 1(PING SUCCEEDS):

路由器调试输出:

*Nov  3 20:55:33.447: IP: s=192.168.1.50 (Ethernet1/1), d=192.168.2.1, len 84, rcvd 0
*Nov  3 20:55:33.451:     ICMP type=8, code=0
*Nov  3 20:55:33.451: ICMP: echo reply sent, src 192.168.2.1, dst 192.168.1.50, topology BASE, dscp 0 topoid 0
*Nov  3 20:55:33.451: FIBipv4-packet-proc: route packet from (local) src 192.168.2.1 dst 192.168.1.50
*Nov  3 20:55:33.451: FIBfwd-proc: packet routed by adj to Ethernet1/1 192.168.1.50
*Nov  3 20:55:33.451: FIBipv4-packet-proc: packet routing succeeded
*Nov  3 20:55:33.451: IP: s=192.168.2.1 (local), d=192.168.1.50 (Ethernet1/1), len 84, sending
*Nov  3 20:55:33.451:     ICMP type=0, code=0
R2#
*Nov  3 20:55:33.451: IP: s=192.168.2.1 (local), d=192.168.1.50 (Ethernet1/1), len 84, sending full packet
*Nov  3 20:55:33.455:     ICMP type=0, code=0
*Nov  3 20:55:33.455: IP: s=192.168.1.50 (Ethernet1/1), d=192.168.2.1, len 84, input feature
*Nov  3 20:55:33.455:     ICMP type=8, code=0, packet consumed, MCI Check(88), rtype 0, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
  • 路由器接收 IP 数据包 192.168.1.50 -> 192.168.2.1
  • 路由器不路由数据包这是一个本地接口,数据包不会退出路由器
  • 路由器从 192.168.2.1 -> 192.168.1.50 创建 ICMP Echo Reply
  • 路由器路由回复并从接口 E1/1 发送出去

其次,从 PC1 (192.168.1.50) 到 PC2 (192.168.2.50) 的 TTL 为 1 (PING FAILS) 的 ping:

路由器调试输出:

*Nov  3 20:57:23.419: FIBipv4-packet-proc: route packet from Ethernet1/1 src 192.168.1.50 dst 192.168.2.50
*Nov  3 20:57:23.419: FIBfwd-proc: packet routed by adj to Ethernet1/2 192.168.2.50
*Nov  3 20:57:23.419: FIBipv4-packet-proc: packet routing succeeded
*Nov  3 20:57:23.419: ICMP: time exceeded (time to live) sent to 192.168.1.50 (dest was 192.168.2.50), topology BASE, dscp 0 topoid 0
*Nov  3 20:57:23.419: FIBipv4-packet-proc: route packet from (local) src 192.168.1.1 dst 192.168.1.50
*Nov  3 20:57:23.419: FIBfwd-proc: packet routed by adj to Ethernet1/1 192.168.1.50
*Nov  3 20:57:23.419: FIBipv4-packet-proc: packet routing succeeded
R2#
*Nov  3 20:57:23.419: IP: s=192.168.1.1 (local), d=192.168.1.50 (Ethernet1/1), len 56, sending
*Nov  3 20:57:23.419:     ICMP type=11, code=0
*Nov  3 20:57:23.419: IP: s=192.168.1.1 (local), d=192.168.1.50 (Ethernet1/1), len 56, sending full packet
*Nov  3 20:57:23.419:     ICMP type=11, code=0
*Nov  3 20:57:23.419: IP: s=192.168.1.50 (Ethernet1/1), d=192.168.2.50, len 84, input feature
*Nov  3 20:57:23.419:     ICMP type=8, code=0, packet consumed, MCI Check(88), rtype 0, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
  • 路由器将数据包从 E1/1 路由到 E1/2
  • TTL减为0,超时,打包丢弃
  • 路由器将超出的 ICMP TTL 发送到数据包源
  • ICMP 数据包从 E1/1 路由到 PC1