localhost
のIPアドレス127.0.0.1
を作成する決定の起源は何かと思いました。 127
の「意味」は何ですか? 0.0.1
の「意味」は何ですか?
127は、サブネットマスクが255.0.0.0
のクラスAネットワークの最後のネットワーク番号です。 127.0.0.1
は、サブネット内で割り当て可能な最初のアドレスです。 127.0.0.0
は線番になるため使用できません。ただし、ホスト部分に他の番号を使用しても問題なく機能し、127.0.0.1
に戻るはずです。必要に応じて、127.1.1.1
にpingを送信して、自分で試すことができます。なぜ彼らはこれを実装するために最後のネットワーク番号まで待ったのですか?文書化されているとは思いません。
ループバックは1986年11月なので、127の割り当てに関して最初に言及できることは RFC 99 ReynoldsとPostelによって作成されたものです。
アドレス「0」は、「this network」のように「this」を意味すると解釈されます。
たとえば、アドレス0.0.0.37は、このネットワーク上のホスト37を意味すると解釈できます。
...
クラスAネットワーク番号127には「ループバック」機能が割り当てられています。つまり、上位のプロトコルによってネットワーク127アドレスに送信されたデータグラムは、ホスト内でループバックする必要があります。ネットワーク127のアドレスに「送信」されたデータグラムは、どこのネットワークにも表示されません。
1981年9月の早い時期でさえ RFC 79 、0と127はすでに予約されています。
000.rrr.rrr.rrr予約済み[JBP] ... 127.rrr.rrr.rrr予約済み[JBP]
0と127は、1981年までに予約された唯一のクラスAネットワークでした。0は特定のホストを指すために使用されたため、127はループバック用に残されました。
これで問題が解決しないことは知っていますが、これは私ができる限り遠い昔のことです。ループバックに1.0.0.0を選択する方が理にかなっているかもしれませんが、それはすでにBBNパケット無線ネットワークに提供されています。
インターネットの設計者は、ハードウェアがどのように機能するかを本当に知っていて、低レベルの実装を念頭に置いて設計しました。
値0、127、255は、これらの値をテストし、他の整数よりも高速に実行される小さな命令を使用して異なるコードに分岐できる「トリック」があるため、8ビットアセンブリおよび機械語プログラミングでは特別です。 127は最も高い符号付き8ビット整数であるため、1ずつ増やすと符号付きオーバーフローが発生します。同様に、255をインクリメントすると、符号なしオーバーフローが発生します。単に値0をレジスタにロードするだけで、通常はチップにゼロフラグが設定されます。ネットワーキングプログラムが疑似コードで次のようになっているとします。
if (value == 0) doLocal();
if (value == 127) doLoopback();
if (value == 255) doNetwork();
チップによって異なりますが、当時のほとんどのチップはこれらのテストをそれぞれ2ワード、3ワード、3ワード(合計8ワード)でエンコードでき、さらにこれらの特定のテストはすべて1クロックサイクルで実行される可能性がありました。他の値を使用すると、おそらくそれぞれ4ワード(合計12ワード)、コードサイズが50%増加し、実行時間も50%増加する可能性があります。
LocalhostまたはループバックIPアドレスの意味を考えると、そのアドレス、またはそのアドレスが属するネットワークがホストの外部に表示されることは決してないことに気付くでしょう。 (ホストの中は暗すぎて見えません。マーク・トウェインに謝罪します。)
したがって、誰かがこのlocalhostアドレスを表すIPネットワークを選択する必要がありました。誰が最初にそれを選択したかは覚えていませんが、「ホスト要件」として定期的に発行されるIETF Request for Commentsで指定されています。
それはずっと前に行われたものであり、クラスAのアドレス全体を「無駄にする」という考えは、当時誰の心にも浮かびませんでした。
Localhostのユーティリティは、ハードコードされたIPアドレスを使用して自分と対話できることです。ドメインネームシステムが登場するずっと前から使用されていました。実際には127.x.x.xの有効なアドレスを使用できますが、誰も使用できません。 「ルーター要件」のRFCは、そのネットワークをインターネット上でルーティングすることを許可していないため、実際のネットワークとして127をこっそり使用することはできません。
これらの標準が作成されたとき、コンピュータは遅く、通常は8ビットのレジスタに制限されていたためです。数値と数値の比較は非常に遅く、特にこれらの数値を後ろからフェッチする必要がある場合は、メモリが非常に遅くなります。レジスター、つまり「CPUオンボード」ストレージははるかに高速でした。
さらに、これらの古いコンピュータには、「ゼロに等しい」、「ゼロとは異なる」、「負/正の整数」を検出するための特別なより高速な命令がありました(符号は... 、それは左端の=記号を除いてすべて2進数の「1」を持つ数値です?)。
そのため、頻繁に行われる操作で多くのCPUサイクルを節約するようにプログラミングの手口を許可したため、これらは特別な数値でした。
"IF CallerIP =" 0 "ではなく" IF NotZero(CallerIP) "命令は表示されません。
より詳しい説明については、「BEQ、BNE」(6502 CPU)などの古いアセンブリの手順を確認してください。また このページをチェックアウト 。
最終的には:
0、255、127はすべて、1つの最速の命令でチェックできます。 Cのようなさらに高水準の言語には、コンパイラが内部で1つの命令に最適化する「shortuct」比較関数があります。
70年と80年のプログラマーは、IPナンバリングのような標準の背後にある、非常に希少なリソースを備えた壮大なアーキテクチャを本当に生み出しました。
まず、127.x.x.xの範囲全体がローカルホストを指しています。
127のバイナリは「01111111」です。 "11111111" = 255と0は予約されているため、選択は明白です:)