Mi chiedevo quale sia l'origine della decisione di prendere localhost
l'indirizzo IP 127.0.0.1
. Qual è il "significato" di 127
? qual è il "significato" di 0.0.1
?
Mi chiedevo quale sia l'origine della decisione di prendere localhost
l'indirizzo IP 127.0.0.1
. Qual è il "significato" di 127
? qual è il "significato" di 0.0.1
?
Risposte:
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 sottorete. 127.0.0.0
non può essere utilizzato perché sarebbe il numero del filo. Ma l'utilizzo di qualsiasi altro numero per la parte host dovrebbe funzionare correttamente e ripristinare l'utilizzo 127.0.0.1
. Puoi provarlo tu stesso eseguendo il ping 127.1.1.1
se lo desideri. Perché hanno atteso l'ultimo numero di rete per implementarlo? Non credo sia documentato.
La prima menzione che posso trovare sull'assegnazione di 127 come loopback è la RFC 990 del novembre 1986 creata da Reynolds e Postel:
L'indirizzo zero deve essere interpretato nel senso di "questo", come in "questa rete".
Ad esempio, l'indirizzo 0.0.0.37 potrebbe essere interpretato come host di significato 37 su questa rete.
...
Alla classe di rete A numero 127 viene assegnata la funzione "loopback", ovvero un datagramma inviato da un protocollo di livello superiore a un indirizzo di rete 127 dovrebbe tornare indietro all'interno dell'host. Nessun datagramma "inviato" a un indirizzo di rete 127 dovrebbe mai apparire su qualsiasi rete ovunque.
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 entro il 1981. 0 era usato per indicare un host specifico, quindi ha lasciato 127 per il loopback.
So che questo non risponde alla domanda, ma è il più lontano possibile. Potrebbe essere stato più sensato scegliere 1.0.0.0 per il loopback, ma questo era già stato dato a BBN Packet Radio Network.
I progettisti di Internet sapevano davvero come funzionava l'hardware e progettavano pensando all'implementazione di basso livello.
I valori 0, 127 e 255 sono speciali nella programmazione dell'assembly a 8 bit e nella programmazione del linguaggio macchina poiché esistono "trucchi" che è possibile utilizzare per testare questi valori e diramare su codice diverso utilizzando istruzioni più piccole che vengono eseguite più rapidamente rispetto ad altri numeri interi. 127 è il numero intero a 8 bit con il segno più alto, quindi aumentarlo di 1 provocherà un overflow con segno. Allo stesso modo, l'incremento di 255 provocherà un overflow senza segno. Caricare semplicemente il valore 0 in un registro di solito imposta un flag zero sul chip. Immagina che il programma di rete sia simile 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 particolari test avrebbero potuto essere eseguiti in 1 ciclo di clock ciascuno. L'uso di qualsiasi altro valore richiederebbe probabilmente 4 parole ciascuno (12 parole in totale), un aumento del 50% nella dimensione del codice e probabilmente un aumento del 50% nei tempi di esecuzione.
Se pensi a cosa significa un localhost o un indirizzo IP di loopback, ti rendi conto di non voler 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. Chiedo scusa a Mark Twain.)
Quindi, qualcuno ha dovuto scegliere una rete IP per rappresentare questo indirizzo localhost. Non ricordo chi lo scelse per primo, ma è specificato nella richiesta IETF di commenti che viene periodicamente emessa come "Requisiti dell'host".
Fu fatto tanto tempo fa che l'idea di "sprecare" un intero indirizzo di classe A non entrò nella mente di nessuno in quel momento.
L'utilità di localhost è che puoi parlare con te stesso usando un indirizzo IP codificato. Era usato molto prima che esistesse il Domain Name System. Puoi effettivamente utilizzare uno qualsiasi degli indirizzi validi 127.xxx, ma nessuno lo fa mai. Non puoi intrufolarti e usare 127 come una vera rete perché la RFC "Router Requirements" non consente di instradare mai quella rete su qualsiasi Internet.
Innanzitutto, l'intera gamma 127.xxx punta al tuo host locale.
127 in binario è "01111111". "11111111" = 255 e 0 sono riservati, quindi la scelta è ovvia :)
Perché quando questi standard sono stati creati, i computer erano lenti e di solito limitati ai registri a 8 bit. Il confronto tra numeri e numeri era molto lento, specialmente se quei numeri dovevano essere recuperati dal retro, quindi VERAMENTE memoria lenta. I registri, ovvero lo storage "CPU on board", erano molto più veloci.
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 un po ', il bit più a sinistra, ora vede una connessione con 127 , questo è il numero con tutto il binario "1" tranne il segno più a sinistra =?).
Pertanto quelli erano numeri speciali, perché consentivano ai trucchi di programmazione di salvare molti cicli della CPU su operazioni eseguite di frequente.
Non vedresti mai un'istruzione "IF CallerIP =" 0 "ma un'istruzione" IF NotZero (CallerIP) ".
Puoi andare a controllare le antiche istruzioni di assemblaggio come "BEQ, BNE" (6502 CPU) per spiegazioni più lunghe. Controlla anche questa pagina .
Alla fine:
0, 255 e 127 possono essere controllati tutti con un'istruzione più veloce. Anche linguaggi di livello più elevato come C hanno funzioni di confronto "a corto raggio" che il compilatore può ottimizzare internamente in un'unica istruzione.
I programmatori degli anni 70 e 80 hanno davvero prodotto magnifiche architetture con risorse super-scarse, dietro standard come la numerazione IP c'è un sacco di pensiero e genialità.