私は誤って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
から応答があります。したがって、0
の072
(私の最初の間違い)は重要です。
この質問は、今週のスーパーユーザー質問でした。
詳細については、ブログエントリまたはブログに貢献する自分で
@ 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バイトすべてを明示的に書き込む必要があります)。
あなたは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