Можно ли переопределить 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.

Джейк

0
задан 19 September 2016 в 17:13
1 ответ

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

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

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

.
0
ответ дан 5 December 2019 в 09:29

Теги

Похожие вопросы