É válido ter parte de um endereço IPv4 definido como zero?

36

Estou trabalhando em uma alteração em um aplicativo Java EE que seria autenticado com base no endereço IP do usuário usando ServletRequest.getRemoteAddr . Armazenamos os intervalos de endereços IP (FROM_IP e TO_IP) em um banco de dados, e o sistema só autenticaria se o endereço IP de um usuário cair em um intervalo.

Agora, os testadores apontaram que o dígito 0 (zero) não deve ser permitido nos valores de FROM_IP e TO_IP (em qualquer lugar). Observe que este é um aplicativo voltado para a Internet e, portanto, obteremos apenas endereços IP públicos.

Os testadores estão certos em sugerir essa validação? Por que não podemos ter zero no valor do intervalo, como em 167.23.0.1 - 167.23.255.255?

    
por Ritesh 16.07.2011 / 01:00

5 respostas

70

Não, eles estão completamente incorretos.

Na verdade, este é um endereço IP válido: 192.168.24.0

Como é o 167.23.0.1 .

A separação do endereço IP em segmentos pontilhados é uma conveniência puramente humana para exibição. É muito mais fácil lembrar 192.168.1.42 do que 3232235818 .

O que importa para os computadores é a separação (netmask). Não é válido ter um endereço de host com a seção do host do endereço definida inteiramente como 0 ou 1.

Portanto, 192.168.24.0, desde que a máscara de rede seja tal que alguns bits sejam definidos na parte do host. Veja os seguintes 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

Neste caso, a parte do endereço (lado direito) tem 2 bits definidos. Este é um endereço de host válido na sub-rede 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

Neste caso, a parte do endereço tem 10 bits definidos e 6 bits não definidos. Este é outro endereço de host válido na mesma sub-rede.

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

Nesse caso, a parte do endereço tem zero bits definidos. Este não é um endereço de host válido na rede 192.168.24.0/24.

    
por 16.07.2011 / 01:19
16

A menos que eu seja mal-entendido, seus testadores estão completamente errados. Endereços IP válidos podem certamente ter um 0 neles.

    
por 16.07.2011 / 01:20
12

Em geral: Não, não importa se há um 0 no endereço ou não.

No entanto, há um grão de verdade no que seus testadores estão dizendo. Em alguns casos, o equipamento de rede antigo ou quebrado não funcionará corretamente nos endereços com 0 nos últimos octetos. Isso se deve às antigas regras de roteamento classful. No roteamento Classfull, você pode dizer a netmask do primeiro octeto do endereço. Se o equipamento ainda seguir regras de roteamento classfull, é provável que ele manipule um endereço como 200.100.1.0/16 incorretamente.

    
por 16.07.2011 / 02:22
3

Digamos que você precisa de 510 endereços IP em um intervalo e seu endereço de rede é 192.1.1.0, você teria uma sub-rede / 23, dos quais um dos IPs do host é um endereço IP .0, seus testadores estão errados se .0 endereço é um endereço de host. Se você tem uma rede / 24, seria correto dizer que estava errado.

    
por 16.07.2011 / 02:00
2

Para fornecer uma resposta muito simples: Um ou mais zeros em um endereço IP são perfeitamente válidos para endereços de host, desde que esses endereços não sejam da rede ou do endereço de broadcast.

Os endereços de rede e transmissão são endereços IP válidos, eles não são utilizáveis pelos hosts.

    
por 16.07.2011 / 04:11