¿Las direcciones IP con y sin ceros a la izquierda son iguales?


90

Tengo un sistema de seguridad y la configuración de red solo permite una dirección IP de tres dígitos. No puedo configurarlo 192.168.2.100, sino que tengo que usarlo 192.168.002.100.

¿Son diferentes estas dos direcciones IP? ¿Debo configurar la LAN de mi enrutador 192.168.xxx.xxxpara que funcione correctamente? No puedo encontrar ninguna información sólida sobre esto.


16
De acuerdo con las respuestas a continuación, 192.168.020.100 no debería ser lo mismo que 192.168.20.100, pero puede ser lo mismo si su sistema permite que las IP solo se ingresen de esta manera (lo he visto con copiadoras cuando la IP se ingresa dígito por dígito con flechas arriba-abajo). - Si su sistema tiene ese capricho incluso cuando es posible la entrada de teclado "normal" (es decir, puede hacer una entrada técnica 192.168.2.100, pero se queja), entonces sugiero que hable con el proveedor (¿Qué tan confiable es el sistema de seguridad si su validación de entrada es es tan horrible?)
Hagen von Eitzen

44
Eso realmente es una validación bastante extraña. Cambiaría los sistemas de seguridad, como alude @Hagen.
Carreras de ligereza en órbita

2
Esto también puede ser específico del software. Son válidos con o sin los 0s principales , pero me he encontrado con algunas aplicaciones que no admiten una dirección IP que no tenía 3 dígitos en cada octeto.
ps2goat

2
Todas las direcciones IP (v4) son realmente solo 32 bits representados de una manera agradable. Si así 192.168.002.100es como su herramienta representa 0xc0a80264/ 3232236132 / 192.168.2.100, entonces es lo mismo.
Tim S.

1
¿Puedes por favor aceptar otra respuesta? El que aceptó está realmente equivocado (o al menos incompleto) y tiene 11 votos negativos.
Arjan

Respuestas:


102

Depende de la herramienta.

Para la mayoría de los propósitos, los dos serán iguales, pero no siempre.

Por ejemplo, si usa un número de 3 dígitos que comienza con un cero (o uno de dos dígitos que comienza con cero, gracias @ Dietrich-Epp), entonces ping asumirá que los números son octales.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

37
No tanto ping, sino la rutina subyacente que utilizainet_addr()
cde

2
También está sucediendo en OSX.
Johann Philipp Strathausen

21
No es porque tenga tres dígitos, es porque el número tiene un cero a la izquierda. Puede probar esto intentando hacer ping a 09.09.09.09, que no funciona porque 9 no es válido en octal.
Dietrich Epp

65

Suponiendo que todo el software que está utilizando usa punto decimal y subredes correctamente, sí, son lo mismo.

192.168.0.1, por ejemplo, es solo la notación punto-decimal amigable del valor punto-binario 11000000.10101000.00000000.00000001.

Ya sea que lo escriba como 192.168.0.1 o 192.168.000.001, ambos son iguales a 11000000.10101000.00000000.00000001


63
Los puntos también son para conveniencia; la IP real es 11000000101010000000000000000001
cpast

14
@cpast o como un número hexadecimal:C0A80001
jfs

13
o como número octal (comenzando con 0, con o sin puntos), por ejemplo, ping 0300.0250.2.0144 para 192.168.2.100
Sergey

15
o como un número decimal3232235521
oldmud0

14
Como señaló la respuesta de @GreenstoneWalker, muchos programas no los percibirán de la misma manera; un número con un cero inicial (que no contiene los dígitos 8 o 9) se entenderá como un número de notación octal; por lo tanto, 010.000.001.063 se interpretaría como "8.0.1.51" (octal 010 = decimal 8; octal 063 = decimal 51) en lugar de "10.0.1.63".
Doktor J

37

Depende de las herramientas o funciones que use cualquier programa para analizar la dirección dada. Tanto Microsoft como Linux, así como otros sistemas operativos, usan una rutina compatible con POSIXinet_addr() para analizar direcciones.

Muchos programas TCP / IP como Ping y FTP utilizan la función de sockets inet_addr () para traducir cadenas de direcciones IP en direcciones de 4 bytes. Esta función acepta una dirección IP en notación decimal, octal y hexadecimal estándar.
Microsoft KB115388 Ping y FTP resuelven la dirección IP con el cero inicial como octal

 

La función inet_addr () convierte la dirección de host de Internet cp de la notación de números y puntos IPv4 en datos binarios en orden de bytes de red.

En todas las formas anteriores, los componentes de la dirección punteada se pueden especificar en decimal, octal (con un 0 inicial) o hexadecimal, con un 0X inicial). Las direcciones en cualquiera de estos formularios se denominan colectivamente notación de números y puntos IPv4 . La forma que usa exactamente cuatro números decimales se conoce como notación decimal con puntos IPv4 (o, a veces: notación con puntos cuádruples IPv4).
inet_addr (3): rutinas de cambio de dirección de Internet - página de manual de Linux

