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


Erré equivocadamente el punto de una dirección IP y escribí 192.168.072.
Para mi sorpresa me conecté a una máquina en 192.168.0.58

Si hago ping 192.168.072 Recibo respuestas de 192.168.0.58.

¿Por qué es esto?


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


Si hago ping 192.168.72 Recibo una respuesta de 192.168.0.72, así que parece que 0 en 072 (en mi error original) es significativo.


Esta pregunta fue una Pregunta del Superusuario de la semana.
Leer el Entrada de blog para más detalles o contribuir al blog tú mismo


370


origen


Pertinente:  blog.superuser.com/2012/02/10/wtfriday-http2915189091 - Tom Wijsman
Curiosamente, sucede exactamente lo mismo en Linux: ping 192.168.072 huellas dactilares PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...]. - Mechanical snail
lo que es aún más aleatorio es que tenías una máquina en 192.168.0.58 para obtener una respuesta. ¿Cuáles son las posibilidades de eso? - KronoS
@KronoS en realidad no es tan extraño si estás en una red de la escuela o la empresa. Algunos servidores DHCP darán direcciones en orden creciente y la mayoría de ellas se usarán. - Taum
192.168.0.58 está agotando el tiempo para mí ... ¿pueden todas las solicitudes de ping de algún modo han noqueado al servidor ?! - iamserious


Respuestas:


Todo el mundo lo está complicando demasiado con RFC, clases de IP, etc. Simplemente ejecute algunas pruebas para ver cómo ping comando analiza la entrada de IP por el usuario (se eliminan las cascaras externas):

> 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 puedes ver, el ping comando (en Windows) le permite usar diferentes formatos de direcciones IP. Una dirección IPv4 se puede dividir en cuatro partes ("quad-punteado") de la siguiente manera: A.B.C.D, y el ping comando le permite dejar un poco, rellenando un valor predeterminado de 0 como sigue:

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 proporciona una parte única, si está por debajo de 255 (el máximo para un octeto), se trata como un octeto como el anterior, pero si es mayor que 255, entonces se convierte y se transfiere al siguiente campo (es decir, mod 256)

Hay algunos casos extremos, como proporcionar más de cuatro partes que no parecen funcionar (p. Ej., Ping google.comLa IP no funcionará para ninguno 0.74.125.226.4 o 74.125.226.4.0)

También puede usar la notación hexadecimal tanto en formato quad-punteado como en formato plano, pero debe formatearlo por pre-pendiente 0x a cada octeto


Entonces, hay muchas maneras de representar una dirección IP (IPv4). Puede usar el formato plano o punteado-quad (o punteado-triple, punteado-doble, o incluso punteado-único), y para cada uno, puede usar (o incluso mezclar y combinar) decimales, octales y hexadecimales. Por ejemplo, puedes hacer ping google.com de las siguientes maneras:

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

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


Solicitud:

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

Misterio resuelto.


Tenga en cuenta que, mientras que el Windows ping comando permite una gran variedad de formatos para la entrada e interpreta formatos no estándar en la forma en que se ve, eso no significa necesariamente que pueda usar dichos formatos en todas partes. Algunos programas pueden obligarte a proporcionar las cuatro partes de un quad con puntos, otros pueden no permitir mezclar y combinar decimales y octal, 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.


Apéndice:

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

(Como alguien que ha tenido numerosos aneurismas y ataques cardíacos intentando escribir 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; caso, al menos 31+32+33+34=120 variaciones)

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

Lo mismo pasa con 090.010.010.010 donde el carácter inválido está en un octeto diferente. Igualmente, 0xf.0xf.0xf.0xf pings 15.15.15.15, pero 0xh1.0x1.0xg0.0f falla

Bueno, supongo que eso es lo que obtienes por no ser fluido en múltiples bases de números.

Probablemente sea más fácil y seguro simplemente asegurarse de usar siempre direcciones de 4 puntos y coma ("40q"? "Quaddy-quad"? "Cutie-q"?).

