localhost IP 127.0.0.1はなぜですか?


85

私は、localhostIPアドレスを決定する決定の起源は何かと考えました127.0.0.1。「意味」とは127何ですか?「意味」とは0.0.1何ですか?


2
私もこれに興味があります。IPv6ループバックは0:0:0:0:0:0:0:1であり、これは私にとって理にかなっています。
hyperslug

1
はい、IPv6のlocalhostはあまり多くの質問を投げかけません:)
Roee Adler

21
「0:0:0:0:0:0:0:1のような場所はありません」ドアマットはまだ見ていません!
ウィリアムヒルサム

9
@Wilを「:: 1のような場所はありません」に圧縮すると、もう少しビジネスが得られます。
new123456

6
@WilliamHilsumを「0000:0000:0000:0000:0000:0000:0000:0001のような場所はありません」に展開し、さらに充電します。
ニックT

回答:


87

127は、サブネットマスクがのクラスAネットワークの最後のネットワーク番号です255.0.0.0127.0.0.1サブネット内の最初の割り当て可能なアドレスです。127.0.0.0線番になるため使用できません。ただし、ホスト部分に他の番号を使用すると、正常に機能し、を使用するようになり127.0.0.1ます。127.1.1.1必要に応じて、pingを実行して自分で試すことができます。なぜ彼らはこれを実装するために最後のネットワーク番号まで待ったのですか?文書化されているとは思わない。


14
127をarbitrarily意的に選択する唯一の理由は、覚えやすい数字(01111111)であり、おそらく、一部のプログラムやWindowsコンポーネントの使用方法のように、1600万のホストアドレスがそれ自体とのみ通信できることを許可していたためです最近のポート)。RFCでは、ループバックに127.0.0.1/32を使用するのが標準的な方法であるとしか述べていません。ホストにループバックし、ネットワークに決してヒットしないことを除けば、ブロックの残りの部分で何を意図していたかについてはかなり曖昧です。
RoyalKnight 2009

2
すべてのブロックアドレスを127.0.0.1に戻すことは実装に依存しており、おそらくLinuxスタックの特性にすぎない可能性があります。Solarisでは、pingテストが成功するために、少なくともインターフェイスが宛先アドレスにバインドされている必要があります。
jlliagre

56

ループバックは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パケット無線ネットワークに与えられています。


23

インターネットの設計者は、ハードウェアがどのように機能するかを本当に知っていて、低レベルの実装を念頭に置いて設計しました。

値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%増加します。


1
当時の古いマシンには通常とは異なるワードサイズがあったため、私は「ワード」を使用していましたが、それでも多くの場合8ビット演算を使用していました。8088の場合、「バイト」と言うでしょう。
ジョセフブイ

5

localhostまたはループバックIPアドレスが何を意味するかを考えると、ホストの外部でそのアドレスまたはそのアドレスが属するネットワークを見たくないことを認識します。(ホストの内部では、暗すぎて見えません。マークトウェインに謝罪します。)

そのため、誰かがこのローカルホストアドレスを表すIPネットワークを選択する必要がありました。誰が最初に選択したかは思い出せませんが、IETFの「ホスト要件」として定期的に発行されるコメントのリクエストで指定されています。

クラスAのアドレス全体を「無駄にする」という考えが、当時誰の心にも入らなかったのは、かなり前のことです。

localhostのユーティリティは、ハードコードされたIPアドレスを使用して自分と会話できることです。ドメインネームシステムが存在するずっと前に使用されていました。実際には127.xxxの有効なアドレスを使用できますが、誰も使用しません。「ルーター要件」RFCでは、インターネット上でそのネットワークをルーティングすることは許可されていないため、実際のネットワークとして127をこっそり使用することはできません。


4

まず、127.xxxの範囲全体がローカルホストを指します。
バイナリの127は「01111111」です。"11111111" = 255と0は予約されているため、選択は明らかです:)


25
なぜそれが再び明らかになったのですか?
ローアドラー

彼らは単純なものを選んだと思う。繰り返しますが、すべての「1」が予約されているため、1つのゼロが追加されました:)
kolypto 09

なぜ10111111ではないのですか?:)または11011111または11101111または11110111または11111011または11111101またはそのようなもの
Mushex Antaranian

1
いや。再試行する。
アルディーアラム

4

これらの標準が作成されたとき、コンピューターは遅く、通常は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ナンバリングなどの標準の背後にある、非常に乏しいリソースを備えた壮大なアーキテクチャを実際に生み出し、多くの考えと天才があります。


素晴らしい答え。これは本当に最も明確で最も賢明な説明です。
not2qubit

実際、IPが設計され、IPの初期の土台がいくつか定められた頃、8ビットの整数倍のデータを扱うことは当然ではありませんでした。当時の多くのアーキテクチャには、たとえば12ビットまたは18ビットの倍数のレジスタとワードサイズがありました。これが、8進数が当時非常に人気があった理由の1つです。18ビットは、損失も無駄もなく、正確に6桁の8進数として表現できます。12ビットは4桁の8進数です。マイクロコンピューターは通常8ビット単位で動作しましたが、マイクロコンピューターがインターネットに定期的に(特に直接)接続されるようになったのはずっと後のことです。
CVn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.