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