Gostaria de saber qual é a origem da decisão de tomar localhost
o endereço IP 127.0.0.1
. Qual é o "significado" de 127
? qual é o "significado" de 0.0.1
?
Gostaria de saber qual é a origem da decisão de tomar localhost
o endereço IP 127.0.0.1
. Qual é o "significado" de 127
? qual é o "significado" de 0.0.1
?
Respostas:
127 é o último número de rede em uma rede classe A com uma máscara de sub-rede 255.0.0.0
. 127.0.0.1
é o primeiro endereço atribuível na sub-rede. 127.0.0.0
não pode ser usado porque esse seria o número do fio. Mas o uso de outros números para a parte do host deve funcionar bem e voltar ao uso 127.0.0.1
. Você pode tentar você mesmo executando o ping, 127.1.1.1
se desejar. Por que eles esperaram até o último número de rede para implementar isso? Eu não acho que esteja documentado.
A primeira menção que posso encontrar sobre a atribuição de 127 como loopback é novembro de 1986 RFC 990, de autoria de Reynolds e Postel:
O endereço zero deve ser interpretado como significando "isto", como em "esta rede".
Por exemplo, o endereço 0.0.0.37 poderia ser interpretado como significando o host 37 nesta rede.
...
O número de rede classe A 127 é atribuído à função "loopback", isto é, um datagrama enviado por um protocolo de nível superior a um endereço de rede 127 deve retornar dentro do host. Nenhum datagrama "enviado" para um endereço de rede 127 deve aparecer em qualquer rede em qualquer lugar.
Mesmo em setembro de 1981, as RFC 790 , 0 e 127 já estavam reservadas:
000.rrr.rrr.rrr Reservado [JBP] ... 127.rrr.rrr.rrr Reservado [JBP]
0 e 127 eram as únicas redes reservadas de Classe A em 1981. 0 foi usado para apontar para um host específico, de modo que deixou 127 para loopback.
Eu sei que isso não responde à pergunta, mas isso é o mais antigo que eu pude cavar. Poderia ter feito mais sentido escolher 1.0.0.0 para loopback, mas isso já foi dado à BBN Packet Radio Network.
Os designers da Internet realmente sabiam como o hardware funcionava e os projetaram com a implementação de baixo nível em mente.
Os valores 0, 127 e 255 são especiais na montagem de 8 bits e na programação de linguagem de máquina, pois existem "truques" que você pode usar para testar esses valores e ramificar para código diferente usando instruções menores que são executadas mais rapidamente do que para outros números inteiros. 127 é o número inteiro de 8 bits mais alto e assinado, portanto, incrementá-lo em 1 causará um estouro assinado. Da mesma forma, incrementar 255 causará um estouro sem sinal. Simplesmente carregar o valor 0 em um registrador geralmente definirá um sinalizador zero no chip. Imagine que o programa de rede se parece com isso no pseudocódigo:
if (value == 0) doLocal();
if (value == 127) doLoopback();
if (value == 255) doNetwork();
Embora dependa do chip, naqueles dias a maioria dos chips podia codificar esses testes com 2 palavras, 3 palavras e 3 palavras, respectivamente (total de 8 palavras) e, além disso, esses testes específicos provavelmente eram executados em 1 ciclo de clock cada. Usar qualquer outro valor provavelmente exigiria 4 palavras cada (total de 12 palavras), um aumento de 50% no tamanho do código e provavelmente um aumento de 50% no tempo de execução.
Se você pensar no significado de um host local ou endereço IP de loopback, percebe que nunca deseja ver esse endereço ou a rede à qual esse endereço pertence, fora de um host. (Dentro de um host, está escuro demais para vê-lo. Desculpas a Mark Twain.)
Então, alguém teve que escolher uma rede IP para representar este endereço de host local. Não me lembro de quem o escolheu primeiro, mas está especificado na solicitação de comentários da IETF, emitida periodicamente como "Requisitos de host".
Isso foi feito há muito tempo, que a idéia de "desperdiçar" um endereço inteiro de classe A não passou pela cabeça de ninguém na época.
O utilitário do localhost é que você pode conversar consigo mesmo usando um endereço IP codificado. Foi usado muito antes de existir o Sistema de Nomes de Domínio. Você poderia realmente usar qualquer um dos endereços válidos 127.xxx, mas ninguém nunca usa. Você não pode esgueirar-se e usar 127 como uma rede real porque o RFC "Requisitos de roteador" proíbe o roteamento dessa rede em qualquer Internet.
Primeiro, todo o intervalo 127.xxx aponta para o seu host local.
127 no binário é "01111111". "11111111" = 255 e 0 são reservados, portanto a escolha é óbvia :)
Porque quando esses padrões foram criados, os computadores eram lentos e geralmente limitados a registros de 8 bits. A comparação de números com números era muito lenta, especialmente se esses números tivessem que ser buscados na parte de trás e, em seguida, MUITO memória lenta. Registros, ou seja, o armazenamento "CPU on board" foi muito mais rápido.
Além disso, esses computadores antigos tinham instruções especiais e mais rápidas para detectar "igual a zero", "diferente de zero", "número inteiro negativo / positivo" (onde o sinal estava ... adivinhem, o bit mais à esquerda, agora veja uma conexão com 127 , esse é o número com todo o binário "1", exceto o sinal = mais à esquerda =).
Portanto, esses eram números especiais, porque permitiam que truques de programação economizassem muitos ciclos de CPU em operações realizadas com freqüência.
Você nunca veria uma instrução "IF CallerIP =" 0 ", mas" IF NotZero (CallerIP) ".
Você pode verificar as instruções de montagem antigas como "BEQ, BNE" (6502 CPUs) para obter explicações mais longas. Verifique também esta página .
No final:
0, 255 e 127 podem ser verificados com uma instrução mais rápida. Linguagens ainda mais de alto nível, como C, têm funções de comparação de "atalho" que o compilador pode otimizar internamente em uma única instrução.
Nos anos 70 e 80, os programadores realmente produziram arquiteturas magníficas com recursos escassos; por trás de padrões como a numeração IP, há muito pensamento e genialidade.