IP アドレスを ping しようとすると、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
10.10.208.47
これはLexmark E120n プリンターであることを考えると、この奇妙な問題の原因は何なのでしょうか?
答え1
この動作は実際には ping の通常の機能によるものであり、実際のハードウェアとは関係ありません。
実際、IPアドレス(またはその一部)の先頭にゼロを付けると、その番号は次のように解釈されます。8進数。
つまり、057
857
進数では47です。したがって、pingは情報処理アドレスにあるマシンにクエリを実行し10.10.208.47
、そのマシンから応答を取得します。
0 だけではなく 0x プレフィックスを使用して、16 進数のアドレスに ping を実行することもできることに注意してください。
編集: 多くのコメントが示唆しているように、この機能は実際にはping
IP アドレスを操作する多くの CLI ソフトウェアに固有のものではなく、IP アドレスを操作する多くの CLI ソフトウェアに存在します。
答え2
Ping は、他の多くの UNIX プログラムと同様に、名前解決に UNIX システム上の C ライブラリを使用します。使用される関数の 1 つは ですinet_aton
。
のマニュアルページには次のようにinet_aton
書かれています:
「.」表記の「部分」として提供されるすべての数値は、C 言語で指定されているように、10 進数、8 進数、または 16 進数にすることができます (つまり、先頭の 0x または 0X は 16 進数を意味し、先頭の 0 は 8 進数を意味し、それ以外の場合は数値は 10 進数として解釈されます)。
したがって、先頭にゼロを使用すると、数値は 8 進数として解釈されます。つまり、57 = 047 = 0x39 となります。