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

индекс
199,95

Альтернативный способ записи 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 и т.д. Попробуйте сами.
+100
14 сентября 2009, 16:10
150

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

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

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

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

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

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

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
esenin #
Функция ip2long грешит.
Если возвращенное значение из функции более максимального значения целого числа: 32 бита (2147483647) или 64 бита, то производится пересчет значения в число с плавающей точкой.
Поэтому, на разных платформах, функция может выдать разные значения. будьте осторожны.
0
NickyX3 #
Интересно, как из 4 байт может получиться число более 32 байт?
0
mx2000 #
Дружок, на всякий случай, чтобы ты знал: числа бывают знаковые и беззнаковые. про 64 бита — гон.
+2
evil_random #
squid только об этом не знает.
+3
evil_random #
и nginx говорит Bad Request
–1
gag_fenix #
видимо, этот способ записи не везде поддерживается
в FTP-клиенте и браузере замечательно работает
0
ConstNW #
у меня второй сквид сработал нормально. а третий в комментах выше не справился.
+5
gag_fenix #
Полезное применение такой нотации — хранение IP-адресов в базе данных.
В строковом виде IP занимает 7-15 байт, в числовом — 4 байта.
+5
blum #
В той же MySQL реализовано, INET_ATON() и INET_NTOA().
0
freeAKK #
интересно, для IP6 такое в mysql уже есть?
0
frizz #
В mysql ещё нет.
В PHP можно использовать inet_pton();
+1
DorBer #
Больше полезно для проверки входждения в диапазон адресов :)
0
vitek #
А ещё для сортировки очень здорово, да.
–1
evil_random #
Ну и как следствие отсюда 62.149.0.62 = 62.149.62
0
blum #
А почему?
62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 62 * 2561 = 1049968128
0
DileSoft #
Вы путаете.

0
DileSoft #
Вы путаете:

62 * 256^3 + 149 * 256^2 + 62 * 256^0 — вот так считайте.
0
blum #
Вы написали для случая 62.149.0.62. У меня записано то же самое. А вот для 62.149.62 я действительно ошибся. ТО, что записано у меня во второй строке — это для 62.149.62.0
А для 62.149.62 будет: 62 * 2562 + 149 * 2561 + 62 * 256o = 4101438. Т.е. вс равно не равно :-)
0
homm #
А почему так считать? Почему не 62 * 2563 + 149 * 2561 + 62 * 256?
+3
blum #
Я не прав…
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
evil_random #
потому что
62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 62 * 256O = 1049952318
0
blum #
см. выше.
+2
homm #
Как вы узнали, что 62 нужно умножить на 1, а не на 256?
+1
DileSoft #
А почему пропускается именно вторая часть справа, а не третья, например?
–6
HighwayStar #
марш в школу на информатику, изучать способы перевода из одной системы счисления в другую

если в школу уже поздно. то хотя бы в гугл или википедию
0
DileSoft #
Что-то не нашел, конкретизируйте пожалуйста.
–5
HighwayStar #
ru.wikipedia.org/wiki/Шестнадцатеричная_система_счисления

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

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

123.234.34.45 = 0x7B.0xEA.0x22.0x2D = 0x7BEA222D = 2078941741
0
blum #
Да в том то и дело, что когда PHP посчитает ip2long('62.149.62') и ip2long('62.149.0.62'), то выдаст одинаковые результаты, как и С, впрочем. Всё это из-за реализации понятия «non-complete IP», насколько я понял. Т.е. IP с тремя октетами этой библиотекой считаются валидными и переводятся по другим правилам (не «дополняя» нулём спереди или сзади.
0
homm #
Это не имеет ничего общего со способами перевода информации, 62.149.0.62 ≠ 62.149.62 при переводе поразрядно, они равны только как ip адреса, но вот почему — не понятно.
0
blum #
И снова см. выше :) Это сточки из мануала к C-шной библиотеке, на её основе PHP-шная написана
+2
homm #
Т.е. это не имеет никакого логического объяснения, просто так реализовано в самой популярной библиотеке?
+1
trisch #
логическое объяснение в том, что адрес имеет фиксированную длину, и если он у вас в формате 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
trisch #
62.149.255= 62.149.0.255 (сорри, ctrl случайно нажала)
и может где-то не так перевела из 16-ричной в 10-чную. перевожу на бегу )
–1
evil_random #
потому, что 62.149.0.62 = 62.149.62, 62.62 = 62.0.0.62, 127.1 = 127.0.0.1
в IP адресе 0 можно опускать, когда придет IPV6 это прочувствуется острее.
0
homm #
Вот ведь твердолобый :)
Спрашивают «почему», ответ опять «потому что равно». Ну да ладно, trisch вроде все объяснила.
0
evil_random #
затупил маленько. бывает :)
–5
Dialogus #
Либо у меня дежавю, либо это уже недавно было на хабре
–1
seraph #
Классический пример применения union в языке C и аналогичных конструкций языка ;-)
+1
superhabra #
o_O Вы о чём?
+3
b8c6 #
union в языке C — такая конструкция, в которую можно записать массив из четырёх байтов, а прочитать 32х-битное целое, которое будет состоять как раз из тех самых байтов.
–1
superhabra #
Неужели? А то что на LE и BE значения будут разные роли не играет?
+2
Halt #
Вам никто не сказал что endiannes сохранится. Это именно способ доступа к памяти, а не преобразование. Часто еще применялось для доступа к отдельным битам флагов, типа такого:

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

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

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

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

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

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

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

