Пользователь
54,0
рейтинг
14 сентября 2009 в 16:10

Администрирование → Альтернативный способ записи IP-адресов

Наверное, некоторые знают такую штуку, но думаю, далеко не все.

Как мы все знаем, адрес IPv4 представляет собой 32-битное число. Традиционно IP-адрес записывается в виде 4-х октетов, разделенных точкой, в десятичной системе счисления. Например: 77.88.21.8.
Однако существуют и другие, менее распространенные варианты записи.

Во-первых, каждый из 4-х октетов можно записать в восьмеричной или шестнадцатеричной системах счисления:
77.88.21.8 = 0x4d.0x58.0x15.0x8 = 0115.0130.025.010, или даже можно смешивать 77.88.0x15.010.

Во-вторых, адрес можно записывать в виде числа:
77 * 2563 + 88 * 2562 + 21 * 2561 + 8 * 256О = 1297618184.
Аналогично п.1 это число можно записывать в восьмеричной и шестнадцатеричной системах счисления: 1297618184 = 011526012410 = 0x4D581508.

Честно говоря, не нашел RFC, в котором описываются эти форматы, но это работает везде: в браузере, команде ping и т.д. Попробуйте сами.
Владислав Росс @gag_fenix
карма
169,8
рейтинг 54,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (131)

  • +1
    Интересный способ, не знал о таком
    • +2
      Честно говоря, я вот уже 10 минут пытаюсь вспомнить, _откуда_ я знаю об этом. Так и не вспомнил :-(

      В студенческие годы только это знание помогло наконец понять, почему не проходит коннект на айпи 192.168.070.31. Человек набрал 070 потому, что тогда не надо точку давить — программка сама перекидывает фокус на следующий октет. И мучался два дня, ничего не понимая :-)
      • 0
        MAC тоже можно поразному записывать :) когда я только начинал знакомиться с cisco очень удивляла надпись вида хххх.хххх.хххх
        • 0
          Это тупо расстанка «знаков препинания», так сказать.
          Чего действительно в цисках другое забавное, так это поддежка обратной записи айпи, 1.0.0.127, к примеру.
      • +2
        Когда-то ооооочень давно была страничка в интернете на английском, посвящённая маскировке УРЛа, и там было написано много способов — и такой как www.list.ru@1297618184, и такие, как Вы описали… Я потом искал эту страничку — не нашёл. Возможно, эта информация у Вас оттуда же в голове отложилась и вот всплыла.
        • 0
          да, вот я тоже об этом сразу вспомнил
          и даже какая-то программа была, которая маскировала и демаскировала такие урлы
      • 0
        А я случайно узнал что такое longip.
        Когда потребовалось написать механизм, на проверку вхождения в заданный диапазон.
        Потом заменил на стандартную функцию ip2long()
  • –10
    На вскидку думаю так — это связанно с особенностью современной архитектуры, точнее ее 32-разрядностью.
    32 бита = 4 байта = 1 двойное слово
    В АйПи используется как раз 4 байта, которые хранятся в памяти в виде одного двойного слова
    По моему так (с) Винни пух
    о_о
  • НЛО прилетело и опубликовало эту надпись здесь
    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        вот так ( с http:// работает):
        011526012410/
      • НЛО прилетело и опубликовало эту надпись здесь
    • +4
      Хром сразу в нормальный айпи конвертирует.
      • НЛО прилетело и опубликовало эту надпись здесь
        • –2
          А огнелис вообще выдал сразу www.google.ru/ о_О
          • 0
            аналогично
          • +2
            огнелис оставил без изменения, а то что у вас получилось — редирект.
      • 0
        ага. а ещё говорит, на 011526012410/ «возможно вы имели ввиду „77.88.21.8/
    • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Safari can’t open the page “http://1249723236/” because Safari can’t find the server “1249723236”.

      Сафари 4.0.3 на Снежном Леопарде…

      Терминал пигует нормально предварительно сконвертировав в стандартный айпи.
  • +3
    В PHP есть даже встроенные функции для этого:
    php.net/ip2long
    php.net/long2ip

    Там же, в мануале, ссылка на реализацию этого же в стандартной библиотеке С. Наверное из C оно и попало в ОС, браузеры и т.п.
    • 0
      Должен заметить, что там довольно странная реализация. Функция может легко давать отрицательные значения.
      • +1
        Да, в мануале написано:

        Note: Because PHP's integer type is signed, and many IP addresses will result in negative integers, you need to use the "%u" formatter of sprintf() or printf() to get the string representation of the unsigned IP address.
      • 0
        Функция ip2long грешит.
        Если возвращенное значение из функции более максимального значения целого числа: 32 бита (2147483647) или 64 бита, то производится пересчет значения в число с плавающей точкой.
        Поэтому, на разных платформах, функция может выдать разные значения. будьте осторожны.
        • 0
          Интересно, как из 4 байт может получиться число более 32 байт?
        • 0
          Дружок, на всякий случай, чтобы ты знал: числа бывают знаковые и беззнаковые. про 64 бита — гон.
  • +2
    squid только об этом не знает.
    • +3
      и nginx говорит Bad Request
      • –1
        видимо, этот способ записи не везде поддерживается
        в FTP-клиенте и браузере замечательно работает
    • 0
      у меня второй сквид сработал нормально. а третий в комментах выше не справился.
  • +5
    Полезное применение такой нотации — хранение IP-адресов в базе данных.
    В строковом виде IP занимает 7-15 байт, в числовом — 4 байта.
    • +5
      В той же MySQL реализовано, INET_ATON() и INET_NTOA().
      • 0
        интересно, для IP6 такое в mysql уже есть?
        • 0
          В mysql ещё нет.
          В PHP можно использовать inet_pton();
    • +1
      Больше полезно для проверки входждения в диапазон адресов :)
      • 0
        А ещё для сортировки очень здорово, да.
  • –1
    Ну и как следствие отсюда 62.149.0.62 = 62.149.62
    • 0
      А почему?
      62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
      62 * 2563 + 149 * 2562 + 62 * 2561 = 1049968128
      • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Вы написали для случая 62.149.0.62. У меня записано то же самое. А вот для 62.149.62 я действительно ошибся. ТО, что записано у меня во второй строке — это для 62.149.62.0
          А для 62.149.62 будет: 62 * 2562 + 149 * 2561 + 62 * 256o = 4101438. Т.е. вс равно не равно :-)
        • 0
          А почему так считать? Почему не 62 * 2563 + 149 * 2561 + 62 * 256?
          • +3
            Я не прав…
            publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/libs/commtrf2/inet_addr.htm
            The following describes the restrictions on the field values for the inet_addr subroutine:
            Format Field Restrictions (in decimal)
            a Value_a < 4,294,967,296
            a.b Value_a < 256; Value_b < 16,777,216
            a.b.c Value_a < 256; Value_b < 256; Value_c < 65536
            a.b.c.d Value_a < 256; Value_b < 256; Value_c < 256; Value_d < 256

            Т.е. 62.149.62 мы понимаем как 62.149.aa.bb, где aa.bb равно 62, т.е. 00.62.
            DileSoftправ :)
      • –3
        потому что
        62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
        62 * 2563 + 149 * 2562 + 62 * 256O = 1049952318
        • 0
          см. выше.
        • +2
          Как вы узнали, что 62 нужно умножить на 1, а не на 256?
        • НЛО прилетело и опубликовало эту надпись здесь
          • –6
            марш в школу на информатику, изучать способы перевода из одной системы счисления в другую

            если в школу уже поздно. то хотя бы в гугл или википедию
            • НЛО прилетело и опубликовало эту надпись здесь
              • –5
                ru.wikipedia.org/wiki/Шестнадцатеричная_система_счисления

                топик стартер как-то туманно обяснил процесс перевода стандартного ip адреса в целое десятичное число, хотя на само деле процесс прост

                каждый байт ip адреса переводится в шестнадцатиричную систему, затем все байты записываются в одно число в том же порядке как они стоя в ip адресе, и хатем это числу переводится в десятичную систему

                123.234.34.45 = 0x7B.0xEA.0x22.0x2D = 0x7BEA222D = 2078941741
                • 0
                  Да в том то и дело, что когда PHP посчитает ip2long('62.149.62') и ip2long('62.149.0.62'), то выдаст одинаковые результаты, как и С, впрочем. Всё это из-за реализации понятия «non-complete IP», насколько я понял. Т.е. IP с тремя октетами этой библиотекой считаются валидными и переводятся по другим правилам (не «дополняя» нулём спереди или сзади.
            • 0
              Это не имеет ничего общего со способами перевода информации, 62.149.0.62 ≠ 62.149.62 при переводе поразрядно, они равны только как ip адреса, но вот почему — не понятно.
              • 0
                И снова см. выше :) Это сточки из мануала к C-шной библиотеке, на её основе PHP-шная написана
                • +2
                  Т.е. это не имеет никакого логического объяснения, просто так реализовано в самой популярной библиотеке?
                  • +1
                    логическое объяснение в том, что адрес имеет фиксированную длину, и если он у вас в формате a.b.c, то на последнюю часть отводится оставшиеся для двух разрядов 65536. то есть:
                    62.149.4096= 62.149.16.0
                    62.149.256= 62.149.1.0

                    62.149.62 = 62.19.0.62
                    • 0
                      62.149.255= 62.149.0.255 (сорри, ctrl случайно нажала)
                      и может где-то не так перевела из 16-ричной в 10-чную. перевожу на бегу )
          • –1
            потому, что 62.149.0.62 = 62.149.62, 62.62 = 62.0.0.62, 127.1 = 127.0.0.1
            в IP адресе 0 можно опускать, когда придет IPV6 это прочувствуется острее.
            • 0
              Вот ведь твердолобый :)
              Спрашивают «почему», ответ опять «потому что равно». Ну да ладно, trisch вроде все объяснила.
              • 0
                затупил маленько. бывает :)
  • –5
    Либо у меня дежавю, либо это уже недавно было на хабре
  • –1
    Классический пример применения union в языке C и аналогичных конструкций языка ;-)
    • +1
      o_O Вы о чём?
      • +3
        union в языке C — такая конструкция, в которую можно записать массив из четырёх байтов, а прочитать 32х-битное целое, которое будет состоять как раз из тех самых байтов.
        • –1
          Неужели? А то что на LE и BE значения будут разные роли не играет?
          • +2
            Вам никто не сказал что endiannes сохранится. Это именно способ доступа к памяти, а не преобразование. Часто еще применялось для доступа к отдельным битам флагов, типа такого:

            union {
            dword dwFlags;
            struct {
            bool bit1: 1;
            bool bit2: 1;
            bool bit3: 1;
            bool bit4: 1;
            // etc
            }
            }

            тогда можно писать в отдельный бит, а читать из всего слова. ну или наоборот, одним махом присвоить/прочитать все значения.
            • 0
              пардон, парсер схавал отступы :(
            • –1
              > Вам никто не сказал что endiannes сохранится.
              И какое тогда union имеет отношение к теме топика?
              • 0
                К тому что надо читать всю ветку комментариев, а не только последние два. Ибо весь сабж суть разные формы представления одного и того же dword-а.
  • –1
    я уже сталкивался с этим, когда писал под виндус приложение на c++ для работы с роутами с использованием библиотеки iphlpapi. там как раз при возвращении таблицы роутов все ip адреса dword'овские, а не как я надеялся получать ip в виде структуры
  • 0
    Чесно говоря, до последнего предложения казалось, что топик полная фигня. Но вот прикладная часть в корне меняет дело!
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Здорово.

    Интересна обратная процедура — есть, например, номер телефона (вместе с кодом города — как раз) — и получить такой же IP-адрес :-)

    Получается unified messaging в чистом виде.
    • 0
      Только вот айпи-адреса по одному не продаются, так что это дело очень большого везения (или больших денег), заиметь такой адрес.
      Куда проще достать номер аськи.
    • +1
      Для телефонов есть e164.arpa., хотя он не так известен, как in-addr.arpa. и вряд ли широко делегируется.
  • –3
    зачот
  • +1
    ping 2130706433

    Обмен пакетами с 127.0.0.1 по 32 байт:

    Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128

    И правда работает :)
    • 0
      а теперь попробуйте

      ping 6425673728
      • 0
        соврамши

        ping 6425673729
        • 0
          а затем

          ping 10720641025
    • 0
      и 127.1 попробуйте
  • –7
    «8 * 256О» — oO, это шо?
    или для наглядности?
    • 0
      Это «восемь умножить на двести пятьдесят шесть в нулевой степени».
      • +1
        это восемь. просто восемь.
    • +3
      точно, для наглядности
  • 0
    я как-то сталкивался с айпи адресами в виде числа, если не изменяет память, то это было в ULOG в linux`e…
    наверное полезно было бы в пост добавить алгоритм для обратного преобразования в традиционный вид.
    • 0
      >алгоритм для обратного преобразования в традиционный вид

      calc.exe

      из десятичного в hex, и оттуда по байтово снова в dec
  • 0
    В детстве читал про это в Хакере, даже фраза была похожая: «можно записать так… так..., или даже смешивать»
    • 0
      Ага, я тоже оттуда подчерпнул
    • +1
      > В детстве читал про это в Хакере
      Вот так незаметно и подступила ко мне старость
    • 0
      Да, тоже вспомнил. Имха, 98 год, ещё бумажное издание.
  • +1
    магия 5349145090 1054177794
    • +1
      А также 9644112386 и так далее…
      Что в первый раз с переполнением сталкиваетесь?
  • +1
    Не забывайте ещё про htonl/ntohl преобразования, ибо есть «сетевой» порядок байт, описанный в RFC, а есть машинный, зависящий от ОС и железа.
    Иногда байты надо переворачивать…
  • 0
    баловалка на вечер=)
  • 0
    Недавно проскакивало в комментариях к какому-то посту.
  • +5
    Капитан Очевидность припас ещё один способ записи IPv4 адресов: через их отображение в IPv6 адреса. Естественно, он будет работать только на dual-stack хостах (последние версии винды и линукса поддерживают, макось тоже, наверное). Ну и распознаёт такие адреса ещё меньшее количество ПО (проксей, блог-парсеров и т.п.).

    Так, приведённый в примере 77.88.21.8 может быть записан как:
    ::ffff:77.88.21.8 или ::ffff:4D58:1508. В виде URL это будет: http://[::ffff:77.88.21.8]/ или http://[::ffff:4D58:1508]/

    Причём вначале можно указать до 5 ноликов, причём как сначала, так и с конца пропуска:
    ::0:0:ffff:77.88.21.8, 0:0::ffff:4D58:1508, .., 0:0:0:0:0:ffff:77.88.21.8.
    • +1
      это ужасно.
      пора эволюционировать в роботов
  • +1
    Скоро придёт IPv6 и всё, никаких вам украшений адресов.
    Впрочем, он уже пришёл — Freenet6 же! Я даже пробовал.
  • 0
    Интересно то, что хром в статье все ссылки позаменял на классический формат.
    • 0
      Опера тоже
  • +2
    Могла бы быть гонка за красивым числом)
    К примеру 1000000000 или 222222222
    • 0
      хочу такой =)
      • +1
        Увы)
        1000000000 — 59.154.202.0 — Australia
        222222222 — 13.62.215.142 — United States
  • 0
    АААААА 0.10.44.42— демонический айпишник…
  • +1
    Это работает не везде. Не в любом браузере, не в любой OS.
  • –2
    А яндекс не боится хабраэффекта?
    • +2
      Если даже хабр не боится хабраэффекта, то думаю яндексу на него вообще наплевать (:
  • +2
    4815162342 опасно пинговать О_о
    • +1
      Пинговать надо только раз в 108 минут
  • 0
    жалко, что никто не написал, откуда этот трюк взялся
    я RFC полистал, но не нашел ничего такого
    • 0
      В том-то и дело, что этот способ является вредным нарушением стандартов, описанных в RFC. Весь «трюк» заключается в том, что некоторые программы (например, броузеры) пытаются быть «умными» и превращать нестандартные незаконные URL в законные, «догадываясь», что 1234567890 — это не имя хоста, а числовой IP-адрес. С точки зрения RFC h ttp://1234567890/ (после h нужно убрать пробел) не является корректным URL с IP-адресом (1234567890 — это имя хоста, которое должно разрешаться DNS).
      Другой пример нарушения стандартов, который, к сожалению, нередко используется, это HTTP URL с именем пользователя и паролем, например
      h ttp://vasya:collpassword@www.acme.com/ (после h нужно убрать пробел)
      Такие URL со схемой ftp: вполне валидны, но с http: — нет.
      • 0
        Линукс тогда получается тоже идет поперек стандарта: ping 1297618184 и lynx 1297618184 работают на ура.
        Вы можете привести RFC, где описывается «нотация» IP-адреса? Интересно все-таки увидеть первоисточник.
        • +1
          Линукс является ядром ОС и имеет очень отдаленное отношение к проблеме. Прикладная программа ping — это тоже о другом. Разные прикладные программы могут позволять представлять IP-адрес в самых разных формах, хоть словами. Речь не об IP-адресах вообще. Я об стандартной универсальной вещи, используемой множеством прикладных программ — об URI (или URL, разница тут не важна). А вот в URL-то IP-адрес можно указывать не как заблагорассудится, или как позволяет программа ping в конкретно вашем Линуксе, а только определенным образом, который и стандартизирован в RFC3986. Uniform Resource Identifier (URI): Generic Syntax
          Процитирую нужные кусочки (выделение жирным — моё):
          A host identified by an IPv4 literal address is represented in
          dotted-decimal notation (a sequence of four decimal numbers in the
          range 0 to 255, separated by "."), as described in [RFC1123] by
          reference to [RFC0952]. Note that other forms of dotted notation may
          be interpreted on some platforms, as described in Section 7.4, but
          only the dotted-decimal form of four octets is allowed by this
          grammar.


          IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

          dec-octet = DIGIT; 0-9
          / %x31-39 DIGIT; 10-99
          / «1» 2DIGIT; 100-199
          / «2» %x30-34 DIGIT; 200-249
          / «25» %x30-35; 250-255
          • 0
            спасибо, теперь все понятно
  • +1
    На связке Mac Os + Safari числовое представление адреса не работает
    • 0
      А всем говорят — Think different… ;)
      • 0
        ненене, никаких холиваров :) смысл этого выражения в другом :)
    • +2
      Там скоро и адресная строка не будет работать, ибо правоверный мак-юзер не должен набирать адрес с клавиатуры, это для варварских линуксоидов и виндузятников.
      • 0
        скорей бы уж )))
        • +1
          Ну да. Внедрят, предположим, голосовой ввод, и будут полчища юзеров усердно пытаться спеллить [haebrahaebr], а в ответ им Four-Zero-Four:))
  • +1
    Господа, а зачем карете турбина? IP четвертой версии уже потихоньку уходит в прошлое.
    • 0
      Ну вот и обращайся к гуглу (и большинству сайтов) по 6. Наверняка его тоже можно сократить до натурального числа, только в 2 раза длиннее.
  • +1
    ping 0xBabaBeda
    ничего личного :)
  • 0
    я никого не испугаю, если скажу что RGB(255, 127, 0) можно записать в виде ff7f00 или 16744192?
    • 0
      16744192 что-то не очень работает у меня в CSS
      приведите пример
      • 0
        я где-то упомянул CSS?
        • 0
          rgb(x, y, z) — в CSS есть такая конструкция, вот я и подумал
          то, что можно цвет записать числом — это замечательно, но способ записи IP, который тут описан очень много где работает

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.