Протокол ARP решает задачу сопоставления MAC адреса по IP адресу. ARP (Address Resolution Protocol) описан в RFC 826, в его задачу входит разрешение (т.е. узнать) MAC адрес по определенному IP адресу.
В иерархии протоколов, ARP инкапсулируется в Ethernet и работает в формате запрос-ответ, как изображено на рисунке. В ARP-запросе указывается искомый IP адрес, чей MAC адрес требуется найти. В ARP-ответе должен прийти искомый MAC адрес.
ARP имеет следующий формат (рисунок ниже). Из множества полей наибольший интерес представляет:
-
Sender hardware address (SHA) - MAC адрес отправителя.
-
SPA - IP адрес отправителя
-
THA - MAC адрес назначения
-
TPA - IP адрес назначения
В нашем примере:
-
поле SHA будет установлено в 00:00:00:00:00:01
-
поле SPA - 10.0.0.0.1
-
поле THA - 00:00:00:00:00:00 (т.е. пустое, так как именно MAC адрес мы и не знаем)
-
поле TPA - 10.0.0.0.2
Так как хост отправителя не знает какому MAC адресу нужно отправить запрос, то на канальном уровне ARP-запрос имеет широковещательный адрес, т.е. в поле MAC адрес назначения устанавливается FF:FF:FF:FF:FF:FF. Таким образом, ARP-запрос обрабатывается всеми хостами, которые его получат.
Получив ARP-запрос хост сравнивает IP адрес назначения (TPA) со своим. Если у него нет такого IP адреса, то запрос игнорируется. Если у хоста оказался IP адрес назначения, он отправляет ARP-ответ, в котором указывает свой MAC адрес. В нашем примере ARP ответ будет выглядеть вот так:
-
поле SHA будет установлено в 00:00:00:00:00:02
-
поле SPA - 10.0.0.0.2
-
поле THA - 00:00:00:00:00:01
-
поле TPA - 10.0.0.0.1
Обратите внимание, что поля источника содержат информацию об отправителе. Если это ARP запрос, то в полях SHA и SPA будет отправитель ARP-запроса (00:00:00:00:00:01 и 10.0.0.1 соответственно). А если это ARP-ответ, то в полях SHA и SPA будет информация об отправителе ARP-ответа (00:00:00:00:00:02 и 10.0.0.2 соответственно).
Так как в ARP-запросе есть информация про MAC адрес отправителя, ARP-ответ уже не широковещательный, а отправляется на конкретный MAC адрес.
Запустим сеть по адресу https://miminet.ru/web_network?guid=d9012b77-fd52-48b0-b618-a3c3f55caf15 и посмотрим за ее работой. Первым делом мы видим, что хост 1 отправляет ARP-запрос (ARP-request), после получает ARP-ответ (ARP-response) и только потом уже отправляет ICMP пакеты.
Таким образом ARP решает проблему связки сетевого и канального уровня. Возможно вы обратили внимание, что мы не изобразили место ARP в модели ISO/OSI. Это все потому, что непонятно, к какому уровню его отнести. С одной стороны он работает с IP адреса, т.е. знает про сетевой уровень. С другой стороны он работает с MAC адресами. Чтобы не вести бесконечные споры, ARP по модели ISO/OSI называют протокол уровня 2,5.
Отправлять ARP-запросы каждый раз, когда хост хочет отправить пакет в сеть не эффективно. Поэтому, у хостов есть специальная область памяти, куда они сохраняют ARP-ответы. Эта область памяти называется ARP кэш.
ARP кэш представляет собой таблицу из 3-х колонок, как на рисунке:
-
IP адрес
-
MAC адрес
-
Тип записи
Вы можете посмотреть свой ARP-кэш при помощи команды arp -a. Она одинаково работает под Windows, Linux и MacOS.
Каждому IP адресу соответствует определенный MAC адрес. Как только хост через ARP протокол определил MAC адрес другого хоста, он заносит эту информацию к себе в ARP-кэш. Таким образом, при отправке последующих пакетов он сможет их отправлять сразу, без предварительного разрешения MAC адреса.
Третье поле в ARP-кэше, тип записи, бывает двух типов:
-
динамический
-
статический
Динамический тип означает, что запись была добавлена через работу ARP протокола и она должна быть удалена через определенное время. У каждой ОС есть свои временные промежутки, через которые запись в ARP-кэше динамическим типом будет удалена. Например, у ОС Windows это 30-45 секунд, при условии, что хост не будет пользоваться конкретной записью из ARP-кэша (https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/address-resolution-protocol-arp-caching-behavior).
Статический тип означает, что запись была добавлена не через ARP протокол и должна быть в ARP-кэше до выключения ОС.
Каждый раз, когда ОС отправляет пакет в сеть, для правильного заполнения поля MAC адрес отправителя, она:
-
Ищет нужный IP адрес в ARP-кэш
-
Если нужного IP адреса нет в ARP-кэш, отправляет ARP-запрос
Для примера создайте в miminet сеть как на рисунке ниже:
-
2 хоста соединим друг с другом
-
на хосте 1 установим IP адрес в 192.168.1.1 и маску в 24
-
на хосте 2 установим IP адрес в 192.168.1.2 и маску в 24
-
на хосте 1 выполните команду ping (1 пакет) и в качестве IP адреса назначения укажите 192.168.1.2
-
запустите эмуляцию
-
когда эмуляция закончится, запустите анимацию и посмотрите на пакеты. Первым делом вы увидите ARP-запрос и ARP-ответ, чтобы хост 1 мог узнать MAC адрес назначения.
А теперь:
-
добавьте на хосте 1 команду “Добавить запись в ARP-кэш”, как указано на рисунке 48а. В качестве IP адреса укажите 192.168.1.2, а MAC адрес поставьте 00:11:22:33:44:55 (или любой другой, где multicast бит равен 0, так как это будет широковещательный адрес,и не 00:00:00:00:00:02, так как адрес хоста 2).
-
запустите эмуляцию
-
запустите анимацию и посмотрите, больше нет никаких ARP-запросов. Вместо этого хост 1 сразу отправляет ICMP пакет, так как MAC адрес для IP адреса 192.168.1.2 уже есть в ARP-кэш. Но, так как MAC адрес неверный, то хост 2 получив такой пакет отбрасывает его и никакого ICMP-ответа не генерируется, как это было до этого.
Когда ОС назначает себе IP адрес, она хочет убедиться, что такого же IP адреса нет в ее сети. Ведь IP адреса должны быть уникальными. Для этого она отправляет ARP-запрос в сеть, в котором указывает в качестве IP адреса назначения свой IP адрес.
Если в сети уже есть хост с таким же IP адресом, то наш хост получит ARP-ответ. Таким образом он поймет, что в сети уже существует хост с таким IP и назначать его себе нельзя. Если у вас Windows, то вы увидите подобное сообщение, как на рисунке ниже.
Вопрос 1: Что будет, если на ARP-запрос никто не ответит?
Ответ: Отправив ARP-запрос, хост ожидает некоторый таймаут (примерно 1-3 секунды). Если за время таймаута хост не получил ARP-ответ, то он снова отправляет ARP-запрос. И так он делает 3 раза. После 3-й попытки хост сообщает протоколам более верхнего уровня о невозможности отправить пакет в сеть.
Вопрос 2: Что будет, если хост получит 2 ARP-ответа сразу?
Ответ: Обычно такое поведение зависит от реализации ARP-протокола. Некоторые ОС принимают только первый ARP-ответ, другие ОС могут принять ARP-ответ второй и даже в случае, когда хост не отправлял ARP-запрос.
Вопрос 3: Если находясь в сети мой хост будет отправлять ARP-ответы в ответ на беспричинный ARP-запрос, тогда никто больше кроме меня не сможет назначить себе IP адрес?
Ответ: Да, такое поведение сложно отследить и администраторы очень не любят таких людей.
Вопрос 4: Если мой хост подделает ARP-ответ на ARP-запрос другого хоста и мой ARP-ответ придет первым на хост отправителя, это означает, что пакет, который предназначается для другого хоста придет ко мне?
Ответ: Да, это называется атака ARP-spoofing.