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.072
recibo 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.72
recibo una respuesta por parte de 192.168.0.72
, por lo que parece la 0
de 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
ip
ping
ip-address
George Duckett
fuente
fuente
ping 192.168.072
impresionesPING 192.168.072 (192.168.0.58) 56(84) bytes of data.
[...].192.168.0.58
para obtener una respuesta. ¿Cuáles son las posibilidades de eso?192.168.0.58
me está agotando el tiempo ... ¿pueden todas las solicitudes de ping haber eliminado de alguna manera el servidor?Respuestas:
Todo el mundo lo complica demasiado con RFC, clases de IP y demás. Simplemente ejecute algunas pruebas para ver cómo el
ping
comando analiza la entrada de IP por parte del usuario (se eliminó el desperdicio extraño):Como puede ver, el
ping
comando (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.D
y elping
comando le permite omitir algunas, completando un valor predeterminado de la0
siguiente manera: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 cualquiera0.74.125.226.4
o74.125.226.4.0
).También puede usar la notación hexadecimal en forma cuadriculada y plana, pero debe formatearla antes de
0x
cada 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.com
de 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.072
utiliza el tercer formato en la tabla anterior (A.B.0.C
), por lo que realmente está haciendo ping192.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
ping
comando 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
8
o9
cuando usa octal, ag
en modo hexadecimal, etc.)ping
es 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.040
hará ping8.16.24.32
como se esperaba, pasar010.020.030.080
aping
se tratará como una URL en lugar de una dirección IP, como lafoo.bar.baz.com
que podría (pero lamentablemente no existe). En otras palabras, intenta hacer ping al subdominio010
en el subdominio020
en el dominio030
en el dominio de nivel superior080
. Sin embargo, dado080
que no es un TLD válido (como.com
,.net
y sus amigos), la conexión falla en el primer paso.Lo mismo sucede
090.010.010.010
cuando el carácter no válido está en un octeto diferente. Del mismo modo,0xf.0xf.0xf.0xf
pings15.15.15.15
, pero0xh1.0x1.0xg0.0f
falla.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!
fuente
inet_aton()
) son más simples en un aspecto: no hay condicionales para "menos / más de 255".ping
comando (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.chmod
. Eso es. Esa es la única excepción para octal permitido. Período.C:\>ping 0xffffcc
Pinging 0.255.255.204 with 32 bytes of data:
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.
fuente
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:
Así que ahí lo tiene ... se
192.168.072
ajusta al patrón abc, por lo que072
(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 a0.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:
fuente
inet_addr
en Winsock.También debe tener en cuenta que una ip puede representarse mediante enteros sumados en importancia a su posición.
Aquí está lo bueno:
192.168.58 será 192.168.0.58 porque
192.11010106 también será 192.168.0.58 porque
3232235578 también será 192.168.0.58 porque
fuente
1.2.3.
produce un error, porque el analizador no puede encontrar el último número para agregar al total.