「ping X」はなぜ機能するのでしょうか。「X」は任意の整数です。

「ping X」はなぜ機能するのでしょうか。「X」は任意の整数です。

そこで、Windows 10 の ping ユーティリティの奇妙な癖を発見しました。IP アドレスではなく整数を ping すると、その数値が IPv4 アドレスに「変換」されます。変換では、最初のオクテットが 256^3 の位、2 番目のオクテットが 256^2、3 番目のオクテットが 256^1、最後のオクテットが「1」の位、つまり 256^0 になります。

たとえば、「ping 200」は 0.0.0.200 に ping しますが、「ping 400」は 0.0.1.144 に ping します。ここで、3 番目のオクテットの「1」は 256 (256 + 144 = 400) を表します。

簡単に Google 検索してみましたが (適切な検索語が思いつきませんでしたが)、何も見つかりませんでした。

私の唯一の理論は次の2つです:

  1. IP スキーマの以前のバージョン (つまり、未使用の v1、v2、または v3) では、単一の整数を使用する計画だった可能性があります。Microsoft は、下位互換性にこだわり、ping が最初にコード化されたずっと昔から、これを処理するための変換アルゴリズムを ping ユーティリティに書き込みました。
  2. ping ユーティリティのコーディング方法により、通常は有効な IPv4 アドレスを取得し、そのデータで何かを行う前に 1 つの整数に変換します。したがって、コード内のチェックとして、ユーザーが 1 つの整数を入力したと判断された場合、最初の変換手順はスキップされます。

何かアイデアはありますか? 同僚たちは間違いなく興味をそそられましたが、彼らも私と同じように何も知りませんでした。

編集: Arch Linux マシンでテストしたところ、同じ動作がそこでも発生することが確認できたので、私の最初の理論はおそらく信用できないものになったと思います。

答え1

答えはウィキペディア:

クラスフル ネットワークが実践されていたときは、他のアドレス表現が一般的に使用されていました。たとえば、ループバック アドレス 127.0.0.1 は、ネットワーク マスクに 8 ビット、ホスト番号に 24 ビットを持つクラス A ネットワークに属しているため、通常は 127.1 と表記されます。ドット表記のアドレスに 4 つ未満の数字が指定されている場合、最後の値は、アドレスを 4 オクテットに埋めるために必要なバイト数の整数として扱われます。したがって、アドレス 127.65530 は 127.0.255.250 に相当します。

答え2

それは奇妙なことではなく、特徴です。

IPv4 アドレスのドット表記は、IPv4 アドレスである 4 バイト (つまり 32 ビット) の整数 (IP パケットの 32 ビットの宛先フィールドに入力される) を表す方法にすぎないことに注意してください。ユーティリティによって、この整数の形式は異なります。

過去には、一部のブラウザがアドレス バーのアドレスとしてこのような 10 進数の整数を受け入れていたことは知っています。(現在使用している 2 つのブラウザ、Firefox と Chrome がこれを行わなくなったことに驚きました。)

答え3

「.0」は条件に応じて省略可能

マシンの TCP/IP プロトコル スイートが正しくインストールされているかどうかを確認するために、マシンでループ テストを実行するために「ping 127.0.0.1」コマンドをよく使用します。しかし、同じテスト結果は「ping 127.1」コマンドを使用しても得られます。実際、「ping 127.1」と「ping 127.0.0.1」の 2 つのコマンドは同じで、どちらもループ テストを実行しています。

なぜそうなるのでしょうか? これは、Ping コマンド アプリケーションで IP アドレスを使用するスキルです。IP アドレスが 32 桁の 2 進数で構成されていることは誰もが知っています。誰もが覚えやすいように、8 桁の 2 進数ごとに 10 進数に変換されます。したがって、覚えやすい IP アドレスは 4 つの 10 進数で構成されます (127.0.0.1 など)。Windows オペレーティング システムには「.0」を自動的に埋め込む機能があるため、「127.0.0.1」を「127.1」に変更できます。

ただし、この「.0」の省略は条件付きで制限されており、任意に省略することはできません。Pingコマンドの応用では、「ping 127.0.0.1」コマンドを「ping 127.1」に書き換えるなど、IPアドレスの最後の10進数の前に現れる1つ以上の「.0」のみを省略することができます。

1 つ以上の「.0」が 10 進数の最後の部分の隣ではなく、他の位置にある場合、この「.0」を省略することはできません。たとえば、「ping 202.0.96.1」を「ping 202.96.1」と記述することはできません。これは、「ping 202.96.1」によって返される結果が「202.0.96.1」の応答メッセージではなく、「202.96.0.1」の応答メッセージであるためです。

IPアドレスの代わりに数字文字列

Ping コマンドでは、IP アドレスの代わりに数値文字列を使用することもできます。「ping 3658906394」コマンドを実行すると、IP アドレス「218.22.123.26」の情報が返されます。

なぜそうなるのでしょうか? 実際、「3658906394」は IP アドレス「218.22.123.26」の別の表現です。 もちろん、同じ方法で他の IP アドレスに ping することもできます。

文字列はどのように変換されますか?実は、複雑ではありません。IPアドレス「218.22.123.26」を例にとると、IPアドレスを数値文字列に変換する方法は次のとおりです。まず「218.22.123.26」を16進数の「DA.16.7B.1A」に変換し、次にそれを削除します。小数点の後ろは「DA167B1A」になり、最後に16進数が10進数の「3658906394」に変換され、「218.22.123.26」は「3658906394」になります。他のIPアドレスを数値文字列に変換する場合も同じ方法が使用されます。

ヒント: 一部の LAN 環境では、「Ping+数値文字列」コマンドの使用が失敗し、「不明なホスト数値文字列」というプロンプト メッセージが表示される場合があります。これは、数値文字列が IP アドレスではなくホスト名に解決されるためです。

答え4

IPv4 アドレスは、符号なし 32 ビットの整数です。人間が読みやすくするための誤った試みとして、従来は UI で「ドット付き 10 進数」表記で表示され、最上位から始まる各オクテット (8 ビット バイト) が 10 進数として表され、次のオクテットとはドットで区切られます。

一部の UI では、UInt32 として解釈できるものなら何でも入力でき、結果の UInt32 を意図した IPv4 アドレスとして使用できることは、それほど驚くことではありません。

関連情報