Чи однакові IP-адреси з нульовими нульовими і без них?


89

У мене система безпеки, і мережевий параметр дозволяє лише тризначну IP-адресу. Я не можу встановити його 192.168.2.100, замість цього мені доведеться використовувати 192.168.002.100.

Чи відрізняються ці дві IP-адреси? Чи потрібно встановити локальну мережу мого маршрутизатора для 192.168.xxx.xxxтого, щоб це працювало правильно? Я не можу знайти твердої інформації про це.


16
Відповідно до наведених нижче відповідей, 192.168.020.100 не повинен бути таким самим, як 192.168.20.100, але це може бути однаково, якщо ваша система дозволяє IP-адреси вводити лише таким чином (я бачив це з копіями, коли IP вводиться цифра по цифра зі стрілками вгору вниз). - Якщо у вашій системі є ця химерність навіть тоді, коли можливий "звичайний" введення клавіатури (тобто ви можете ввести технічний вклад 192.168.2.100, але він скаржиться), я пропоную вам поговорити з постачальником (наскільки надійною є система безпеки, якщо перевірка її введення такий гадкий?)
Хаген фон Ейтцен

4
Це дійсно досить химерне підтвердження. Я б перемикав системи безпеки, як натякає @Hagen.
Гонки легкості на орбіті

2
Це також може бути специфічним для програмного забезпечення. Вони дійсні з провідними або без них 0, але я зіткнувся з деякими програмами, що не підтримують IP-адресу, яка не мала 3 цифр у кожному октеті.
ps2goat

2
Всі IP (v4) адреси насправді всього 32 біти, представлені приємно. Якщо 192.168.002.100ваш інструмент представляє 0xc0a80264// 3232236132 / 192.168.2.100, то це те саме.
Тім С.

1
Чи можете ви прийняти іншу відповідь? Той, кого ви прийняли, дійсно помиляється (або, принаймні, неповний) і має 11 посилань.
Ар'ян

Відповіді:


101

Це залежить від інструменту.

Для більшості цілей обидва будуть однаковими, але не завжди.

Наприклад, якщо ви використовуєте 3-розрядне число, що починається з нуля (або двозначне, починаючи з нуля, дякуючи @ Dietrich-Epp), то ping вважатиме, що цифри є вісімковими.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

37
Не стільки пінг, але основна рутина, яку він використовуєinet_addr()
cde

2
Це також відбувається на OSX.
Йоганн Філіп Стратхаузен

21
Це не тому, що вона має три цифри, це тому, що число має провідний нуль. Ви можете перевірити це, спробуючи ping 09.09.09.09, який не працює, оскільки 9 не вірно в восьмериці.
Дітріх Епп

65

Якщо припустимо, що все програмне забезпечення, яке ви використовуєте, правильно використовує крапки з десятковою чи підмережею, так, вони однакові.

192.168.0.1, наприклад, є лише дружнім крапковим десятковим позначенням крапкового двійкового значення 11000000.10101000.00000000.00000001.

Якщо ви введете його як 192.168.0.1 або 192.168.000.001, вони обидва рівні 11000000.10101000.00000000.00000001


63
Крапки також для зручності; реальна IP - 11000000101010000000000000000001
cpast

14
@cpast або у вигляді шістнадцяткової цифри:C0A80001
jfs

13
або як восьмеричне число (починаючи з 0, з крапками або без), наприклад, ping 0300.0250.2.0144 за 192.168.2.100
Сергій

15
або як десяткове число3232235521
oldmud0

14
Як зазначається у відповіді @GreenstoneWalker, багато програм не сприймають їх як однакові; число з початковим нулем (яке не містить цифр 8 або 9) буде розумітися як восьмеричне позначення числа; отже, 010.000.001.063 трактуватиметься як "8.0.1.51" (вісімковий 010 = десятковий 8; вісімковий 063 = десятковий 51) замість "10.0.1.63"!
Doktor J

37

