Network driver interface specification что это

Обновлено: 02.07.2024

Спецификация интерфейса сетевого драйвера (в англоязычной среде NDIS — англ. Network Driver Interface Specification) [1] – это интерфейс прикладного программирования (API) для сетевых интерфейсных плат (NIC).

Он был совместно разработан Microsoft и 3Com Corporation и в основном используется в Microsoft Windows. Однако проекты оболочки NDISwrapper с открытым исходным кодом и Project Evil с открытым исходным кодом позволяют использовать многие совместимые с NDIS сетевые адаптеры для Linux, FreeBSD и NetBSD, а Magnussoft ZETA, производная от BeOS, поддерживает несколько драйверов NDIS.

NDIS формирует подуровень управления логическим каналом (LLC), который является верхним подуровнем уровня канала передачи данных OSI (уровень 2). Таким образом, NDIS выступает в качестве интерфейса между подуровнем управления доступом к среде передачи (MAC), который является нижним подуровнем уровня канала передачи данных, и сетевым уровнем (уровень 3).

NDIS представляет собой библиотеку функций, часто называемую «оболочкой», которая скрывает базовую сложность аппаратного обеспечения NIC и служит стандартным интерфейсом для драйверов сетевого уровня 3 и драйверов MAC уровня оборудования. Другим распространенным LLC является Open Data-Link Interface (ODI).

NDIS. Введение

Собственно, как и обещал, начинаю цикл статей о подсистеме NDIS и о том, что с ней связано. Решил связать его с процессом собственного обучения на своей первой работе. Если цикла не получится, значит меня загрузили по самые уши, или вообще уволился.

Вступление

Для чего, вообще этот NDIS? Зачем его придумали, если и всё и так хорошо?

NDIS — это одна из подсистем ядра Windows, которая имеет прямое отношение к спектру начиная от драйверов сетевых карт и заканчивая интерфейсами для протоколов сетевого уровня. NDIS состоит из т.н. стека драйверов (хотя, как по мне, так это никакой не стек, а очередь), но для общего понимания лучше представлять себе это так:

image

Хорошо, но мне этого мало!
  • Драйвер должен себя зарегистрировать. Это означает то, что драйвер при загрузке указывает ядру, чтО он есть на самом деле и какого он типа;
  • Драйвер должен предоставлять минимальный набор интерфейсных функций, которые он предоставляет NDIS'у. Собственно, за эти функции NDIS и будет тягать этот самый драйвер;
  • Так же драйвер дожен, в зависимости от своего типа, реализовать функции управления собой, которые так же тягаются во время выполнения. Отличие от предыдущего пункта в том, что эти функции для каждого типа драйвера уникальные.
  • Драйверы минипорта;
  • Драйверы протокола;
  • Промежуточные драйверы;
  • Драйверы-фильтры.

Зачастую на практике пишутся драйверы-фильтры и промежуточные драйверы, т.к. в остальных потребность есть у небольшого круга компаний выпускающих собственные сетевые решения. Во времена XP разработчики часто использовали промежуточные драйверы (потому, что фильтров не было), начиная с Windows Vista лучше использовать фильтры, т.к. они проще в своём устройстве и основную функцию (а для нас это практически во всех случаях — модификация трафика) выполняют «на ура». Итак, как мы помним, «сверху» NDIS'a у нас протоколы (IP, IPX, ARP, RARP, etc.), а снизу сетевые карты. На этом промежутке мы будем выполнять свои магические заклинания над трафиком.

