IPv6 поддерживает 2128 (примерно 3,4x1038 адресов). Таким образом на каждого из 6,5 миллиардов жителей Земли приходится по 5x1028 (около 295) адресов. Или это примерно 252 адресов для каждой звезды в известной нам вселенной. Т.е. более чем в десять миллиардов миллиардов миллиардов раз больше адресов, чем поддерживает IPv4.

IPv6-пакеты и индексы зон

IPv6-пакет, состоит из двух основных частей: заголовка и "полезной нагрузки".

Заголовок находится в первых 40 октетах (320 бит) в пакете и содержит поля:

  • Версия - версии IP (4 бита).
  • Класс трафика – приоритет пакета (8-бит). Существует два класса: где источник обеспечивает контроль и где источник не обеспечивает контроль трафика.
  • Метка потока – QoS-менеджмент (20 бит). Первоначально был создан для предоставления специальных сервисов в реальном времени, но в настоящее время не используется.
  • Длина полезной нагрузки - длина полезной нагрузки в байтах (16 бит). Если заполнена нулями, значит используется Jumbo payload.
  • Следующий заголовок - определяет следующий инкапсулированный протокол. Значения, совместимы с теми, что определенны для протокола IPv4 (8 бит).
  • Лимит скачков - заменяет поле time to live в IPv4 (8 бит).
  • Источник и адрес назначения - 128 бит каждый.

Полезная нагрузка может быть размером до 64 Kб в стандартном режиме, или большего размера в Jumbo payload режиме.

Фрагментация производится только в отправляющем узле IPv6: маршрутизаторы никогда не фрагментируют пакеты, и ожидается, что узлы будут использовать PMTU.

Поле "Протокол" из IPv4 заменяется на поле "Следующий заголовок". Это поле, как правило, определяет уровень транспортного протокола, используемого в "полезной нагрузке".

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

Индексы зоны

Локальные адреса несут в себе проблему для систем с несколькими интерфейсами. Так как каждый интерфейс может быть подключен к разным сетям и охватывает всю подсеть, могут возникать неясности, которые не могут быть решены с помощью таблиц маршрутизации.

Например, хост имеет два интерфейса, которые автоматически получают локальные адреса: fe80::1/64 и fe80::2/64, только один из которых подключен к той же физической сети в качестве принимающей стороны, которая имеет адрес fe80::3/64. Если хост попытается связаться с fe80::3 как он узнает, какой интерфейс (fe80::1 или fe80: 2) следует использовать?

Решение определено в RFC 4007 и представляет собой добавление уникальных индексов зоны для местных интерфейсов. Текстуально оно может представлено в виде <address>%<zone_id>, например: http://[fe80::1122:33ff:fe11:2233%eth0]:80/. Однако это вызывает новые проблемы из-за похожести на %-кодировку URI.

  • Microsoft Windows IPv6-стек использует цифровые идентификаторы зоны: fe80::3%1
  • BSD-приложения, как правило, используют имя интерфейса в качестве зоны: fe80::3%pcn0
  • Linux-приложения, как правило, тоже используют имя интерфейса в качестве зоны ID: fe80:: 3%eth0, хотя GNU/Linux утилиты конфигурации сетевого интерфейса, такие как ifconfig и iproute2, не показывают индексы зоны.

Только относительно небольшое число IPv6-приложений, способных понять синтаксис адреса с индексом зоны, в результате чего использование локальных адресов сильно ограничено.