Если совершить опечатку в IP-адресе, то результат будет странным, на первый взгляд. Например, пинг к 192.168.72 распознаётся как 192.168.0.72, а 192.168.072 уже распознаётся как 192.168.0.58.
Причина кроется в сложности сочетания разных RFC, IP-классов и тому подобных вещей. Просто запустите пару тестов и посмотрите, как команда ping
парсит входящие значения.
C:>ping 1
Pinging 0.0.0.1 with 32 bytes of data:
C:>ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:
C:>ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:
C:>ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:
C:>ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.
C:>ping 255
Pinging 0.0.0.255 with 32 bytes of data:
C:>ping 256
Pinging 0.0.1.0 with 32 bytes of data:
Как несложно заметить, команда ping
(в Windows) допускает использование разных форматов адреса. Адрес IPv4 может разбивается на четыре части (октета): A.B.C.D
, и команда ping
позволяет не указывать все части, заполняя пропуски самостоятельно по следующему алгоритму:
1 часть (ping A) : 0.0.0.A
2 части (ping A.B) : A.0.0.B
3 части (ping A.B.C) : A.B.0.C
4 части (ping A.B.C.D) : A.B.C.D
Если указать только одну часть, то она воспринимается как октет по вышеприведённому алгоритму. Если она превышает 255, то значение конвертируется и переносится в следующее поле.
Есть несколько пограничных случаев. Например, если указать больше четырёх октетов, то такой адрес вообще не распознается. Так, IP-адрес google.com
не сработает ни для 0.74.125.226.4
, ни для 74.125.226.4.0
.
Можно использовать и шестнадцатеричную форму записи как с разделением октетов точками, так и без разделения. В первом случае каждый октет нужно предварять значением 0x
, во втором случае префикс 0x
указывается перед всем адресом. В восьмеричной системе указывается префикс 0
.
Таким образом, существует множество способов представления IP-адреса (IPv4). Можно записывать его без точек или с точками (двумя точками, тремя точками или с одной точкой), и для каждого случая можно использовать разную форму записи: десятичную, шестнадцатеричную, восьмеричную. Их можно даже смешивать в одном адресе для разных октетов. Например, вы можете записать адрес google.com
следующими способами:
google.com
(доменное имя)
74.125.226.4
(десятичная форма записи с точками)
1249763844
(десятичная без точек)
0112.0175.0342.0004
(восьмеричная с точками)
011237361004
(восьмеричная без точек)
0x4A.0x7D.0xE2.0x04
(шестнадцатеричная с точками)
0x4A7DE204
(шестнадцатеричная без точек)
74.0175.0xe2.4
(ಠ_ಠ)
(Слаба богу, что не поддерживается ещё и двоичная запись!)
В нашем случае, пинг к 192.168.072 использует третий вариант из вышеприведённой таблицы (A.B.0.C), так что в реальности адрес преобразуется в 192.168.0.072. Однако, поскольку последний октет начинается с нуля, он обрабатывается как восьмеричное значение, что в десятичной системе соответствует 58.
Загадка разгадана.
Нужно заметить, что хотя ping
под Windows поддерживает такое разнообразие форматов и корректно интерпретирует их, это не обязательно означает, что эти форматы можно использовать повсеместно. Некоторые программы могут требовать ввода всех четырёх октетов, другие могут запретить смешивание восьмеричных и десятичных значений в одном адресе, и так далее.
Кстати, в IPv6 ещё более сложная логика разбора адресов и больше допустимых форматов.
Автор: alizar