NIC是否“知道”其MAC地址?

时间:2013-08-23 19:17:47

标签: macos ethernet ndis

我的理解是以太网NIC“知道”其MAC地址。当数据包到达线路时,NIC会检查目标MAC是否与其MAC匹配,如果是,则将数据包转发到网络堆栈。这减轻了操作系统必须检查到达线路的每个数据包的情况。

我想知道哪个OS驱动程序功能支持这个。我一直在查看NDIS 5.1参考资料,并且发现了这个:http://msdn.microsoft.com/en-us/library/windows/hardware/ff557131%28v=vs.85%29.aspx并且我认为我很接近,但还没有获得累积奖金。

我正在准备课程材料,我想告诉我的班级,NIC知道它的MAC地址,但不想教导它,除非我能证实这是真的。看到支持这一点的操作系统驱动程序功能将满足我的疑虑。

我感谢社区提供的任何帮助(和评论)。

2 个答案:

答案 0 :(得分:1)

数据包过滤

您的理解是正确的。 NIC在硬件中进行大量过滤,以避免CPU过度过滤。通常,典型的以太网NIC将具有可编程数据包过滤器,只有在满足特定条件时才允许数据包,如下所示:

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

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

硬件数据包过滤器的唯一目的是减少主机的CPU使用率。 Windows不依赖于硬件数据包筛选器来实现功能正确性。如果一个行为不端的NIC始终指示所有未经过滤的数据包,Windows将自动回退到软件过滤。

更新数据包过滤器

Windows may modify the packet filter on the hardware。例如,如果您运行Netmon或Wireshark并启用其“混杂模式”,则NDIS将指示NIC指示所有流量,即使目标是非本地单播地址。

如果您想要一个有趣的实验室实验,请打开PowerShell并运行此命令来查询当前的数据包过滤器:

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

您可以将其传递给另一个命令以使输出更具可读性:

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

数据包过滤器显示为整数,它是SDK / WDK头文件ntddndis.h中NDIS_PACKET_TYPE_XXX常量的位掩码。现在,如果您在Netmon或Wireshark中启用混杂模式,您应该看到数据包筛选器更改为包含NDIS_PACKET_TYPE_PROMISCUOUS标志(0x20)。禁用Netmon或Wireshark将恢复预先存在的数据包过滤器。

其他过滤类型

我刚刚介绍了最基本的数据包过滤级别,几乎所有以太网网卡都支持这种级别。 (Microsoft要求对“Device.Network.LAN.Base.PacketFiltering”徽标要求提供最低级别的支持。)更复杂的硬件可以做很酷的事情。

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

声明

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

答案 1 :(得分:0)

驱动程序是查找此信息的错误位置,因为在驱动程序参与之前(通常)由卡处理寻址。查看wikipedia article on MAC addresses

  

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

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