Así que adelante y aprende algunas bases numéricas. Podrás 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 lo hagamos pensar sobre las direcciones IPv6; ¡Creo que son uno de los 111 sellos!


565



¿Complicado? La experimentación puede ser muy útil, y en este caso produjo una buena respuesta; pero sin una teoría o documentación o estándares, puede estar perdiendo un factor crítico y no saberlo. O podría determinar cómo funciona una versión en particular y estar equivocado sobre el 90% de las implementaciones disponibles. O bien, podría proponer 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 la documentación (para inet_aton()) son más simples en un aspecto - sin condicionales para "debajo / sobre 255". - LarsH
¡Hey Mira! ¡La parte de "ciencia" de Computer Science hace su aparición! (hipotetizar, experimentar, verificar) - Izkata
@LarsH, ese es mi punto, que el ping comando (al menos en Windows) es como muchos de los programas de Microsoft (especialmente el notorio) 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 ISOs y RFCs, es práctico, Hice algo y está siendo raro pregunta que puede responderse sin recurrir a (especificaciones técnicas largamente secas, aburridas y aburridas), aunque vincularlas en caso de que el OP desee leerlas también es bueno. - Synetech
El análisis octal con prefijo 0 debe abandonarse por completo, salvo por chmod. Eso es. Esa es la única excepción para octal permitido. Período. - James Dunne
es útil para la conversión RGB HEX a DEC. lol ~ C:\>ping 0xffffcc  Pinging 0.255.255.204 with 32 bytes of data: - wilson


Hay dos razones para esto:

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

En segundo lugar, el penúltimo 0 se puede eliminar de las direcciones IP como taquigrafía. 127.0.1 se interpreta como 127.0.0.1, y en su caso 192.168.58 se interpreta como 192.168.0.58.


147



No agrupa ceros. Realmente trata cada punto como un separador correspondiente al límite del siguiente byte. Por lo tanto, las direcciones IP 2130706433 y 127.0.0.1 son las mismas direcciones. - Serge
¿la notación x.x.x.x para números de 32 bits tiene un nombre? Puede ser usado / útil en otros dominios, pero no puedo googlearlo :) editar: no importa, es la notación de punto decimal - Guillaume86
más precisamente, es la notación cuadriculada en el caso de una dirección IP - Guillaume86
¡El famoso cero inicial ha golpeado una vez más! - Luc M
¡ahora esta es la verdadera respuesta! - l--''''''---------''''''''''''


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

Uno podría ingenuamente adivinar 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 reportado por OP: 192.168.072 fue analizado 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 probó y las que probé) utilizan algo equivalente a inet_aton () para analizar el argumento de la dirección IP. los página de hombre 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 tienes ... 192.168.072 se ajusta al patrón a.b.c, por lo que 072 (después de analizar 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, se agregan los bytes necesarios rellenos cero inmediatamente antes del último número dado... no al final ni al comienzo de la cadena de bytes. (Expresarlo de esta manera funciona si el último número dado es menos de 256).

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

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


97



Esta es, de lejos, la mejor respuesta en mi humilde opinión. - Josh
En Windows estás buscando inet_addr en Winsock. - user7116


También debe tener en cuenta que una IP puede representarse mediante números enteros agregados 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

25



"192.168.56 será 192.168.0.56 porque 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" ¿Estás seguro? Esperaría que 168 se multiplicara por 256 ^ 1 en el primer caso, y por 256 ^ 2 en el segundo caso. Del mismo modo, 192 se multiplicaría por 256 ^ 2 frente a 256 ^ 3. Así que 192.168.56 solo podría = 192.168.0.56 si hay reglas adicionales en su lugar, 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 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 de 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 3er 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
Los puntos solo sirven para delinear qué números se deben multiplicar 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 en 256 ^ 2 y 256 ^ 1, respectivamente. Luego agrega todos los resultados (algunos impl. Pueden mantener un total acumulado, 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. Por eso también 1.2.3. da como resultado un error, porque el analizador no puede encontrar el último número para agregar al total. - Justin ᚅᚔᚈᚄᚒᚔ