Me preguntaba cuál es el origen de la decisión de tomar localhost
la dirección IP 127.0.0.1
. ¿Cuál es el "significado" de 127
? ¿Cuál es el "significado" de 0.0.1
?
Me preguntaba cuál es el origen de la decisión de tomar localhost
la dirección IP 127.0.0.1
. ¿Cuál es el "significado" de 127
? ¿Cuál es el "significado" de 0.0.1
?
Respuestas:
127 es el último número de red en una red de clase A con una máscara de subred de 255.0.0.0
. 127.0.0.1
es la primera dirección asignable en la subred. 127.0.0.0
no se puede usar porque ese sería el número de cable. Pero usar cualquier otro número para la parte del host debería funcionar bien y volver a usarlo 127.0.0.1
. Puede probarlo haciendo ping 127.1.1.1
si lo desea. ¿Por qué esperaron hasta el último número de red para implementar esto? No creo que esté documentado.
La primera mención que puedo encontrar sobre la asignación de 127 como loopback es noviembre de 1986 RFC 990 escrito por Reynolds y Postel:
La dirección cero debe interpretarse como "esto", como en "esta red".
Por ejemplo, la dirección 0.0.0.37 podría interpretarse como el host 37 en esta red.
...
Al número de red de clase A 127 se le asigna la función de "bucle de retorno", es decir, un datagrama enviado por un protocolo de nivel superior a una dirección de red 127 debe volver al bucle dentro del host. Ningún datagrama "enviado" a una dirección de red 127 debería aparecer en ninguna red en ningún lugar.
Incluso en septiembre de 1981, RFC 790 , 0 y 127 ya estaban reservados:
000.rrr.rrr.rrr Reservado [JBP] ... 127.rrr.rrr.rrr Reservado [JBP]
0 y 127 fueron las únicas redes reservadas de Clase A en 1981. 0 se utilizó para apuntar a un host específico, por lo que dejó 127 para loopback.
Sé que esto no responde la pregunta, pero esto es lo más atrás que pude cavar. Podría haber tenido más sentido elegir 1.0.0.0 para loopback, pero eso ya se le dio a BBN Packet Radio Network.
Los diseñadores de Internet realmente sabían cómo funcionaba el hardware, y lo diseñaron con una implementación de bajo nivel en mente.
Los valores 0, 127 y 255 son especiales en el ensamblaje de 8 bits y la programación en lenguaje de máquina porque hay "trucos" que puede usar para probar estos valores y bifurcarse a diferentes códigos usando instrucciones más pequeñas que se ejecutan más rápido que para otros enteros. 127 es el entero de 8 bits con signo más alto, por lo que su incremento en 1 provocará un desbordamiento de signo. Del mismo modo, incrementar 255 causará un desbordamiento sin signo. Simplemente cargar el valor 0 en un registro generalmente establecerá un indicador de cero en el chip. Imagine que el programa de red se ve así en pseudocódigo:
if (value == 0) doLocal();
if (value == 127) doLoopback();
if (value == 255) doNetwork();
Aunque depende del chip, en esos días la mayoría de los chips podían codificar estas pruebas con 2 palabras, 3 palabras y 3 palabras respectivamente (un total de 8 palabras) y además, esas pruebas particulares probablemente se ejecutarían en 1 ciclo de reloj cada una. El uso de cualquier otro valor probablemente requeriría 4 palabras cada una (un total de 12 palabras), un aumento del 50% en el tamaño del código y probablemente también un aumento del 50% en el tiempo de ejecución.
Si piensa en lo que significa una dirección IP localhost o loopback, se da cuenta de que nunca quiere ver esa dirección, o la red a la que pertenece esa dirección, fuera de un host. (Dentro de un host, está demasiado oscuro para verlo. Disculpas a Mark Twain).
Entonces, alguien tuvo que elegir una red IP para representar esta dirección de host local. No recuerdo quién lo eligió primero, pero se especifica en la Solicitud de comentarios IETF que se publica periódicamente como "Requisitos de host".
Se hizo hace tanto tiempo, que la idea de "desperdiciar" una dirección completa de clase A no entró en la mente de nadie en ese momento.
La utilidad de localhost es que puedes hablar contigo mismo usando una dirección IP codificada. Se usó mucho antes de que existiera el Sistema de nombres de dominio. En realidad, podría usar cualquiera de las direcciones válidas 127.xxx, pero nadie lo hace nunca. No puede colarse y usar 127 como una red real porque el RFC "Requisitos del enrutador" no permite el enrutamiento de esa red en cualquier Internet.
Primero, todo el rango 127.xxx apunta a su localhost.
127 en binario es "01111111". "11111111" = 255 y 0 están reservados, por lo que la elección es obvia :)
Porque cuando se crearon esos estándares, las computadoras eran lentas y generalmente se limitaban a registros de 8 bits. La comparación de números con números era muy lenta, especialmente si esos números debían buscarse desde atrás, entonces REALMENTE ralentizan la memoria. Los registros, es decir, el almacenamiento de "CPU a bordo" fueron mucho más rápidos.
Además, esas viejas computadoras tenían instrucciones especiales y más rápidas para detectar "igual a cero", "diferente a cero", "entero negativo / positivo" (donde estaba el signo ... adivina qué, el bit más a la izquierda, ahora ve una conexión con 127 , ese es el número con todos los "1" binarios, excepto el signo más a la izquierda =).
Por lo tanto, esos eran números especiales, porque permitían trucos de programación para ahorrar muchos ciclos de CPU en operaciones realizadas con frecuencia.
Nunca vería una instrucción "IF CallerIP =" 0 "sino una instrucción" IF NotZero (CallerIP) ".
Puede consultar las antiguas instrucciones de montaje como "BEQ, BNE" (6502 CPU) para obtener explicaciones más largas. También revise esta página .
En el final:
0, 255 y 127 podrían verificarse con una sola y más rápida instrucción. Incluso más lenguajes de alto nivel como C tienen funciones de comparación "shortuct" que el compilador puede optimizar internamente en una sola instrucción.
Los programadores de los años 70 y 80 realmente produjeron arquitecturas magníficas con recursos súper escasos, detrás de estándares como la numeración IP hay mucho pensamiento y genialidad.