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


379

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

pingを送信する192.168.072と、から応答を受け取ります192.168.0.58

どうしてこれなの?


WindowsドメインのWindows PCを使用しています。


pingを送信する192.168.72とから応答が返される192.168.0.72ので0072(元の間違いでは)inが重要なようです。


この質問は今週のスーパーユーザー質問でした詳細について
ブログエントリを読むか自分でブログに投稿してください



2
興味深いことに、Linuxでもまったく同じことが起こります。ping 192.168.072印刷PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...]。
機械式カタツムリ

9
さらにランダム192.168.0.58なのは、応答を得るためのマシンがあったことです。その可能性は何ですか?
ジェームズメルツ

3
@KronoS学校や会社のネットワークを利用している場合、実際にはそれほど奇妙ではありません。一部のDHCPサーバーは昇順でアドレスを提供し、それらのほとんどが使用されます。
タウム

5
192.168.0.58私のためにタイムアウトしている..すべてのping要求が何らかの形でサーバーをノックアウトできますか?!
iamserious

回答:


570

誰もがRFCやIPクラスなどでそれを過度に複雑にしています。いくつかのテストを実行して、pingコマンドがユーザーによるIP入力を解析する方法を確認します(余分なチャフは削除されます)。

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

ご覧のとおり、pingコマンド(Windowsの場合)を使用すると、さまざまなIPアドレス形式を使用できます。IPv4アドレスは、次のように4つの部分(「ドットで区切られた」)に分割できます。A.B.C.Dまた、このpingコマンドを使用すると、一部を省略して0、次のデフォルトを入力できます。

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

単一のパーツのみを提供する場合、255(オクテットの最大値)未満の場合、上記のようにオクテットのように扱われますが、255を超える場合は変換され、次のフィールドにロールオーバーされます(つまり、mod 256)。

4つ以上のパーツを提供しても機能しないように見えるなど、いくつかのエッジケースがあります(たとえば、ping google.comのIPは、0.74.125.226.4またはのいずれでも機能しません74.125.226.4.0)。

16進表記をドット付きクワッド形式とフラット形式の両方で使用することもできますが0x、各オクテットの前に付加してフォーマットする必要があります。


そのため、(IPv4)IPアドレスを表す方法はたくさんあります。フラットまたはドット付きクワッド(またはドット付きトリプル、ドット付きダブル、またはドット付きシングル)形式を使用でき、それぞれに10進数、8進数、16進数を使用できます(または組み合わせることもできます)。たとえばgoogle.com、次の方法でping を実行できます。

  • google.com  (ドメイン名)
  • 74.125.226.4  (ドット付き10進数)
  • 1249763844  (フラット10進数)
  • 0112.0175.0342.0004  (点線の8進数)
  • 011237361004  (平らな8進数)
  • 0x4A.0x7D.0xE2.0x04  (点線の16進数)
  • 0x4A7DE204  (平六角形)
  • 74.0175.0xe2.4  (ಠ_ಠ)

(バイナリ表記のサポートが追加されなかったことに感謝します!)


アプリケーション

あなたの場合、ping 192.168.072は上記の表の3番目の形式(A.B.0.C)を使用するため、実際にはpingを実行しています192.168.0.072。さらに、最後の部分に先行ゼロがあるため、8進数(10進数では58)として扱われます。

ミステリーは解決しました。


Windows pingコマンドでは、入力にこのようなさまざまな形式を使用でき、非標準形式を表示されている方法で解釈しますが、そのような形式をどこでも使用できるというわけではありません。一部のプログラムでは、ドットで区切られたクワッドの4つの部分すべてを提供するように強制する場合もあれば、10進数と8進数の混合と一致を許可しない場合もあります。

また、IPv6アドレスは、解析ロジックと入力形式の許容性をさらに複雑にします。


補遺

syssは指摘あなたは数字の1で無効な文字を使用する場合(例えば、という8か、9オクタル、使用している場合g、次に進モードでは、など)pingことを認識し、それを文字列として解釈することが十分にスマートであるが(-al? -ic?)数値のIPアドレスではなくURL。

