Назад | Перейти на главную страницу

Допустимо ли иметь нулевую часть IPv4-адреса?

Я работаю над изменением приложения Java EE, которое будет аутентифицироваться на основе IP-адреса пользователя, используя ServletRequest.getRemoteAddr. Мы храним диапазоны IP-адресов (FROM_IP и TO_IP) в базе данных, и система будет аутентифицироваться, только если IP-адрес пользователя попадает в диапазон.

Теперь тестировщики указали, что цифра 0 (ноль) не должна допускаться в значениях FROM_IP и TO_IP (в любом месте). Обратите внимание, что это приложение для выхода в Интернет, поэтому мы получим только общедоступные IP-адреса.

Правы ли тестировщики, предлагая такую ​​проверку? Почему у нас не может быть ноль в значении диапазона, таком как 167.23.0.1 - 167.23.255.255?

Нет, они совершенно неверны.

Фактически, это действующий IP-адрес: 192.168.24.0

Как есть 167.23.0.1.

Разделение IP-адреса на сегменты с точками - это чисто человеческое удобство для отображения. Намного легче запомнить 192.168.1.42 чем 3232235818.

Для компьютеров важно разделение (сетевая маска). Недопустимо иметь адрес хоста с разделом хоста адреса, полностью установленным на 0 или 1.

Итак, 192.168.24.0, если сетевая маска такова, что некоторые биты устанавливаются в части хоста. См. Следующие расчеты:


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

В этом случае в адресной части (правая сторона) установлено 2 бита. Это действительный адрес хоста в подсети 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

В этом случае в адресной части установлено 10 бит и не установлено 6 бит. Это еще один действительный адрес хоста в той же подсети.


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

В этом случае в адресной части установлены нулевые биты. Это недопустимый адрес хоста в сети 192.168.24.0/24.

Если я не ошибаюсь, ваши тестеры совершенно неправы. Действительные IP-адреса, безусловно, могут содержать 0.

В общем: Нет, не имеет значения, есть ли в адресе 0 или нет.

Однако в том, что говорят ваши тестировщики, есть доля правды. В некоторых случаях старое или сломанное сетевое оборудование не будет правильно работать на адресах с 0 в последних октестах. Это связано со старыми правилами классовой маршрутизации. В маршрутизации Classfull маску сети можно определить по первому октету адреса. Если оборудование по-прежнему следует правилам маршрутизации по классам, скорее всего, оно будет неправильно обрабатывать адрес типа 200.100.1.0/16.

Допустим, вам нужно 510 IP-адресов в одном диапазоне, а ваш сетевой адрес - 192.1.1.0, у вас будет подсеть / 23, из которых один из IP-адресов вашего хоста является IP-адресом .0, ваши тестеры ошибаются, если адрес .0 это адрес хоста. Если у вас сеть / 24, будет правильно сказать, что это неправильно.

Чтобы дать очень простой ответ: один или несколько нулей в IP-адресе вполне допустимы для адресов хоста, если эти адреса не являются сетевым или широковещательным адресом.

Сетевые и широковещательные адреса являются действительными IP-адресами, они просто не могут использоваться хостами.