Странное безточное десятичное обозначение IP-адреса ... Как это работает?


89

Ранее сегодня я думал, что у меня есть URL в буфере обмена, но на самом деле у меня было четыре 9-значных целых числа, скопированных из электронной таблицы, которые были идентификационными номерами из проприетарной системы. Полностью не связано с поставленной задачей. Я вставил его в Firefox и с удивлением обнаружил, что он действительно загрузил страницу. До этого я видел десятичные записи адресов IPv4 без точек , но это длинное число намного больше.

714687644714805209715128610715964400 (вставьте HTTP: // впереди)

Как это работает? Все преобразователи десятичной дроби -> IPv4, которые я нашел в Интернете, считают это неверным вводом. Если я возьму IPv4-адрес, который он на самом деле загружает, и выполню те же вычисления, чтобы преобразовать его в десятичную точку без точек, я получу значительно меньшее число.

Я читал, что ping может принимать слова и выполнять некоторые преобразования, но он не может преобразовать это число в IP-адрес. Об IPv6 не может быть и речи, поскольку этот хост не имеет возможности подключения по IPv6.

Что это за безумие? Это поставило меня в тупик и моих коллег.

Изменить: он вернулся онлайн сейчас.



2
Вы действительно уверены, что это не IPv6-адрес? Потому что это число разбивается на 8 цифр в базе 65536; Адреса IPv6 имеют 8 цифр в базе 65536. Представлены в шестнадцатеричном формате, как обычно для IPv6, это 89: a4d2: 471b: 45ef: 77ed: c70f: da35: 93f0.
Кристиан

2
@Christian Его объяснение источника числа jives с показанным фактическим номером, который имеет 36 цифр (каждый идентификатор - 9 цифр или 714xxxxxx или 715xxxxxx). Компьютер даже не имеет IPv6, а число, принятое в качестве адреса IPv4, действительно возвращает веб-страницу. Числа от ~ 5E33 до ~ 3E38 имеют 8 цифр в базе 65536, я думаю, это просто совпадение, что его попадание в этот диапазон (плюс, любое меньшее число также будет действительным адресом IPv6)
Тим С.

1
@beeks Хорошо, это уже не работало, когда я попробовал это вчера, но, учитывая, что это был незащищенный маршрутизатор, возможно, это не так удивительно. Так вы говорите, что вы в основном вставили случайное число в адресную строку? Или какая у вас там была электронная таблица со странно закодированными IP-адресами незащищенных маршрутизаторов? ;)
Кристиан

1
@ Кристиан, LOL. Это были уникальные идентификаторы сообщений в системе соответствия. Совершенно невероятный шанс, что я вставил их в адресную строку, и это сработало. Могу поспорить, что это никогда не повторится со мной в моей жизни :)
beeks

Ответы:


93

Это довольно интересный вопрос, и мне понадобилось немного времени, чтобы разобраться. Краткий ответ: последние 32 бита числа 3660944368 (в десятичном виде, который можно найти с помощью 714687644714805209715128610715964400 mod 2^32)

Это десятичное значение адреса IPv4 218.53.147.240 , которое может быть найдено путем преобразования его в base-256, 3660944368 = 218*(256^3)+53*(256^2)+147*(256)+240аналогично записи десятичного числа (base-10). Например 234 = 2*10^2+ 3*10 + 4.

Как указывает @chritohnide, каждый раздел адресов IPv4 с точками называется октетом, поскольку он представляет 8 двоичных цифр. Стоит также отметить, что различные форматы адресов IPv4 (такие как десятичная точка с точками или чисто десятичное число) - это просто разные способы представления 32-разрядного двоичного числа для нашей выгоды.

Поскольку адреса IPv4 являются 32-разрядными числами, для разрешения адреса используются только последние 32-разрядные числа. Почему это так, не так очевидно. Как уже отмечали другие, полное число выглядит поразительно похожим на IPv6-адрес в десятичном виде, но не является действительным адресом.

Если посмотреть на спецификацию Teredo (см. 4. Адреса Teredo ), IPv4-клиент занимает последние 32 бита адреса IPv6, но префикс номера не соответствует спецификации Teredo (также см. Википедию ).


12
Хороший ответ. Также может быть полезно упомянуть, что каждый раздел адреса IPv4 с точками называется октетом, поскольку он представляет собой десятичное представление 8-битного двоичного числа (4 октета = 4 x 8 бит = 32 бита адреса IPv4) и что десятичное число Версия действительно только для нашего блага.
chritohnide

4
Вы уверены, что это не десятичная запись IPv6? Он успешно преобразуется в0089:a4d2:471b:45ef:77ed:c70f:da35:93f0
Izkata

5
@Izkata: маловероятно, поскольку этот адрес будет находиться в нераспределенной и зарезервированной части адресного пространства IPv6.
Хеннинг Махолм

3
Число (в ASCII), вероятно, будет просто пропущено через одну из строки C stdlib в функции int для преобразования в 32-битный адрес ipv4. В большинстве реализаций C stdlib эти преобразования автоматически выполняют по модулю 2 ^ <желаемый целочисленный размер>. Результат в этом случае точно соответствует наблюдаемому поведению.
Тонни

3
Стоит отметить, что это, вероятно, причуды анализатора URL Firefox. Кажется, он признает, что это число, а не URL-адрес, и пытается проанализировать его как 32-битный не усеянный IP-адрес (результирующее проанализированное целое число заканчивается по модулю 32-битного, и на самом деле он не выполняет никакой проверки ошибок на входе ). Chrome, например, не показывает такое поведение. На самом деле, возможно, стоит сообщить об этом как о тривиальной ошибке в Firefox.
Джейсон C
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.