Я по ошибке пропустил точку IP-адреса и набрал 192.168.072
.
К моему удивлению, я подключился к машине в192.168.0.58
Если я пинг, 192.168.072
я получаю ответы от 192.168.0.58
.
Почему это?
Я на ПК с Windows в домене Windows.
Если я пингую, 192.168.72
я получаю ответ 192.168.0.72
, так что кажется, что 0
in 072
(в моей первоначальной ошибке) имеет значение.
Этот вопрос был Супер Вопросом Пользователя Недели .
Прочитайте запись в блоге для получения более подробной информации или внесите свой вклад в блог самостоятельно
ip
ping
ip-address
Джордж Дакетт
источник
источник
ping 192.168.072
печатаетPING 192.168.072 (192.168.0.58) 56(84) bytes of data.
[...].192.168.0.58
чтобы получить ответ. Каковы шансы на это?192.168.0.58
тайм-аут для меня .. может все запросы ping каким-то образом выбили сервер ?!Ответы:
Все слишком усложняют это с RFC, классами IP и тому подобным. Просто запустите несколько тестов, чтобы увидеть, как
ping
команда анализирует IP-ввод, введенный пользователем (посторонняя запись удалена):Как видите,
ping
команда (в Windows) позволяет использовать разные форматы IP-адресов. IPv4-адрес может быть разбит на четыре части («пунктирная четверка») следующим образом:,A.B.C.D
аping
команда позволяет вам пропустить некоторые, заполнив значение по умолчанию0
следующим образом:Если вы предоставляете только одну часть, то, если она меньше 255 (максимум для октета), она обрабатывается как октет, как указано выше, но если она больше 255, она преобразуется и переносится в следующее поле. (т. е.
mod 256
).Есть несколько случаев краев , как обеспечение более четырех частей , кажется, не работают (например, пинг
google.com
IP «s не будет работать либо0.74.125.226.4
или74.125.226.4.0
).Вы также можете использовать шестнадцатеричное обозначение в точечно-четырехугольной и плоской форме, но необходимо отформатировать ее, предварительно ожидая
0x
каждого октета.Таким образом, существует множество способов представления 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
(ಠ_ಠ)(Слава Богу, что поддержка двоичной нотации не была добавлена!)
Применение :
В вашем случае pinging
192.168.072
использует третий формат в приведенной выше таблице (A.B.0.C
), так что вы на самом деле ping192.168.0.072
. Кроме того, поскольку у вас есть ведущий ноль в последней части, он обрабатывается как восьмеричное число, которое в десятичной дроби равно 58.Тайна разгадана.
Обратите внимание, что хотя команда Windows
ping
допускает такое большое разнообразие форматов для ввода и интерпретирует нестандартные форматы видимыми способами, это не обязательно означает, что вы можете использовать такие форматы везде. Некоторые программы могут вынудить вас предоставить все четыре части точечного квадрата, другие могут не допустить смешивания и сопоставления десятичных и восьмеричных чисел и т. Д.Кроме того, адреса IPv6 еще больше усложняют логику синтаксического анализа и приемлемость формата ввода.
Приложение :
syss отметил, что если вы используете недопустимый символ в одном из чисел (например,
8
или9
при восьмеричном использовании, ag
в шестнадцатеричном режиме и т. д.), тоping
он достаточно умен, чтобы распознать это и интерпретировать его как строку (-al? -ic?) URL вместо цифрового IP-адреса.(Как человек, который имел многочисленные аневризмы и сердечные приступы, пытался написать предположительно «простой» код, чтобы приспособить экспоненциально растущее число перестановок значений данных, я ценю, что он, кажется, правильно обрабатывает все входные варианты; в этом случай, как минимум 3 1 +3 2 +3 3 +3 4 = 120 вариаций.)
Так, при задании
010.020.030.040
будет свистеть ,8.16.24.32
как и ожидалось, проходя010.020.030.080
кping
будет рассматриваться как URL вместо IP - адреса , как ,foo.bar.baz.com
который может (но , к сожалению , не) существует. Другими словами, он пытается пропинговать поддомен010
на поддомене020
в домене030
в домене верхнего уровня080
. Тем не менее, поскольку080
это недопустимый TLD (например.com
,.net
и их друзья), соединение не будет установлено сразу на первом этапе.То же самое происходит с тем,
090.010.010.010
где недопустимый символ находится в другом октете. Точно так же0xf.0xf.0xf.0xf
пингует15.15.15.15
, но0xh1.0x1.0xg0.0f
не получается.О, хорошо, я думаю, что это то, что вы получаете за то, что вы не владеете несколькими базами чисел.
Вероятно, проще и безопаснее просто убедиться, что вы всегда используете адреса с четырьмя точками («40q»? «Quaddy-quad»? «Cutie-q»?)).
Так что иди и изучи некоторые основы чисел . Вы сможете похвастаться жизнью вечеринок, и, как говорится, существует 10 типов людей: тех, кто знает двоичный код, и тех, кто этого не знает.
Давайте даже не будем думать об адресах IPv6; Я думаю, что они одна из 111 печатей !!!
источник
inet_aton()
) проще в одном отношении - никаких условий для «меньше / больше 255».ping
команда (по крайней мере, для Windows) подобна многим программам Microsoft (особенно пресловутым) IE. Он пытается быть слишком прощающим и брать все, что вы в него бросаете, и пытается его интерпретировать. Да, есть официальный документ о форматах IP-адресов, но это не вопрос ISO и RFC, это практично, я что-то сделал, и это странный вопрос, на который можно ответить, не прибегая к (по общему признанию, длинному, сухому, скучному технические спецификации) - хотя ссылки на них на случай, если ФП захочет их прочитать, тоже хороши.chmod
. Вот и все. Это единственное исключение для восьмеричного кода. Период.C:\>ping 0xffffcc
Pinging 0.255.255.204 with 32 bytes of data:
Для этого есть две причины:
Во-первых, префикс «0» обозначает восьмеричное число. Поскольку окт (072) = декабрь (58), 192.168.072 = 192.168.58.
Во-вторых, второй-последний 0 может быть сброшен с IP-адресов как сокращение . 127.0.1 интерпретируется как 127.0.0.1, а в вашем случае 192.168.58 интерпретируется как 192.168.0.58.
источник
В дополнение к важному замечанию @ neu242 о восьмеричной нотации и наблюдению, что IP-адреса могут быть сокращены, другой важной частью является знание того, как интерпретируются сокращенные IP-адреса.
Можно наивно предположить, что, если некоторые из четырех чисел отсутствуют, парсер добавит заполненные нулями байты в конец (или начало) последовательности байтов. Но это не соответствует поведению, о котором сообщил OP: 192.168.072 был проанализирован как 192.168. 0 .58, а не как 192.168.58. 0 или 0 .192.168.58.
Очевидно, что ping для Windows и Linux (версия, которую вы пробовали, и версия, которую я пробовал) использует что-то эквивалентное inet_aton () для анализа аргумента IP-адреса. Страница man для inet_aton () говорит:
Итак, у вас это есть ...
192.168.072
соответствует шаблону abc, поэтому072
(после синтаксического анализа в виде восьмеричного числа) было интерпретировано как 16-битное значение, которое определяет 2 правых байта двоичного адреса, что эквивалентно0.58
.Приведенные выше правила эквивалентны тому, что если какое-либо из четырех чисел отсутствует, необходимые байты, заполненные нулями, добавляются непосредственно перед последним полученным числом ... ни в конце, ни в начале строки байтов. (Выражение таким образом работает, если последнее заданное число меньше 256.)
Обратите внимание, что более новые версии ping могут не разрешать такого рода сокращения или восьмеричное толкование. Источник 2010 код iputils (включая пинг) , которые я нашел использует inet_pton () , а не inet_aton () для разбора IP - адрес аргумента. Страница man для inet_pton () говорит:
источник
inet_addr
в Winsock.Вы также должны учитывать, что ip может быть представлен целыми числами, сложенными вместе по значению для их положения.
Вот классная вещь:
192.168.58 будет 192.168.0.58, потому что
192.11010106 также будет 192.168.0.58, потому что
3232235578 также будет 192.168.0.58, потому что
источник
1.2.3.
возникает ошибка, потому что парсер не может найти последнее число для добавления к общему количеству.