Знает ли сетевая карта свой MAC-адрес?

Насколько я понимаю, сетевая карта Ethernet «знает» свой MAC-адрес. Когда пакеты поступают по сети, NIC проверяет, соответствует ли MAC-адрес назначения своему MAC-адресу, и если да, то пересылает пакет вверх по сетевому стеку. Это избавляет операционную систему от необходимости проверять каждый пакет, поступающий по сети.

Я хотел бы знать, какие функции драйвера ОС поддерживают это. Я просматривал справочник NDIS 5.1 и нашел это: http://msdn.microsoft.com/en-us/library/windows/hardware/ff557131%28v=vs.85%29.aspx и я думаю, что близко, но еще не сорвал джекпот.

Я готовлю материалы для занятий и хочу сообщить своему классу, что сетевая карта знает свой MAC-адрес, но не хочу учить этому, пока не смогу проверить для себя, что это правда. Увидев, что функции драйвера ОС, поддерживающие это, развеяли бы мои сомнения.

Я ценю любую помощь (и комментарии), которую может предоставить сообщество.


person The Demigeek    schedule 23.08.2013    source источник


Ответы (2)


Пакетная фильтрация

Ваше понимание правильное. Сетевая карта выполняет значительную аппаратную фильтрацию, чтобы избавить ЦП от чрезмерной фильтрации. Как правило, типичная сетевая карта Ethernet имеет программируемый фильтр пакетов, который пропускает пакеты только в том случае, если они соответствуют определенным критериям, например следующим:

  • MAC-адрес назначения совпадает с одним из набора программируемых адресов назначения (как правило, вы помещаете свой собственный адрес индивидуальной рассылки в целевой набор, а также несколько адресов многоадресной рассылки).
  • Адрес назначения — это широковещательный адрес (для Ethernet это ff-ff-ff-ff-ff-ff).
  • Адрес назначения — любой многоадресный адрес (для Ethernet первый байт имеет установленный младший бит)

В типичной работе Windows программирует сетевой адаптер на прием трафика, предназначенного для индивидуального адреса сетевого адаптера, широковещательного адреса и нескольких многоадресных адресов (например, для обнаружения соседей IPv6 и UPnP).

Единственная цель аппаратного фильтра пакетов — уменьшить использование ЦП хоста. Windows не полагается на аппаратный фильтр пакетов для корректной работы. Если бы плохо работающая сетевая карта всегда указывала, что все пакеты не отфильтрованы, Windows автоматически вернулась бы к фильтрации в программном обеспечении.

Обновление фильтра пакетов

Windows может изменить фильтр пакетов на оборудование. Например, если вы запустите Netmon или Wireshark и включите их «неразборчивый режим», NDIS даст указание сетевой карте указать весь трафик, даже если пункт назначения является нелокальным одноадресным адресом.

Если вам нужен интересный лабораторный эксперимент, откройте PowerShell и выполните эту команду, чтобы запросить текущий фильтр пакетов:

Get-WmiObject -Namespace root\wmi -Class MSNdis_CurrentPacketFilter |
    Format-List InstanceName, NdisCurrentPacketFilter

Вы можете передать это другой команде, чтобы сделать вывод более читаемым:

    % { @{ $_.InstanceName = "{0:X8}" -f $_.NdisCurrentPacketFilter } }

Пакетный фильтр представлен целым числом, представляющим собой битовую маску NDIS_PACKET_TYPE_XXX констант из заголовочного файла SDK/WDK ntddndis.h. Теперь, если вы включите неразборчивый режим в Netmon или Wireshark, вы должны увидеть изменение фильтра пакетов, чтобы включить флаг NDIS_PACKET_TYPE_PROMISCUOUS (0x20). Отключение Netmon или Wireshark восстановит существовавший ранее фильтр пакетов.

Другие типы фильтрации

Я только что описал самый базовый уровень фильтрации пакетов, который поддерживают почти все сетевые карты Ethernet. (Microsoft требует этого минимального уровня поддержки с требованием к логотипу «Device.Network.LAN.Base.PacketFiltering».) Более сложное оборудование может делать классные вещи.

Например, оборудование, поддерживающее несколько очередей приема, имеет несколько фильтров приема. Сетевая карта указывает пакеты, которые соответствуют каждому фильтру, отдельно, на отдельных ЦП, чтобы гипервизору было проще распределять трафик по виртуализированным гостевым операционным системам.

Отказ от ответственности

В вашем вопросе упоминаются как OS X, так и NDIS, технология Windows. Мои замечания относятся только к NDIS и Windows, так как я работаю в Microsoft.

person Jeffrey Tippet    schedule 24.08.2013

Драйверы - неподходящее место для поиска этой информации, поскольку адресация (обычно) обрабатывается картой еще до того, как драйвер вмешается. Ознакомьтесь с статьей Википедии о MAC-адресах:

MAC-адреса чаще всего назначаются производителем контроллера сетевого интерфейса (NIC) и хранятся в его оборудовании, например в постоянной памяти карты или в каком-либо другом механизме встроенного ПО. Если MAC-адрес назначается производителем, он обычно кодирует зарегистрированный идентификационный номер производителя и может называться прошитым адресом (BIA).

Драйверы могут поддерживать получение адреса сетевой карты и, в некоторых случаях, его изменение (переопределение заданного на заводе-изготовителе адреса), но по большей части драйверы просто оставят уровень MAC для сетевой карты.

person Gordon Davisson    schedule 23.08.2013