Dlaczego localhost IP 127.0.0.1?

85

Zastanawiałem się, skąd pochodzi decyzja o localhostadresie IP 127.0.0.1. Jakie jest „znaczenie” 127? jakie jest „znaczenie” 0.0.1?

Roee Adler
źródło
2
Też jestem ciekawa. Sprzężenie zwrotne IPv6 to 0: 0: 0: 0: 0: 0: 0: 1, co ma dla mnie sens.
hyperslug
1
Tak, lokalny host IPv6 nie stawia zbyt wielu pytań :)
Roee Adler
21
Nie widziałem jeszcze maty drzwi „0: 0: 0: 0: 0: 0: 0: 1”!
William Hilsum
9
@Wil Skompresuj to do „nie ma miejsca jak :: 1”, a zyskasz trochę więcej biznesu.
new123456
6
@WilliamHilsum rozwiń go do „Nie ma takiego miejsca jak 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0001” i ładuj więcej.
Nick T

Odpowiedzi:

87

127 jest ostatnim numerem sieci w sieci klasy A z maską podsieci 255.0.0.0. 127.0.0.1jest pierwszym przypisywalnym adresem w podsieci. 127.0.0.0nie można użyć, ponieważ byłby to numer drutu. Ale użycie innych liczb w części hosta powinno działać poprawnie i powrócić do używania 127.0.0.1. Możesz spróbować samodzielnie, pingując, 127.1.1.1jeśli chcesz. Dlaczego czekali na ostatni numer sieci, aby to wdrożyć? Nie sądzę, żeby to było udokumentowane.

John T.
źródło
14
Jedynym powodem, dla którego widziałbym, jak arbitralnie wybierali 127, jest to, że jest to łatwa do zapamiętania liczba (01111111), i być może pozwalali 16 milionom adresów hostów na komunikowanie się tylko ze sobą i ze sobą (np. Jak niektóre programy i składniki systemu Windows używają porty obecnie). RFC tak naprawdę tylko wspomniały, że standardową praktyką jest używanie 127.0.0.1/32 do sprzężenia zwrotnego. Jest dość niejasne, co zamierzali zrobić przez resztę bloku, poza tym, że zapętla się z powrotem do hosta i nigdy nie łączy się z siecią, stąd moja powyższa spekulacja.
RoyalKnight
2
Przywrócenie wszystkich adresów bloków do 127.0.0.1 zależy od implementacji i być może jest to po prostu specyfika stosu Linux. Solaris wymaga przynajmniej powiązania interfejsu z adresem docelowym, aby test ping mógł zakończyć się powodzeniem.
jlliagre
56

Najwcześniejsza wzmianka o przypisaniu 127 jako pętli zwrotnej to RFC 990 z listopada 1986 r. Autorstwa Reynoldsa i Postela:

Adres zero należy interpretować jako oznaczający „to”, jak w „tej sieci”.

Na przykład adres 0.0.0.37 można interpretować jako oznaczający host 37 w tej sieci.

...

Do sieci o numerze 127 klasy A przypisana jest funkcja „sprzężenia zwrotnego”, to znaczy datagram wysłany przez protokół wyższego poziomu na adres sieci 127 powinien zapętlić się z powrotem w hoście. Żaden datagram „wysłany” na adres sieciowy 127 nigdy nie powinien pojawić się w żadnej sieci w dowolnym miejscu.

Już we wrześniu 1981 r. RFC 790 , 0 i 127 były już zarezerwowane:

000.rrr.rrr.rrr Zarezerwowany [JBP]
...
127.rrr.rrr.rrr Zarezerwowany [JBP]

0 i 127 były jedynymi zarezerwowanymi sieciami klasy A do 1981 r. 0 było używane do wskazywania określonego hosta, więc pozostawiono 127 do sprzężenia zwrotnego.

Wiem, że to nie odpowiada na pytanie, ale to jest tak daleko, jak mogłem wykopać. Być może bardziej sensowne byłoby wybranie 1.0.0.0 dla pętli zwrotnej, ale zostało to już przekazane BBN Packet Radio Network.

hiperslug
źródło
23

Projektanci Internetu naprawdę wiedzieli, jak działa sprzęt i projektowali z myślą o implementacji na niskim poziomie.

Wartości 0, 127 i 255 są specjalne w 8-bitowym asemblerze i programowaniu w języku maszynowym, ponieważ istnieją „sztuczki”, których można użyć do przetestowania tych wartości i rozgałęzienia do innego kodu za pomocą mniejszych instrukcji, które wykonują się szybciej niż w przypadku innych liczb całkowitych. 127 jest najwyższą 8-bitową liczbą całkowitą ze znakiem, więc zwiększenie jej o 1 spowoduje przepełnienie ze znakiem. Podobnie zwiększenie wartości 255 spowoduje przepełnienie bez znaku. Samo załadowanie wartości 0 do rejestru zwykle ustawia flagę zero na chipie. Wyobraź sobie, że program sieciowy wygląda tak w pseudokodzie:

if (value == 0) doLocal();
if (value == 127) doLoopback();
if (value == 255) doNetwork();