Це залежить від інструментів або функцій, які використовує будь-яка програма для розбору вказаної адреси. І Microsoft, і Linux, а також інші ОС використовують процедуру, сумісну з POSIX,inet_addr() для розбору адрес.

Багато програм TCP / IP, такі як Ping і FTP, використовують функцію сокетів inet_addr () для перекладу рядків IP-адрес у 4-байтні адреси. Ця функція приймає IP-адресу у стандартних десяткових, восьмеричних та шістнадцяткових позначеннях.
Microsoft KB115388 Ping і FTP вирішують IP-адресу з провідною нульовою позначкою восьмери

 

Функція inet_addr () перетворює адресу хоста в Інтернеті cp з позначення цифр і крапок IPv4 у двійкові дані в порядку байтів мережі.

У всіх перерахованих вище формах компоненти пунктирної адреси можуть бути вказані у десятковій, восьмеричній (із провідним 0), або в шістнадцятковій, з провідною 0X). Адреси в будь-якій з цих форм узагальнено називаються позначенням числа-крапки IPv4 . Форма, яка використовує рівно чотири десяткових числа, називається IPv4 пунктирною десятковою нотацією (або іноді: IPv4 пунктирно-чотиризначення).
inet_addr (3): Процедури зміни адрес в Інтернеті - man man на сторінці Linux

Таким чином, ваша конкретна система може вимагати тризначного десяткового позначення для кожного октету, але це не є універсальним, і слід бути обережним, щоб забезпечити введення правильної IP-адреси.

Звичайно, працюватимуть лише дійсні числа для кожного типу. Офтальмові, шістнадцяткові або десяткові цифри також виходять з ладу або спричинять проблеми. Octal 088, Hex 0xGG або Decimal 280 - все недійсні приклади.


3
+1 для основної функції. Додамо, ця функція призведе до виходу з ладу синтаксичного розбору IP-адреси, якщо дійсний байт (наприклад, .88) є нульовим, оскільки 8 не є дійсним числом у восьмеричному номері.
Ho,

У Windows XP (і до цього) функція БУДЕ прийняти недійсні восьмеричні числа та все ще намагатиметься їх перетворити. Це може призвести до дуже неочевидною поведінки. Недійсні номери Vista відносяться до доменних імен, і Windows спробує зробити пошук DNS для них. Що теж досить дивна поведінка, але це, принаймні, не спричинить жодних проблем.
Тонні

@tonny це тому, що POSIX inet_addr () повертає -1 для недійсних значень, котрі крутяться приблизно до 255. Більш нова процедура, як згадується на сторінці Man man, має кращу обробку помилок.
cde

@cde Я ніколи не намагався заглиблюватися в цю механіку inet_addr (). Я візьму на це ваше слово :-)
Тонні

13

Як вказували гонки легкості на Орбіті та інші,

На INET(3)головній сторінці описані inet_addrта inet_aton, стандартні функції, що використовуються для перетворення "IPv4 нотації цифр і крапок у бінарну форму". Він говорить

... компоненти пунктирної адреси можуть бути вказані в десятковій, восьмеричній (з провідним 0) або в шістнадцятковій, з провідною 0X).

Таким чином, технічно НІ , IP-адреса з провідними нулями не завжди (завжди) однакова як одна без ведучих нулів. У вашому випадку, однак, 192.168.2.100і 192.168.002.100однакові, тому що 002 == 2.

Будь-який користувальницький інтерфейс, який вимагає, щоб кожен компонент був довжиною рівно трьох символів, з неправильно потрібними провідними нулями, порушується.


1
Ідея, що потрібні "провідні нулі" (на деякому обладнанні), не здається суперечливою; Що є підставою для виклику цього "неправильно-потрібного" / "зламаного"? Так як це порушує INET (3) / inet_addr / inet_aton? Реалізація, що вимагає таких нулів, швидше за все, використовує інший код, який може чудово повідомляти, отже, не буде "зламаним". (Я бачив, як це роблять принтери.) Чи є підстава стверджувати, що сторінка INET (3) є більш "правильною" / більш авторитетним ресурсом, ніж інші офіційні документи, такі як RFC та інші, на які цитується цей проект документа ?
TOOGAM

