IPv6 — 128 бит, бесконечные адреса и почему мы всё ещё на IPv4
IPv4 закончился: новые блоки в IANA не выдаются с 2011 года. Решение, спроектированное ещё в 1995, — IPv6 с 128-битным адресным пространством. Это 2^128 = 340 ундециллионов адресов. Достаточно, чтобы дать каждому атому в человеческом теле триллион IP. И всё же в 2026 году значимая часть интернета всё ещё на IPv4.
В этом уроке разберём формат IPv6, чем он лучше и хуже IPv4, как живут в смешанном (dual-stack) окружении, и почему миграция растянулась на 30 лет. Знать IPv6 нужно DE, потому что облака, мобильный интернет и даже домашние сети всё чаще приходят с IPv6 по умолчанию.
Что такое syscall — граница процесс/ядро128 бит — запись в hex
В IPv4 32 бита записывались как 4 десятичных октета. В IPv6 128 бит записываются как 8 групп по 4 hex-цифры, разделённых двоеточием.
Пример полного адреса:
2001:0db8:0000:0000:0000:ff00:0042:8329
Это 128 бит, разбитые на 8 групп по 16 бит каждая.
Длинно. Поэтому есть две правила сокращения:
1. Убираем leading zeros в каждой группе.
2001:0db8:0000:0000:0000:ff00:0042:8329
->
2001:db8:0:0:0:ff00:42:8329
2. Заменяем самую длинную цепочку нулей на :: (один раз!).
2001:db8:0:0:0:ff00:42:8329
->
2001:db8::ff00:42:8329
:: означает «дополни нулями до 128 бит». Это сокращение можно использовать только один раз в адресе, иначе непонятно, сколько именно групп заменено.
Примеры:
::1— IPv6 loopback (эквивалент127.0.0.1). Это 7 групп нулей +1.::— unspecified address (эквивалент0.0.0.0).fe80::1— link-local адресfe80:0:0:0:0:0:0:1.2001:4860:4860::8888— Google Public DNS IPv6 (2001:4860:4860:0:0:0:0:8888).
Структура IPv6-адреса
В IPv6 принято делить адрес на две части по 64 бита:
- Network prefix — 64 бита (первая половина).
- Interface identifier — 64 бита (вторая половина).
То есть стандартная подсеть в IPv6 — /64. Каждая такая подсеть имеет 2^64 адресов (это в 4 миллиарда раз больше, чем весь IPv4!). Подсеть меньше /64 — редкость и часто не работает.
Что бывает в первых 64 битах (типичная иерархия):
- Global routing prefix (первые 48 бит) — назначается ISP’у.
- Subnet ID (бит 48-64) — организация может разделить на 65,536 подсетей /64 внутри.
- Interface ID (бит 64-128) — идентификатор устройства внутри подсети.
Типы IPv6-адресов
Не все IPv6-адреса одинаковы. Есть несколько важных категорий.
1. Global unicast (2000::/3). Публичные адреса, маршрутизируемые в интернете. Адреса вида 2001:..., 2607:... и т.д. Их выдаёт IANA через регистраторов. Это «настоящий» интернет-IPv6.
2. Link-local (fe80::/10). Аналог 169.254.X.X в IPv4. Каждый IPv6-интерфейс автоматически получает link-local адрес fe80::<EUI-64>. Используется для общения внутри сегмента, не маршрутизируется. ARP в IPv6 заменён на Neighbor Discovery, и он использует link-local.
3. Unique local (fc00::/7, fd00::/8). Аналог приватных IPv4 (10/8, 172.16/12, 192.168/16). Используются внутри организаций, не маршрутизируются в интернете. На практике используются меньше, чем 10.X.X.X в IPv4 — проще получить пул global unicast.
4. Loopback (::1/128). Один-единственный адрес ::1. Эквивалент 127.0.0.1. (В отличие от IPv4, где целый /8 — здесь только один адрес.)
5. Multicast (ff00::/8). Аналог IPv4 multicast, но активно используется самим протоколом (Neighbor Discovery, OSPF и др.).
6. Документации (2001:db8::/32). Аналог 192.0.2.X в IPv4 — для книг и примеров. Не маршрутизируется.
SLAAC — как хост получает IPv6 без DHCP
В IPv4 для получения IP обычно используется DHCP. В IPv6 есть альтернатива — SLAAC (Stateless Address Autoconfiguration). Хост сам себе генерирует IPv6 без сервера. Алгоритм:
- Хост поднимает интерфейс. Сразу же получает link-local адрес
fe80::<EUI-64>. EUI-64 — модифицированный MAC + дополнительные биты. - Шлёт Router Solicitation (RS) на multicast
ff02::2(все роутеры). «Кто здесь роутер?» - Роутер отвечает Router Advertisement (RA): «Я роутер. Подсеть — 2001:db8::/64. Default gateway — мой link-local fe80::1.»
- Хост берёт префикс
2001:db8::/64, генерирует interface ID (либо из MAC, либо случайно), получает свой global адрес2001:db8::<id>. - Шлёт Duplicate Address Detection (DAD) — «есть тут кто с таким IP?» Если ответили — генерирует новый.
- Готово, у хоста IPv6.
SLAAC — революция: не нужен DHCP сервер. Только роутер с RA. Это снижает сложность сети.
Однако есть DHCPv6 — работает похоже на DHCPv4, выдаёт IP плюс дополнительные опции. Современные сети часто используют гибрид: SLAAC даёт адрес, DHCPv6 даёт DNS-сервер и другие настройки.
В Linux:
# Посмотреть IPv6:
ip -6 addr show
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
# inet6 2001:db8::a683:e7ff:fe1a:bbcc/64 scope global dynamic mngtmpaddr
# inet6 fe80::a683:e7ff:fe1a:bbcc/64 scope link
# Виден link-local (fe80::) и global (2001:...). Оба сосуществуют.
Заметьте: a683:e7ff:fe1a:bbcc в interface ID — это EUI-64 от MAC a4:83:e7:1a:bb:cc. Алгоритм EUI-64:
- MAC =
a4:83:e7:1a:bb:cc. - Вставляем
ff:feв середину:a4:83:e7:ff:fe:1a:bb:cc. - Инвертируем второй младший бит первого октета:
a4(10100100) ->a6(10100110). - Получаем
a6:83:e7:ff:fe:1a:bb:cc. - Группируем по 16 бит:
a683:e7ff:fe1a:bbcc.
С точки зрения приватности — проблема: ваш MAC «утекает» в IPv6, и сайты могут отслеживать вас по нему. Решение — temporary addresses (RFC 4941) — ОС генерирует случайные IPv6 и периодически их меняет. По умолчанию включено в Windows и macOS, опционально в Linux.
Dual-stack — IPv4 и IPv6 одновременно
В переходный период (который уже 30 лет идёт) большинство хостов и сервисов работают в dual-stack — имеют и IPv4, и IPv6, могут принимать соединения по обоим. Как клиент выбирает?
Happy Eyeballs (RFC 8305) — алгоритм, реализованный в браузерах и современных HTTP-клиентах:
- Делаем DNS-запрос на
example.com. Получаем AAAA (IPv6) и A (IPv4) записи. - Параллельно пытаемся соединиться по IPv6 и IPv4.
- Кто первый ответит — тем и идём. IPv6 даём небольшой приоритет (~250 мс fora).
- Если IPv6 быстрее — используем его. Если медленнее или не работает — fallback на IPv4.
Это решает «IPv6 broken pipe» проблему: если у пользователя IPv6 настроен, но не работает — браузер не зависнет, быстро переключится на IPv4.
# Проверить, идёт ли соединение по IPv6 или IPv4:
curl -v https://www.google.com 2>&1 | grep 'Connected'
# Connected to www.google.com (2607:f8b0:4004:c08::65) port 443
# -- это IPv6
# Принудить на IPv4:
curl -4 https://www.google.com -v 2>&1 | grep 'Connected'
# Connected to www.google.com (142.251.40.196) port 443
# Принудить на IPv6:
curl -6 https://www.google.com -v 2>&1 | grep 'Connected'
Что IPv6 даёт и не даёт
Плюсы:
- Огромное адресное пространство. Никакого NAT, каждое устройство имеет глобально уникальный адрес.
- End-to-end connectivity. Любой может достучаться до любого — ваш домашний компьютер может быть сервером без проброса портов.
- Auto-configuration (SLAAC). Сеть проще — не нужно DHCP.
- Built-in security (IPsec). В стандарте есть поддержка IPsec, в IPv4 это надстройка.
- Простой заголовок. Меньше полей, нет fragmentation в роутерах, нет header checksum.
- Multicast вместо broadcast. Чище, эффективнее.
Минусы / почему не везде:
- Legacy. Миллионы серверов, файрволов, балансировщиков — настроены на IPv4. Менять страшно и дорого.
- Кадры. Сетевики и админы привыкли мыслить десятичными октетами.
2001:db8:abcd:1234::5— не так удобно. - NAT в IPv4 даёт «бесплатный файрвол». Любой хост за NAT недоступен извне. В IPv6 хосту нужен явный stateful firewall, иначе он голый в интернете.
- Поддержка приложений. Некоторые legacy-приложения не поддерживают IPv6.
- Привычка к 192.168.X.X. Локалки на IPv6 — редкость.
В 2026 году:
- ~40% трафика Google идёт по IPv6.
- AWS, GCP, Azure поддерживают IPv6, но IPv4 всё ещё дефолт.
- Мобильные сети США и Индии — почти полностью IPv6 (T-Mobile, Reliance Jio).
- Многие домашние провайдеры выдают IPv6, но клиенты не пользуются.
Попробуй сам
# 1. Посмотреть свои IPv6:
ip -6 addr show
# Увидите link-local (fe80::) на каждом интерфейсе
# Если есть global -- увидите 2001:..., 2a00:..., 2607:... или подобные
# 2. Пинг по IPv6:
ping6 ::1 # loopback
ping6 google.com # внешний хост (если IPv6 настроен)
ping6 2001:4860:4860::8888 # Google Public DNS IPv6
# 3. DNS-запрос AAAA:
dig +short AAAA google.com
# 2607:f8b0:4004:c08::65 ...
# 4. Узнать публичный IPv6:
curl -6 ifconfig.me 2>/dev/null || echo "No IPv6 connectivity"
# 5. Сравнить latency IPv6 vs IPv4:
ping -c 5 -4 google.com
ping -c 5 -6 google.com
# 6. Посмотреть IPv6 routing table:
ip -6 route show
# 7. Захватить IPv6-трафик:
sudo tcpdump -i any 'ip6' -c 10
# Увидите ICMPv6 (Neighbor Solicitations, Router Advertisements)
# 8. Узнать link-local адрес соседа:
ping6 -I eth0 ff02::1 # multicast 'all nodes'
# Каждый сосед в сегменте ответит со своего link-local адреса
Особенно интересно: каждый IPv6-хост сразу имеет link-local, даже без интернета. Это всегда работает — пингаешь fe80::%eth0 или используешь interface scope.