Pull to refresh

Почему пинг к 192.168.072 возвращает ответ от 192.168.0.58

Reading time2 min
Views46K
Original author: Synetech
Если совершить опечатку в IP-адресе, то результат будет странным, на первый взгляд. Например, пинг к 192.168.72 распознаётся как 192.168.0.72, а 192.168.072 уже распознаётся как 192.168.0.58.

Народ слишком усложняет здесь из-за разных RFC, IP-классов и тому подобных вещей. Просто запустите пару тестов и посмотрите, как команда ping парсит входящие значения.

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 поддерживает такое разнообразие форматов и корректно интерпретирует их, это не обязательно означает, что эти форматы можно использовать повсеместно. Некоторые программы могут требовать ввода всех четырёх октетов, другие могут запретить смешивание восьмеричных и десятичных значений в одном адресе, и так далее.
Tags:
Hubs:
Total votes 148: ↑109 and ↓39+70
Comments56

Articles