Пакетная фильтрация
Ваше понимание правильное. Сетевая карта выполняет значительную аппаратную фильтрацию, чтобы избавить ЦП от чрезмерной фильтрации. Как правило, типичная сетевая карта 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