【问题标题】:Does a NIC 'know' its MAC address?网卡“知道”它的 MAC 地址吗?
【发布时间】:2013-08-26 22:44:00
【问题描述】:

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

我想知道哪些操作系统驱动程序功能支持此功能。我一直在查看 NDIS 5.1 参考,发现了这个:http://msdn.microsoft.com/en-us/library/windows/hardware/ff557131%28v=vs.85%29.aspx,我想我已经接近了,但还没有中奖。

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

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

【问题讨论】:

    标签: macos ethernet ndis


    【解决方案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 将恢复预先存在的数据包过滤器。

    其他过滤类型

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

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

    免责声明

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 2016-02-17
        • 2015-10-07
        相关资源
        最近更新 更多