¿Por qué el ping 192.168.072 (solo 2 puntos) devuelve una respuesta de 192.168.0.58?

378

Por error, perdí el punto de una dirección IP y escribí 192.168.072.
Para mi sorpresa, me conecté a una máquina en192.168.0.58

Si hago ping 192.168.072recibo respuestas de 192.168.0.58.

¿Por qué es esto?


Estoy en una PC con Windows en un dominio de Windows.


Si un ping 192.168.72recibo una respuesta por parte de 192.168.0.72, por lo que parece la 0de 072(en mi error inicial) es significativo.


Esta pregunta fue una pregunta de superusuario de la semana .
Lea la entrada del blog para más detalles o contribuya al blog usted mismo

George Duckett
fuente
2
Curiosamente, sucede exactamente lo mismo en Linux: ping 192.168.072impresiones PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...].
Caracol mecánico
99
lo que es aún más aleatorio es que tenía una máquina 192.168.0.58para obtener una respuesta. ¿Cuáles son las posibilidades de eso?
James Mertz
3
@KronoS en realidad no es tan extraño si estás en la red de una escuela o empresa. Algunos servidores DHCP darán direcciones en orden creciente y la mayoría de ellos serán utilizados.
Taum
55
192.168.0.58me está agotando el tiempo ... ¿pueden todas las solicitudes de ping haber eliminado de alguna manera el servidor?
iamserious

Respuestas:

569

Todo el mundo lo complica demasiado con RFC, clases de IP y demás. Simplemente ejecute algunas pruebas para ver cómo el pingcomando analiza la entrada de IP por parte del usuario (se eliminó el desperdicio extraño):

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

Como puede ver, el pingcomando (en Windows) le permite usar diferentes formatos de dirección IP. Una dirección IPv4 se puede dividir en cuatro partes ("dotted-quad") de esta manera: A.B.C.Dy el pingcomando le permite omitir algunas, completando un valor predeterminado de la 0siguiente manera:

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

Si solo suministra una sola parte, entonces si está por debajo de 255 (el máximo para un octeto), se trata como un octeto como arriba, pero si es mayor que 255, entonces se convierte y se pasa al siguiente campo (es decir, mod 256).

