Перейти к содержанию

ARP

Чтобы отправить пакет на 192.168.1.10, сетевому интерфейсу нужен не IP-адрес, а MAC-адрес получателя. Узнаёт его ARP: спрашивает всю сеть «у кого этот адрес?» и запоминает ответ.

Обновлено Редакция GAW

ARP (Address Resolution Protocol, RFC 826) — протокол, который по IP-адресу находит MAC-адрес узла в той же локальной сети. Кадры Ethernet и Wi-Fi адресуются 48-битным аппаратным адресом, а приложение знает только IP-адрес. ARP связывает эти два адреса и хранит найденные пары в таблице (ARP-кэше), чтобы не спрашивать перед каждым пакетом.

Запрос и ответ

  1. Узел хочет отправить пакет на IP-адрес в своей подсети, но в таблице нет его MAC-адреса.
  2. Он рассылает всем станциям сегмента ARP-запрос (код операции REQUEST = 1): «мой IP и MAC такие-то, у кого IP-адрес X?». Поле MAC цели при этом не заполняется — его и ищут.
  3. Все узлы получают запрос, но отвечает только владелец адреса X: кадром REPLY (код 2) напрямую запросившему.
  4. Запросивший записывает пару «IP — MAC» в таблицу и отправляет пакет.

По RFC 826 получатель запроса сразу запоминает адреса отправителя — ещё до того, как посмотрит на код операции: раз с ним хотят говорить, ответ скорее всего понадобится. Пакет ARP содержит тип и длину адресов, поэтому подходит не только для пары Ethernet и IPv4: для Ethernet длина аппаратного адреса — 6 байт.

Подсеть и шлюз

Какой MAC-адрес искать, решает маска подсети. Если получатель в своей подсети, ARP ищет MAC самого получателя. Если в чужой — MAC шлюза по умолчанию, а IP-адрес назначения в пакете остаётся прежним. Неверная маска или шлюз часто проявляются именно здесь: ARP-запросы уходят, а ответа нет.

Проверка конфликта адресов

RFC 5227 добавил к ARP проверку, не занят ли адрес. Перед тем как начать пользоваться адресом, узел ждёт случайное время до 1 секунды и отправляет три ARP Probe — запросы с нулевым IP-адресом отправителя, чтобы не испортить чужие таблицы, — с интервалом от 1 до 2 секунд. Если ответа нет, он дважды с интервалом 2 секунды отправляет ARP Announcement с собственным адресом в обоих полях. Так проверяют адрес, полученный от DHCP или выбранный самим устройством в диапазоне link-local.

На микроконтроллере ARP выполняет стек TCP/IP — программный или аппаратный, как у W5500, — и прошивке обычно достаточно правильно задать IP-адрес, маску и шлюз. Отладочный признак: в сниффере видны повторяющиеся ARP-запросы «who has» к одному адресу без ответа — значит, узла с таким IP в сегменте нет или он не отвечает.

Частые вопросы

Зачем нужен ARP, если у устройства есть IP-адрес?

Кадр Ethernet или Wi-Fi адресуется MAC-адресу, а не IP. Перед отправкой стек должен узнать MAC получателя в своей подсети, а для узла в другой сети — MAC шлюза по умолчанию. ARP рассылает всем запрос с искомым IP-адресом, а владелец адреса отвечает своим MAC-адресом напрямую.

Как устройство проверяет, что IP-адрес никем не занят?

По RFC 5227 оно отправляет ARP Probe — запрос с нулевым адресом отправителя и проверяемым адресом цели: три пробы с интервалом от 1 до 2 секунд после случайной задержки до 1 секунды. Если кто-то ответил, адрес занят. Если нет — две ARP Announcement с интервалом 2 секунды объявляют адрес своим.

Почему узлы не рассылают свои адреса ARP заранее?

Автор RFC 826 считал периодическую рассылку бесполезной: 100 рабочих станций, объявляющих себя раз в 10 минут, дают пакет каждые 6 секунд и заполняют таблицы записями об узлах, с которыми никто не разговаривает. Поэтому ARP узнаёт адрес только тогда, когда он нужен. Исключение — ARP Announcement по RFC 5227: узел объявляет адрес один раз, когда начинает им пользоваться.

Источники

  1. IETF. RFC 826 An Ethernet Address Resolution Protocol (D. C. Plummer, November 1982) — Packet format: поля ar$hrd (тип аппаратного адреса), ar$pro (тип протокольного адреса), ar$hln и ar$pln (длины адресов в байтах), ar$op (REQUEST = 1, REPLY = 2), адреса отправителя ar$sha, ar$spa и цели ar$tha, ar$tpa; Packet Generation: для Ethernet ar$hln = 6 (48-битный адрес), запрос рассылается всем станциям сегмента, ar$tha не заполняется; Packet Reception: пара «протокольный адрес — аппаратный адрес» отправителя записывается в таблицу до проверки кода операции, на REQUEST к своему адресу узел отвечает REPLY напрямую запросившему; «Why is it done this way?»: периодическая широковещательная рассылка нежелательна — 100 станций раз в 10 минут дают пакет каждые 6 секунд, адрес узнают только по необходимости
  2. IETF. RFC 5227 IPv4 Address Conflict Detection (S. Cheshire, July 2008) — разд. 1.1: ARP Probe — запрос с нулевым IP-адресом отправителя и проверяемым адресом в поле цели; ARP Announcement — запрос, где адрес отправителя и цели совпадают; константы: PROBE_WAIT 1 с, PROBE_NUM 3, PROBE_MIN 1 с, PROBE_MAX 2 с, ANNOUNCE_WAIT 2 с, ANNOUNCE_NUM 2, ANNOUNCE_INTERVAL 2 с, MAX_CONFLICTS 10, RATE_LIMIT_INTERVAL 60 с

Нашли ошибку?