Я написал это в прошлом году как внутренний справочный документ, когда некоторые наши инженеры запутались, когда меня попросили поместить адреса IPv6 в DNS. Я не обращался к DNS конкретно, но большая часть беспокойства касалась формата адресов, а не «понимания» того, как они работают. Может быть, это будет полезно и для других:
Итак, первое, что нужно признать, это то, что IPv6-аддеры выглядят ужасно. Они делают.
Но я думаю, что это только потому, что мы не привыкли иметь с ними дело, и мы не понимаем, что они означают на очень низком уровне, как мы делаем с адресами IPv4. Я думаю, что потребуется некоторое время, чтобы освоиться с ними, но мы должны с чего-то начать.
Еще одна важная вещь, которую следует помнить: адреса IPv4 - это 32-разрядные числа, а адреса IPv6 - это 128-разрядные числа. Когда маршрутизатор маршрутизирует или фильтрует межсетевой экран, они делают это на основе этого числа. То, как человек выбирает отображение этого числа, совершенно произвольно и в основном просто традиция. Таким образом, вся эта электронная почта объясняет, как люди выбирают эти цифры - машинам все равно, для них это все биты.
Адрес IPv4 составляет 32 бита или четыре байта. То, что мы называем «реальными» IP-адресами, является просто методом, который стал стандартным для представления этой битовой строки, разделения битов на 4 8-битных групп, представления каждых 8 битов в виде десятичного числа и разделения этих десятичных чисел этим Период. Итак, возьмите случайный IP-адрес 172.30.154.249. Когда маршрутизатор «думает» об этом IP-адресе, он действительно думает об этом так:
10101100000111101001101011111001
Который мы можем перевести вниз в нашу собственную форму:
10101100 = 172
00011110 = 30
10011010 = 154
11111001 = 249
Иногда вы также можете увидеть их в виде чистого десятичного числа:
10101100000111101001101011111001 = 2,887,686,905
Вряд ли кто-то использует эту форму специально (*), но это исторически верный способ написать адрес IPv4. Фактически, эта форма используется в RFC821, который определил SMTP в 1982 году. Если вы хотите вручную направлять почту на конкретный компьютер вместо DNS, вы можете использовать два разных типа литералов. Первой была знакомая форма «пунктирный квадрат» в скобках («user @ [172.30.154.249]»). Второй использовал десятичную форму IP с префиксом знака фунта («user @ # 2887686905»).
Все вышеперечисленное было просто для того, чтобы обеспечить основу для преобразования ваших знаний о том, как адреса IPv4 работают, в адреса IPv6. Так же, как IPv4 является 32-разрядным числом, адреса IPv6 являются 128-разрядными числами. АРИН назначил МОЕЙ УДИВИТЕЛЬНОЙ КОМПАНИИ (**) диапазон IP 2311: FD67 / 32. Ради примера для работы я собираюсь использовать IP 2311: FD67 :: AC1E: 9AF9.
Итак, вот битовая строка, представляющая этот ip6:
00100011000100011111110101100111000000000000000000000000000000000000000000000000000000000000000010101100000111101001101011111001
Если бы мы представляли эти битовые строки так, как мы делаем битовые строки IPv4 (преобразуем каждый 1-байтовый блок в десятичный, разделяя каждую точку), мы получили бы следующее:
35.17.253.103.0.0.0.0.0.0.0.0.172.30.154.249
Это имеет пару проблем. Во-первых, это выглядит как прикольный номер IPv4, что нехорошо, вам нужен надежный способ различать их. Другое - это то, что в нем много информации, много цифр и много пустого пространства. Таким образом, обе проблемы решаются путем использования другого разделителя (двоеточие (:) вместо точки (.)) И представления байтов в шестнадцатеричном формате вместо десятичного. Где IPv4 разделял 8-битные чанки, представленные в десятичном виде, с точками, IPv6 разделял 16-битные чанки, разделяемые двоеточиями. Итак, вот разбивка нашего примера IPv6 IP:
0010001100010001 = 2311
1111110101100111 = FD67
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
1010110000011110 = AC1E
1001101011111001 = 9AF9
2311:FD67:0:0:0:0:AC1E:9AF9
В нем все еще много пустого пространства, поэтому есть вероятность, что наибольшая строка нулей может быть опущена и представлена двойным двоеточием. Итак, вышеуказанный IP можно записать:
2311:FD67::AC1E:9AF9
Я не видел этого много, но, насколько я понимаю, есть также четкое соглашение, позволяющее записывать последние 32-разрядные символы в виде префикса с точками-точками, что позволяет легко распознавать устаревшие адреса при переходе с IPv4 на IPv6. , Итак, как вы, наверное, заметили, мой пример IPv6-адреса заканчивается теми же 32-мя битами, которые полностью составляют мой пример IPv4. Это особенно полезно, когда вы пишете в этом стиле. В этом случае мой адрес IPv6 будет выглядеть так:
2311:FD67::172.30.145.249
Чтобы вернуться к тому, с чего я начал с IPv6, я упомянул, что нам было назначено 2311: FD67 / 32. / 32 является битовой маской, как и в адресах IPv4. По сути это означает, что нам статически были назначены первые 32 из 128 битов в адресе IPv4, который мы могли создать. Поскольку 2311: FD67 - 32 бита, это означает, что каждый IP-адрес, который мы создаем из этого диапазона, будет начинаться с него.
Другими словами, 172.17 / 16 можно рассматривать как «каждый IP между 172.17.0.0 и 172.17.255.255», 2311: FD67 / 32 можно рассматривать как «каждый IP между 2311: FD67: 0: 0: 0: 0: 0: 0 и 2311: FD67: FFFF: FFFF: FFFF: FFFF: FFFF: FFFF ".
Я думаю, что пройдет много времени, прежде чем мы начнем переход на IPv6, но я надеюсь, что это объяснение поможет вам чувствовать себя более комфортно, используя их и ссылаясь на них.
Опять же, очень важно понять, что единственное, о чем я говорю, это буквально записать адрес IPv6. Похоже, в схему нумерации для маршрутизации встроено много интеллектуальных возможностей, которые я пока еще не совсем понял, так что сейчас я могу обратиться только к тому, как это выглядит =).
(*) Я видел десятичное представление IPv4 в некоторой программной отладке раньше, но я почти уверен, что это ошибка или лень, я думаю, что в коде C гораздо сложнее быстро вывести 32-битное целое число, чем отформатировать пунктирный квадрат для печати.
(**) Я указал название моей компании и префикс