Разберемся с тем, чем именно отличаются драйверы-фильтры и промежуточные драйверы. Итак, когда трафик движется в сеть, т.е. от протокола к сетевой карте, он проходит через очередь пользовательских драйверов, которую сформировал NDIS. В самой середине этой очередь (честно, не знаю как найти середину, если в очереди 3 драйвера, однако с MSDN'ом не поспоришь) NDIS располагает промежуточные драйвера. Эти драйверы выстраиваются в свою очередь по неизвестному алгоритму, однако NDIS гарантирует, что трафик пройдёт через каждый драйвер в «стеке». Промежуточный драйвер представляет собой обманку, «сверху», т.е. для драйверов, которые располагаются над ним, он выглядит как минипорт (хотя настоящие минипорты еще далеко внизу), а «снизу» выглядит как протокол (протоколы далеко вверху). Т.о. промежуточный драйвер является прозрачным, и зачастую его используют не для фильтрации или модификации трафика, а для «рассылки» трафика одного протокола нескольким минипортам (они же интерфейсы сетевых карт). Ну, или, наоборот: рассылки трафика сетевой карты по нескольким протоколам.

  • Драйвер-монитор, не подвергает трафик изменению, но может его «воровать»;
  • Драйвер-модификатор, полный контроль над трафиком, меняй, удаляй, добавляй своё — что угодно.

Из названия понятно какая между ними разница, однако стоит отметить, что при установке оба драйвера устанавливаются и «работают» нормально. Т.е. если вы написали функции слежения, то трафик вы увидите. Однако, драйвер-модификатор в некоторых случаях потребует перезагрузки. Если перезагрузки не будет, то мониторить трафик вы сможете, а, допустим, ронять пакеты — нет. Функциональная особенность.

Теперь разберемся с местом драйверов-фильтров в очереди. Положение в очереди определяется назначением драйвера. Назначение драйвера (обычное назначение, т.е. для чего этот драйвер используется) устанавливается на этапе установки в его .INF файле. Полный список назначений я не приведу, но примерно картину обрисую. Допустим драйвер предназначается для сжатия трафика, для этого мы в .INF файле укажем «compression», так же есть назначение «encryption», ну или «Custom».

Тут можно ознакомиться со всем списком. Скажу так же, что custom — самые нижележащие драйверы, а, например, scheduler — самые «верхние».

Содержание

Краткий обзор драйверов спецификации NDIS

Сетевые драйверы можно разделить на 2 категории: TDI-драйверы (Transport Driver Interface) и NDIS-драйверы (Network Driver Interface Specification). TDI-драйверы — это высокоуровневые драйверы, например, SMB-клиент, SMB-сервер, обертки SMB (NFFS, MSFS) и т.п. Мы с Вами рассмотрим NDIS-драйвера. NDIS — это специальный драйвер (ему соответствует файл ndis.sys), который содержит функции, используемые низкоуровневыми сетевыми драйверами. NDIS как бы обволакивает низкоуровневые сетевые драйверы и является посредником в их общении между собой и с железом. По сути NDIS можно считать третьим ядром Windows. Чтобы более четко уяснить себе что из себя представляет NDIS можно посмтореть на следующую картинку:

  • Минипорт-драйверы (драйверы адаптера)
  • Промежуточные драйверы (например, psched.sys)
  • Драйверы протокола (например, tcpip.sys)
Минипорт-драйверы
  • производит инициализацию своего устройства (адаптера)
  • создание /включение/выключение/удаление сетевых подключений
  • выдача клиенту или изменение параметров адаптера
  • отправка пакетов
  • получение пакетов
  • оповещение ОС о состоянии адаптера
  • перезагрузка и остановка адаптера

Минипорт-драйверы бывают «Connectionless» (например, драйвер Ethernet-адаптера) и «Сonnection-oriented» (например, драйвер модема). У Сonnection-oriented драйверов система коллбэков чуть сложнее, в нее входят обработчики событий, связанных с подключением к каналу связи, отключением от канала, выбором канала (для беспроводных адаптеров) и т.п. Для некоторых операций Сonnection-oriented драйверы вызывают специальные функции NDIS, отличающиеся префиксом «Со» в имени (например, вместо NdisMIndicateReceivePacket Сonnection-oriented драйвер должен вызывать NdisMColndicateReceivePacket).

Каждый коллбэк выполняет свою задачу: выдача информации, отправка данных, прием данных и т.п. Подробнее можно посмотреть в хелпе к WDK (DDK). Там можно получить полную информацию о коллбэках.

Драйверы протоколов могут передоверять минипорт-драйверу (при условии, что минипорт-драйвер это умеет — либо сам, либо адаптер умеет это делать на аппаратном уровне) некоторые свои функции (например, разграничить контрольную сумму или цифровую подпись IP-пакета или принять решение, как фрагментировать большой ТСP-пакет). Это значительно повышает производитель сети.

  1. LBFO (Load Balancing and Fail Over) — позволяет понимающим его адаптерам распределять между собой исходящий трафик и исправлять ошибки друг друга. Впрочем, что имеет смысл только на backbone routers (центральных маршрутизаторах больших сетей), на которые редко ставят Windows
  2. FFP (Fast Forwarding Path) — позволяет понимающим его адаптерам маршрутизировать/фильтровать пакеты чисто аппаратно, вообще без участия ОС и не нагружая основные процессоры компьютера
Промежуточные драйверы

Промежуточный драйвер сверху виден как минипорт-драйвер (смотрим на картинку), т.е. как бы виртуальный адаптер, а снизу — как драйвер протокола (снова смотрим на картинку), как бы виртуальный протокол. Как частный случай, возможна ситуация, когда промежуточный драйвер виден только сверху.

  • организуют «справедливый» доступ разных клиентских программ к адаптерам дабы программы не мешали друг другу
  • фильтруют и перехватывают трафик
  • маршрутизируют пакеты из одной сети в другую, если эти сети различаются (например, Ethernet и WI-FI)
Драйверы протоколов

Драйверы протокола — это самый верхний уровень спецификации NDIS. Эти драйверы занимаются тем, что выделяют ресурсы для соответствующих пакетов, копируют данные приложений в пакеты и передают их драйверам нижнего уровня. Также драйверы протоколов обеспечивают интерфейс для получения пакетов от нижележащих драйверов.

К драйверам протоколов относятся и драйверы транспорта, реализующие стек сетевых протоколов, такой как например TCP/IP (tspip.sys).

Если пост будет интересен читателям, то в следующих постах можно конкретно на примере написать свой сниферо-подобный промежуточный драйвер или также описать как написать каждый из типов драйверов (минипорта, промежуточный или протокола).

Сетевые драйверы

NDIS-драйверы бывают трёх типов [2] :

  • Минипорт-драйверы
  • Промежуточные драйверы
  • Драйверы протокола

Минипорт-драйверы

У каждой сетевой железки есть свой минипорт-драйвер. Через NDIS минипорт-драйвер получает некоторые команды. Функции минипорт-драйвера можно описать следующим образом:

  • производит инициализацию своего устройства (адаптера)
  • создание/включение/выключение/удаление сетевых подключений
  • выдача клиенту или изменение параметров адаптера
  • отправка пакетов
  • получение пакетов
  • оповещение ОС о состоянии адаптера
  • перезагрузка и остановка адаптера

Минипорт-драйвер содержит 22 стандартные callback-функции, с помощью которых он оповещает о различных событиях (некоторые из этих функций могут быть NULL, тогда драйвер о соответствующих событиях не оповещается). NDIS экспортирует около 150 функций для использования минипорт-драйверами.

Минипорт-драйверы бывают «Connectionless» (например, драйвер Ethernet-адаптера) и «Сonnection-oriented» (например, драйвер модема). У Сonnection-oriented драйверов система callback’ов чуть сложнее, в нее входят обработчики событий, связанных с подключением к каналу связи, отключением от канала, выбором канала (для беспроводных адаптеров) и т.п. Для некоторых операций Сonnection-oriented драйверы вызывают специальные функции NDIS, отличающиеся префиксом «Со» в имени (например, вместо NdisMIndicateReceivePacket Сonnection-oriented драйвер должен вызывать NdisMColndicateReceivePacket). Каждый callback выполняет свою задачу: выдача информации, отправка данных, прием данных и т.п. Подробнее можно посмотреть в help’е к WDK (DDK). Там можно получить полную информацию о callback’ах.

Драйверы протоколов могут передоверять минипорт-драйверу (при условии, что минипорт-драйвер это умеет — либо сам, либо адаптер умеет это делать на аппаратном уровне) некоторые свои функции (например, разграничить контрольную сумму или цифровую подпись IP-пакета или принять решение, как фрагментировать большой TCP-пакет). Это значительно повышает производительность сети.

Один минипорт может быть связан с одним или несколькими протоколами. Это означает, что трафик, поступающий в минипорт, может быть принят параллельно несколькими драйверами протоколов. Например, Winpcap добавляет второй драйвер протокола в выбранный минипорт, чтобы захватить входящие пакеты. Кроме того, можно смоделировать несколько виртуальных сетевых адаптеров, реализуя виртуальные драйверы минипорта, которые отправляют и получают трафик от одного физического сетевого адаптера. Одним из примеров использования виртуальных мини-портов является добавление виртуальных сетевых адаптеров, каждый из которых имеет свою виртуальную локальную сеть. Поскольку реализации не могут предположить, что другие драйверы получили одни и те же буферы, необходимо обрабатывать входящие буферы только для чтения, а драйвер, который изменяет содержимое пакета, должен выделять свои собственные буферы.

Промежуточные драйверы

Промежуточные драйверы располагаются между слоями MAC и IP и могут контролировать весь трафик, принимаемый NIC. На практике промежуточные драйверы реализуют как минипорт-драйвер, так и драйвер протокола. Драйвер минипорта и драйвер протокола фактически взаимодействуют с соответствующими минипортами и протокольными интерфейсами, которые находятся в промежуточном драйвере. Эта конструкция позволяет добавлять несколько промежуточных драйверов между драйверами минипорта и протокола. Поэтому поставщики драйверов не могут предположить, что интерфейс, на который они отправляют трафик, реализуется последним драйвером в цепочке. Для написания приложений с использованием NDIS можно использовать образцы, которые входят в комплект Windows Driver Kit (WDK) Microsoft. Образец «PassThru» является хорошей отправной точкой для промежуточных драйверов, поскольку он реализует все необходимые детали, требуемые в этом типе драйверов, но просто передает трафик к следующему драйверу в цепочке.

Драйверы протоколов

Драйверы протокола — это самый верхний уровень спецификации NDIS. Эти драйверы занимаются тем, что выделяют ресурсы для соответствующих пакетов, копируют данные приложений в пакеты и передают их драйверам нижнего уровня. Также драйверы протоколов обеспечивают интерфейс для получения пакетов от нижележащих драйверов. К драйверам протоколов относятся и драйверы транспорта, реализующие стек сетевых протоколов, такой как например TCP/IP.

Технические характеристики

Он был разработан совместно Microsoft и 3Com Corporation и в основном используется в Microsoft Windows . Однако проекты оболочки NDISwrapper и Project Evil с открытым исходным кодом позволяют использовать многие NDIS-совместимые сетевые адаптеры с Linux , FreeBSD и NetBSD . magnussoft ZETA , производная от BeOS , поддерживает ряд драйверов NDIS.

NDIS формирует подуровень управления логическим каналом (LLC), который является верхним подуровнем канального уровня OSI (уровень 2). Следовательно, NDIS действует как интерфейс между подуровнем управления доступом к среде передачи (MAC), который является нижним подуровнем уровня канала данных, и сетевым уровнем (уровень 3).

NDIS - это библиотека функций, которую часто называют « оболочкой », которая скрывает базовую сложность оборудования NIC и служит стандартным интерфейсом для драйверов сетевого протокола уровня 3 и драйверов MAC уровня оборудования.

Версии NDIS, поддерживаемые различными версиями Windows, следующие:

  • NDIS 2.0: MS-DOS , Windows для рабочих групп 3.1 , OS / 2
  • NDIS 3.0: Windows для рабочих групп 3.11
  • NDIS 3.1: Windows 95
  • NDIS 4.0: Windows 95 OSR2, NT 4.0 , Windows CE 3.0
  • NDIS 4.1: Windows 98
  • NDIS 5.0: Windows 98 SE , Me , 2000
  • NDIS 5.1: Windows XP , Server 2003 , Windows CE 4.x, 5.0, 6.0
  • NDIS 5.2: Windows Server 2003 с пакетом обновления 2 (SP2)
  • NDIS 6.0: Windows Vista
  • NDIS 6.1: Windows Vista с пакетом обновления 1 (SP1), Server 2008 , Windows Embedded Compact 7 , Windows Embedded Compact 2013
  • NDIS 6.20: Windows 7 , Server 2008 R2
  • NDIS 6.30: Windows 8 , Windows Server 2012
  • NDIS 6.40: Windows 8.1 , Windows Server 2012 R2
  • NDIS 6.50: Windows 10 , версия 1507
  • NDIS 6.60: Windows 10 версии 1607 и Windows Server 2016
  • NDIS 6.70: Windows 10, версия 1703
  • NDIS 6.80: Windows 10, версия 1709
  • NDIS 6.81: Windows 10, версия 1803
  • NDIS 6.82: Windows 10 версии 1809 и Windows Server 2019
  • NDIS 6.83: Windows 10, версия 1903

Трафик, принимаемый сетевым адаптером, управляется драйвером минипорта NDIS, в то время как различные протоколы, такие как TCP / IP , реализуются драйверами протокола NDIS. Один минипорт может быть связан с одним или несколькими протоколами. Это означает, что трафик, поступающий в минипорт, может быть получен параллельно несколькими драйверами протокола. Например, Winpcap добавляет второй драйвер протокола на выбранный минипорт для захвата входящих пакетов. Кроме того, можно смоделировать несколько виртуальных сетевых адаптеров, реализовав драйверы виртуального минипорта, которые отправляют и получают трафик от одного физического сетевого адаптера. Одним из примеров использования драйвера виртуального минипорта является добавление виртуальных сетевых адаптеров, каждая из которых имеет свою виртуальную локальную сеть . Поскольку реализации не могут предполагать, что другие драйверы получили те же буферы, нужно рассматривать входящие буферы как только для чтения, а драйвер, изменяющий содержимое пакета, должен выделять свои собственные буферы.

Драйверы NDIS Miniport также могут использовать интерфейсы модели драйверов Windows для управления сетевым оборудованием.

Другой тип драйвера - это промежуточный драйвер NDIS. Промежуточные драйверы находятся между уровнями MAC и IP и могут контролировать весь трафик, принимаемый сетевым адаптером. На практике промежуточные драйверы реализуют интерфейсы как минипорта, так и протокола. Драйвер минипорта и драйвер протокола фактически обмениваются данными с соответствующими интерфейсами минипорта и протокола, которые находятся в промежуточном драйвере. Эта конструкция позволяет добавлять несколько связанных промежуточных драйверов между драйверами минипорта и протокола. Поэтому производители драйверов не могут предполагать, что интерфейс, на который они отправляют трафик, реализован последним драйвером в цепочке. Для написания приложений с использованием NDIS можно использовать образцы, которые прилагаются к Microsoft Windows Driver Kit (WDK). Пример «PassThru» является хорошей отправной точкой для промежуточных драйверов, поскольку он реализует все необходимые детали, требуемые для этого типа драйвера, но просто передает трафик следующему драйверу в цепочке.

Версии

Список версий NDIS, поддерживаемых различными версиями Windows, выглядит следующим образом:

  • NDIS 2.0: MS-DOS, Windows for Workgroups 3.1, OS/2
  • NDIS 3.0: Windows for Workgroups 3.11
  • NDIS 3.1: Windows 95
  • NDIS 4.0: Windows 95 OSR2, NT 4.0, Windows CE 3.0
  • NDIS 5.0: Windows 98, Windows 98 SE, Me, 2000
  • NDIS 5.1: Windows XP, Server 2003, Windows CE 4.x, 5.0, 6.0
  • NDIS 5.2: Windows Server 2003 SP2
  • NDIS 6.0: Windows Vista
  • NDIS 6.1: Windows Vista SP1, Server 2008, Windows Embedded Compact 7, Embedded Compact 2013
  • NDIS 6.20: Windows 7, Server 2008 R2
  • NDIS 6.30: Windows 8, Windows Server 2012
  • NDIS 6.40: Windows 8.1, Windows Server 2012 R2
  • NDIS 6.50: Windows 10
  • NDIS 6.60: Windows Server 2016

Спецификация интерфейса сетевого драйвера - Network Driver Interface Specification

Network Driver Interface Specification ( NDIS ) представляет собой интерфейс прикладного программирования (API) для контроллеров сетевого интерфейса (NIC).

СОДЕРЖАНИЕ

Читайте также: