Интерфейс TDI
Windows NT предоставляет для взаимосвязи между транспортными
драйверами и TDI-клиентами уровня ядра, такими как эмуляторы сетевых интерфейсов,
редиректоры, серверы, единый программный интерфейс, называемый
интерфейсом транспортных драйверов (Transport Driver Interface,
TDI).
Изначально этот интерфейс планировалось использовать в пользовательском
режиме работы ОС. В окончательном варианте интерфейс стал работать в режиме
ядра, однако все еще может быть использован напрямую из пользовательского
уровня. TDI предоставляется верхней частью любого транспортного стека
протоколов Windows NT. TDI обеспечивает независимость TDI-клиентов от
используемых ими транспортов. TDI поддерживает передачу как с установлением
постоянного сеанса (виртуальная цепь), так и без него (датаграммы).
Требование, чтобы все драйверы транспорта предоставляли единый общий интерфейс
TDI, облегчает задачу их разработки, а также разработки TDI-клиентов,
потому что только этот интерфейс необходимо запрограммировать.
Так как TDI является относительно новым сетевым интерфейсом, и большинство
приложений разработаны для использования других существующих стандартных
интерфейсов, таких как NetBIOS и WinSockets, то Windows NT включает эмуляторы
для этих двух популярных интерфейсов. Части уровня ядра этих эмуляторов,
являющиеся драйверами файловых систем, отображают родные функции с соответствующими
параметрами в одну или несколько TDI-функций, а затем вызывают соответствующие
драйверы транспортов через TDI.
Интерфейс TDI включает следующее:
- 1. Множество стандартных диспетчерских точек входа, обеспечиваемых
транспортным драйвером, к которому TDI-клиент может обратиться с запросом
ввода/вывода.
2. Множество процедур обратного вызова, экспортируемых любым TDI-клиентом
и регистрируемых транспортным драйвером, для получения TDI-клиентом
уведомления о произошедшем сетевом событии.
3. Параметры, структуры, lOCTLs и правила, ассоциированные с процедурами
транспорта и его клиента.
4. Множество функций вида TdiXxx, которые транспорт и его клиент могут
вызывать для взаимодействия друг с другом.
5. Множество макросов и функций вида TdiBuildXxx, которые TDI-клиент
может использовать, чтобы обеспечить принятие запросов нижележащим транспортом.
Программная модель TDI очень похожа на модель Winsocket.
TDI-клиенты реализуют следующие шаги для установления соединения с удаленным
сервером:
- 1. TDI-клиент формирует пакет TDIIRP типа address open
для размещения адреса. TDI-транспорт возвращает файловый объект, известный
как объект-адрес, представляющий адрес. Этот шаг эквивалентен использованию
функции bind в Winsocket.
2. TDI-клиент размещает и формирует пакет TDI IRP типа connection open,
и TDI-транспорт возвращает файловый объект, известный как объект-соединение,
представляющий соединение. Этот шаг эквивалентен использованию функции
socket в Winsocket.
3. TDI-клиент ассоциирует объект-соединение с объектом-адресом с помощью
пакета TDI IRP типа associate address.
4. TDI-клиент, принимающий удаленное соединение, выпускает TDI IRP пакет
типа listen, определяющий число соединений, поддерживаемых для объекта-соединения,
и затем выпускает пакет TDI IRP типа accept, который завершается, когда
удаленная система установит соединение. Эта операция эквивалентна использованию
функций listen и accept в Winsocket.
5. TDI-клиент, который хочет установить соединение с удаленным сервером,
выпускает TDI IRP пакет типа connect, определяя объект-соединение, который
TDI-транспорт завершает, когда установится соединение. Выпуск TDI IRP
пакета типа connect эквивалентно использованию функции connect в Winsocket.
|