Операции над IPv6-адресами — краткий экскурс
Введение
Данная статья является переводом конкретного раздела, описывающего базовые операции над IPv6-адресами из учебника CCNA 200-301 Volume 1 от автора Wendell Odom.
Сокращение IPv6 адресов
Их «::» можно использовать всего один раз на весь IPv6-адрес.
Если перед буквами (hex) или цифрами, кроме нуля в гекстете идут нули, то их можно отсекать.
Разберем несколько примеров:
Дано
С сокращением
Нахождение части подсетей IPv6-адреса
Для написания номера подсети приводим часть хостов к нулю и получаем такое: 2000:1234:5678:9ABC:0000:0000:0000:0000/64, а в сокращенном виде: 2000:1234:5678:9ABC::/64
Разберем несколько примеров:
Дано
Подсеть
С сокращением
А теперь разберем несколько более сложных примеров:
Дано: 2000:1234:5678:9ABC:1234:5678:9ABC:1111/56
Каждый гекстет есть 16 бит, так как всего 8 гекстетов и 128 бит, таким образом 16*8 = 128, значит половина гекстета = 8 бит.
В данном случае, нам нужно отсчитать 3 целых гекстет и половину 4-го, получаем 3*16+8=56 бит.
Итого получаем такую часть подсети: 2000:1234:5678:9A00:0000:0000:0000:0000/56
или в сокращенном виде: 2000:1234:5678:9A00::/56
Тут можно легко допустить ошибку, посчитав, что, так как у нас префикс=56 бит, то после 9A мы должны были отсечь 2 символа, но это не так. Они остаются: 9A00, потому что, если отсечь два нуля в конце в дальнейшем может превратится в 009А, что является уже другим адресом.
Разберем несколько примеров с различными префиксами:
Дано
С сокращением
Учимся понимать как работает механизм по автоматической выдаче IPv6-адресов на основе MAC-адресов хостов
Дано: 2001:DB8:1:1::/64
MAC: B8:0C:BE:EF:CA:FE, в дальнейшем буду разделять точкой на 3 октета: B80C.BEEF.CAFE
Первым делом необходимо разделить MAC-адрес пополам
и добавить посередине значение: FFFE, по итогу получаем такую запись: B80C:BEFF:FEEF:CAFE
Необходимо перевести B8 в двоичный вид, получаем: 1011 1000, но это еще не все. Из двоичной записи берем 7-й бит и инвертируем его (1 в 0 или 0 в 1) и получаем такую запись: 1011 1010, а теперь обратно переводим в HEX-формат, получаем BA (B=1011, A=1010). Наконец-то подставляем вместо B8 наш результат BA и получаем: BA0C:BEFF:FEEF:CAFE, а эту запись добавляем в конец адреса из Дано и получаем результат: 2001:DB8:1:1:BA0C:BEFF:FEEF:CAFE
Разберем несколько примеров:
Адреса протокола IPv6 — локальный и глобальный тип
Протокол IPv6 это протокол сетевого уровня, предназначенный для передачи данных. Он призван заменить протокол IPv4, в котором есть проблема нехватки IP адресов. Протокол IPv6 несовместим с IPv4, основное отличие в том, что длина IP адреса в протоколе IPv4 это 4 байта, а в протоколе IPv6 16 байт. IP адрес в протоколе IPv4 записываются в виде четырех десятичных чисел разделенных двоеточиями, числа могут быть от 0 до 255. Например, 77.88.8.7.
Длина адреса IPv6 гораздо больше 16 байт или 128 бит, и использовать такую же схему записи как и для адреса IPv4 неудобно, адрес был бы слишком длинным. Вместо этого предложили использовать запись следующего вида: 8 групп шестнадцатеричных чисел отделенных друг от друга двоеточиями, каждое число состоит из четырех шестнадцатеричных цифр и значение может быть от 0 до ffff. Например: 2a02:6b8:0892:ad61:59a2:3149:c5a0:67a4/64.
Префикс IPv6
IPv4 IP адрес состоит из двух частей: адрес подсети и адрес хоста. Для того, чтобы определить, где в IP адресе, адрес сети, а где адрес хоста, используется так называемая маска подсети. Протокол IPv6 использует похожие понятия, но с другими названиями.
IPv6 адрес также состоит из двух частей, адрес сети и адрес компьютера, но адрес сети называется префиксом IPv6, а адрес хоста называется адресом интерфейса. То, что в IPv4 называлось маской подсети в протоколе IPv6 называется длиной префикса.
Длина префикса в протоколе IPv6 показывает, сколько цифр в IP адресе относится к адресу сети, а сколько к адресу компьютера.
Вот пример записи префикса в IPv6: 2a02:6b8:0892:ad61:59a2:3149:c5a0:67a4/64, маска подсети в IPv4 также может записываться в подобном формате. Кроме этого маска подсети в IPv4 может быть записана в десятичном формате, но в IPv6 десятичный формат не используется.
Длина префикса 64 означает, что первые 64 бита IPv6 адреса относится к адресу сети, а оставшиеся 64 бита к адресу интерфейса или адресу хоста.
Вычисления префикса IPv6
Правила вычисления адреса сети или префикса, как он называется в протоколе IPv6, точно такие же, как и в протоколе IPv4. Необходимо перевести адрес в двоичную форму, отсчитать количество бит которое, соответствует длине префикса, эти биты IP адреса оставить без изменения, а остальные заменить нулями.
Чаще всего в IPv6 можно использовать упрощенную процедуру. Если длина префикса кратна 16, то префикс заканчивается, как раз на одной из групп шестнадцатеричных чисел, поэтому мы можем оставить без изменения те шестнадцатеричные числа, которые входят в префикс, а всё остальное заменить нулями.
Например, если длина префикса /64, то мы можем первые четыре группы шестнадцатеричных чисел оставит без изменения, остальные заменить нулями.
Более сложный случай, если длина префикса кратна 4, в этом случае префикс включает полностью какую-либо шестнадцатеричную цифру, поэтому мы оставляем без изменения всю начальную часть IP адреса, до той цифры на который заканчивается префикс, а оставшуюся часть заменяем нулями.
Например: длина нашего префикса 52 бита, первые три группы шестнадцатеричных чисел заканчиваются на границе 48 бит, длина нашего префикса 52 на 4 бита больше, соответственно в префикс включается еще одна шестнадцатеричная цифра, здесь у нас находиться цифра а, поэтому в адрес сети мы включаем всю начальную часть IPv6 адреса, в том числе и эту цифру а, а все остальные цифры заменяют нулями.
Так как длина IPv6 адреса очень большая, и таких адресов очень много, то есть возможность использовать именно такие адреса, которые нам удобны. Поэтому сейчас на практике чаще всего используются префиксы длина которых кратна 16 или 4. Однако что делать если вы столкнетесь ситуации когда длина префиксы не кратна 4?
Например, длина нашего префикса 54, нам придется перевести адрес IPv6 в двоичную форму, для простоты мы можем переводить не весь адрес, а только ту часть в которой заканчивается наш префикс. (картинка ниже)
Например, префикс длиной 54 заканчивается в группе цифр ad61, нам нужно перевести это число из шестнадцатеричного формата в двоичный. Выполнить логическое И (AND) с префиксом, получиться вот такой результат:
мы переводим его в обратно 16-ричный формат получилось ac00, все остальные группы цифр заменяются на 0. (картинка ниже)
Правила сокращения IPv6 адресов
Несмотря на то, что мы записываем IPv6 адреса с помощью шестнадцатеричных цифр, адреса все равно получаются очень длинными, поэтому были выработаны правила сокращения IP адресов для повышения удобства их записи.
Первое правило сокращения адресов IPv6 заключается в том, что ведущие нули в каждой группе чисел разделенных двоеточием, можно сократить. Например, мы можем удалить вот эти нули. (картинка ниже)
Адрес стал заметно короче, его удобнее записывать.
Но мы можем пойти дальше, следующее правило заключается в том, что если в нашем адресе IPv6 есть две или больше идущих подряд групп нулей, то эти группы можно пропустить. Например, вот эти две группы нулей мы можем пропустить, и у нас получится два двоеточия. (картинка ниже)
Это позволяет получить еще более короткую форму записи адреса IPv6. Данное правило особенно полезно для записи префиксов IPv6 или адресов подсети, в которых очень много нулей, все эти нули можно сократить, и префикс будет записываться гораздо короче. (картинка ниже)
Неправильные сокращения
Однако при сокращении IPv6 адресов нужно быть очень внимательными, и не совершать ошибки. Давайте рассмотрим, какие ошибки случаются чаще всего.
Во-первых нельзя сокращать нули, которые идут в конце группы цифр, например, нельзя удалить вот эти 3 нуля. (картинка ниже)
Потому что после сокращения не понятно, что должно быть вот в этой группе, должны ли быть нули перед единицей или после нее. (картинка ниже)
Допускается сокращение только ведущих нулей в группе, поэтому такое сокращение неправильное. Правильное сокращение вот такое, мы удаляем ведущие нули, а там где нули находятся в конце группы, их необходимо оставить. (картинка ниже)
Другая проблема возможна, если в нашем адресе IPv6, есть несколько групп идущих подряд нулей. Например, вот такой IP адрес здесь две подряд идущих группы нулей, и три подряд идущих группы нулей. (картинка ниже)
Если мы сократим обе группы, то никак нельзя понять куда и сколько нулей вставлять. Правильный вариант сокращения нужно пропустить ту группу, которая содержит больше всего подряд идущих нулей, в нашем случае это вторая группа, так как в ней три подряд идущих группы нулей, а в первой части мы просто сокращаем ведущие нули получаются вот такая форма записи.
Типы адресов IPv6
Теперь давайте рассмотрим, какие бывают типы адресов IPv6. Точно так же как и в IPv4, есть индивидуальный (unicast) адрес, который соответствуют одному компьютеру, и групповой (multicast) адрес, который соответствует нескольким компьютерам сети.
В IPv6 появился новый тип адресов, который называется произвольный (anycast), это такой тип адреса, который может быть назначен нескольким компьютерам в сети, точно также какие групповой, но в отличие от группового, когда мы отправляем сообщение на anycast адрес его получает только один из компьютеров получателей. В отличии от IPv4 в протоколе IPv6, нет широковещательных адресов, вместо них используются групповые адреса специального вида.
Область действия IP-адресов
IPv6 адреса также различаются по области действия. Глобальный адрес IPv6 действует в интернете. Глобальные адреса должны быть уникальными в интернете, поэтому адреса IPv6 распределяются организации IANA.
Локальные адреса IPv6 (unique local address), могут использоваться внутри организации без обращения в IANA, такие адреса не маршрутизируются в интернет, поэтому ничего страшного не произойдет, если несколько организаций будут использовать одни и те же локальные адреса. Локальные адреса IPv6 это аналоги приватных или частных адресов IPv4.
В IPv6 есть локальные адреса канала связи (link-local address), которые вообще не маршрутизируются, они назначаются автоматически и действуют в пределах одного сегмента сети, одного коммутатора или несколько связанных между собой коммутаторов. Через маршрутизатор сообщения с такими IPv6 адресами не проходят.
Раньше, в стандарте протокола IPv6, был определён локальный адрес площадки (site local address), но сейчас такие типы адресов уже не используются, и они исключены из стандарта, поэтому такие адреса мы рассматривать не будем.
Начальные цифры адресов IPv6
Область действия адреса определяются по его начальным цифрам. Глобальный адрес начинается с цифр 2 или 3. На самом деле глобальные адресом могут начинаться с любых цифр, кроме тех, которые используются для других типов адресов. Однако сейчас, на практике, распределяются глобальные адреса, которые начинаются только с 2 или 3. Это сделано для того, чтобы избежать не эффективного распределения адресов IPv6, как это происходило при начальном распределение адресов IPv4.
Локальные адреса, которые действуют только в рамках одной организации, начинаются с цифр FD. Локальный адрес канала связи действующий в рамках одного сегмента сети, начинается с цифр FE80, и групповые IPv6 адреса начинаются с цифр FF.
Структура глобального IPv6 адреса
Подробнее рассмотрим структуру адресов IPv6 каждой области действия. Глобальный адрес IPv6, состоит из двух частей, адрес сети и адрес интерфейса.
Длина адреса сети и идентификаторов интерфейса — 64 бита. Адрес сети в свою очередь делится на две части, глобальный префикс маршрутизации, длина которого 48 бит, глобальные префиксы должны быть уникальными и они распределяются IANA, среди организаций. Следующие 16 бит могут использоваться организацией, для того чтобы разбить сеть на отдельные подсети, Пример, глобального IP адреса он начинается с двойки: 2a02:06b8:0000:0001:0000:0000:feed:a11
Структура локального IPv6 адреса
Локальный адрес IPv6 начинается цифр FD. Здесь адрес подсети составляет 64 бита, и 64 бита выделено на адрес интерфейса, то есть адрес компьютера.
В отличии от глобальных адресов, для формирования локального адреса IPV6, организации не обязательно обращаться в агентства IANA, такие адреса не распространяются в интернет, и их можно формировать самостоятельно.
Адрес сети в этом случае состоит из двух частей, глобальный идентификатор организации длиной 40 бит, идентификатор может быть любой на выбор организации, однако рекомендуется использовать специальные правила выбора этого глобального идентификатора, таким образом, что с очень высокой вероятностью этот глобальный идентификатор будет уникальным для разных компаний.
Эти правила описаны в документе RFC 4193. Если вы выбрали глобальный идентификатор другим способом, не так как описано в этих правилах, то ничего страшного не произойдет. Однако, наши сети развиваются, возможна такая ситуация, что одна организация поглощает другую организацию, поэтому очень удобно, если глобальные идентификаторы в разных организациях отличаются. Тогда сети разных организаций очень легко объединять между собой.
Следующие 16 бит, так же как и в случае глобального адреса используются для того, чтобы разбить сеть IPv6 на отдельные подсети, и могут использоваться организацией по своему усмотрению. Пример локального адреса IPv6: fde8:86a5:fc91:0001:59a2:3149:c5a0:67a4.
Локальный адрес канала связи, который действует в рамках одного сегмента сети, начинается с цифр FE80, так как пакеты из таких адресов не проходят через маршрутизаторы, то в адресе подсети установлены нули.
И последние 64 бита это идентификатор интерфейса. Вот здесь показан пример локального адреса канала связи: fe80:0000:0000:0000:59a2:3149:c5a0:67a4
Специальные IPv6 адреса
Также как и IPv4 в протоколе IPv6 есть адреса специального вида, примерно с тем же назначением, что и в IPv4. Адрес состоящей из одних нулей с префиксом (::/128) сокращенная запись мы пропускаем все нули просто два двоеточия (::) — это адрес текущего хоста, он используется, если компьютер не знают свой IPv6 адрес, но ему необходимо передавать данные по сети. Например, для получения адреса по протоколу DHCP.
Адрес, который состоит из всех нулей с префиксом ноль (::/0) — это маршрут по умолчанию, обратная петля или lookback интерфейс аналог адреса 1270.0.1 в IPv4 — это адрес, который состоит из всех нулей, и только последняя цифра единица, в сокращенном виде записывается ::1/128.
В IPv6 нет широковещательных адресов, вместо них используются групповые адреса IPV6. Например, такой групповой адрес (ff02::1) означает, все узлы в канале связи, а вот такой (ff02::2) IPv6 адрес это все маршрутизатор в канале связи.
Итоги
Мы рассмотрели формат адресов IPv6. В отличии от адресов IPv4, длина адреса IPv6 16 байт. Адреса очень длинные, поэтому они записываются в виде 8 шестнадцатеричных чисел разделенных двоеточиями, каждое число состоит из 4 цифр.
Есть три типа адресов IPv6: индивидуальный, групповой были в IPv4, произвольный новый тип адресов IPv6. Кроме этого IPv6 не использует широковещательные адреса, которые были в IPv4. Также адреса IPv6 различаются по областям действия:
Основы IPv6
Предисловие
Пост является кратким конспектом Wiki, TechNet’а, FreeBSD’шного handbook’a, Serverfault’a, множества RFC и документов IANA, а также курсов от Специалист.Ру для сотрудников Яндекса.
Пост можно рассматривать как копилку ссылок по актуальной на 2012 год спецификации IPv6. Однако он никак не описывает возможные способы установки IPv6 соединения с интернетом и не привязан к какой-либо определённой ОС.
Учтите, что прочтение данной хабрастатьи займёт у вас не более получаса, однако крайне рекомендуется ознакомиться со всеми приведёнными в статье ссылками… Последнее может занять несколько недель.
Prerequisites
Хоть статья и называется «Основы IPv6» она всё-таки подразумевает наличие базовых знаний о IP сетях и хотя бы небольшой практический опыт работы с IPv6, в противном случае хабрастатья будет даваться очень не легко.
Так же рекомендуется к прочтению документ Implementing IPv6 Addressing and Basic Connectivity от Cisco.
Ещё стоит заметить, что приведённые на википедию ссылки зачастую более примечательны разделом References нежели своим содержанием.
IPv6 Адреса
Анатомия IPv6 адресов
В первой версии этого хабрапоста тут было много текста, но с того момента на википедии выросла отличная статья: IPv6 Address.
Маски подсетей
Маски теперь задаются только /prefix’ами (CIDR), классовой адресации и стандартной decimal dotted нотации в IPv6 нет. Так же теперь первый и последний адрес сети не являются зарезервированными под идентификатор сети и broadcast соответственно.
Выделение IPv6 адресов
Типы адресов и их префиксы
Виды трафика
Address Scope
В IPv6 появилось такое понятие как Scope, он же Zone ID терминологии Microsoft. На самом деле оно было и в IPv4, однако не было задано явно: сети 10/8, 172.16/12 и 192.168/16 яркие тому примеры.
В случае Unicast/Anycast адресов приминимо следующее:
У каждого IPv6 enabled интерфейса есть свой Link-local адрес. Его scope, внезапно, local. Эти адреса уникальны в пределах линка, но не обязаны быть актуальными в пределах одного хоста. Так, например, VLAN созданный на интерфейсе будет иметь такой же link-local адрес, что и родительский интерфейс (так как без использования IPv6 Privacy Extensions он будет генериться из тогоже Link Layer адреса). Для того, чтобы явно указать интерфейс которому принадлежит IPv6 адрес нужно или указывать в ручную интерфейс для исходящих пакетов или использовать специальный суффикс при записи адреса: %ИндексИнтерфейса в Windows (fe80::2b0:d0ff:fee9:4143%3) или %ИмяИнтерфейса в *BSD/Linux (fe80::2b0:d0ff:fee9:4143%em0).
В случае Multicast адресов scope указан в последних четырёх битах вторго октета IPv6 адреса: ff0s:: и может быть interface-local, link-local, admin-local, site-local, organization-local или же global.
Дополнительно стоит ознакомиться с RFC4007 IPv6 Scoped Address Architecture
Жизненный цикл IPv6 адреса
IPv6 Пакет
Заголовок IPv6 пакета
Extension Headers
IPv6 Протоколы
ICMPv6
ICMP в IPv6 был заменён на ICMPv6. О ICMPv6 можно прочитать в RFC4443 Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification.
Сам по себе ICMPv6 довольно прост, однако на его основе сделано множество довольно не тривиальных протоколов, о которых мы поговорим чуть ниже.
Описание Neighbor Discovery Protocol, заменившего протокол ARP, доступно в RFC4861. Теперь это не отдельный протокол, а надстройка над ICMPv6 добавляющая несколько новых типов сообщений.
Основное предназначение NDP — производить мапинг между link-layer и IPv6 адресами, однако это лишь небольшая часть функциональности.
Автоконфигурация
Zeroconf
Как уже было упомянуто выше, хосты умеют автоматически генерировать себе IPv6 link-local адрес из адреса канального уровня. Так что без какой либо настройки любой IPv6-enabled хост подключённый к сети выдаёт сам себе адрес сетевого уровня.
В IPv4 эта технология использует зарезервированный IPv4 диапазон 169.254/16. Подробно технология описана в RFC3927 Dynamic Configuration of IPv4 Link-Local Addresses (Заметьте, что этот RFC вышел после IPv6’ого 2462).
Stateful
В IPv4 автоконфигурация возможна только с использованием DHCP сервера. В IPv6 эту возможность оставили: можно конфигурировать сеть с помощью DHCPv6 сервера и клиента. Однако, поддержка со стороны вендоров DHCPv6 пока не блещет, так например, dhclient во FreeBSD из коробки не умеет IPv6.
Stateless
Комбинированая
Могут использоваться одновременно оба вида автоконфигурации, например stateless для получения IPv6 префикса и stateful для получения адресов DNS-серверов и/или других параметров, которые нельзя передать с помощью Router Advertisement.
Прочее
Протоколы более высокого уровня
Часть протоколов, использующих адрес сетевого уровня в своей работе требовали внесения в них определённых изменением для того, чтобы начать работать по IPv6. Ярким примером такого протокола является FTP.
Тунелирование IPv6 трафика поверх IPv4 сетей
Mobile IPv6
Про него не знаю нечего, так что просто оставлю это здесь: Mobile IP.
IPv6 адрес как хранилище информации
Согласитесь 128бит — это огромный простор для фантазии. Существует множество технологий которые пытаются использовать эти самые 128бит. От кодирования туда IPv4 адреса и криптографических сигнатур до определения растояний между нодами (тут кстати даже мы думали в этом направлении, но пока присмтриваемся к ALTO: Application-Layer Traffic Optimization (ALTO) Problem Statement).
Socket API
Хабратопик описывает IPv6 с точки зрения NOC / системного администратора, но не с точки зрения программиста. Если кому-то интересны особенности программирования под IPv6, то рекомендую обратиться к RFC3493 — Basic Socket Interface Extensions for IPv6 и книжке IPv6 Network Programming