Chociaż zależy to od układu, w tych dniach większość układów mogła zakodować te testy odpowiednio za pomocą 2 słów, 3 słów i 3 słów (łącznie 8 słów), a ponadto wszystkie te konkretne testy mogły zostać wykonane w każdym cyklu zegara. Użycie dowolnej innej wartości wymagałoby prawdopodobnie 4 słów (łącznie 12 słów), 50% wzrostu rozmiaru kodu i prawdopodobnie również 50% wzrostu czasu wykonania.

Joseph Bui
źródło
1
Zauważ, że użyłem „słów”, ponieważ stare maszyny miały wówczas nietypowe rozmiary słów, ale często nadal używały 8-bitowej arytmetyki. W przypadku 8088 powiedziałbym „bajty”.
Joseph Bui
5

Jeśli zastanawiasz się, co oznacza adres IP hosta lokalnego lub sprzężenia zwrotnego, zdajesz sobie sprawę, że nigdy nie chcesz widzieć tego adresu ani sieci, do której należy ten adres, poza hostem. (Wewnątrz hosta jest zbyt ciemno, aby go zobaczyć. Przepraszam Marka Twaina.)

Więc ktoś musiał wybrać sieć IP do reprezentowania tego adresu hosta lokalnego. Nie pamiętam, kto pierwszy go wybrał, ale jest to określone w zapytaniu IETF o komentarze, które jest okresowo wydawane jako „Wymagania hosta”.

Stało się tak dawno temu, że pomysł „zmarnowania” całego adresu klasy A nie przyszedł do głowy nikomu.

Narzędzie localhost polega na tym, że możesz rozmawiać ze sobą za pomocą zakodowanego adresu IP. Użyto go na długo przed pojawieniem się systemu nazw domen. Możesz użyć dowolnego z prawidłowych adresów 127.xxx, ale nikt tego nie robi. Nie można się przekraść i używać 127 jako prawdziwej sieci, ponieważ RFC „Wymagania routera” nie pozwala na rutowanie tej sieci w żadnym Internecie.

kwe
źródło
4

Po pierwsze, cały zakres 127.xxx wskazuje na lokalnego hosta.
127 w systemie binarnym to „01111111”. „11111111” = 255 i 0 są zarezerwowane, więc wybór jest oczywisty :)

kolypto
źródło
25
Dlaczego to znów jest oczywiste?
Roee Adler
Wierzę, że wybrali coś prostego. Znów wszystkie „1” są zarezerwowane, więc dodano jedno zero :)
kolypto
więc czemu nie 10111111? :) lub 11011111 lub 11101111 lub 11110111 lub 11111011 lub 11111101 czy coś podobnego?
Mushex Antaranian
1
Nie. Spróbuj ponownie.
Ardee Aram
3

Ponieważ kiedy standardy te zostały utworzone, komputery działały wolno i zwykle ograniczały się do rejestrów 8-bitowych. Porównywanie liczb do liczb było bardzo powolne, szczególnie jeśli liczby te musiały być pobierane z tyłu, wówczas NAPRAWDĘ powolna pamięć. Rejestry, czyli pamięć „CPU on board” były znacznie szybsze.

Co więcej, te stare komputery miały specjalne, szybsze instrukcje wykrywania „równa zero”, „różna od zera”, „ujemna / dodatnia liczba całkowita” (gdzie znakiem był ... zgadnij co, lewy bit, teraz widzi połączenie z 127 , to jest liczba z wszystkimi liczbami binarnymi „1”, z wyjątkiem znaku „skrajnie lewy =”?

Dlatego były to numery specjalne, ponieważ pozwoliły na zaprogramowanie oszustwa, aby zaoszczędzić wiele cykli procesora na często wykonywanych operacjach.

Nigdy nie zobaczysz instrukcji „IF CallerIP =” 0 ”, ale instrukcję„ IF NotZero (CallerIP) ”.

Możesz sprawdzić starożytne instrukcje montażu, takie jak „BEQ, BNE” (6502 CPU), aby uzyskać dłuższe wyjaśnienia. Sprawdź również tę stronę .

Na końcu:

0, 255 i 127 można sprawdzić za pomocą jednej, najszybszej instrukcji. Jeszcze więcej języków wysokiego poziomu, takich jak C, ma funkcje porównywania „skrótów”, które kompilator może wewnętrznie zoptymalizować w jedną instrukcję.

Programiści z lat 70 i 80 naprawdę stworzyli wspaniałą architekturę z bardzo ograniczonymi zasobami, poza standardami takimi jak numeracja IP wiele myśli i geniusz.

Dario Fumagalli
źródło
Świetna odpowiedź. To naprawdę najjaśniejsze i najbardziej sensowne wyjaśnienie.
not2qubit
W rzeczywistości, kiedy zaprojektowano IP i określono niektóre z jego wczesnych podstaw, praca z danymi w liczbach całkowitych po 8 bitów nie była dana. Wiele architektur w tym czasie miało na przykład rejestry i rozmiary słów w wielokrotnościach 12 lub 18 bitów. Jest to jeden z powodów, dla których octal był w tym czasie tak popularny; 18 bitów można przedstawić jako dokładnie 6 cyfr ósemkowych bez strat i strat; 12 bitów to 4 cyfry ósemkowe. Mikrokomputery zwykle działały w 8-bitowych ilościach, ale dopiero znacznie później mikrokomputery zaczęły regularnie łączyć się (szczególnie bezpośrednio) z Internetem.
CVn