Назад | Перейти на главную страницу

Можно ли переопределить MAC-адрес назначения многоадресного кадра с помощью статической записи ARP?

У меня есть, как мне кажется, несколько неясный вопрос. У меня здесь очень конкретный вариант использования, поэтому, пожалуйста, рассмотрите этот вопрос чисто академический.

У меня есть устройство (под управлением ядра Linux 2.4), которое передает многоадресные пакеты IP UDP через Ethernet. Мне нужно иметь возможность контролировать MAC-адрес назначения кадров. Обычно при отправке многоадресного кадра UDP через обычный сокет UDP MAC-адрес назначения автоматически определяется с помощью стандартного сопоставления, которое в основном составляет 01: 00: 5E: XX: XX: XX, где XX представляют последние 3 октета ( на самом деле 23 бита я думаю) IP. Для одноадресных кадров MAC-адрес назначения, очевидно, получается через ARP.

У меня вопрос:

Если я добавлю статическую запись ARP для IP-адреса многоадресной рассылки, есть ли гарантия, что система будет использовать этот MAC-адрес назначения вместо стандартного сопоставления? Я протестировал это в системе, и, похоже, это работает, но мне было любопытно, является ли это определенным поведением.

Я ожидал, что многоадресные UDP-пакеты будут обходить весь механизм поиска в таблице ARP в качестве оптимизации, но, очевидно, это не так.

Кажется, что он действительно сканирует статическую таблицу ARP даже для многоадресных пакетов. Однако он не будет передавать запрос ARP, если не найдет запись. Вместо этого он, кажется, возвращается к стандартному отображению. Для меня это разумное поведение.

Я попытался ориентироваться в источнике IP-стека ядра, чтобы лучше понять, где принимается решение о том, выполнять ли поиск ARP или нет, но у меня возникли небольшие проблемы.

Если бы кто-нибудь мог указать мне, где в исходном коде ядра было принято это решение, я был бы очень признателен. Из того, что я сейчас понял, пакет сначала попадает в udp_sendmsg в «udp.c». Затем он передается в «ip_output.c». Однако я не уверен, где происходит поиск ARP.

Джейк

Я не могу сказать вам, где именно ядро ​​решает, куда отправлять пакеты, но это поведение определенно стандартно и было реализовано с учетом производительности и модели OSI. ARP находится на более низком уровне, чем IP, поэтому, если ядро ​​находит запись ARP для IP, ему не нужно ничего проверять. Ему не нужно знать, многоадресный это адрес или нет, он просто отправляет пакеты на данный MAC.

Также имейте в виду, что существует только одна таблица ARP, статические записи имеют только дополнительный флаг (PERM), поэтому в основном ядро ​​всегда сначала проверяет эту таблицу, поскольку после того, как IP (статический или нет) присутствует, ядру не нужно выполните любые дополнительные поиски / вычисления для него, например, какой сетевой адрес, какова сетевая маска, каков многоадресный адрес, является ли данный IP-адрес многоадресной рассылки и, если он есть, создайте кадр многоадресной рассылки. Фактически, многоадресные рассылки - это скорее особый случай, чем одноадресные, поэтому выполнение проверки многоадресной рассылки ПЕРЕД проверкой таблицы ARP вообще не будет оптимизацией.

Хотя в этом случае это может немного отвлекать, поскольку ARP является своего рода переходным уровнем между IP и Ethernet, но в принципе вы можете иметь в виду, что ARP находится на более низком уровне, чем IP, поэтому ARP всегда имеет приоритет над IP.