Функции протокола ARP реализованы в ядре Linux в соответствии со спецификацией RFC 826. Протокол используется для преобразования между аппаратными адресами канального уровня и сетевыми адресами IPv4 для подключенных непосредственно сетей. Пользователь обычно не взаимодействует с реализующим протокол модулем ядра за исключением этапа настройки конфигурации при компиляции ядра. Модуль протокола обеспечивает сервисные функции для других протоколов ядра.
Пользовательские процессы могут получать пакеты ARP с помощью сокета packet. Существует также механизм управления кэшем ARP в пользовательском пространстве с помощью сокетов netlink. Контроль таблиц ARP возможен также с использованием операций ioctl и любого сокета PF_INET. В пакет nettools входит утилита arp, обеспечивающая возможность просмотра и изменения таблицы ARP.
Модуль ARP поддерживает кэш отображений между аппаратными адресами и адресами сетевого уровня. Размер кэша ограничен, поэтому старые и редко используемые записи удаляются из таблицы системой сбора мусора. Записи, помеченные как постоянные (permanent) системой сбора мусора из таблицы не удаляются. Поддерживаются возможности прямого управления записями в таблице с использованием описанных ниже операций ioctl с учетом параметров sysctl.
По истечении некоторого времени (в зависимости от параметров sysctl) запись таблицы, которая не обновлялась, будет рассматриваться как устаревшая. В таких случаях ARP сначала пытается app_solicit раз обратиться к локальному демону arp для получения обновленного MAC-адреса. Еслт эти попытки не увенчались удачей и в таблице присутствует старый MAC-адрес, по этому адресу ucast_solicit раз передается тестовый запрос (unicast probe). Если и это не приведет к успеху в сеть передается новый широковещательный запрос ARP (при условии наличия данных для отправки по соответствующему адресу сетевого уровня).
Linux будет автоматически добавлять временные (non-permanent) записи в таблицу proxy arp при получении запросов для адресов, по которым хост пересылает кадры, если функции proxy arp разрешены для принимающего интерфейса. Если путь к получателю неизвестен запись в таблицу proxy arp не включается.
Операции IOCTL
Вызовы ioctl доступны для всех сокетов PF_INET. Сокет принимает в качестве параметра структуру arpreq.
struct arpreq
{
struct sockaddr arp_pa; /* протокольный адрес */
struct sockaddr arp_ha; /* аппаратный адрес */
int arp_flags; /* флаги */
struct sockaddr arp_netmask; /* маска протокольного адреса */
char arp_dev[16];
};
Функции SIOCSARP, SIOCDARP и SIOCGARP устанавливают, удаляют и читают отображение ARP, соответственно. Установка и удаление записей ARP являются привилегированными операциями и могут выполняться только процессами с флагом возможностей CAP_NET_ADMIN или выполняющимися от имени пользователя с UID = 0.
Параметр arp_pa должен содержать сокет AF_INET, и тип адреса arp_ha должен совпадать с типом устройства, заданным в arp_dev. Строка arp_dev содержит имя устройства в формате языка C (строка, завершающаяся 0. Флаги ARP перечислены в таблице 1.
Таблица 1 Флаги ARP
Флаг
|
Значение
|
ATF_COM
|
Просмотр завершен
|
ATF_PERM
|
Постоянная запись
|
ATF_PUBL
|
Публикуемая запись
|
ATF_USETRAILERS
|
Запрошены трейлеры
|
ATF_NETMASK
|
Использовать маску
|
ATF_DONTPUB
|
Непубликуемая запись
|
При установке флага ATF_NETMASK параметр arp_netmask должен содержать корректную маску подсети. Ядро Linux 2.2 не поддерживает записи proxy arp. Флаг ATF_USETRAILERS является устаревшим и не должен использоваться.
Параметры SYSCTL
Модуль ARP поддерживает интерфейс sysctl для настройки глобальных параметров и параметров отдельного интерфейса. Доступ к параметрам обеспечивается через файлы /proc/sys/net/ipv4/neigh/*/* или функции sysctl. Каждый интерфейс системы имеет свой каталог /proc/sys/net/ipv4/neigh/. Параметры в файлах каталога default используются при создании каталогов для новых устройств. Все временные параметры sysctl задаются в секундах, если явно не указано иное.
Таблица 2 Параметры sysctl для ARP
Параметр
|
Описание
|
Значение по умолчанию
|
anycast_delay
|
Максимальное время задержки отклика на сообщения IPv6 neighbour.
|
100 jiffy
|
app_solicit
|
Максимальное число проб, передаваемых демону ARP в пользовательском пространстве через сокет netlink, прежде, чем перейти к multicast-пробам.
|
0
|
base_reachable_time
|
После обнаружения соседа запись для него считается корректной в течение по крайней мере случайного промежутка времени из диапазона base_reachable_time/2 - 3*base_reachable_time/2. Продолжительность периода корректности записи может быть увеличена при получении позитивной обратной связи от протоколов вышележащих уровней.
|
30 секунд
|
delay_first_probe_time
|
Задержка перед отправкой первой пробы с момента принятия решения о том, что запись для соседа устарела.
|
5 секунд
|
gc_interval
|
Период активизации процесса сборки мусора в таблице адресов.
|
30 секунд
|
gc_stale_time
|
Определяет период проверки старения записей. Когда адресная запись сочтена устаревшей, ее нужно обновить до передачи данных по этому адресу.
|
60 секунд
|
gc_thresh1
|
Минимальное число записей, которое должно присутствовать в кэше ARP. Если число записей меньше этого значения, сборщик мусора не будет очищать таблицу.
|
128
|
gc_thresh2
|
Мягкое ограничение числа записей в кэше ARP. При достижении этого порога сборщик мусора будет активизироваться в течение 5 секунд.
|
512
|
gc_thresh3
|
Жесткое ограничение числа записей в кэше ARP. При достижении этого порога должна быть незамедлительно выполнена сборка мусора.
|
1024
|
locktime
|
Минимальный интервал времени хранения записи в кэше ARP. Это ограничение предотвращает переполнение кэша ARP при наличии множества потенциальных записей для одного адреса (например, в результате конфигурационных ошибок).
|
100 jiffy
|
mcast_solicit
|
Максимальное число попыток преобразования адреса с помощью проб multicast/broadcast прежде, чем будет принято решение о недоступности адреса.
|
3
|
proxy_delay
|
При получении запроса ARP для известного адреса proxy-ARP этот параметр определяет задержку передачи отклика, позволяющую в некоторых случаях предотвратить лавину пакетов (network flooding).
|
80 jiffy
|
proxy_qlen
|
Максимальное число пакетов которые могут быть помещены в очередь proxy-ARP.
|
64
|
retrans_time
|
Задержка повторной передачи запроса.
|
100 jiffy
|
ucast_solicit
|
Максимальное число попыток передачи unicast-проб перед тем, как будет запрошен демон ARP (app_solicit).
|
3
|
unres_qlen
|
Максимальное число пакетов от других сетевых уровней, которые могут быть помещены в очередь для каждого неизвестного адреса.
|
3
|
Известные ограничения
-
Значения некоторых таймеров задаются не в абсолютных единицах, а в jiffy, величина которых зависит от аппаратной платформы. Например в системах Alpha = 1/1024 секунды, а для большинства других платформ = 1/100s.
-
Не существует обратной связи с программами пользовательского пространства. Это означает, что работающие на основе явных соединений (connection oriented) протоколы, реализованные в пользовательском пространстве, будут генерировать избыточный трафик ARP, поскольку ndisc будет регулярно повторять пробы MAC-адресов. Такая же проблема характерна для некотрых протоколов, реализованных в ядре (например, NFS на базе UDP).
-
Структура arpreq была изменена в ядре Linux версии 2.0 (добавлено поле arp_dev и изменена нумерация ioctl). В версии ядра 2.2 была прекращена поддержка старых вызовов ioctl.
-
Поддержка записей proxy arp для сетей (маска адреса не равна 0xffffffff) была прекращена в версии ядра Linux 2.2 с заменой на поддержку ядром proxy arp для всех доступных хостов на других интерфейсах системы (для этого интерфейсы должны поддерживать пересылку кадров и proxy arp).
-
Параметры sysctls, включенные в neigh/*, не поддерживаются ядрами Linux до версии 2.2.
|