Все слишком усложняют это с RFC, классами IP и тому подобным. Просто запустите несколько тестов, чтобы увидеть, как pingкоманда анализирует IP-ввод, введенный пользователем (посторонняя запись удалена):
> ping 1
Pinging 0.0.0.1 with 32 bytes of data:
> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:
> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:
> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:
> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.
> ping 255
Pinging 0.0.0.255 with 32 bytes of data:
> ping 256
Pinging 0.0.1.0 with 32 bytes of data:
Как видите, pingкоманда (в Windows) позволяет использовать разные форматы IP-адресов. IPv4-адрес может быть разбит на четыре части («пунктирная четверка») следующим образом:, A.B.C.Dа pingкоманда позволяет вам пропустить некоторые, заполнив значение по умолчанию 0следующим образом:
1 part (ping A) : 0.0.0.A
2 parts (ping A.B) : A.0.0.B
3 parts (ping A.B.C) : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D
Если вы предоставляете только одну часть, то, если она меньше 255 (максимум для октета), она обрабатывается как октет, как указано выше, но если она больше 255, она преобразуется и переносится в следующее поле. (т. е. mod 256).
Есть несколько случаев краев , как обеспечение более четырех частей , кажется, не работают (например, пинг google.comIP «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), так что вы на самом деле ping 192.168.0.072. Кроме того, поскольку у вас есть ведущий ноль в последней части, он обрабатывается как восьмеричное число, которое в десятичной дроби равно 58.
Тайна разгадана.
Обратите внимание, что хотя команда Windows pingдопускает такое большое разнообразие форматов для ввода и интерпретирует нестандартные форматы видимыми способами, это не обязательно означает, что вы можете использовать такие форматы везде. Некоторые программы могут вынудить вас предоставить все четыре части точечного квадрата, другие могут не допустить смешивания и сопоставления десятичных и восьмеричных чисел и т. Д.
Кроме того, адреса IPv6 еще больше усложняют логику синтаксического анализа и приемлемость формата ввода.
Приложение :
syss отметил, что если вы используете недопустимый символ в одном из чисел (например, 8или 9при восьмеричном использовании, a gв шестнадцатеричном режиме и т. д.), то 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 печатей !!!