Все слишком усложняют это с 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.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
), так что вы на самом деле 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 печатей !!!