Hay unos pocos casos extremos como proporcionar más de cuatro partes no parecen funcionar (por ejemplo, ping google.com's IP no funcionará para cualquiera 0.74.125.226.4o 74.125.226.4.0).

También puede usar la notación hexadecimal en forma cuadriculada y plana, pero debe formatearla antes de 0xcada octeto.


Por lo tanto, hay muchas formas de representar una dirección IP (IPv4). Puede usar el formato plano o punteado cuádruple (o punteado triple, punteado doble o incluso punteado simple), y para cada uno, puede usar (o incluso mezclar y combinar) decimal, octal y hexadecimal. Por ejemplo, puede hacer ping google.comde las siguientes maneras:

  • google.com  (nombre de dominio)
  • 74.125.226.4  (decimal punteado)
  • 1249763844  (decimal plano)
  • 0112.0175.0342.0004  (octal punteado)
  • 011237361004  (octal plano)
  • 0x4A.0x7D.0xE2.0x04  (hexágono punteado)
  • 0x4A7DE204  (hexágono plano)
  • 74.0175.0xe2.4  (ಠ_ಠ)

(¡Gracias a Dios que no se agregó soporte de notación binaria!)


Aplicación :

En su caso, el ping 192.168.072utiliza el tercer formato en la tabla anterior ( A.B.0.C), por lo que realmente está haciendo ping 192.168.0.072. Además, debido a que tiene un cero inicial en la última parte, se trata como octal, que en decimal es 58.

Misterio resuelto.


Tenga en cuenta que, si bien el pingcomando de Windows permite una variedad tan amplia de formatos para la entrada e interpreta formatos no estándar de la manera que se ve, eso no significa necesariamente que pueda usar dichos formatos en todas partes. Algunos programas pueden obligarlo a proporcionar las cuatro partes de un quad con puntos, otros pueden no permitir mezclar y combinar decimales y octales, y así sucesivamente.

Además, las direcciones IPv6 complican aún más la lógica de análisis y la aceptabilidad del formato de entrada.


Anexo :

syss señaló que si usa un carácter no válido en uno de los números (por ejemplo, an 8o 9cuando usa octal, a gen modo hexadecimal, etc.) pinges lo suficientemente inteligente como para reconocerlo e interpretarlo como una cadena (-al? -ic?) URL en lugar de como una dirección IP numérica.

(Como alguien que ha tenido numerosos aneurismas y ataques cardíacos tratando de escribir un código supuestamente "simple" para acomodar el número exponencialmente explosivo de permutaciones de valores de datos, aprecio que, al parecer, procesa correctamente todas las variaciones de entrada; en esto caso, al menos 3 1 +3 2 +3 3 +3 4 = 120 variaciones.)

Por lo tanto, mientras que la especificación 010.020.030.040hará ping 8.16.24.32como se esperaba, pasar 010.020.030.080a pingse tratará como una URL en lugar de una dirección IP, como la foo.bar.baz.comque podría (pero lamentablemente no existe). En otras palabras, intenta hacer ping al subdominio 010en el subdominio 020en el dominio 030en el dominio de nivel superior 080. Sin embargo, dado 080que no es un TLD válido (como .com, .nety sus amigos), la conexión falla en el primer paso.

Lo mismo sucede 090.010.010.010cuando el carácter no válido está en un octeto diferente. Del mismo modo, 0xf.0xf.0xf.0xfpings 15.15.15.15, pero 0xh1.0x1.0xg0.0ffalla.

Bueno, supongo que eso es lo que obtienes por no ser fluido en múltiples bases numéricas.

Probablemente sea más fácil y seguro asegurarse de usar siempre direcciones de 4 puntos con cuatro puntos ("40q"? "Cuádruple-cuádruple"?

Así que ve y aprende algunas bases numéricas . Podrá presumir y ser la vida de las fiestas, y como dicen, hay 10 tipos de personas: los que saben binario y los que no.

Ni siquiera pensemos en las direcciones IPv6; ¡Creo que son uno de los 111 sellos!

Synetech
fuente
39
¿Complicado en exceso? La experimentación puede ser muy útil, y en este caso produjo una buena respuesta; pero sin una teoría, documentación o estándares, puede faltar un factor crítico y no saberlo. O podría estar determinando cómo funciona una versión en particular y estar equivocado sobre el 90% de las implementaciones que existen. O podría inventar reglas que expliquen los resultados de sus experimentos pero que sean más complicadas que las reglas previstas. En este caso, creo que las reglas de documentación (para inet_aton()) son más simples en un aspecto: no hay condicionales para "menos / más de 255".
LarsH
71
¡Hey Mira! ¡Aparece la parte de "ciencia" de la informática! (hipotetizar, experimentar, verificar)
Izkata
13
@LarsH, ese es mi punto, sin embargo, que el pingcomando (al menos en Windows) es como muchos de los programas de Microsoft (especialmente los notorios) IE. Intenta ser demasiado indulgente y toma todo lo que le arrojas e intenta interpretarlo. Sí, hay un documento oficial sobre formatos de direcciones IP, pero que no se trata de preguntas sobre ISO y RFC, es práctico, hice algo y es una pregunta extraña que puede responderse sin recurrir a (es cierto, largo, seco, aburrido especificaciones técnicas), aunque también es bueno vincularlos en caso de que el OP quiera leerlos.
Synetech
66
El análisis octal con prefijo 0 debe abandonarse por completo, salvo para chmod. Eso es. Esa es la única excepción para octal permitido. Período.
James Dunne
66
Es útil para la conversión de RGB HEX a DEC. lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
wilson
147

Hay dos razones para esto:

Primero, un prefijo '0' indica un número octal . Desde oct (072) = dec (58), 192.168.072 = 192.168.58.

En segundo lugar, el penúltimo 0 puede eliminarse de las direcciones IP como una forma abreviada . 127.0.1 se interpreta como 127.0.0.1, y en su caso 192.168.58 se interpreta como 192.168.0.58.

neu242
fuente
77
No agrupa ceros. En realidad, trata cada punto como un separador correspondiente al siguiente límite de bytes. Por lo tanto, las direcciones IP 2130706433 y 127.0.0.1 son las mismas direcciones.
Serge
2
más concretamente, es la notación de cuatro puntos en el caso de una dirección IP
Guillaume86
44
¡El famoso cero inicial ha golpeado una vez más!
Luc M
2
ahora esta es la verdadera respuesta!
l --''''''--------- '' '' '' '' '' ''
2
Esa respuesta es incorrecta y engañosa. Al colocar un 0 en 1.0.2.3 (1.2.3) se obtiene una dirección IP diferente (1.2.0.3).
sch
101

Además del importante punto de @ neu242 sobre la notación octal y la observación de que las direcciones IP pueden acortarse, la otra pieza crítica es saber cómo se interpretan las direcciones IP acortadas.

Uno podría adivinar ingenuamente que si faltan algunos de los cuatro números, el analizador agregaría bytes llenos de cero al final (o al principio) de la secuencia de bytes. Pero esto no coincide con el comportamiento que informó el OP: 192.168.072 se analizó como 192.168. 0 .58, no como 192.168.58. 0 , ni 0 .192.168.58.

Aparentemente, el ping de Windows y Linux (la versión que probaste y la que probé) usa algo equivalente a inet_aton () para analizar el argumento de la dirección IP. La página del manual para inet_aton () dice:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

Así que ahí lo tiene ... se 192.168.072ajusta al patrón abc, por lo que 072(después de analizarlo como un número octal) se interpretó como un valor de 16 bits que define los 2 bytes más a la derecha de la dirección binaria, equivalente a 0.58.

Las reglas anteriores son equivalentes a decir que si falta alguno de los cuatro números, los bytes rellenos con cero necesarios se agregan inmediatamente antes del último número dado ... no al final ni al principio de la cadena de bytes. (Expresarlo de esta manera funciona si el último número dado es menor que 256).

Tenga en cuenta que las versiones más recientes de ping pueden no permitir este tipo de taquigrafía, ni la interpretación octal. El código fuente de 2010 para iputils (incluido ping) que encontré usa inet_pton () en lugar de inet_aton () para analizar el argumento de la dirección IP. La página del manual para inet_pton () dice:

A diferencia de inet_aton (3) e inet_addr (3), inet_pton () admite direcciones IPv6. Por otro lado, inet_pton () solo acepta direcciones IPv4 en notación decimal punteada, mientras que inet_aton (3) e inet_addr (3) permiten la notación más general de números y puntos (formatos de números hexadecimales y octales, y formatos que no tienen ' t requiere que los cuatro bytes se escriban explícitamente).

LarsH
fuente
12
Esta es, de lejos, la mejor respuesta en mi humilde opinión.
Josh
En Windows que estás buscando inet_addren Winsock.
user7116
24

También debe tener en cuenta que una ip puede representarse mediante enteros sumados en importancia a su posición.

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

Aquí está lo bueno:

192.168.58 será 192.168.0.58 porque

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106 también será 192.168.0.58 porque

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578 también será 192.168.0.58 porque

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578
vesquam
fuente
1
"192.168.56 será 192.168.0.56 porque 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" ¿Está seguro? Es de esperar que 168 se multiplique por 256 ^ 1 en el primer caso, y por 256 ^ 2 en el segundo caso. De manera similar, 192 se multiplicaría por 256 ^ 2 frente a 256 ^ 3. Entonces, 192.168.56 solo podría = 192.168.0.56 si hay reglas adicionales establecidas, como la caída de ceros.
LarsH
@LarsH, creo que lo que se dice aquí es que se basa de izquierda a derecha, a diferencia del conteo "normal" donde basamos todo desde el lugar del 1. Entonces, el primer punto hace que lo que está a la izquierda se multiplique por 256 ^ 3, el segundo por 256 ^ 2, el tercero por 256. si no hay un punto a la izquierda, se agrega sin multiplicar por 256 ^ n. Entonces 1.2.3. (1.2.3.0) sería diferente de 1.2.3 (1.2.0.3), si lo entiendo correctamente.
iX3
@ iX3: si ese fuera el caso, entonces "192.168.56 será 192.168.0.56" sería incorrecto, porque en el primer caso, 56 se multiplicaría por 256 ^ 1, mientras que en el segundo caso, 56 solo se multiplicaría y 256 ^ 0. Y el 192.168.072 del OP se interpretaría como 192.168.58.0 en lugar de 192.168.0.58.
LarsH
Lo que es un poco engañoso es el hecho de que la dirección tiene 0 tiene el tercer dígito. Considere esta dirección 192.168.1.56 La forma de 3 dígitos sería 192.168.312 Porque 1 * 256 ^ 1 + 56 * 256 ^ 0 es 312
vesquam
1
Los puntos solo sirven para delinear qué números deben multiplicarse por qué potencia de 256. El analizador busca el primer punto y multiplica el número anterior por 256 ^ 3. Repita para el segundo y tercer punto, pero por 256 ^ 2 y 256 ^ 1, respectivamente. Luego agrega todos los resultados juntos (algunos impl. Pueden mantener un total acumulado en su lugar, aunque el resultado es el mismo). Si falta alguno de esos puntos, simplemente no hace la multiplicación y solo agrega el número final al total acumulado. Esa es también la razón por la que se 1.2.3.produce un error, porque el analizador no puede encontrar el último número para agregar al total.
Justin ᚅᚔᚈᚄᚒᚔ