Zastanawiałem się, skąd pochodzi decyzja o localhost
adresie IP 127.0.0.1
. Jakie jest „znaczenie” 127
? jakie jest „znaczenie” 0.0.1
?
Zastanawiałem się, skąd pochodzi decyzja o localhost
adresie IP 127.0.0.1
. Jakie jest „znaczenie” 127
? jakie jest „znaczenie” 0.0.1
?
Odpowiedzi:
127 jest ostatnim numerem sieci w sieci klasy A z maską podsieci 255.0.0.0
. 127.0.0.1
jest pierwszym przypisywalnym adresem w podsieci. 127.0.0.0
nie 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.1
jeśli chcesz. Dlaczego czekali na ostatni numer sieci, aby to wdrożyć? Nie sądzę, żeby to było udokumentowane.
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.
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.
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.
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 :)
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.