¿Es válido tener parte de una dirección IPv4 establecida en cero?

36

Estoy trabajando en un cambio en una aplicación Java EE que se autenticaría en función de la dirección IP del usuario utilizando ServletRequest.getRemoteAddr . Almacenamos rangos de direcciones IP (FROM_IP y TO_IP) en una base de datos y el sistema se autenticaría solo si la dirección IP de un usuario cae en un rango.

Ahora, los evaluadores han señalado que el dígito 0 (cero) no debe permitirse en los valores FROM_IP y TO_IP (en ningún lugar). Tenga en cuenta que esta es una aplicación orientada a Internet, por lo que solo obtendremos direcciones IP públicas.

¿Tienen razón los evaluadores al sugerir esa validación? ¿Por qué no podemos tener cero en el rango de valores como en 167.23.0.1 - 167.23.255.255?

Ritesh
fuente
11
Y aquí está el enlace obligatorio a ¿Cómo funciona la división en subredes? pregunta.
8
Me parece sorprendente que sus evaluadores mencionen esto, cuando una dirección IPv6 puede contener una docena de ceros. PD: realmente debe hacer que su campo de dirección IP se ajuste a las direcciones IPv6 si no es demasiado tarde. Te ahorrarás dolores de cabeza en el futuro.
Mark Henderson
2
127.0.0.1 tiene dos ceros?
John Smith
1
Por cierto, mi propia dirección IP que aparece en whatismyipaddress.com tiene 0 (67.xx.0.xx)
Ritesh
1
Pregunta similar aquí: ¿XYZ0 es una dirección IP válida?
splattne

Respuestas:

70

No, son completamente incorrectos.

De hecho, esta es una dirección IP válida: 192.168.24.0

Como es 167.23.0.1.

La separación de la dirección IP en segmentos punteados es una conveniencia puramente humana para la visualización. Es mucho más fácil de recordar 192.168.1.42que 3232235818.

Lo que le importa a las computadoras es la separación (máscara de red). No es válido tener una dirección de host con la sección de host de la dirección configurada completamente en 0 o 1.

Entonces, 192.168.24.0 siempre que la máscara de red sea tal que algunos bits se establezcan en la parte del host. Ver los siguientes cálculos:


michael@challenger:~$ ipcalc 192.168.24.0/16
Address:   192.168.24.0         11000000.10101000. 00011000.00000000
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

En este caso, la parte de la dirección (lado derecho) tiene 2 bits establecidos. Esta es una dirección de host válida en la subred 192.168.0.0/16.


michael@challenger:~$ ipcalc 192.168.24.255/16
Address:   192.168.24.255       11000000.10101000. 00011000.11111111
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet

En este caso, la parte de la dirección tiene 10 bits establecidos y 6 bits sin establecer. Esta es otra dirección de host válida en la misma subred.


michael@challenger:~$ ipcalc 192.168.24.0/24
Address:   192.168.24.0         11000000.10101000.00011000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.24.0/24      11000000.10101000.00011000. 00000000
HostMin:   192.168.24.1         11000000.10101000.00011000. 00000001
HostMax:   192.168.24.254       11000000.10101000.00011000. 11111110
Broadcast: 192.168.24.255       11000000.10101000.00011000. 11111111
Hosts/Net: 254                   Class C, Private Internet

En este caso, la parte de la dirección tiene cero bits establecidos. Esta no es una dirección de host válida en la red 192.168.24.0/24.

MikeyB
fuente
11
Saltaré a esta respuesta, que es correcta, para agregar un punto adicional: el formato "quad con puntos" para las direcciones IP, aunque canónico, no es el único formato de representación. Pruebe el comando ping 2130706432o ping 017700000001(sí, incluso en Windows). Puede que te sorprendas por los resultados.
BMDan
55
1076000524 :)
jweyrich
1
Si bien lo que se dice aquí es cierto, también es desafortunadamente el caso de que hay una gran cantidad de interfaces de usuario que piensan que un cero final (o 255) es malo, independientemente de la longitud del prefijo.
Theobroma Cacao
1
192.168.0.257es incorrecto, pero 192.168.257es una representación correcta de 192.168.1.1(como es 192.11010305). Ver inet_aton(3).
BMDan
2
@Raffael: la subred cero era en realidad un remanente de los días de enrutamiento con clase. Cuando tenía, por ejemplo, una red de Clase B (129.97.0.0/16), la subred cero sería cualquier red con bits 17 → X configurados en cero (donde X es la longitud de la subred). Entonces, la red 129.97.0.0/24 sería una subred cero y no se permitiría en los primeros días. Hoy en día (afortunadamente) usamos CIDR y no nos preocupamos por eso.
MikeyB
16

A menos que esté malentendido, sus evaluadores están completamente equivocados. Las direcciones IP válidas ciertamente pueden tener un 0 en ellas.

EEAA
fuente
12

En general: No, no importa si hay un 0 en la dirección o no.

Sin embargo, hay algo de verdad en lo que dicen sus evaluadores. En algunos casos, el equipo de red viejo o roto no funcionará correctamente en direcciones con 0 en los últimos octests. Esto se debe a las viejas reglas de enrutamiento con clase. En el enrutamiento Classfull, puede distinguir la máscara de red desde el primer octeto de la dirección. Si el equipo sigue las reglas de enrutamiento con clase, es probable que maneje una dirección como 200.100.1.0/16 de forma incorrecta.

pehrs
fuente
3

Digamos que necesita 510 direcciones IP en un rango y su dirección de red es 192.1.1.0, tendría una subred / 23, de las cuales una de las direcciones IP de su host es una dirección IP .0, sus evaluadores están equivocados si la dirección .0 es una dirección de host Si tiene una red / 24, sería correcto decir que estuvo mal.

Lucas Kauffman
fuente
2

Para proporcionar una respuesta muy simple: uno o más ceros en una dirección IP son perfectamente válidos para las direcciones de host siempre que esas direcciones no sean la red o la dirección de difusión.

Las direcciones de red y difusión son direcciones IP válidas, simplemente no pueden ser utilizadas por los hosts.

joeqwerty
fuente
1
¿Qué pasa con una dirección de transmisión de XY0.255?
Random832
2
Puede usar la dirección de red para un host, y hacerlo fue una vez una prueba común de "leetness". Afortunadamente, sin embargo, desde entonces ha caído fuera de moda. De manera similar, RFC 3021 permite el uso de direcciones de "transmisión" y de "red" en un / 31, aunque los términos son posiblemente algo inaplicables cuando se trata de dos hosts para empezar.
BMDan