ping 6425673728
0
HighwayStar #
соврамши

ping 6425673729
0
HighwayStar #
а затем

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

calc.exe

из десятичного в hex, и оттуда по байтово снова в dec
0
unicast #
В детстве читал про это в Хакере, даже фраза была похожая: «можно записать так… так..., или даже смешивать»
0
ozonar #
Ага, я тоже оттуда подчерпнул
+1
ssve #
> В детстве читал про это в Хакере
Вот так незаметно и подступила ко мне старость
0
Gavroshe #
Да, тоже вспомнил. Имха, 98 год, ещё бумажное издание.
+1
HighwayStar #
магия 5349145090 1054177794
+1
Wott #
А также 9644112386 и так далее…
Что в первый раз с переполнением сталкиваетесь?
+1
ellesar2001 #
Не забывайте ещё про htonl/ntohl преобразования, ибо есть «сетевой» порядок байт, описанный в RFC, а есть машинный, зависящий от ОС и железа.
Иногда байты надо переворачивать…
0
Kastrulya #
баловалка на вечер=)
0
rold #
Недавно проскакивало в комментариях к какому-то посту.
+5
allter #
Капитан Очевидность припас ещё один способ записи 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
evil_random #
это ужасно.
пора эволюционировать в роботов
+1
lol2Fast4U #
Скоро придёт IPv6 и всё, никаких вам украшений адресов.
Впрочем, он уже пришёл — Freenet6 же! Я даже пробовал.
+2
freeAKK #
+2
lol2Fast4U #
О да! Я сразу не вспомнил, но это же прекрасно!
0
Frag #
Интересно то, что хром в статье все ссылки позаменял на классический формат.
0
zodiac #
Опера тоже
+2
DonSleza4e #
Могла бы быть гонка за красивым числом)
К примеру 1000000000 или 222222222
0
freeAKK #
хочу такой =)
+1
bondsman #
Увы)
1000000000 — 59.154.202.0 — Australia
222222222 — 13.62.215.142 — United States
0
Denai #
АААААА 0.10.44.42— демонический айпишник…
+1
stasikos #
Это работает не везде. Не в любом браузере, не в любой OS.
–2
unreal #
А яндекс не боится хабраэффекта?
+2
Halt #
Если даже хабр не боится хабраэффекта, то думаю яндексу на него вообще наплевать (:
+2
Columbus #
4815162342 опасно пинговать О_о
+1
gefix #
Пинговать надо только раз в 108 минут
0
gag_fenix #
жалко, что никто не написал, откуда этот трюк взялся
я RFC полистал, но не нашел ничего такого
0
AntonShcherbinin #
В том-то и дело, что этот способ является вредным нарушением стандартов, описанных в 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
gag_fenix #
Линукс тогда получается тоже идет поперек стандарта: ping 1297618184 и lynx 1297618184 работают на ура.
Вы можете привести RFC, где описывается «нотация» IP-адреса? Интересно все-таки увидеть первоисточник.
+1
AntonShcherbinin #
Линукс является ядром ОС и имеет очень отдаленное отношение к проблеме. Прикладная программа 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
gag_fenix #
спасибо, теперь все понятно
+1
dasaver #
На связке Mac Os + Safari числовое представление адреса не работает
0
goodbear #
А всем говорят — Think different… ;)
0
dasaver #
ненене, никаких холиваров :) смысл этого выражения в другом :)
+2
VovixLDR #
Там скоро и адресная строка не будет работать, ибо правоверный мак-юзер не должен набирать адрес с клавиатуры, это для варварских линуксоидов и виндузятников.
0
dasaver #
скорей бы уж )))
+1
VovixLDR #
Ну да. Внедрят, предположим, голосовой ввод, и будут полчища юзеров усердно пытаться спеллить [haebrahaebr], а в ответ им Four-Zero-Four:))
+1
lovermann #
Господа, а зачем карете турбина? IP четвертой версии уже потихоньку уходит в прошлое.
0
VovixLDR #
Ну вот и обращайся к гуглу (и большинству сайтов) по 6. Наверняка его тоже можно сократить до натурального числа, только в 2 раза длиннее.
+1
ew1abz #
ping 0xBabaBeda
ничего личного :)
0
mx2000 #
я никого не испугаю, если скажу что RGB(255, 127, 0) можно записать в виде ff7f00 или 16744192?
0
gag_fenix #
16744192 что-то не очень работает у меня в CSS
приведите пример
0
mx2000 #
я где-то упомянул CSS?
0
gag_fenix #
rgb(x, y, z) — в CSS есть такая конструкция, вот я и подумал
то, что можно цвет записать числом — это замечательно, но способ записи IP, который тут описан очень много где работает

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