web-dev-qa-db-ja.com

IPアドレスをpingすると、異なるIPで応答する

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プリンターであることを考えると、この奇妙な問題の原因は何でしょうか?

22
PsyStyle

この動作は実際にはpingの通常の機能によるものであり、実際のハードウェアとは関係ありません。

実際、IPアドレス(またはその一部)の前にゼロを付けると、数値は octal として解釈されます。

つまり、057は、ベース8の57を意味します。つまり、47です。したがって、pingは、アドレス10.10.208.47にあるマシンに [〜#〜] icmp [〜#〜] クエリを送信し、それから応答を取得します。

0の代わりに0xプレフィックスを使用して、16進数でアドレスにpingすることもできます。

編集:多くのコメントが示唆しているように、この機能は実際にはpingに固有のものではなく、IPアドレスを操作する多くのCLIソフトウェアにあります。

43
eltrai

Pingは、他の多くのUNIXプログラムと同様に、名前解決にUNIXシステムのCライブラリを使用します。使用される関数の1つはinet_atonです。

inet_atonのmanページには次のように書かれています。

「。」の「パーツ」として提供されるすべての番号表記は、C言語で指定されているように、10進数、8進数、または16進数です(つまり、先頭の0xまたは0Xは16進数を意味します。それ以外の場合、先頭の0は8進数を意味します。それ以外の場合、数値は10進数として解釈されます)。

したがって、先行ゼロを使用している場合、数値は8進数として解釈されます。したがって、57 = 047 = 0x39です。

15
Jenny D