Como tal, su sistema específico puede requerir una notación decimal de tres dígitos para cada octeto, pero esto no es universal, y se debe tener cuidado para garantizar que se ingrese la dirección IP correcta.

Por supuesto, solo funcionarán números válidos para cada tipo. Los números octales, hexadecimales o decimales fuera de rango también fallarán o causarán problemas. Octal 088, Hex 0xGG o Decimal 280 son ejemplos no válidos.


3
+1 para la función subyacente. Para agregar, esta función hará que el análisis de IP falle si un byte válido (por ejemplo, .88) se rellena con ceros, ya que 8 no es un número válido en octal.
Marzo Ho

En Windows XP (y antes de eso) la función aceptará números octales no válidos y aún intenta convertirlos. Esto puede conducir a un comportamiento muy poco obvio. A partir de Vista, los números no válidos se tratan como nombres de dominio y Windows intentará realizar una búsqueda de DNS para estos. Lo cual es un comportamiento bastante extraño también, pero eso al menos no causará ningún problema.
Tonny

@tonny eso se debe a que POSIX inet_addr () devuelve -1 para valores no válidos, que se desplaza a 255. La rutina más nueva, como se menciona en la página de manual de Linux, tiene un mejor manejo de errores.
cde

@cde Nunca me molesté en profundizar en la mecánica de inet_addr (). Confío en tu palabra :-)
Tonny

13

Como Lightness Races en órbita y otros han señalado,

La INET(3)página del manual describe inet_addry inet_aton, las funciones estándar utilizadas para convertir la "notación de números y puntos IPv4 en forma binaria". Dice

... los componentes de la dirección punteada se pueden especificar en decimal, octal (con un 0 inicial ) o hexadecimal, con un 0X inicial).

Entonces, técnicamente, NO , una dirección IP con ceros a la izquierda no es (siempre) la misma que una sin ceros a la izquierda. En su caso, sin embargo, 192.168.2.100y 192.168.002.100son idénticos, porque 002 == 2.

Se interrumpe cualquier interfaz de usuario que requiera que cada componente tenga exactamente tres caracteres de longitud, con ceros iniciales incorrectamente requeridos.


1
La idea de que se requieren "ceros iniciales" (en algunos equipos) no parece estar en disputa; ¿Cuál es la base para llamar a eso "incorrecto requerido" / "roto"? ¿Solo porque viola INET (3) / inet_addr / inet_aton? Es probable que las implementaciones que requieren tales ceros usen otro código que pueda comunicarse bien, por lo tanto, no está "roto". (He visto a los impresores hacer esto). ¿Hay alguna base para decir que la página de manual de INET (3) es más "correcta" / un recurso más autorizado que otros documentos oficiales, como RFC y otros citados por este borrador de documento ?
TOOGAM

6

Algunas implementaciones consideran que los octetos con ceros iniciales son decimales, otras implementaciones los consideran octales. Mientras el octeto esté en el rango de 0 a 7, esto no hace la diferencia. Entonces, por ejemplo, 192.168.002.100se interpretaría como 192.168.2.100en ambas implementaciones.

Pero si tuviera que escribir una dirección, ya 192.168.010.100que podría interpretarse como 192.168.10.100o 192.168.8.100dependiendo de la implementación. Tampoco es improbable que existan implementaciones, lo que consideraría que los ceros iniciales son un error de sintaxis. Además, hay escenarios en los que el software puede insistir en que debe usar la representación canónica por una razón u otra. Por todas esas razones, recomiendo evitar los ceros a la izquierda cuando escribe una dirección IP.

Si escribe software que necesita analizar una dirección IP, recomendaría aceptar ceros a la izquierda, pero enviar una advertencia a una ubicación adecuada cuando ocurra.

Ligeramente relacionado hay implementaciones que le permiten tener menos de cuatro componentes en la notación punteada. Cuando hay menos de cuatro componentes, el último componente tiene más de 8 bits y los componentes anteriores tienen exactamente 8 bits. Por ejemplo 192.168.612, en realidad sería una forma válida de escribir 192.168.2.100. Pero nuevamente no se recomienda usar esa notación.


0

Solo un pequeño consejo: en algunos casos es importante usar prefijos cero en las direcciones IP. Un ejemplo es Apache .htaccess denegar reglas.

Si usas algo como

deny from 11.22.33.22

Apache es tan estúpido que también bloqueará el acceso desde las siguientes direcciones IP:

111.22.33.22

11.22.33.221

211.22.33.221

y, en general, cualquier dirección IP que incluya 11.22.33.22

Entonces, solo para asegurarse de que no bloqueará ninguna IP que no haya querido bloquear, debe usar:

deny from 011.022.033.022

para asegurarse de que Apache bloqueará el acceso solo desde la dirección IP 11.22.33.22.


3
Interesante. ¿Puede proporcionar una referencia para esto?
Scott

La referencia es la experiencia personal y muchas pruebas y errores, después de encontrar muchos visitantes bloqueados como resultado de no usar ceros a la izquierda. Otra forma de evitar prohibiciones incorrectas es usar la IP en formato CIDR. Por ejemplo, 11.22.33.22/32 en lugar de solo 11.22.33.22
Nick Gar