(多数の動脈瘤と心臓発作を起こし、指数関数的に爆発するデータ値の順列の数に対応するために「単純な」コードを書き込もうとしている人として、私はそれがすべての入力変動を正しく処理することを感謝しています;少なくとも3 1 +3 2 +3 3 +3 4 = 120バリエーション。

そのため、指定したとおり010.020.030.040にping 8.16.24.32が実行されますが、に渡す010.020.030.080ことpingはIPアドレスではなくURLのように扱われますfoo.bar.baz.com。換言すれば、サブドメインに対してpingを実行しようとした010サブドメインに020ドメイン上の030トップレベルドメインで080。しかし、080有効なTLD(のようにではない.com.netと彼らの仲間)、接続は右の最初の段階で失敗しました。

090.010.010.010無効な文字が異なるオクテットにある場合にも同じことが起こります。同様に0xf.0xf.0xf.0xfpings 15.15.15.15ですが、0xh1.0x1.0xg0.0f失敗します。

まあ、私はそれがあなたが複数の数ベースに流beingでないために得るものだと思います。

常に4ドット四つ(「40q」?「quaddy-quad」?「cutie-q」?)のアドレスを常に使用することを確認する方が簡単で安全です。

だから出かけて、いくつかの基数を学びましょう。パーティーを披露し、パーティーの生活を送ることができます。彼らが言うように、10種類の人々がいます。バイナリを知っている人と知らない人です。

IPv6アドレスについても考えないでください。私は彼らが111シールの1つだと思います!!!


39
複雑すぎる?実験は非常に有用な場合があり、この場合は良い答えが得られました。しかし、理論、ドキュメント、または標準がなければ、重要な要素を見逃し、それを知らない可能性があります。または、ある特定のバージョンがどのように動作するかを判断し、実装の約90%が間違っている可能性があります。または、実験の結果を説明するルールを考え出すこともできますが、意図したルールよりも複雑です。この場合、ドキュメンテーションのルール(for inet_aton())は1つの点でより単純であると思います-「アンダー/オーバー255」の条件はありません。
LarsH

71
ねえ、見て!コンピュータサイエンスの「科学」の部分が登場します!(仮説、実験、検証)
Izkata

13
@LarsH、それは私のポイントですが、pingコマンド(少なくともWindowsの場合)はMicrosoftのプログラムの多く(特に悪名高い)IEのようなものです。それはあまりにも寛容になり、あなたが投げたものを何でもとって解釈しようとします。はい、そこにIPアドレス形式の公式文書であるが、これはISOイメージおよびRFCについての質問ではないこと、それは実用的ですが、私が何かをした、それは奇妙なことだ(確かに長い、乾燥、退屈に頼らずに答えることができる質問を技術仕様)-OPがそれらを読みたい場合にそれらにリンクするのも良いことです。
Synetech

6
0を前に付けた8進数の構文解析は、を除いて完全に破棄する必要がありますchmod。それでおしまい。これは、許可されている8進数の唯一の例外です。期間。
ジェームズダン

6
RGB HEXからDECへの変換に役立ちます。笑〜C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
ウィルソン

147

これには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として解釈されます。


7
ゼロをグループ化しません。実際には、各ドットを次のバイト境界に対応する区切り文字として扱います。したがって、IPアドレス2130706433と127.0.0.1は同じアドレスです。
セルジュ

2
よりprecislyそれはクワッドがIPアドレスの場合は表記を点在だ
Guillaume86

4
有名な先行ゼロがもう一度ヒットしました!
リュックM

2
今これが本当の答えです!
l --''''''--------- '' '' '' '' '' ''

2
その答えは間違っており、誤解を招くものです。1.0.2.3(1.2.3)で0をドロップすると、異なるIPアドレス(1.2.0.3)が得られます。
sch

101

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

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

どうやらWindowsとLinuxのping(試したバージョンと試したバージョン)は、inet_aton()と同等のものを使用してIPアドレス引数を解析します。inet_aton()manページには次のように書かれています:

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.072abcパターンに適合するので、072(8進数として解析した後)は、バイナリアドレスの右端の2バイトを定義する16ビット値として解釈されました0.58

上記のルールは、4つの数字のいずれかが欠落している場合、必要なゼロで埋められたバイトが、与えられた最後の数字の直前に追加されます...バイト列の最後でも先頭でもありません。(最後の数値が256未満の場合、この方法で機能します。)

pingの新しいバージョンでは、この種の省略表現や8進数の解釈が許可されない場合があります。私が見つけたiputils(pingを含む)の2010ソースコードは、inet_aton()ではなくinet_pton()を使用してIPアドレス引数を解析します。inet_pton()manページには次のように書かれています:

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


12
これが断然ベストな答えです。
ジョシュ


24

また、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

1
「0 * 256 ^ 1 + 58 * 256 ^ 0 = 58であるため、192.168.56は192.168.0.56になります」よろしいですか?最初のケースでは168に256 ^ 1が掛けられ、2番目のケースでは256 ^ 2が掛けられます。同様に、192は256 ^ 2対256 ^ 3で乗算されます。したがって、192.168.56は、ゼロのドロップなどの追加のルールがある場合にのみ192.168.0.56になります。
LarsH

@LarsH、ここで言われているのは、1の場所からすべてを基にする「通常の」カウントとは異なり、左から右に基づいているということです。したがって、最初のドットは、左側にあるものに256 ^ 3を掛け、2番目に256 ^ 2に掛け、3番目に256を掛けます。左側にドットがない場合は、256を掛けずに加算されます^ n。1.2.3。(1.2.3.0)は、正しく理解できれば、1.2.3(1.2.0.3)とは異なります。
iX3

@ iX3:その場合、「192.168.56は192.168.0.56になります」は正しくありません。最初のケースでは56に256 ^ 1が乗算されるのに対し、2番目のケースでは56にのみ乗算されるためですy 256 ^ 0。そして、OPの192.168.072は、192.168.0.58ではなく192.168.58.0として解釈されます。
LarsH

少し誤解を招くのは、アドレスの0が3桁目であるという事実です。このアドレスを検討してください192.168.1.56 1 * 256 ^ 1 + 56 * 256 ^ 0は312
vesquam

1
ドットは、どの数値に256の累乗を掛けるべきかを示すためにのみ使用されます。パーサーは最初のドットを探し、その前の数値に256 ^ 3を掛けます。2番目と3番目のドットに対して、それぞれ256 ^ 2と256 ^ 1だけ繰り返します。次に、すべての結果を加算します(一部の実装では、結果は同じですが、代わりに現在の合計を保持する場合があります)。これらのドットのいずれかが欠落している場合、乗算は実行されず、単に最終的な数値が現在の合計に加算されます。また1.2.3.、パーサーが合計に追加する最後の数値を見つけることができないため、エラーが発生する理由でもあります。
ジャスティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.