Welcome to Энциклопедия сетевых протоколов
Поиск

Модули
· Титульная страница
· Мир протоколов
· Основные темы
· Архив публикаций
· Поиск
· Каталог ссылок
· Участники
· Документы и программы

Выбор языка
Язык интерфейса:


Статистика
20490548
запросов с 22 сентября 2005

Внешняя статистика
Rambler's Top100

  
Реализация протокола ARP в Linux
Опубликовано 06 окт. 2005 (Чт.) в 10:51:55
Тема: Реализации протоколов

Функции протокола ARP1 реализованы в ядре Linux в соответствии со спецификацией RFC 826. Протокол используется для преобразования между аппаратными адресами канального уровня и сетевыми адресами IPv4 для подключенных непосредственно сетей. Пользователь обычно не взаимодействует с реализующим протокол модулем ядра за исключением этапа настройки конфигурации при компиляции ядра. Модуль протокола обеспечивает сервисные функции для других протоколов ядра.

Пользовательские процессы могут получать пакеты ARP с помощью сокета packet. Существует также механизм управления кэшем ARP в пользовательском пространстве с помощью сокетов netlink. Контроль таблиц ARP возможен также с использованием операций ioctl и любого сокета PF_INET. В пакет nettools входит утилита arp, обеспечивающая возможность просмотра и изменения таблицы ARP.



Модуль ARP поддерживает кэш отображений между аппаратными адресами и адресами сетевого уровня. Размер кэша ограничен, поэтому старые и редко используемые записи удаляются из таблицы системой сбора мусора. Записи, помеченные как постоянные (permanent) системой сбора мусора из таблицы не удаляются. Поддерживаются возможности прямого управления записями в таблице с использованием описанных ниже операций ioctl с учетом параметров sysctl.

По истечении некоторого времени (в зависимости от параметров sysctl) запись таблицы, которая не обновлялась2, будет рассматриваться как устаревшая. В таких случаях 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 neighbour3.

100 jiffy4

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

Известные ограничения

  1. Значения некоторых таймеров задаются не в абсолютных единицах, а в jiffy, величина которых зависит от аппаратной платформы. Например в системах Alpha = 1/1024 секунды, а для большинства других платформ = 1/100s.

  2. Не существует обратной связи с программами пользовательского пространства. Это означает, что работающие на основе явных соединений (connection oriented) протоколы, реализованные в пользовательском пространстве, будут генерировать избыточный трафик ARP, поскольку ndisc будет регулярно повторять пробы MAC-адресов. Такая же проблема характерна для некотрых протоколов, реализованных в ядре (например, NFS на базе UDP).

  3. Структура arpreq была изменена в ядре Linux версии 2.0 (добавлено поле arp_dev и изменена нумерация ioctl). В версии ядра 2.2 была прекращена поддержка старых вызовов ioctl.

  4. Поддержка записей proxy arp для сетей (маска адреса не равна 0xffffffff) была прекращена в версии ядра Linux 2.2 с заменой на поддержку ядром proxy arp для всех доступных хостов на других интерфейсах системы (для этого интерфейсы должны поддерживать пересылку кадров и proxy arp).

  5. Параметры sysctls, включенные в neigh/*, не поддерживаются ядрами Linux до версии 2.2.

1Address Resolution Protocol – протокол преобразования адресов, обеспечивающий возможность определения MAC-адреса устройства Ethernet по сетевому адресу интерфейса.

2В качестве обновлений записи рассматривается информация от протоколов вышележащих уровней (например, пакеты TCP ACK или сигналы, переданные с использованием системной функции sendmsg и содержащие флаг MSG_CONFIRM).

3Поддержка anycast еще не реализована в ядре Linux.

4Специальная единица времени, используемая ядрами Linux. Для процессоров x86 составляет приблизительно 10 мсек.


 
Вход
Регистрационное имя

Пароль

[Восстановить пароль]

Если у Вас еще нет учетной записи, Вы можете зарегистрироваться.


Связанные ссылки
· Поиск в разделе Реализации протоколов
· Статьи пользователя Николай Малых


Самая популярная статья раздела Реализации протоколов:
RAW-сокеты в Linux


Оценка статьи
Средняя оценка: 5
голос.: 2


Оцените эту публикацию:

Отлично
Очень хорошо
Хорошо
Приемлемо
Плохо


Параметры

 Вариант для печати Вариант для печати


Связанные темы

Настройка параметров оборудованияНастройка сетевых параметров хостов

"Вход" | Вход/регистрация | 0 коммент.
Комментарии выражают мнение их авторов. Администрация сайта не несет никакой ответственности за достоверность представленных в комментариях посетителей сведений, а также за содержание таких комментариев.

Для публикации своих комментариев Вам нужно зарегистрироваться..
Copyright © Nikolai Malykh
Все права на опубликованные на сайте материалы принадлежат Nikolai Malykh, если в опубликованном на сайте документе явно не указано иное.
Не разрешается воспроизведение опубликованных на сайте документов без согласия правообладателя.

Hosted By Web Hosting by iPage

Copyright © 2005 by Nikolai Malykh
Based on PHP-Nuke by Francisco Burzi. This is free software, and you may redistribute it under the GPL. Author comes with absolutely no warranty.
Время генерации страницы: 0.32 сек.