对IP地址执行Ping操作会响应不同的IP


21

当我尝试ping IP地址时,10.10.208.57由于该IP地址的网络中没有任何内容,因此没有响应。

但是,如果我尝试ping 10.10.208.0,57则另一个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打印机,这个奇怪问题的根源可能是什么?


3
凹凸,看在这个线程的答案:superuser.com/questions/486788/...
米哈尔Sokolowski

Answers:


43

该行为实际上是由于ping的正常功能所致,与您的实际硬件无关。

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

因此在以8为基数的47中057表示平均值57。因此ping将把ICMP查询发送到位于该地址的机器,10.10.208.47并因此从中获得答案。

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

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


哇!谢谢!我的心脏停顿了
一会儿

4
不只是ping。很多事情可以做到这一点。
珍妮D说恢复莫妮卡

1
巴什(Bash)像这样对待所有“ 整合者
蒂姆(Tim)

15

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

的手册页中inet_aton说:

所有数字均以``部分''形式提供。注释可以是C语言中指定的十进制,八进制或十六进制(即,前导0x或0X表示十六进制;否则,前导0表示八进制;否则,数字解释为十进制)。

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


我注意到甚至Windows的行为也一样。感谢您的详细回答!
PsyStyle

@PsyStyle不客气!它是广泛的操作系统和编程语言中数字的标准表示法。
珍妮D说恢复莫妮卡

“因此,当您使用前导零时,该数字将被解释为十进制。” 我认为这是一个错字,您的意思是解释为八进制吗?
Cruncher

1
谢谢@Cruncher。我责怪咖啡因流中血液浓度过高。
珍妮D说恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.