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