Сокращение IPv6 адресов

Адрес протокола IPv6 состоит из 128 бит и записывается обычно в шестнадцатеричном виде. Адрес разбиваются на блоки по 16 бит (хекстеты) и каждый блок представляется четырьмя шестнадцатеричными цифрами. Хекстеты разделяются знаком двоеточия. Таким образом, адрес получается достаточно длинным – он состоит из 32 шестнадцатеричных цифр и 7 знаков двоеточия.

Пример IPv6 адреса 2001:0DB0:0000:123A:0000:0000:0000:0030. Запись весьма длинная, чтобы немного упростить процесс записи адресов, используют сокращенную запись. Для того чтобы сократить данный адрес надо последовательно применить два правила.

Правило 1

В каждом хекстете (группе из 4-х цифр) ведущие нули удаляются. Например, во втором хекстете 0DB0 заменяется на DB0. То есть ноль слева удаляется, ноль справа мы не трогаем. Если хекстет состоит из одних нулей, то он заменяется на один нуль. Таким образом адрес 2001:0DB0:0000:123A:0000:0000:0000:0030 преобразуется в 2001:DB0:0:123A:0:0:0:30. А, например, адрес loopback 0000:0000:0000:0000:0000:0000:0000:0001 заменяется на 0:0:0:0:0:0:0:1.

Правило 2

Это правило применяется только после первого. В адрес выбирается одна самая длинная группа, состоящая из полностью нулевых хекстетов, то есть самая длинная последовательность «:0:0:0:» и заменяется на два двоеточия «::». Эту замену можно произвести только один раз и только с самой длинной последовательностью, так как, если бы мы, например, сделали такую замену в двух местах адреса, то потом нельзя было бы восстановить, сколько именно хекстетов мы заменили в первом и во втором случае. Важный момент: нельзя заменять одну группу из :0: на ::, правило два применимо только если есть более одной нулевой группы.

Для примера возьмём адрес из предыдущей замены 2001:DB0:0:123A:0:0:0:30. Самая длинная последовательность из полностью пустых хекстетов – это «:0:0:0:», она начинается сразу после хекстета «123A». Есть ещё последовательность из одного пустого хекстета (между «DB0» и «123A»), но эта – длиннее, так что заменять будем её. Адрес станет совсем небольшим: 2001:DB0:0:123A::30 конечно, длиннее IPv4 адреса, но гораздо короче исходного.

Получение исходного адреса по сокращённой записи

Эта процедура достаточно тривиальна, если мы уже умеем сокращать адреса.

Сначала надо посчитать, сколько хекстетов в адресе осталось. В нашем случае, в адресе 2001:DB0:0:123A::30 осталось 5 хекстетов. Мы знаем, что адрес должен состоять из восьми хекстетов – значит вместо «::» возвращаем три недостающих нулевых, получаем 2001:DB0:0:123A:0:0:0:30. Теперь в каждой группе, где меньше четырёх цифр дописываем слева такое количество нулей, чтобы в группе стало четыре цифры. В результате получим исходный адрес 2001:0DB0:0000:123A:0000:0000:0000:0030.

Примеры

Теперь, чтобы закрепить понимание, приведём несколько примеров сокращения адресов. Сокращать будем по правилам в два этапа.

  1. FF80:0000:0000:0000:0123:1234:ABCD:EF12 → FF80:0:0:0:123:1234:ABCD:EF12 → FF80::123:1234:ABCD:EF12
  2. FF02:0000:0000:0000:0000:0001:FF00:0300 → FF02:0:0:0:0:1:FF00:300 → FF02::1:FF00:300
  3. 2001:0DB8:0000:1111:0000:0000:0000:0200 → 2001:DB8:0:1111:0:0:0:200 → 2001:DB8:0:1111::200
  4. 0000:0000:0000:0000:0000:0000:0000:0001 → 0:0:0:0:0:0:0:1 → ::1
  5. 0000:0000:0000:0000:0000:0000:0000:0000 → 0:0:0:0:0:0:0:0 → ::

Адрес loopback выглядит в сокращённой записи особенно элегантно ::1. Даже если вы не пользуетесь IPv6, но работаете на одной из современных операционных, систем, у вас наверняка установлен этот протокол. Это легко проверить, пропинговав loopback.

ping ::1
Pinging ::1 with 32 bytes of data:
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Ping statistics for ::1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Относится к теме: 
Тэги: 

Комментарии

Здравствуйте,
могу ли я разместить на своих страница ссылку на этот материал?

Небольшое дополнение: имхо, нелишне было бы упомянуть, что одиночное :0: не сокращается до :: - то есть, скажем, 2001:db8:0000:9:1:2:3:4 нельзя сокращать до 2001:db8::9:1:2:3:4

(а почему вы используете 2001:db0 вместо обещпринятого 2001:db8 ?)

Аватар пользователя bacek
Здравствуйте.
По поводу использования материала - у меня об этом есть в "О сайте". В двух словах - можно не спрашивать, если будет индексируемая гипперссылка на оригинал.

Что касается 2001:db0 - то не могу точно сказать - писал давно. Наверное чтобы показать, что правила одни для всех типов адресов, а может просто опечатался. Не думаю, что это принципиально.
А вот про сокращение одного нуля (что нельзя сокращать одну группу до ::) я не слышал до этого. Можно линк на первоисточник?

Про сокращение - см. RFC5952
Узнал про это после прочтения презабавнейшей истории http://labs.apnic.net/blabs/?p=309
История длинная, истина где-то в конце.
Не для печати: если будет тоскливо дочитывать, или не позволит занятость, то я конспективно излагал ее на своих страничках http://ip.v6net.ru/archives/1419

Аватар пользователя bacek
Спасибо. Статью подправил, надо на хабре UPD сделать. Действительно, редкая ситуация, об этом в CCNA ничего не писали вроде бы.

Когда я сдавал (10 лет назад) - вообще не было вопросов по IPv6...

Аватар пользователя bacek
Да, это новый R&S 2013 года выпуска. Теперь добавили очень много, собственно об этом и пишу на хабре.

(2a00:a960:1023:0:0:0:0:1188) не могли бы помочь определить местонахождение данного айпи. Заранее спасибо

Аватар пользователя bacek
https://www.ultratools.com/tools/ipv6InfoResult?ipAddress=2a00%3Aa960%3A1023%3A0%3A0%3A0%3A0%3A1188 person: Igor Voronin address: OOO E-GROUP phone: +7(916)680-31-23 nic-hdl: IV924-RIPE mnt-by: E-GROUP-MNT mnt-by: DATAPRO-RU-MNT mnt-by: garrycrow created: 2011-02-25T13:08:49Z last-modified: 2015-09-09T15:15:02Z source: RIPE # Filtered и т.п.

Добавить комментарий