6

Деякі реалізації вважають октети з провідними нулями десятковими, інші реалізації вважають їх вісімковими. Поки октет знаходиться в діапазоні від 0 до 7, це не має значення. Так, наприклад, 192.168.002.100інтерпретується як 192.168.2.100в обох реалізаціях.

Але якби ви ввели адресу, оскільки 192.168.010.100її можна інтерпретувати як 192.168.10.100або 192.168.8.100залежно від реалізації. Крім того, малоймовірно, що існує реалізація, яка вважала б провідні нулі помилкою синтаксису. Крім того, існують сценарії, в яких програмне забезпечення може наполягати на тому, що вам доведеться використовувати канонічне представлення з тих чи інших причин. З усіх цих причин я рекомендую уникати провідних нулів, коли ви пишете IP-адресу.

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

Трохи пов'язані є реалізації, які дозволяють мати менше чотирьох компонентів у пунктирній нотації. Коли є менше чотирьох компонентів, останній компонент має більше 8 біт, а попередні компоненти мають рівно 8 біт. Наприклад 192.168.612, насправді це був би вірний спосіб написання 192.168.2.100. Але знову використовувати це позначення не рекомендується.


0

Лише невелика порада: в деяких випадках важливо використовувати нульові префікси в IP-адресах. Прикладом є правила Apache .htaccess заперечення.

Якщо ви використовуєте щось подібне

deny from 11.22.33.22

Apache настільки дурний, що також заблокує доступ із таких IP-адрес:

111.22.33.22

11.22.33.221

211.22.33.221

і взагалі будь-яка IP-адреса, яка включає 11.22.33.22

Отже, щоб переконатися, що ви не заблокуєте жодні IP-адреси, які ви не мали намір заблокувати, слід використовувати:

deny from 011.022.033.022

щоб бути впевненим, що Apache заблокує доступ лише з IP-адреси 11.22.33.22.


3
Цікаво. Чи можете ви надати посилання на це?
Скотт

Довідка - це особистий досвід та безліч випробувань та помилок, після того, як багато відвідувачів були заблоковані внаслідок не використання провідних нулів. Ще один спосіб уникнути неправильних заборон - це використання IP у форматі CIDR. Наприклад, 11.22.33.22/32 замість всього 11.22.33.22
Нік Гар

0

будьте обережні з цим. він ПОВИНЕН бути таким же , але це НЕ !
Я не міг знайти пояснення цьому, але я точно можу сказати, що IP-адреси Windows та Linux з і без ведучих нулів НЕ однакові! можливо, це стосується перетворення з інших форматів, таких як шістнадцятковий або двійковий.

з мого досвіду роботи з Windows і Linux це не інструмент залежно, але ОС залежно, здається, тому що я працюю в якійсь проблемі з використанням ips, як 10.08.03.100:

  • примітка: "10.08.0.1" та 10.09.0.1 не вдалося знайти
  • Примітка: "10.010.0.1" дозволено до 10.8.0.1

linux / debian7 / 8: ті ж результати з інструментами "ping" та "snmpget"

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

windows7 / 8/10: такі самі результати з інструментами "ping" та "telnet"

(Вибачте, у мене немає під рукою англійського windows. Помилка говорить про те, що хоста не вдалося знайти)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

Провідний нуль часто позначає восьмеричний. Дійсно, восьмерик 010 - це десяткові 8, а 08 та 09 - недійсні восьмеричні числа. Тож так, прийнята відповідь від AthomSfere (на даний момент) помилкова (або принаймні неповна). Дивіться його коментарі та деякі інші відповіді.
Ар'ян

