Сетевые интерфейсы
В этом разделе описываются основные понятия сетевого интерфейса в Windows, включая способы их идентификации в коде и их свойствах.
Внимание
Этот раздел предназначен для аудитории разработчиков как для классических приложений Windows, так и для сетевых драйверов в режиме ядра. Тем не менее некоторые сведения, представленные здесь, также могут быть полезны для системных администраторов, управляющих сетевыми интерфейсами с помощью командлетов PowerShell.
Обзор
Сетевой интерфейс — это точка подключения двух частей сетевого оборудования или уровней протокола. Как правило, это представлено физической сетевой картой (сетевой картой) для подключения между компьютером и частной или общедоступной сетью. Однако он также может принимать форму компонента, доступного только для программного обеспечения, например интерфейса обратного цикла (127.0.0.1
для IPv4 или ::1
для IPv6).
Сетевые интерфейсы определяются рабочей службой разработки Интернета (IETF) в RFC 2863 и не предназначены для определения Windows. Подробные вопросы о значении идентификаторов сетевых интерфейсов, таких как ifIndex, см. в определениях IETF. В остальной части этого раздела рассматриваются сведения о реализации windows.
Идентификаторы и свойства сетевого интерфейса
В Windows сетевой интерфейс можно идентифицировать разными способами. Некоторые из этих идентификаторов используются для различения сетевых интерфейсов друг от друга, но не все идентификаторы одинаково подходят для этой задачи из-за их различных свойств. Как правило, сетевые интерфейсы определяются сетевым адресом внешних компонентов. Например, это может быть идентификатор узла и номер порта или просто уникальный идентификатор узла.
В коде сетевой интерфейс можно идентифицировать различными способами. В следующей таблице описаны способы идентификации сетевого интерфейса вместе с связанными свойствами. Рекомендуется использовать GUID интерфейса (ifGuid) для программирования, если для конкретного API не требуется другой идентификатор сетевого интерфейса.
Примечание.
В следующей таблице полужирные ячейки представляют свойство, которое желательно для сетевых программистов.
Идентификатор | Размер | Уникально в системе | Уникально в мире | Прогнозируемо | Будет переработан, если сетевой адаптер удален | Сохраняется во время перезагрузки | Конечные пользователи могут изменять в любое время | Драйверы могут изменяться в любое время | Общее знакомство с конечными пользователями | Всегда присутствует |
---|---|---|---|---|---|---|---|---|---|---|
ifIndex | 4 байта | Да | No | No | Да | Нет1 | Нет | Нет | Около2 | Да |
NetLuid | 8 байт | Да | No | No | Да | Да | Нет | Нет | No | Да |
ifGuid | 16 байт | Да | Обычно3 | No | Нет | Да | Нет | Нет | No | Да |
ifAlias | 514 байт | Да для сетевых адаптеров4 | No | Иногда5 | Да | Да | Да | Нет | Да | Обычно4 |
ifDescr | 514 байт | Обычно6 | No | No | Да | Да | Нет | Да | Да | Обычно |
ifPhysAddress (MAC ADDRESS) | От 0 до 32 байт | Обычно для сетевых адаптеров | Обычно для сетевых адаптеров | Да | Привязка к оборудованию | Да | Нет | Нет | Да | Обычно 7 |
Идентификатор экземпляра PnP | До 400 байт | Да | No | No | Да | Да | Нет | Нет | No | Обычно для сетевых адаптеров8 |
Расположение PnP (номер слота PCI) | До 400 байт | Да | No | Да | Да | Да | Нет | Нет | Иногда. | Иногда8,9 |
Примечания для предыдущей таблицы:
- ЕслиIndexes не гарантированы стабильной во время перезагрузки, даже если они часто получают то же значение, что и предыдущая загрузка. Поэтому не рекомендуется использовать драйверы, еслиIndex , за исключением случаев, необходимых API.
- Некоторые
netsh
команды принимают илиindex
вifIndex
качестве входных данных. Поэтому некоторые администраторы знакомы со свойством ifIndex , если они часто используютnetsh
команду. - Если компьютер клонирован или изображен, некоторые графические идентификаторы могут совпадать. Кроме того, некоторые специальные сетевые интерфейсы, такие как встроенный интерфейс Teredo, могут иметь одинаковый GUID на всех компьютерах.
- NetCfg применяет, что ifAlias является непустой строкой и является уникальным среди всех сетевых адаптеров. Однако поставщик интерфейса NDIS не поддерживает. Тамерфоре можно найти специальные сетевые интерфейсы с повторяющимися или пустыми именами. Это чаще всего видно с командами LBFO.
- Только если встроенное ПО поддерживает согласованное именование устройств. Типически серверы имеют эту функцию.
- NetCfg назначает уникальный ifDescrs всем сетевым интерфейсам. Однако драйверы могут вызывать API, чтобы изменить значение ifDescr на что-либо, включая то, что не является уникальным. Некоторые сторонние пакеты программного обеспечения делают это.
- Не все типы носителей имеют mac-адрес. Например, некоторые туннели не имеют этой концепции и просто объявляют массив байтов нулевой длины в качестве своего сетевого адреса.
- Присутствует только в сетевых интерфейсах, поддерживаемых устройством PnP. Например, интерфейсы переплета, интерфейсы фильтра с легким весом, интерфейсы, предоставляемые поставщиком интерфейса NDIS, и некоторые специальные встроенные сетевые адаптеры не поддерживают их.
- Только некоторые автобусы PnP поддерживают идентификатор расположения PnP. Встроенные шины PCI и USB выполняются, в то время как корневые перечисляемые устройства не выполняются.
Видимость для разработчиков
В предыдущей таблице все свойства, кроме свойств самонастраивающийся (PnP), отображаются в классических приложениях пользовательского режима и драйверах режима ядра через общий заголовок (Netioapi.h). Свойства PnP отображаются с помощью заголовка Devpkey.h и используются как классическими приложениями пользовательского режима, так и драйверами режима ядра. Например, см . документацию ПО DEVPKEY .
API вспомогательного IP-адреса также доступен как для классических приложений в пользовательском режиме, так и для драйверов режима ядра.
Область API UWP предоставляет только свойство ifGuid напрямую. Однако разработчикам приложений UWP можно импортировать функцию GetIfTable2 с помощью P/Invoke, если они необходимы для доступа к другим свойствам сетевого интерфейса.
См. также
Определения базы сведений об управлении (MIB) для сетевых интерфейсов см. в rfC 2863.
Сведения о сетевых интерфейсах NDIS в сетевых драйверах см. в разделе NDIS Network Interfaces.
Справочник по API Netioapi.h см. в заголовке netioapi.h.