网络接口

本主题介绍 Windows 中的高级网络接口概念,其中包括可在代码中识别它们的方式及其属性。

重要

本主题适合开发人员受众,且适用于 Windows 桌面网络应用和内核模式网络驱动程序。 但是,此处提供的某些信息对于通过 PowerShell cmdlet 来管理网络接口的系统管理员也很有用。

概述

网络接口是指存在两个网络设备或协议层连接的点。 通常,它由物理网络接口卡 (NIC) 来表示,以便在计算机与专用或公用网络之间建立连接。 但是,它也可采用仅软件组件的形式,例如环回接口(对于 IPv4 为127.0.0.1,对于 IPv6 则为 ::1)。

网络接口由 RFC 2863 中的 Internet 工程工作队 (IETF) 定义,而不应由 Windows 定义。 有关网络接口标识符(如 ifIndex)含义的详细问题,请参阅 IETF 对它们的定义。 本主题的其余部分将讨论特定于 Windows 的实现详细信息。

网络接口标识符和属性

在 Windows 上,可通过不同方式标识网络接口。 其中某些标识符可用于相互区分网络接口,但并非所有标识符均同样适合该任务,因为它们具有不同的属性。 通常,网络接口由外部组件的网络地址进行标识。 例如,它可能是一个节点 ID 和端口号,或只是一个唯一节点 ID。

在代码中,可通过多种方式标识网络接口。 下表详细介绍了网络接口与关联属性的标识方式。 建议使用接口 GUID (ifGuid) 进行编程,除非特定 API 需要其他网络接口标识符。

注意

在下表中,粗体单元格表示网络程序员所需的属性。

Identifier 大小 在系统中唯一 在现实环境中唯一 可预测 如果删除 NIC,则会回收 在重新启动后保留 最终用户可随时修改 驱动程序可随时修改 对最终用户的一般熟悉程度 始终存在
ifIndex 4 字节 No 1 某些2
NetLuid 8 字节 No No
ifGuid 16 字节 通常3 No
ifAlias 514 字节 对 NIC 而言为是4 有时5 通常4
ifDescr 514 字节 通常6 No 通常
ifPhysAddress (MAC ADDRESS) 0 到 32 个字节 通常(对于 NIC) 通常(对于 NIC) 绑定到硬件 通常 7
PnP 实例 ID 最多 400 字节 No 通常(对于 NIC)8
PnP 位置(PCI 槽号) 最多 400 字节 No 有时 有时8,9

针对上表的说明:

  1. 无法保证在重新启动后 IfIndexes 能保持稳定,即使它们通常会收到与上一次启动相同的值。 因此,除非 API 需要,否则不建议驱动程序使用 ifIndex
  2. 某些 netsh 命令使用 ifIndexindex 以作为输入。 因此,如果某些管理用户经常使用 netsh 命令,则应熟悉 ifIndex 属性。
  3. 如果克隆或映像计算机,则某些 GUID 可能相同。 此外,某些特殊网络接口(例如内置 Teredo 接口)在所有计算机上可能具有相同的 GUID。
  4. NetCfg 会强制认定 ifAlias 为非空字符串,且在所有 NIC 中均唯一。 但是,NDIS 接口提供程序则不会。 因此,可查找具有重复名称或空名称的特殊网络接口。 此问题最常出现在 LBFO 团队中。
  5. 仅当固件支持“一致设备命名”时。 通常,服务器具有此功能。
  6. NetCfg 会向所有网络接口分配唯一的 ifDescr。 但是,驱动程序可调用 API 将 ifDescr 更改为任意内容,其中包括不唯一的内容。 某些第三方软件包可执行此操作。
  7. 并非所有媒体类型均有“MAC 地址”。例如,某些隧道没有此概念,而只是将零长度字节数组播发为其网络地址。
  8. 仅存在于由 PnP 设备提供支持的网络接口上。 例如,环回接口、轻型筛选接口、NDIS 接口提供程序提供的接口以及某些特殊的内置 NIC 没有支持它们的 PnP 设备。
  9. 仅某些 PnP 总线支持 PnP 位置 ID。 内置的 PCI 和 USB 总线可提供支持,而根枚举设备则不支持。

面向开发人员的可见性

在上表中,除即插即用 (PnP) 属性之外的所有属性均会通过共享头文件 (Netioapi.h) 对用户模式桌面应用和内核模式驱动程序可见。 PnP 属性可通过 Devpkey.h 头文件可见,并由用户模式桌面应用和内核模式驱动程序使用。 例如,请参阅 DEVPKEY 文档。

IP 帮助程序 API 也可用于用户模式桌面应用和内核模式驱动程序。

UWP API 表面仅会直接公开 ifGuid 属性。 但是,如果需要 GetIfTable2 函数才能访问其他网络接口属性,则 UWP 应用开发人员可使用 P/Invoke 来导入 GetIfTable2 函数。

有关网络接口的管理信息基础 (MIB) 定义,请参阅 RFC 2863

有关网络驱动程序中的 NDIS 网络接口,请参阅 NDIS 网络接口

有关 Netioapi.h API 参考,请参阅 netioapi.h 头文件