我的理解是以太网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地址,但不想教导它,除非我能证实这是真的。看到支持这一点的操作系统驱动程序功能将满足我的疑虑。
我感谢社区提供的任何帮助(和评论)。
答案 0 :(得分:1)
您的理解是正确的。 NIC在硬件中进行大量过滤,以避免CPU过度过滤。通常,典型的以太网NIC将具有可编程数据包过滤器,只有在满足特定条件时才允许数据包,如下所示:
ff-ff-ff-ff-ff-ff
)。在典型操作中,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。