it-swarm-eu.dev

Perché localhost IP 127.0.0.1?

Mi sono chiesto quale sia l'origine della decisione per rendere localhost l'indirizzo IP 127.0.0.1. Qual è il "significato" di 127? qual è il "significato" di 0.0.1?

85
Roee Adler

127 è l'ultimo numero di rete in una rete di classe A con una subnet mask di 255.0.0.0. 127.0.0.1 è il primo indirizzo assegnabile nella subnet. 127.0.0.0 non può essere utilizzato perché sarebbe il numero del filo. Ma l'utilizzo di altri numeri per la parte Host dovrebbe funzionare correttamente e ripristinare l'utilizzo di 127.0.0.1. Puoi provarlo da solo eseguendo il ping 127.1.1.1 se lo desideri. Perché hanno aspettato fino all'ultimo numero di rete per implementare questo? Non penso sia documentato.

87
John T

La prima menzione che posso trovare riguardo l'assegnazione di 127 come loopback è novembre 1986 RFC 990 , scritto da Reynolds e Postel:

L'indirizzo zero deve essere interpretato come "questo", come in "questa rete".

Ad esempio, l'indirizzo 0.0.0.37 potrebbe essere interpretato come Host 37 su questa rete.

...

Il numero di rete della classe A 127 è assegnato alla funzione "loopback", ovvero un datagramma inviato da un protocollo di livello superiore a un indirizzo di rete 127 deve essere riavvolto all'interno dell'Host. Nessun datagramma "inviato" a un indirizzo di rete 127 dovrebbe mai apparire su qualsiasi rete da nessuna parte.

Già nel settembre 1981 RFC 790 , 0 e 127 erano già riservati:

 000.rrr.rrr.rrr Riservato [JBP] 
 ... 
 127.rrr.rrr.rrr Riservato [JBP] 

0 e 127 erano le uniche reti di Classe A riservate per il 1981. 0 è stato usato per indicare un host specifico, lasciando 127 per loopback.

So che questo non risponde alla domanda, ma questo è il momento in cui ho potuto scavare. Avrebbe potuto essere più sensato scegliere 1.0.0.0 per il loopback, ma ciò era già stato assegnato alla rete radio BBN Packet.

56
hyperslug

I progettisti di Internet sapevano davvero come funzionava l'hardware, e pensavano a un'implementazione di basso livello in mente.

I valori 0, 127 e 255 sono speciali nell'assemblaggio di 8 bit e nella programmazione del linguaggio macchina perché ci sono "trucchi" che puoi usare per testare questi valori e diramarti su codice diverso usando istruzioni più piccole che si eseguono più velocemente di altri interi. 127 è il numero intero con 8 bit con segno più alto, quindi incrementarlo di 1 causerà un overflow con segno. Analogamente, l'incremento di 255 causerà un overflow non firmato. Il semplice caricamento del valore 0 in un registro di solito imposta un flag di zero sul chip. Immagina che il programma di rete assomigli a questo in pseudocodice:

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

Sebbene dipenda dal chip, in quei giorni la maggior parte dei chip poteva codificare questi test con 2 parole, 3 parole e 3 parole rispettivamente (totale 8 parole) e inoltre quei test particolari erano tutti suscettibili di essere eseguiti in un ciclo di clock ciascuno. L'utilizzo di qualsiasi altro valore richiederebbe probabilmente 4 parole ciascuna (12 parole in totale), un aumento del 50% delle dimensioni del codice e probabilmente anche un aumento del 50% del tempo di esecuzione.

23
Joseph Bui

Se pensi a cosa significhi un localhost o un indirizzo IP di loopback, ti ​​rendi conto che non vuoi mai vedere quell'indirizzo, o la rete a cui appartiene quell'indirizzo, al di fuori di un host. (All'interno di un host, è troppo buio per vederlo. Scuse a Mark Twain.)

Quindi, qualcuno doveva scegliere una rete IP per rappresentare questo indirizzo localhost. Non ricordo chi l'abbia scelto per primo, ma è specificato nella richiesta di commenti IETF che viene periodicamente emessa come "Requisiti host".

È stato fatto tanto tempo fa, che l'idea di "perdere" un intero indirizzo di classe A non è entrata nella mente di nessuno in quel momento.

L'utilità di localhost è che puoi parlare da solo usando un indirizzo IP hard-coded. È stato usato molto prima che esistesse il Domain Name System. Potresti effettivamente utilizzare uno qualsiasi degli indirizzi validi 127.x.x.x, ma nessuno lo fa mai. Non puoi intrufolarti e usare 127 come una vera rete perché la RFC "Router Requirements" non consente mai di instradare quella rete su Internet.

5
kwe

Innanzitutto, l'intera gamma 127.x.x.x punta al tuo localhost.
127 in binario è "01111111". "11111111" = 255 e 0 sono riservati, quindi la scelta è ovvia :)

4
kolypto

Perché quando sono stati creati quegli standard, i computer erano lenti e solitamente limitati a registri a 8 bit. Il confronto tra numeri e numeri era molto lento, soprattutto se quei numeri dovevano essere recuperati dal retro, quindi REALMENTE rallentava la memoria. Registri, cioè l'archiviazione "CPU on board" era molto più veloce.

Inoltre quei vecchi computer avevano istruzioni speciali e più veloci per rilevare "uguale a zero", "diverso da zero", "intero negativo/positivo" (dove il segno era ... indovina quale, il bit più a sinistra, ora vedi una connessione con 127 , questo è il numero con tutto il "1" binario tranne il segno = più a sinistra?).

Di conseguenza, si trattava di numeri speciali, in quanto consentivano agli inganni di programmazione di risparmiare un sacco di cicli della CPU sulle operazioni eseguite di frequente.

Non vedresti mai un "IF CallerIP =" 0 "ma un'istruzione" IF NotZero (CallerIP) ".

Potresti controllare le istruzioni di assemblaggio antiche come "BEQ, BNE" (6502 CPU) per spiegazioni più lunghe. Inoltre controlla questa pagina .

Alla fine:

0, 255 e 127 potrebbero essere tutti controllati con una sola, più veloce, istruzione. Anche i linguaggi di alto livello come C hanno funzioni di confronto "a corto" che il compilatore può ottimizzare internamente in un'unica istruzione.

Anni 70 e 80 programmatori hanno davvero prodotto magnifiche architetture con risorse super-scarse, dietro standard come la numerazione IP c'è un sacco di pensiero e genialità.

3
Dario Fumagalli