Чи дійсно частина частини IPv4-адреси встановлена ​​на нуль?


36

Я працюю над зміною додатку 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?


11
І ось обов’язкове посилання на те, як працює підмережа? питання.

8
Мені здається дивним, що ваші тестери доводять це, коли адреса IPv6 може містити десяток 0. PS Ви дійсно повинні змусити ваш IP-адресу відповідати IPv6 адресам, якщо це не пізно. Ви вбережете себе від головного болю в майбутньому.
Марк Хендерсон

2
127.0.0.1 має дві нулі?
Джон Сміт

1
До речі, моя власна IP-адреса, що відображається на whatismyipaddress.com, має в ній 0 (67.xx.0.xx)
Ritesh

1
Подібне запитання тут: Чи дійсна XYZ0 дійсна IP-адреса?
splattne

Відповіді:


70

Ні, вони абсолютно невірні.

Насправді це дійсна 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.


11
Я перейду до цієї відповіді, яка є правильною, щоб додати додатковий пункт: формат "пунктирного квадратику" для IP-адрес, хоча канонічний, це не єдиний формат представлення. Спробуйте команду ping 2130706432, або ping 017700000001(так, навіть у Windows). Ви можете бути здивовані результатами.
BMDan


1
Незважаючи на те, що тут сказано, дійсно правда, але, на жаль, буває так, що існує величезна кількість інтерфейсів користувача, які вважають, що нульовий кінцевий нуль (або 255) поганий, незалежно від довжини префікса.
Теоброма Какао

1
192.168.0.257є неправильним, але 192.168.257є правильним поданням 192.168.1.1(як є 192.11010305). Див inet_aton(3).
BMDan

2
@Raffael: нуль підмережі насправді був відхиленням від класових днів маршрутизації. Коли б у вас, скажімо, була мережа класу B (129.97.0.0/16), нульова підмережа була б будь-якою мережею з бітами 17 → X, усі встановлені в нуль (де X - довжина підмережі). Таким чином, мережа 129.97.0.0/24 була б нульовою підмережею і заборонена в перші дні. Сьогодні (на щастя) ми використовуємо CIDR і не турбуємось про це.
MikeyB

16

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


12

Взагалі: Ні, не має значення, чи є в адресі 0 чи ні.

Однак у ваших тестерах є зерно правди. У деяких випадках старе або зламане мережеве обладнання не працюватиме правильно за адресами з 0 в останніх октестах. Це пов'язано зі старими правилами маршрутизації класу. У маршрутизації Classfull ви можете повідомити мережну маску з першого октету адреси. Якщо обладнання все ще дотримується класифікованих правил маршрутизації, ймовірно, неправильно обробляти адресу на зразок 200.100.1.0/16.


3

Скажімо, вам потрібно 510 IP-адрес в одному діапазоні, а ваша мережна адреса - 192.1.1.0, у вас буде підмережа / 23, з яких один з ваших IP-адрес хостів - .0 IP-адреса, ваші тестери помиляються, якщо адреса .0 - адреса хоста. Якщо у вас є мережа / 24, було б правильно сказати, що це було неправильно.


2

Щоб надати дуже просту відповідь: Одна або кілька нулів в ip-адресі цілком дійсні для адрес хоста, доки ці адреси не є мережевою або широкомовною адресою.

Мережеві та широкомовні адреси є дійсними IP-адресами, вони просто не використовуються хостами.


1
як щодо широкомовної адреси XY0.255?
Випадково832

2
Ви можете використовувати мережеву адресу для хоста, і колись це було звичайним тестом на "впорядкованість". На щастя, однак вона з тих пір вийшла з ладу. Аналогічно, RFC 3021 дозволяє використовувати як "широкомовні", так і "мережеві" адреси в / 31, хоча умови, мабуть, дещо не застосовні, коли для початку ви маєте справу лише з двома хостами.
BMDan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.