0

My understanding is that an Ethernet NIC 'knows' its MAC address. When packets arrive on the wire, the NIC checks to see if the destination MAC matches its MAC, and if so, forwards the packet up the network stack. This alleviates the operating system of having to examine each and every packet that arrives on the wire.

I'd like to know which OS driver functions support this. I've been looking at the NDIS 5.1 reference, and have found this: http://msdn.microsoft.com/en-us/library/windows/hardware/ff557131%28v=vs.85%29.aspx and I think I'm close, but haven't hit the jackpot yet.

I'm preparing class materials and I want to tell my class that the NIC knows its MAC address, but don't want to teach that unless I can verify to myself that it's true. Seeing the OS driver functions that support this would satisfy my doubt.

I appreciate any help (and comment) the community could provide.

4

2 回答 2

1

包过滤

你的理解是正确的。NIC 会在硬件中进行大量过滤,以使 CPU 免于过度过滤。通常,典型的以太网 NIC 将具有可编程的数据包过滤器,仅在数据包满足某些条件时才允许数据包,例如:

  • 目标 MAC 地址与一组可编程目标地址中的一个匹配(通常您会将自己的单播地址以及多个多播地址放入目标集中)。
  • 目标地址是广播地址(对于以太网,即ff-ff-ff-ff-ff-ff)。
  • 目标地址是任何多播地址(对于以太网,第一个字节设置了 LSB)

在典型操作中,Windows 将对 NIC 进行编程,以接受发往 NIC 的单播地址、广播地址和少量多播地址(例如,用于 IPv6 邻居发现和 UPnP)的流量。

硬件包过滤器的唯一目的是减少主机的 CPU 使用率。Windows 不依赖硬件包过滤器来保证功能的正确性。如果表现不佳的 NIC 始终指示所有未过滤的数据包,Windows 将自动退回到软件过滤。

更新包过滤器

Windows 可能会修改硬件上的数据包过滤器。例如,如果您运行 Netmon 或 Wireshark 并启用它们的“混杂模式”,NDIS 将指示 NIC 指示所有流量,即使目标是非本地单播地址。

如果您想要一个有趣的实验室实验,请打开 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 将恢复预先存在的数据包过滤器。

其他过滤类型

我刚刚描述了几乎所有以太网 NIC 都支持的最基本级别的数据包过滤。(微软要求这种最低级别的支持与“Device.Network.LAN.Base.PacketFiltering”标志要求。)更复杂的硬件可以做很酷的事情。

例如,支持多个接收队列的硬件具有多个接收过滤器。NIC 在不同的 CPU 上分别指示与每个过滤器匹配的数据包,以使管理程序更容易将流量分配到虚拟化来宾操作系统。

免责声明

您的问题提到了 OS X 和 NDIS,一种 Windows 技术。我的言论仅适用于 NDIS 和 Windows,因为我在 Microsoft 工作。

于 2013-08-24T18:17:08.383 回答
0

驱动程序是查找此信息的错误位置,因为寻址(通常)在驱动程序参与之前由卡处理。查看有关 MAC 地址的维基百科文章

MAC 地址通常由网络接口​​控制器 (NIC) 的制造商分配,并存储在其硬件中,例如卡的只读存储器或其他一些固件机制。如果由制造商分配,MAC 地址通常对制造商的注册标识号进行编码,并且可以称为烧入地址 (BIA)。

驱动程序可能支持获取 NIC 的地址,并且在某些情况下更改它(覆盖工厂定义的地址),但大多数情况下,驱动程序只会将 MAC 层留给 NIC。

于 2013-08-23T22:14:31.580 回答