題 為什麼localhost IP 127.0.0.1?


我想知道決定的起源是什麼 localhost的IP地址 127.0.0.1。的意義是什麼 127?的意義是什麼 0.0.1


77
2017-08-29 05:39


起源


我對此也很好奇。 IPv6環回為0:0:0:0:0:0:0:1,這對我來說很有意義。 - hyperslug
是的,IPv6的localhost不會引發太多問題:) - Roee Adler
我還沒有看到“沒有像0:0:0:0:0:0:0:1這樣的地方”門墊了! - William Hilsum
@Wil將它壓縮為“沒有像:: 1這樣的地方”,你會得到更多的業務。 - new123456
@WilliamHilsum將它擴展為“沒有像0000:0000:0000:0000:0000:0000:0000:0001這樣的地方”並收取更多費用。 - Nick T


答案:


127是具有子網掩碼的A類網絡中的最後一個網絡號 255.0.0.0127.0.0.1 是子網中的第一個可分配地址。 127.0.0.0 不能使用,因為那將是線號。但是使用主機部分的任何其他數字應該可以正常工作並恢復使用 127.0.0.1。您可以通過ping來自己嘗試 127.1.1.1 如果你願意的話。為什麼他們等到最後一個網絡號才能實現呢?我認為沒有記錄。


85
2017-08-29 05:50



我看到他們任意選擇127的唯一原因是它是一個容易記住的數字(01111111),也許他們允許1600萬個主機地址只能與自己和自己進行通信(就像一些程序和Windows組件使用的方式一樣)現在的港口)。 RFC只是真正提到127.0.0.1/32的標準做法是用於環回。除了它循環回到主機並且永遠不會進入網絡之外,它們對於其餘塊的意圖是非常模糊的,因此我的上述推測。 - RoyalKnight
讓所有塊地址恢復到127.0.0.1是依賴於實現的,可能只是Linux堆棧的特性。 Solaris至少需要將接口綁定到目標地址才能使ping測試成功。 - jlliagre


最早提到關於127的任務,因為環回是1986年11月 RFC 990 由Reynolds和Postel撰寫:

地址零將被解釋   意思是“這個”,如同“這個”   網絡”。

例如,地址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]

到1981年,0和127是唯一保留的A類網絡.0用於指向特定主機,因此留下127用於環回。

我知道這不能回答這個問題,但這可以追溯到我可以挖掘的時間。選擇1.0.0.0進行環回可能更有意義,但已經將其提供給BBN分組無線網絡。


54
2017-08-29 07:21





互聯網的設計者確實知道硬件是如何工作的,並且他們在設計時考慮了低級實現。

值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%。


22
2018-04-15 15:36



請注意,我使用“單詞”,因為當時的舊機器具有不尋常的字大小,但它們通常仍然使用8位算術。對於8088,我會說“字節”。 - Joseph Bui


如果您考慮本地主機或環回IP地址的含義,您會發現您永遠不希望在主機之外看到該地址或該地址所屬的網絡。 (在主人的內心,它看起來太黑了。向馬克吐溫道歉。)

所以,有人必須選擇一個IP網絡來代表這個本地主機地址。我不記得是誰首先選擇它,但它在IETF請求註釋中指定,定期發佈為“主機要求”。

這是在很久以前完成的,當時“浪費”整個A級地址的想法並沒有進入任何人的腦海。

localhost的實用程序是您可以使用硬編碼的IP地址與自己交談。它早在有域名系統之前就被使用了。您實際上可以使用任何127.x.x.x有效地址,但沒有人這樣做過。您不能潛行並使用127作為真實網絡,因為“路由器要求”RFC不允許在任何互聯網上路由該網絡。


5
2017-08-29 06:02





首先,整個127.x.x.x範圍指向您的localhost。
二進制127是“01111111”。 “11111111”= 255和0保留,所以選擇很明顯:)


4
2017-08-29 21:21



怎麼會再次顯而易見? - Roee Adler
我相信他們只選擇了簡單的東西。同樣,所有“1”都被保留,因此添加了一個零:) - kolypto
那為什麼不10111111? :)或11011111或11101111或11110111或11111011或11111101或類似的東西? - Mushex Antaranian
不。再試一次。 - Ardee Aram


因為當創建這些標準時,計算機很慢並且通常限於8位寄存器。 將數字與數字進行比較是非常緩慢的,特別是如果這些數字必須從後面獲取然後真的慢速記憶。寄存器,即“CPU板載”存儲速度要快得多。

此外,那些舊計算機有特殊的,更快的指令來檢測“等於零”,“不同於零”,“負/正整數”(其中符號是......猜測什麼,最左邊的位,現在看到與127的連接) ,這是所有二進制“1”的數字,除了最左邊的=符號?)。

因此,這些都是特殊數字,因為它們允許編程技巧,以便在頻繁完成的操作上節省大量CPU週期。

你永遠不會看到“IF CallerIP =”0“而是”IF NotZero(CallerIP)“指令。

您可以查看古老的裝配說明,如“BEQ,BNE”(6502 CPU),以獲得更長的解釋。也 查看此頁面

到底:

可以使用一條最快的指令檢查0,255和127。更像C的高級語言具有“短路”比較功能,編譯器可以在內部優化為一條指令。

70年代和80年代的程序員真正製作了具有超級稀缺資源的宏偉架構,在IP編號等標準背後有很多思想和天才。


3
2017-07-11 08:23



很好的答案。這確實是最清晰,最明智的解釋。 - not2qubit
實際上,當IP被設計出來並且它的一些早期基礎工作被確定時,處理8位整數倍的數據並不是給定的。例如,當時的許多體系結構具有寄存器和字大小,其數量為12或18位的倍數。這就是為什麼八角形在當時如此受歡迎的原因之一; 18位可以精確地表示為6位八位數,沒有丟失和浪費; 12位是4個八進制數字。微型計算機通常以8位數量工作,但它只是 許多 後來,微型計算機開始定期連接(特別是直接)到互聯網。 - α CVn