Ping 一个 IP 地址,响应不同的 IP

Ping 一个 IP 地址,响应不同的 IP

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

但是如果我尝试 ping10.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

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

答案1

该行为实际上是由于 ping 的正常特性而引起的,与您的实际硬件无关。

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

所以057意味着57以 8 为基数,也就是 47。因此 ping 将发送ICMP查询位于地址的机器10.10.208.47并因此从中得到答案。

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

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

答案2

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

的手册页inet_aton显示:

按照 C 语言的规定,在 `.' 表示法中作为 `` 部分 '' 提供的所有数字可以是十进制、八进制或十六进制(即,前导 0x 或 0X 表示十六进制;否则,前导 0 表示八进制;否则,该数字将被解释为十进制)。

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

相关内容