Фу, що обробка 10.010.0.1 просто абсолютно жахлива. У Microsoft Windows ping 10.070.0.1 трактується як 10.56.0.1, а 10.080.0.1 видає миттєву помилку: "Запит Ping не зміг знайти хост 10.080.0.1. Перевірте ім'я та повторіть спробу."
TOOGAM

1
Так, @TOOGAM, восьмерик 070 - це десятковий 56. І восьмери вісімки 080 - не дійсне число.
Ар'ян

-4

Два IP-адреси різні.

Однак:

  • Люди, як правило, вважають їх однаковими.
  • Деякі програми вважають їх однаковими.
  • Деякі програми на деяких платформах вважатимуть їх різними.

Якщо це звучить заплутано, це тому, що не існує стандарту, який би регулював спосіб запису IP-адрес, тому різні програмісти в різні моменти історії та на різних платформах усі мали різні ідеї щодо того, що потрібно робити.

IP-адреси насправді є двійковими, і люди, як правило, використовують пунктирне десяткове позначення для представлення IP-адрес. Програмне забезпечення може приймати різні числові основи (наприклад, десяткову, восьмеричну, шістнадцяткову) та інтерпретувати речі різними способами залежно від того, як ви це пишете. Як ви це пишете, це може сказати програмному забезпеченню, в яку базу ви пишете.

Раджу: не використовуйте провідні нулі, якщо ви хочете використовувати крапкові десяткові позначення. Деякі програми вважають, що прапор означає, що ви вводите восьмеричний номер. Якщо ви хочете ввести десяткову цифру, ви не отримаєте очікуваних результатів.

Я задав подібне запитання і отримав кілька хороших відповідей, тому, якщо ви хочете прочитати на RFC, там є хороша інформація.


-6

Це має працювати в будь-якому випадку. Ви навіть можете пінг з трицифровими номерами, і комп'ютер зрозуміє IP-адресу.

Редагувати : вікна будуть читати його як восьмеричний, це працює лише для Linux.


Це правда. Шарфяний десятковий формат, як відомо, насправді лише для людей. Пристрої в мережі не використовують це представлення IP-адреси.
Патрік Сеймур

1
@Brock Vond: Так, хіба що я думаю, що ти переклав випадково 186 та 168.
Патрік Сеймур

6
Використання пінгу з тризначними цифрами може не працювати. Це може трактувати їх як восьмеричні.
Грінстоун Уокер

1
@LightnessRacesinOrbit Насправді даний приклад працюватиме навіть у тому випадку, якщо ви їх з нульовим накладом, принаймні в Windows та Debian (у мене немає Mac). Помилка / функція виникає лише в тому випадку, якщо число додано до нуля, а нульове число перевищує 7 (як восьмеричні та десяткові були б однакові). Якщо ви спробуєте ввести дійсну десяткову адресу, занулену нулем (наприклад, 012.034.056.078), вона все ще намагатиметься проаналізувати це як восьмеричний, що призведе до відмови функції ping.
Ho

1
@MarchHo: Так, це ми всі говоримо.
Гонки легкості на орбіті

-11

Провідний нуль безглуздий. Октети (база-10) 0-255 чисел, а не рядки.

Оскільки я не зовсім впевнений, що ви запитуєте (або що ви знаєте, яке запитання потрібно задати :)): Отож, IP # повинен бути в тій самій підмережі, що і ваша мережа. Якщо ви вибрали 11.12.13.14 в межах підмережі 192.168.0.0, цей пристрій не зможе спілкуватися з ним і використовувати цю підмережу.


lol - ні, я не розумію підмережу, а основні поняття мереж ... просто ніколи не стикався з продуктом, для якого потрібні 3 цифри. Я просто використовував 11.12.13.14 як змінні ... але дякую :)
Brock Vond

9
-1: Ні, inet_addrі сотні тисяч інструментів, які покладаються на нього для розбору адрес, приймають провідні 0, щоб байт був вказаний у позначенні base-8. Це навряд чи "безглуздо".
Гонки легкості на орбіті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.