ping一个IP地址响应不同的IP

Psy*_*yle 22 ip ping

当我尝试 ping IP 地址时,10.10.208.57我没有响应,因为该 IP 地址的网络中不存在任何内容。

但是,如果我尝试 ping 10.10.208.057而不是另一个 IP 地址响应:

root@everest:/root# ping 10.10.208.057
PING 10.10.208.057 (10.10.208.47) 56(84) bytes of data.
64 bytes from 10.10.208.47: icmp_seq=1 ttl=253 time=0.732 ms
64 bytes from 10.10.208.47: icmp_seq=2 ttl=253 time=0.695 ms
64 bytes from 10.10.208.47: icmp_seq=3 ttl=253 time=0.659 ms
64 bytes from 10.10.208.47: icmp_seq=4 ttl=253 time=0.705 ms
Run Code Online (Sandbox Code Playgroud)

考虑到这10.10.208.47是 Lexmark E120n 打印机,这个奇怪问题的根源是什么?

elt*_*rai 43

这种行为实际上是由于 ping 的正常功能造成的,与您的实际硬件无关。

实际上,在 IP 地址(或其中的一部分)前面加上前导零会导致数字被解释为八进制

所以057意味着57在基数 8 中是 47。因此 ping 会将ICMP查询发送到位于 address 的机器10.10.208.47,因此从它那里得到答案。

请注意,您还可以使用 0x 前缀而不是仅使用 0 来 ping 十六进制地址。

编辑:正如许多评论所暗示的那样,此功能实际上并非特定于ping并且可以在许多操作 IP 地址的 CLI 软件中找到。

  • 不只是平。很多事情都是这样做的。 (4认同)

Jen*_*y D 15

Ping 与许多其他 Unix 程序一样,使用您的 Unix 系统上的 C 库进行名称解析。使用的功能之一是inet_aton

手册页inet_aton说:

所有数字都以“.”的形式作为“部分”提供。表示法可以是十进制、八进制或十六进制,如 C 语言中所指定的(即,前导 0x 或 0X 表示十六进制;否则,前导 0 表示八进制;否则,将数字解释为十进制)。

因此,当您使用前导零时,该数字将被解释为八进制。因此,57 = 047 = 0x39。