ARP
Чтобы отправить пакет на 192.168.1.10, сетевому интерфейсу нужен не IP-адрес, а MAC-адрес получателя. Узнаёт его ARP: спрашивает всю сеть «у кого этот адрес?» и запоминает ответ.
Обновлено Редакция GAW
ARP (Address Resolution Protocol, RFC 826) — протокол, который по IP-адресу находит MAC-адрес узла в той же локальной сети. Кадры Ethernet и Wi-Fi адресуются 48-битным аппаратным адресом, а приложение знает только IP-адрес. ARP связывает эти два адреса и хранит найденные пары в таблице (ARP-кэше), чтобы не спрашивать перед каждым пакетом.
Запрос и ответ
- Узел хочет отправить пакет на IP-адрес в своей подсети, но в таблице нет его MAC-адреса.
- Он рассылает всем станциям сегмента ARP-запрос (код операции REQUEST = 1): «мой IP и MAC такие-то, у кого IP-адрес X?». Поле MAC цели при этом не заполняется — его и ищут.
- Все узлы получают запрос, но отвечает только владелец адреса X: кадром REPLY (код 2) напрямую запросившему.
- Запросивший записывает пару «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: узел объявляет адрес один раз, когда начинает им пользоваться.
Источники
- 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 секунд, адрес узнают только по необходимости
- 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 с
Нашли ошибку?
Смотрите также
- MAC-адрес48-битный адрес интерфейса: OUI, биты I/G и U/L, MAC у ESP32
- Шлюз по умолчаниюМаршрутизатор для пакетов за пределы подсети; адрес из той же подсети
- Маска подсети32 бита: единицы — номер сети, нули — номер узла; 255.255.255.0 = /24
- Link-local адрес (169.254.x.x)Адрес 169.254.0.0/16, назначаемый без DHCP; действует только в своём сегменте
- DHCPПротокол выдачи IP-адреса, маски и шлюза; аренда, DISCOVER–OFFER–REQUEST–ACK