web-dev-qa-db-ja.com

192.168.072(2ドットのみ)をpingすると、192.168.0.58から応答が返されるのはなぜですか?

私は誤ってIPアドレスのドットを外して192.168.072と入力しました。
驚いたことに、私は192.168.0.58のマシンに接続しました

192.168.072に対してpingを実行すると、192.168.0.58から応答があります。

どうしてこれなの?


私はWindowsドメイン上のWindows PCにいます。


192.168.72に対してpingを実行した場合、192.168.0.72から応答があります。したがって、0072(私の最初の間違い)は重要です。


この質問は、今週のスーパーユーザー質問でした。
詳細については、ブログエントリまたはブログに貢献する自分で

375
George Duckett

これには2つの理由があります。

まず、接頭辞「0」は、 8進数 の番号を示します。 oct(072)= dec(58)なので、192.168.072 = 192.168.58です。

次に、最後から2番目の0は、 の省略形 としてIPアドレスから削除できます。 127.0.1は127.0.0.1と解釈され、あなたの場合は192.168.58は192.168.0.58と解釈されます。

147
neu242

@ neu242の8進表記に関する重要な点、およびIPアドレスを短縮できるという観察に加えて、他の重要な部分は、短縮されたIPアドレスがどのように解釈されるかを知っていることです。

4つの数値の一部が欠落している場合、パーサーはゼロで埋められたバイトをバイトシーケンスの末尾(または先頭)に追加すると推測するかもしれません。しかし、これはOPが報告した動作と一致しません:192.168.072は192.168.58としてではなく192.168 。58として解析されました。または。192.168.58。

どうやらWindowsとLinuxのping(試したバージョンと試したバージョン)は、inet_aton()と同等のものを使用してIPアドレス引数を解析します。 inet_aton()のマニュアルページ の説明:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

192.168.072はabcパターンに適合するため、072(8進数として解析した後)は、バイナリの右端2バイトを定義する16ビット値として解釈されました。 0.58と同等のアドレス。

上記の規則は、4つの数値のいずれかが欠落している場合、必要なゼロで埋められたバイトがの最後の数値の直前に追加される...と言うのと同等です。バイト列の終わりでも始まりでも。 (最後に指定した数が256未満の場合、この方法で機能します。)

Pingの新しいバージョンでは、この種の省略表現や8進解釈が許可されない場合があります。 iputilsの2010ソースコード (pingを含む)は、inet_aton()ではなくinet_pton()を使用してIPアドレス引数を解析します。 inet_pton()のマニュアルページ の説明:

Inet_aton(3)およびinet_addr(3)とは異なり、inet_pton()はIPv6アドレスをサポートします。一方、inet_pton()はドット付き10進表記のIPv4アドレスのみを受け入れますが、inet_aton(3)およびinet_addr(3)はより一般的な数字およびドット表記(16進数および8進数形式、およびtは、4バイトすべてを明示的に書き込む必要があります)。

101
LarsH

あなたはipがそれらの位置に重要な意味で一緒に加えられた整数によって表されることができることも考慮しなければなりません。

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

これはクールなことです:

192.168.58は192.168.0.58になります。

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106も192.168.0.58になります。

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578も192.168.0.58になります

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578
24
vesquam