私は、localhost
IPアドレスを決定する決定の起源は何かと考えました127.0.0.1
。「意味」とは127
何ですか?「意味」とは0.0.1
何ですか?
私は、localhost
IPアドレスを決定する決定の起源は何かと考えました127.0.0.1
。「意味」とは127
何ですか?「意味」とは0.0.1
何ですか?
回答:
127は、サブネットマスクがのクラスAネットワークの最後のネットワーク番号です255.0.0.0
。127.0.0.1
サブネット内の最初の割り当て可能なアドレスです。127.0.0.0
線番になるため使用できません。ただし、ホスト部分に他の番号を使用すると、正常に機能し、を使用するようになり127.0.0.1
ます。127.1.1.1
必要に応じて、pingを実行して自分で試すことができます。なぜ彼らはこれを実装するために最後のネットワーク番号まで待ったのですか?文書化されているとは思わない。
ループバックは1986年11月のRFC 990であり、レイノルズとポステルによって作成されたため、127の割り当てに関して最初に言及した言及は次のとおりです。
アドレスゼロは、「this network」のように「this」を意味すると解釈されます。
たとえば、アドレス0.0.0.37は、このネットワーク上のホスト37を意味すると解釈できます。
...
クラスAネットワーク番号127には「ループバック」機能が割り当てられます。つまり、上位レベルのプロトコルによってネットワーク127アドレスに送信されるデータグラムは、ホスト内でループバックする必要があります。ネットワーク127アドレスに「送信」されたデータグラムは、どこのネットワークにも表示されません。
1981年9月のRFC 790でさえ、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アドレスが何を意味するかを考えると、ホストの外部でそのアドレスまたはそのアドレスが属するネットワークを見たくないことを認識します。(ホストの内部では、暗すぎて見えません。マークトウェインに謝罪します。)
そのため、誰かがこのローカルホストアドレスを表すIPネットワークを選択する必要がありました。誰が最初に選択したかは思い出せませんが、IETFの「ホスト要件」として定期的に発行されるコメントのリクエストで指定されています。
クラスAのアドレス全体を「無駄にする」という考えが、当時誰の心にも入らなかったのは、かなり前のことです。
localhostのユーティリティは、ハードコードされたIPアドレスを使用して自分と会話できることです。ドメインネームシステムが存在するずっと前に使用されていました。実際には127.xxxの有効なアドレスを使用できますが、誰も使用しません。「ルーター要件」RFCでは、インターネット上でそのネットワークをルーティングすることは許可されていないため、実際のネットワークとして127をこっそり使用することはできません。
まず、127.xxxの範囲全体がローカルホストを指します。
バイナリの127は「01111111」です。"11111111" = 255と0は予約されているため、選択は明らかです:)
これらの標準が作成されたとき、コンピューターは遅く、通常は8ビットのレジスターに制限されていたためです。数値を数値と比較するのは非常に遅く、特にそれらの数値をバックからフェッチする必要がある場合は、本当にメモリが遅くなります。レジスタ、つまり「CPU on board」ストレージははるかに高速でした。
さらに、これらの古いコンピューターには、「ゼロに等しい」、「ゼロとは異なる」、「負/正の整数」を検出するための特別な高速命令がありました、これは、左端の=記号を除くすべてのバイナリ「1」を持つ数値です)。
したがって、これらは特別な数字でした。なぜなら、それらはプログラミングのトリックによって、頻繁に行われる操作で多くのCPUサイクルを節約できるからです。
「IF CallerIP = "0"ではなく、 "IF NotZero(CallerIP)"命令が表示されることはありません。
長い説明については、「BEQ、BNE」(6502 CPU)などの古いアセンブリ命令を確認してください。また、このページをチェックしてください。
最終的には:
0、255、127はすべて、1つの最速の命令でチェックできます。Cのようなさらに高レベルの言語には、コンパイラが内部的に1つの命令に最適化する「shortuct」比較関数があります。
70年と80年のプログラマーは、IPナンバリングなどの標準の背後にある、非常に乏しいリソースを備えた壮大なアーキテクチャを実際に生み出し、多くの考えと天才があります。