È valido avere parte di un indirizzo IPv4 impostato su zero?


36

Sto lavorando a una modifica in un'applicazione Java EE che eseguirà l'autenticazione in base all'indirizzo IP dell'utente utilizzando ServletRequest.getRemoteAddr . Archiviamo intervalli di indirizzi IP (FROM_IP e TO_IP) in un database e il sistema eseguirà l'autenticazione solo se l'indirizzo IP di un utente rientra in un intervallo.

Ora, i tester hanno sottolineato che la cifra 0 (zero) non dovrebbe essere consentita nei valori FROM_IP e TO_IP (in nessun luogo). Nota che si tratta di un'applicazione con connessione Internet e quindi avremo solo indirizzi IP pubblici.

I tester hanno ragione nel suggerire questa convalida? Perché non possiamo avere zero nel valore dell'intervallo come in 167.23.0.1 - 167.23.255.255?


11
Ed ecco il link obbligatorio a Come funziona la sottorete? domanda.

8
Trovo sorprendente che i tuoi tester lo dimostrino, quando un indirizzo IPv6 può contenere una dozzina di 0. PS, dovresti davvero adattare il campo del tuo indirizzo IP agli indirizzi IPv6 se non è troppo tardi. Ti risparmierai mal di testa in futuro.
Mark Henderson

2
127.0.0.1 ha due zeri?
John Smith,

1
A proposito, il mio indirizzo IP che appare su whatismyipaddress.com ha 0 (67.xx.0.xx)
Ritesh

Risposte:


70

No, sono completamente errati.

In realtà, questo è un indirizzo IP valido: 192.168.24.0

Come è 167.23.0.1.

La separazione dell'indirizzo IP in segmenti punteggiati è una comodità puramente umana per la visualizzazione. È molto più facile da ricordare 192.168.1.42di 3232235818.

Ciò che conta per i computer è la separazione (maschera di rete). Non è valido avere un indirizzo host con la sezione host dell'indirizzo impostata interamente su 0 o 1.

Quindi, 192.168.24.0 fintanto che la maschera di rete è tale che alcuni bit vengono impostati nella parte host. Vedi i seguenti calcoli:


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

In questo caso, la parte dell'indirizzo (lato destro) ha 2 bit impostati. Questo è un indirizzo host valido nella sottorete 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

In questo caso, la parte dell'indirizzo ha 10 bit impostati e 6 bit non impostati. Questo è un altro indirizzo host valido nella stessa sottorete.


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

In questo caso, la parte dell'indirizzo ha zero bit impostati. Questo non è un indirizzo host valido nella rete 192.168.24.0/24.


11
Passerò a questa risposta, che è corretta, per aggiungere un ulteriore punto: il formato "quad punteggiato" per gli indirizzi IP, sebbene canonico, non è l'unico formato di rappresentazione. Prova il comando ping 2130706432o ping 017700000001(sì, anche su Windows). Potresti trovarti sorpreso dai risultati.
BMDan,


1
Sebbene ciò che viene detto qui sia effettivamente vero, purtroppo è anche vero che esiste un numero enorme di interfacce utente che ritengono che uno zero finale (o 255) sia negativo, indipendentemente dalla lunghezza del prefisso.
Theobroma Cacao,

1
192.168.0.257non è corretto, ma 192.168.257è una rappresentazione corretta di 192.168.1.1(così com'è 192.11010305). Vedere inet_aton(3).
BMDan,

2
@Raffael: la subnet zero era in realtà un passaggio dai giorni di routing di classe. Se avessi, per esempio, una rete di Classe B (129.97.0.0/16) la sottorete zero sarebbe qualsiasi rete con bit 17 → X tutti impostati su zero (dove X è la lunghezza della sottorete). Quindi la rete 129.97.0.0/24 sarebbe una sottorete zero e non consentita nei primi giorni. Oggi (per fortuna) usiamo CIDR e non preoccuparti di questo.
MikeyB,

16

A meno che non fraintenda, i tuoi tester sono completamente sbagliati. Gli indirizzi IP validi possono sicuramente contenere uno 0.


12

In generale: No, non importa se c'è uno 0 nell'indirizzo o no.

Tuttavia, c'è un granello di verità in ciò che dicono i tester. In alcuni casi le apparecchiature di rete vecchie o danneggiate non funzioneranno correttamente sugli indirizzi con 0 negli ultimi test. Ciò è dovuto alle vecchie regole di routing classfull. Nel routing Classfull, è possibile indicare la maschera di rete dal primo ottetto dell'indirizzo. Se l'apparecchiatura segue ancora le regole di routing classfull, è probabile che gestisca un indirizzo come 200.100.1.0/16 in modo errato.


3

Supponiamo che tu abbia bisogno di 510 indirizzi IP in un intervallo e il tuo indirizzo di rete sia 192.1.1.0, avresti una sottorete / 23, di cui uno dei tuoi IP host è un indirizzo IP .0, i tuoi tester sono sbagliati se l'indirizzo .0 è un indirizzo host. Se hai una rete / 24 sarebbe giusto dire che era sbagliato.


2

Per fornire una risposta molto semplice: uno o più zeri in un indirizzo IP sono perfettamente validi per gli indirizzi host purché tali indirizzi non siano l'indirizzo di rete o di trasmissione.

Gli indirizzi di rete e broadcast sono indirizzi IP validi, semplicemente non utilizzabili dagli host.


1
che dire di un indirizzo di trasmissione di XY0.255?
Casuale 832,

2
È possibile utilizzare l'indirizzo di rete per un host e farlo una volta era un test comune di "leetness". Per fortuna, però, da allora è passato di moda. Allo stesso modo, RFC 3021 consente l'uso di entrambi gli indirizzi "broadcast" e "network" in un / 31, sebbene i termini siano probabilmente in qualche modo inapplicabili quando si ha a che fare solo con due host.
BMDan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.