Документация по LinuxLinuxDoc.Ru 🔍

arp - модуль ARP ядра Linux

НАЗВАНИЕ
arp - модуль ARP ядра Linux.

ОПИСАНИЕ
Этот модуль протокола ядра реализует 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_CON-
FIRM для команды sendmsg(2). Если прогресса нет, то ARP
пытается повторить запрос. Сначала он пытается app_solicit
раз запросить обновленный MAC-адрес у локального демона
arp. Если получить адрес не удалось, а старый MAC-адрес
известен, то адресный запрос посылается ucast_solicit раз.
Если и после этого адрес определить не удалось, то по сети
посылается новый широковещательный ARP-запрос. Запросы
посылаются только при наличии в очереди данных для
отправки.

Linux автоматически добавляет произвольную запись proxy
arp, когда система получает запрос адреса и производит
переадресацию этого запроса, а proxy arp запущен на
принимающем интерфейсе. При наличии reject route
(маршрута отказа) запись proxy arp не производится.


ВЫЗОВЫ IOCTL
Всем сокетам 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
считается устаревшей, ее не рекомендуется использовать.


РАБОТА С ИНТЕРФЕЙСОМ SYSCTLS
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_reach-
able_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.
Читать новости Linux в Telegram
Linux - arp - модуль ARP ядра Linux
Мы в соцсетях ✉