Почему работает «ping X», где «X» — произвольное целое число?

Почему работает «ping X», где «X» — произвольное целое число?

Итак, я обнаружил странную особенность утилиты ping в Windows 10. Если вы пингуете целое число вместо IP-адреса, она «преобразует» это число в адрес IPv4. Преобразование происходит так, что первый октет — это ваша позиция 256^3, второй октет — 256^2, третий — 256^1, а последний октет — это позиция «единиц» или 256^0.

Например, «ping 200» будет пинговать 0.0.0.200, а «ping 400» будет пинговать 0.0.1.144, где «1» в третьем октете представляет 256 (256 + 144 = 400).

Быстрый поиск в Google (хотя я не смог придумать подходящего поискового запроса) ничего не дал.

У меня есть только две теории:

  1. Может быть, в более ранней итерации схемы IP (т. е. неиспользуемых v1, v2 или v3) планировалось использовать только целые числа. Microsoft, в своей одержимости обратной совместимостью, написала алгоритм перевода в утилиту ping для обработки этого способа еще тогда, когда ping был впервые закодирован.
  2. Может быть, из-за того, как закодирована утилита ping, она обычно берет действительный адрес IPv4 и преобразует его в одно целое число, прежде чем что-то делать с этими данными. Таким образом, в качестве проверки в коде, если он видит, что пользователь ввел одно целое число, он просто пропускает этот начальный шаг преобразования.

Есть идеи? Это определенно заинтриговало моих коллег, но они были такими же невежественными, как и я.

EDIT: Только что проверил на своей машине Arch Linux, и могу подтвердить, что там тоже наблюдается такое поведение, так что это, скорее всего, дискредитирует мою первую теорию.

решение1

Ответ задокументирован вВикипедия:

Другие представления адресов были широко распространены, когда практиковались классовые сети. Например, адрес обратной связи 127.0.0.1 обычно записывается как 127.1, учитывая, что он принадлежит к сети класса A с восемью битами для маски сети и 24 битами для номера хоста. Когда в адресе указано менее четырех чисел в точечной нотации, последнее значение рассматривается как целое число из такого количества байтов, которое требуется для заполнения адреса до четырех октетов. Таким образом, адрес 127.65530 эквивалентен 127.0.255.250.

решение2

Это не причуда. Это особенность.

Помните, что точечная нотация IPv4-адреса — это всего лишь способ представления четырехбайтового (т.е. 32-битного) целого числа, которое является IPv4-адресом (и которое помещается в 32-битное поле назначения в IP-пакете). Различные утилиты будут принимать различные форматы для этого целого числа.

Я знаю, что в прошлом некоторые браузеры принимали такие десятичные целые числа в качестве адреса в адресной строке. (Я был удивлен, что два моих текущих браузера, Firefox и Chrome, больше этого не делают.)

решение3

«.0» можно опустить условно

Вы часто используете команду "ping 127.0.0.1" для выполнения теста цикла на машине, чтобы проверить, правильно ли установлен набор протоколов TCP/IP машины. Но нашли ли вы его? Тот же результат теста можно получить, используя команду "ping 127.1". Фактически, две команды "ping 127.1" и "ping 127.0.0.1" одинаковы, обе они выполняют тесты цикла.

Почему так? Это навык использования IP-адреса в приложении команды Ping. Все знают, что IP-адрес состоит из 32 двоичных цифр. Для того, чтобы всем было легче запомнить, каждые 8 ​​двоичных цифр преобразуются в десятичные цифры. Таким образом, легко запоминающийся IP-адрес состоит из четырех десятичных цифр (например, 127.0.0.1). Поскольку операционная система Windows имеет функцию автоматического заполнения «.0», я могу изменить «127.0.0.1» на «127.1».

Однако пропуск этого ".0" ограничен условно и не может быть пропущен произвольно. При применении команды Ping вы можете пропустить только один или несколько ".0", которые появляются перед последним десятичным числом IP-адреса, например, переписать команду "ping 127.0.0.1" в "ping 127.1".

Если один или несколько «.0» находятся не рядом с последней частью десятичного числа, а в других позициях, то этот «.0» не может быть опущен, например, «ping 202.0.96.1» не может быть записано как «ping 202.96.1». Это происходит потому, что результат, возвращаемый «ping 202.96.1», является ответным сообщением «202.96.0.1» вместо ответного сообщения «202.0.96.1».

Числовая строка вместо IP-адреса

В команде Ping вы также можете использовать числовую строку вместо IP-адреса. Запустите команду "ping 3658906394", и вы увидите возвращаемую информацию IP-адреса "218.22.123.26".

Почему так? На самом деле, "3658906394" — это еще одно представление IP-адреса "218.22.123.26". Конечно, вы также можете пинговать другие IP-адреса таким же образом.

Как преобразуется строка? На самом деле, это не сложно. Если взять IP-адрес "218.22.123.26" в качестве примера, то метод преобразования IP-адреса в числовую строку следующий: сначала преобразуем "218.22.123.26" в шестнадцатеричное "DA.16.7B.1A", а затем удаляем его. После десятичной точки получается "DA167B1A", и, наконец, шестнадцатеричное число преобразуется в десятичное "3658906394", затем "218.22.123.26" становится "3658906394". Тот же метод используется для преобразования других IP-адресов в числовые строки.

Совет: В некоторых средах LAN использование команды "Ping+number string" может завершиться неудачей, и появится сообщение "Unknown host number string". Это происходит из-за того, что числовая строка преобразуется в имя хоста, а не в IP-адрес.

решение4

Адреса IPv4 представляют собой беззнаковые 32-битные целые числа. В ошибочной попытке сделать их более удобными для восприятия человеком они традиционно отображаются в пользовательском интерфейсе в виде «десятичных чисел с точками», где каждый октет (8-битный байт), начиная с самого старшего, представлен как десятичное число, отделенное от следующего октета точкой.

Неудивительно, что некоторые пользовательские интерфейсы позволяют вводить любые данные, которые они могут интерпретировать как UInt32, и использовать полученный UInt32 в качестве предполагаемого вами адреса IPv4.

Связанный контент