Одинаковы ли 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

Это зависит от инструмента.

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

Например, если вы используете трехзначное число, начинающееся с нуля (или двузначное, начинающееся с нуля, спасибо @ 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
Это не потому, что он состоит из трех цифр, а потому, что число имеет начальный ноль. Вы можете проверить это, попробовав пропинговать 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»!
Доктор 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): процедуры изменения адреса в Интернете - справочная страница Linux

Таким образом, вашей конкретной системе может потребоваться трехзначное десятичное обозначение для каждого октета, но это не является универсальным, и следует убедиться, что введен правильный IP-адрес.

Конечно, только действительные числа для каждого типа будут работать. Вне диапазона октальные, шестнадцатеричные или десятичные числа также не будут работать или вызывать проблемы. Восьмеричное 088, шестнадцатеричное 0xGG или десятичное 280 являются недопустимыми примерами.


3
+1 за основную функцию. Чтобы добавить, эта функция приведет к сбою синтаксического анализа IP, если допустимый байт (например, .88) дополнен нулями, поскольку 8 не является действительным числом в восьмеричном виде.
Март, Ho

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

@tonny потому, что POSIX inet_addr () возвращает -1 для недопустимых значений, что составляет около 255. Более новая подпрограмма, как упомянуто на справочной странице Linux, лучше обрабатывает ошибки.
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

будь осторожен с этим. он ДОЛЖЕН быть таким же , но это НЕ !
Я не мог найти объяснение этому, но я могу точно сказать, что в Windows и Linux IP-адреса с ведущими нулями и без них НЕ одинаковы! Может быть, это связано с преобразованием из других форматов, таких как шестнадцатеричный или двоичный формат.

Исходя из моего опыта работы с 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"

(извините, у меня нет английских окон под рукой, ошибка говорит о том, что хост не найден)

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-адрес.

Изменить : Windows будет читать как восьмеричное, это работает только для Linux.


Это правда. Пунктирный десятичный формат, как известно, действительно предназначен только для людей. Устройства в сети не используют это представление IP-адреса.
Патрик Сеймур

1
@ Брок Вонд: Да, за исключением того, что я думаю, что вы транспонировали 186 и 168 случайно.
Патрик Сеймур

6
Использование ping с 3-значными числами может не работать. Это может относиться к ним как восьмеричным.
Гринстоун Уокер

1
@LightnessRacesinOrbit На самом деле, данный пример будет работать, даже если вы заполняете их нулями, по крайней мере, в Windows и Debian (у меня нет Mac). Ошибка / функция возникает только в том случае, если число дополняется нулями, а число дополняется нулями больше 7 (восьмеричное и десятичное число будет одинаковым). Если вы попытаетесь ввести действительный десятичный адрес с нулем (например, 012.034.056.078), он все равно будет пытаться проанализировать его как восьмеричное, что приведет к сбою функции ping.
Март Хо,

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.