Вопрос: Допустимо ли иметь часть нулевого адреса 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?


36
2017-07-15 23:00


Источник


И вот обязательная ссылка на Как работает подсеть? вопрос. - kce
Я нахожу удивительным, что ваши тестеры приносят это, когда адрес IPv6 может содержать дюжину 0. Постскриптум вы действительно должны сделать поле вашего IP-адреса подходящим для IPv6-адресов, если не слишком поздно. В будущем вы избавитесь от головных болей. - Mark Henderson♦
127.0.0.1 имеет два нуля? - John Smith
Кстати, мой собственный IP-адрес whatismyipaddress.com имеет в нем 0 (67.xx.0.xx) - Ritesh
Аналогичный вопрос здесь: Является ли X.Y.Z.0 действительным IP-адресом? - splattne


Ответы:


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

Фактически, это действительный 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.


70
2017-07-15 23:19



Я перейду на этот ответ, который является правильным, чтобы добавить дополнительную точку: формат «пунктирного квадрата» для IP-адресов, в то время как канонический, не является единственным форматом представления. Попробуйте выполнить команду ping 2130706432, или ping 017700000001 (да, даже в Windows). Результаты могут быть удивлены. - BMDan
1076000524 :) - jweyrich
Хотя то, что здесь сказано, действительно верно, к сожалению, к сожалению, существует огромное количество пользовательских интерфейсов, которые считают, что конечный ноль (или 255) является плохим, независимо от длины префикса. - Theobroma Cacao
192.168.0.257 неверно, но 192.168.257 является правильным представлением 192.168.1.1 (как есть 192.11010305). Видеть inet_aton(3), - BMDan
@Raffael: нуль подсети фактически был задержкой от классных дней маршрутизации. Когда у вас была, скажем, сеть класса B (129.97.0.0/16), нулевая подсеть была бы любой сетью с битами 17 → X, все равными нулю (где X - длина подсети). Таким образом, сеть 129.97.0.0/24 будет нулевой подсети и запрещена в первые дни. В настоящее время (к счастью) мы используем CIDR и не волнуемся об этом. - MikeyB


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


16
2017-07-15 23:20





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

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


12
2017-07-16 00:22





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


3
2017-07-16 00:00





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

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


2
2017-07-16 02:11



как насчет широковещательного адреса X.Y.0.255? - Random832
Изменен мой ответ. Спасибо, что поймал это. - joeqwerty
Вы можете использовать сетевой адрес для хоста, и это было когда-то обычным тестом «leetness». К счастью, однако, с тех пор он сильно упал из моды. Аналогичным образом RFC 3021 позволяет использовать как «широковещательную», а также «сетевые» адреса в / 31, хотя термины, возможно, несколько неприменимы, когда вы имеете дело только с двумя хостами. - BMDan