Этот модуль протокола ядра реализует Address Resolution
Protocol (протокол разрешения адресов), определенный RFC 826.
Протокол предназначен для преобразования аппаратных адресов
второго уровня (Layer2) в адреса протокола IPv4 в соединенных
напрямую сетях. Как правило, пользователю не приходится работать
с этим модулем непосредственно, исключая случаи его настройки.
Модуль может использоваться другими протоколами ядра.
Процесс пользователя может получать пакеты ARP через сокеты
packet(7).
Кроме того, существует механизм управления кэшем ARP с помощью сокетов
netlink(7)
из пространства пользователя.
Таблица ARP может управляться с помощью
ioctl (2)
произвольным сокетом
PF_INET.
Модуль ARP поддерживает кэш соответствий аппаратных адресов
и адресов протокола. Размер кэша ограничен, поэтому старые и наименее
используемые записи удаляются. Записи, помеченные как постоянные,
не удаляются никогда. Кэшем можно управлять непосредственно, с помощью
ioctl-вызовов. Работа кэша может быть настроена с помощью sysctl-вызовов,
описанных ниже.
Если в течение некоторого времени (см. sysctl-вызовы ниже) не производится
обращение к существующей записи кэша, то она считается устаревшей.
Положительная обратная связь может быть получена с более высокого уровня;
например, от успешного вызова TCP ACK. Остальные протоколы могут обозначать
свой прогресс в работе, используя флаг
MSG_CONFIRM
для команды
sendmsg(2).
Если прогресса нет, то ARP пытается повторить запрос. Сначала он пытается
app_solicit
раз запросить обновленный MAC-адрес у локального демона arp.
Если получить адрес не удалось, а старый MAC-адрес известен, то
адресный запрос посылается
ucast_solicit
раз. Если и после этого адрес определить не
удалось, то по сети посылается новый широковещательный ARP-запрос.
Запросы посылаются только при наличии в очереди данных для отправки.
Linux автоматически добавляет произвольную запись proxy arp, когда система
получает запрос адреса и производит переадресацию этого запроса, а proxy arp
запущен на принимающем интерфейсе.
При наличии reject route (маршрута отказа) запись proxy arp не производится.
СИСТЕМНЫЕ ВЫЗОВЫ
Всем сокетам
PF_INET
доступны три ioctl-вызова.
В качестве параметра вызова дается указатель на
struct 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
- строка с именем устройства, оканчивающаяся нулем.
arp_flags
флаг
значение
ATF_COM
Поиск окончен
ATF_PERM
Постоянная запись
ATF_PUBL
Анонсировать запись
ATF_USETRAILERS
Требуются trailers
ATF_NETMASK
Использовать маску сети
ATF_DONTPUB
Не отвечать
Если установлен флаг
ATF_NETMASK,
то должно быть указано корректное значение
arp_netmask.
Linux 2.2 не поддерживает сетевые записи proxy ARP, поэтому для удаления
существующих записей proxy arp это значение должно быть равно 0xffffffff
или нулю.
ATF_USETRAILERS
считается устаревшей, ее не рекомендуется использовать.
СИСТЕМНЫЕ ВЫЗОВЫ
ARP поддерживает интерфейс sysctl для настройки общих параметров или
параметров конкретного сетевого интерфейса. Hастройка осуществляется
путем чтения файла или записи в него
/proc/sys/net/ipv4/neigh/*/*,
а также с помощью вызовов
sysctl(2).
Для каждого сетевого интерфейса в системе существует соответствующий каталог в
/proc/sys/net/ipv4/neigh/.
Hастройки в каталоге `default' используются для всех новых устройств.
Если явно не определено время, то оно считается указанным в секундах.
anycast_delay
Максимальное значение задержки в тиках (jiffies) до ответа на запрос IPv6.
В данное время поддержка anycast еще не реализована.
По умолчанию - 1 секунда.
app_solicit
Максимальное количество попыток послать запрос через сетевое соединение
ARP-демону пользователя до возврата к широковещательным запросам (см.
mcast_solicit).
По умолчанию - 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
Минимальное количество записей, хранимых в кэше. Если количество записей
меньше этого значения, то очистка кэша производится не будет.
По умолчанию - 128.
gc_thresh2
Необязательный лимит количества записей в кэше ARP. Если это значение будет
превышено более, чем на 5 секунд, то будет произведена очистка кэша.
По умолчанию - 512.
gc_thresh3
"Жесткий" лимит количества записей в ARP-кэше. Если это значение будет
превышено, то очистка кэша будет произведена в любом случае.
По умолчанию - 1024.
locktime
Минимальное время хранения записи в кэше в тиках. Предотвращает
появление ошибок в кэше при наличии более одного возможного
соответствия (в общем случае из-за неправильной настройки сети).
По умолчанию - 1 секунда.
mcast_solicit
Максимальное количество попыток определить адрес с помощью
широковещательной передачи. Если адрес не будет обнаружен, то он
будет помечен как недоступный.
По умолчанию - 3.
proxy_delay
Задержка в тиках между получением ARP-запроса на известный proxy
ARP-адрес и ответом. Предназначена для предотвращения перегрузки сети.
По умолчанию - 0.8 секунд.
proxy_qlen
Максимальное количество пакетов, которые могут быть отправлены в
очередь для передачи по адресу proxy ARP.
По умолчанию - 64.
retrans_time
Задержка перед повторением запроса в тиках.
По умолчанию - 1 секунда.
ucast_solicit
Максимальное количество попыток послать адресный запрос перед запросом
демона ARP (см.
app_solicit).
По умолчанию - 3.
unres_qlen
Максимальное количество пакетов, поставленных в очередь протоколами
других сетевых уровней для передачи по неразрешенному адресу.
По умолчанию - 3.
НАЙДЕННЫЕ ОШИБКИ
Значения некоторых настроек указаны в тиках, длительность которых
зависит от архитектуры компьютера. В Alpha тик равен 1/1024 секунды.
В большинстве остальных архитектур он равен 1/100 секунды.
Hе существует способа сообщить о положительном ответе из пользовательского
пространства. Это означает, что протоколы, ориентированые на соединения и
реализованные в пользовательском пространстве, будут создавать избыточный
ARP-трафик вследствие того, что ndisc будет вновь и вновь запрашивать
MAC-адрес. То же относится и к некоторым протоколам ядра
(например, NFS через UDP).
На этой странице соединено описание специфических функций IPv4 и функций,
разделяемых IPv4 и IPv6.
ВЕРСИИ
В Linux 2.0, в структуру
structarpreq,
было включено поле
arp_dev
и изменены номера ioctl. Старые ioctl более не поддерживаются.
Сетевые записи proxy arp (маска сети не равна 0xffffffff) в Linux 2.2
не поддерживаются. Вместо этого было реализовано автоматическое определение
ядром всех доступных через другие интерфейсы машин (при отправке сообщения
и запущенном proxy arp).neigh/* sysctls не существовали до версии Linux 2.2.