0

ten cuidado con esto. ¡ DEBE ser lo mismo pero NO lo es !
No pude encontrar una explicación para esto, pero definitivamente puedo decir que en Windows y Linux las direcciones IP con y sin ceros iniciales NO son lo mismo. tal vez esto tenga que ver con la conversión de otros formatos como hexadecimal o binario.

Según mi experiencia con Windows y Linux, no depende de la herramienta, sino del sistema operativo, porque parece que tengo algún problema al usar ips como 10.08.03.100:

  • nota: "10.08.0.1" y 10.09.0.1 no se pudieron encontrar
  • nota: "10.010.0.1" se resuelve a 10.8.0.1

linux / debian7 / 8: mismos resultados con la herramienta "ping" y "snmpget"

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

windows7 / 8/10: mismos resultados con la herramienta "ping" y "telnet"

(lo siento, no tengo una ventana en inglés a mano, el error indica que no se pudo encontrar el host)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

Un cero inicial a menudo denota octal. De hecho, el octal 010 es decimal 8, y 08 y 09 son números octales no válidos. Entonces sí, la respuesta (actualmente) aceptada por AthomSfere es incorrecta (o al menos incompleta). Vea sus comentarios y algunas de las otras respuestas.
Arjan

Ugh, ese manejo de 10.010.0.1 es absolutamente horrible. En Microsoft Windows, el ping 10.070.0.1 se trata como 10.56.0.1 y 10.080.0.1 produce un error instantáneo, "La solicitud de ping no pudo encontrar el host 10.080.0.1. Verifique el nombre e intente nuevamente".
TOOGAM

1
Sí, @TOOGAM, octal 070 es decimal 56. Y octal 080 no es un número válido.
Arjan

-4

Las dos direcciones IP son diferentes.

Sin embargo:

  • La gente generalmente los consideraría igual.
  • Algún software los consideraría igual.
  • Algunos programas, en algunas plataformas, los considerarán diferentes.

Si eso suena confuso, es porque no hay un estándar que rija la forma en que se supone que deben escribirse las direcciones IP, por lo que diferentes programadores en diferentes puntos de la historia y en diferentes plataformas, todos tenían diferentes ideas sobre lo que debería hacerse.

Las direcciones IP son en realidad binarias, y las personas tienden a usar una notación decimal con puntos para representar las direcciones IP. El software puede aceptar varias bases numéricas (es decir, decimal, octal, hexadecimal) e interpretar las cosas de varias maneras según cómo lo escriba. Cómo lo escribes puede decirle al software en qué base estás escribiendo.

Te aconsejo: no uses ceros a la izquierda si quieres usar notación decimal con puntos. Algunos software considerarán que una bandera significa que está ingresando un número octal. Si quiere ingresar un número decimal, no obtendrá los resultados que espera.

Hice una pregunta similar y obtuve algunas buenas respuestas, así que si quieres leer sobre RFC, hay buena información.


-6

Debería funcionar de cualquier manera. Incluso puede hacer ping con números de tres dígitos y la computadora entenderá la dirección IP.

Editar : Windows lo leerá como octal, esto solo funciona para Linux.


Esto es verdad. El formato decimal punteado, como se le conoce, es realmente solo para humanos. Los dispositivos en la red no usan esta representación de una dirección IP.
Patrick Seymour

1
@Brock Vond: Sí, excepto que creo que transpusiste los 186 y 168 accidentalmente.
Patrick Seymour

66
Usar ping con números de 3 dígitos puede no funcionar. Puede tratarlos como octal.
Greenstone Walker

1
@LightnessRacesinOrbit En realidad, el ejemplo dado funcionará incluso si los rellena con ceros, al menos en Windows y Debian (no tengo una Mac). El error / función solo ocurre si el número está rellenado con cero y el número con relleno cero es mayor que 7 (ya que octal y decimal serían idénticos). Si intenta ingresar una dirección decimal válida con relleno de cero (por ejemplo, 012.034.056.078), aún intentará analizar esto como octal, lo que provocará un error en la función ping.
Marzo Ho

1
@MarchHo: Sí, eso es lo que todos estamos diciendo.
Carreras de ligereza en órbita

-11

El cero inicial no tiene sentido. Los octetos son (base-10) números 0-255, no cadenas.

Dado que no estoy exactamente seguro de lo que está preguntando (o que sabe qué pregunta hacer :)): Dicho esto, el IP # debe estar en la misma subred que su red. Si elige 11.12.13.14 dentro de una máscara de subred de 192.168.0.0, ese dispositivo no podrá comunicarse ni utilizar esa subred.


lol: no, definitivamente entiendo la subred y los conceptos básicos de redes ... simplemente nunca encontré un producto que requiriera 3 dígitos allí. Estaba usando el 11.12.13.14 como variables ... pero gracias :)
Brock Vond

99
-1: No, inet_addry los cientos de miles de herramientas que dependen de él para el análisis de direcciones toman un 0 inicial para significar que el byte se da en notación de base 8. Eso es apenas "sin sentido".
Carreras de ligereza en órbita
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.