Открыть сервис

Duplicate Address Detection

Duplicate Address Detection (DAD) — это механизм, используемый в компьютерных сетях для проверки уникальности IPv6-адреса в локальной сети (подсети) перед его назначением интерфейсу. Он является обязательной частью протокола Neighbor Discovery Protocol (NDP) для IPv6 и служит для предотвращения конфликтов адресов, когда два или более устройства пытаются использовать один и тот же IP-адрес. В отличие от IPv4, где проверка уникальности часто не производится (используется протокол ARP для разрешения адресов, но не для их предварительной проверки), DAD является стандартной процедурой для большинства типов IPv6-адресов, включая автоконфигурируемые адреса на основе MAC-адреса (EUI-64), временные адреса и адреса, назначенные вручную.

Принцип работы

DAD реализуется на этапе, когда интерфейс получает или генерирует потенциальный IPv6-адрес, но ещё не начинает его использовать для обычной передачи данных. Процесс основан на отправке и приёме специальных сообщений NDP — Neighbor Solicitation (NS) и Neighbor Advertisement (NA).

Инициализация

Когда хост (компьютер, маршрутизатор, смартфон) хочет назначить интерфейсу новый IPv6-адрес (например, после включения, подключения к сети или изменения конфигурации), он временно переводит этот адрес в состояние tentative (предварительный). В этом состоянии адрес не считается активным: хост не отвечает на запросы, адресованные этому адресу, и не использует его в качестве источника для исходящих пакетов, за исключением самого процесса DAD.

Отправка запроса

Хост отправляет Neighbor Solicitation сообщение, в котором:

  • Целевой адрес (Target Address) — это проверяемый tentative-адрес.
  • Адрес источника (Source Address) — неопределённый адрес (::), так как у интерфейса ещё нет назначенного IPv6-адреса.
  • Адрес назначения (Destination Address) — solicited-node multicast address, соответствующий проверяемому адресу. Это многоадресный адрес, на который подписываются все узлы в подсети, у которых есть адрес с тем же последним 24 битами.

Это сообщение фактически является вопросом: «Есть ли в этой сети устройство, которое уже использует адрес X?».

Ожидание ответа

После отправки запроса хост ожидает ответ в течение определённого времени (обычно 1 секунда, но может настраиваться). Если за это время приходит Neighbor Advertisement от другого узла, в котором указан проверяемый адрес, это означает, что адрес уже занят. Если приходит другой Neighbor Solicitation с тем же целевым адресом (от другого узла, который также проходит DAD), это также считается конфликтом.

Результаты

  • Адрес уникален: Если в течение тайм-аута не получено ни одного ответа (NA или NS с тем же адресом), адрес переводится из состояния tentative в состояние preferred (предпочтительный) или valid (действительный). Интерфейс начинает использовать его для приёма и передачи данных.
  • Конфликт обнаружен: Если получен ответ, DAD считается неудачным. Адрес остаётся в состоянии tentative, но не активируется. Для адресов, полученных через автоконфигурацию без сохранения состояния (SLAAC), хост обычно генерирует новый случайный адрес и повторяет процедуру. Для статически назначенных адресов операционная система может выдать сообщение об ошибке (например, «Duplicate address detected»), и адрес не будет использоваться, пока конфликт не будет разрешён вручную.

Тайминги и параметры

Процесс DAD регулируется несколькими параметрами, определёнными в RFC 4862 (IPv6 Stateless Address Autoconfiguration) и RFC 4861 (Neighbor Discovery for IP version 6):

  • DupAddrDetectTransmits: Количество отправляемых NS-сообщений (обычно 1). Если установлено в 0, DAD отключается.
  • RetransTimer: Интервал между повторными отправками NS (обычно 1000 миллисекунд). Если отправляется несколько NS (если DupAddrDetectTransmits > 1), то между ними выдерживается этот интервал.

Таким образом, общее время ожидания составляет примерно DupAddrDetectTransmits * RetransTimer. При стандартных настройках (1 отправка, таймер 1 с) DAD занимает около 1 секунды.

Применение в IPv6

DAD применяется для всех типов IPv6-адресов, за исключением нескольких специальных случаев:

  1. Адреса, полученные по SLAAC: Хост генерирует адрес на основе префикса сети и своего идентификатора (например, EUI-64) и обязательно выполняет DAD.
  2. Временные адреса (Privacy Extensions): Случайные адреса, генерируемые для повышения конфиденциальности, также проходят DAD.
  3. Статические адреса: При ручном назначении адреса администратором операционная система также выполняет DAD, чтобы убедиться, что адрес не конфликтует с другими.
  4. Anycast-адреса: Для anycast-адресов (которые могут быть назначены нескольким интерфейсам) DAD не выполняется, так как множественное использование одного адреса является нормой.

В IPv4 аналогом DAD является Gratuitous ARP (беспричинный ARP), но он используется не столько для проверки уникальности перед назначением, сколько для обновления ARP-таблиц других узлов после смены адреса. В IPv6 DAD является строго обязательным для unicast-адресов.

Ограничения и проблемы

Несмотря на свою полезность, DAD имеет несколько ограничений:

  • Задержка при подключении: Каждый новый адрес требует ожидания в 1 секунду для завершения DAD. При большом количестве адресов на интерфейсе (например, при использовании Privacy Extensions, генерирующих много временных адресов) задержка может накапливаться.
  • Уязвимость к DoS-атакам: Злоумышленник в той же локальной сети может намеренно отвечать на все NS-запросы DAD, утверждая, что любой проверяемый адрес уже занят. Это приводит к тому, что новые устройства не могут получить адрес, что является формой отказа в обслуживании (Denial of Service). Эта атака известна как DAD DoS или Neighbor Cache Poisoning.
  • Работа только в локальной сети: DAD работает только в пределах одного широковещательного домена (канала связи). Он не проверяет уникальность адреса за пределами локальной подсети.
  • Зависимость от многоадресной рассылки: Для работы DAD требуется, чтобы все узлы в сети поддерживали многоадресную рассылку (multicast). В некоторых старых или специфических сетях это может быть проблемой.

Историческая справка

Механизм DAD был впервые определён в RFC 1971 (1996 год) как часть протокола IPv6 Stateless Address Autoconfiguration. Позже он был уточнён и включён в RFC 2462 (1998 год) и окончательно стандартизирован в RFC 4862 (2007 год). Основной протокол NDP, в рамках которого работает DAD, описан в RFC 4861 (2007 год). До появления DAD в IPv4 для обнаружения конфликтов адресов использовались нестандартные методы, такие как отправка ARP-запросов для собственного адреса, но эта практика не была обязательной и часто игнорировалась.

Сравнение с IPv4

ХарактеристикаIPv4 (Gratuitous ARP)IPv6 (DAD)
ОбязательностьНеобязателен, часто не используетсяОбязателен для unicast-адресов
ЦельОбновление ARP-таблиц, редко — проверка уникальностиПроверка уникальности перед назначением
СообщенияARP-запрос/ответNeighbor Solicitation/Advertisement
Адрес источникаСобственный IP-адресНеопределённый адрес (::)
Состояние адресаНе определеноTentative

Источники

  • RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
  • RFC 4862: IPv6 Stateless Address Autoconfiguration
  • RFC 4291: IP Version 6 Addressing Architecture
  • Таненбаум Э., Уэзеролл Д. «Компьютерные сети» (5-е издание), глава 4.3
  • Стивенс У. Р. «TCP/IP. Иллюстрированное руководство», том 1 (глава 8)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →