Множество Winsock’ов ставит администраторов в тупик

ТехниЧеский обзор Теоретически стандарт Winsock выглядит прекрасно, но на практике он все еще требует некоторой доработки, особенно в том, что касается контроля модификаций

 

Любой администратор сети TCP/IP или NetWare с клиентами под Windows подтвердит, что интерфейс Windows Sockets может оказаться совершенно неуправляемым.

 

Стандарт, известный под именем Winsock, предназначен для того, чтобы приложения Windows и коммуникаций могли взаимодействовать независимо от того, кто написал данное приложение или коммуникационные протоколы. По крайней мере теоретически “Winsock-совместимые” приложения Windows могут использовать интерфейс Winsock для взаимодействия со стеком почти любого базового сетевого коммуникационного протокола.

 

Однако, как ежедневно убеждаются сетевые администраторы, шансы, что все произойдет безо всяких проблем, весьма невелики. Суть проблемы с Winsock  -  в его многоликости. Хотя Winsock  -  это стандарт, его элементы могут интерпретироваться по-разному. Разные поставщики предложили различные варианты, каждый из которых порождает свой собственный файл WINSOCK.DLL, а он может работать только со стеками протоколов определенных поставщиков. В результате жесткий диск пользователя может оказаться забитым файлами WINSOCK.DLL, каждый из которых работает только с определенными программами. Попытка воспользоваться “чужим” файлом WINSOCK.DLL может привести к непредсказуемым последствиям.

 

WINSOCK 2

Что может сделать администратор сети? Версия Winsock 2.0, которую, как ожидается, разработчики получат этим летом, наконец смягчит эту проблему, поскольку в нее будут включены расширения теперешней версии, созданные различными поставщиками, а сам стандарт станет более жестким. А пока лучшая стратегия “защиты” заключается в том, чтобы хорошо понять структуру Winsock, выяснить, каким поставщиком был создан стек протокола, который вы используете (или должны использовать), и аккуратно отследить расположение разных версий winsock.dll.

 

Теория и практика

 

Несомненно, Winsock  -  мощная концепция. Первоначально был создан API (интерфейс прикладного программирования) для работы в качестве связующего звена между приложениями Windows и коммуникационными протоколами TCP/IP, но Winsock не ограничивается протоколом TCP/IP. Он также работает с протоколами NetWare, NetBEUI, DECnet, SLIP (протокол интерфейса последовательной линии) и PPP (“точка - точка”), а также, предположительно, со многими другими протоколами сетевого и канального уровней, если кто-нибудь напишет подходящую DLL (динамически подключаемую библиотеку) Winsock.

 

Winsock API  -  это набор программных обращений к DLL Windows Socket, то есть к программе WINSOCK.DLL. WINSOCK.DLL обращается к стеку определенного коммуникационного протокола. Для приложений Internet или Windows NT  -  это TCP/IP, но с тем же успехом это мог бы быть и IPX/SPX фирмы Novell. Приложения Windows считаются “Winsock-совместимыми”, если они используют Winsock API (большинство приложений так и делают) для обращения к базовому сетевому коммуникационному интерфейсу. Стек сетевого протокола, который уровнем ниже Winsock, может, в свою очередь, использовать пакетный драйвер, NDIS (спецификация интерфейса сетевых устройств) корпорации 3Com или ODI (открытый интерфейс связи) фирмы Novell для “привязки” протокола к сетевой плате. В другом варианте данные могут передаваться на модем через последовательный порт; при этом для подготовки трафика TCP/IP к передаче на другой хост-компьютер Internet по последовательной линии используется протокол SLIP или PPP.

 

Однако спецификация Windows Sockets определяет только верхний уровень интерфейса winsock.dll. Другими словами, она описывает, как “Winsock-совместимое” приложение должно вызывать библиотеку DLL Winsock. Спецификация Windows Sockets не определяет, как файл WINSOCK.DLL должен взаимодействовать со стеком базового протокола. Таким образом, разные протоколы по-разному взаимодействуют с WINSOCK.DLL, причем эти протоколы могут иметь различные реализации, даже если они относятся к таким “стандартным” протоколам, как TCP/IP.

 

Поскольку создатели протоколов по-разному реализуют стандарт TCP/ IP, каждому поставщику нужен уникальный файл WINSOCK. DLL, который бы выполнял вызовы API для определенной реализации протокола TCP/IP. Именно эти различия в интерпретации и реализации ответственны за различия файлов WINSOCK.DLL. Некоторые версии WINSOCK.DLL привносят небольшие расширения стандарта, а некоторые  -  ограничивают его, так что отдельные функции оказываются не полностью доступными.

 

Сама корпорация Microsoft создала несколько собственных расширений стандарта Winsock 1.1. Например, продукт PowerPoint for Windows 95 содержит функцию, которая может передавать широковещательные сообщения другим компьютерам. PowerPoint делает это с помощью специального вызова API Winsock, реализованного корпорацией Microsoft.

 

Однако, поскольку это частное расширение стандарта Winsock 1.1, некоторые файлы WINSOCK32.DLL могут его не понимать и вызывать сбой приложения.

Какой Winsock?

 

Сетевым администраторам вся эта путаница приносит не только несовместимость. Поделимся своим собственным горьким опытом, связанным с “Winsock-совместимостью”. Мы загрузили на ПК под Windows for Workgroups 3.11 корпорации Microsoft продукт Internet Office Professional фирмы Spry  -  набор всех инструментов для Internet, которые могут в принципе понадобиться, плюс стек протокола TCP/IP.

 

На этот ПК уже были загружены две версии стека TCP/IP  -  для Windows for Workgroups корпорации Microsoft и TCP/IP-стек Trumpet Winsock фирмы Peter Tattum Pty. (Тасмания, Австралия), а также ряд “Winsock-совместимых” приложений с прилагаемыми файлами WINSOCK.DLL, которые все хорошо работали.

 

Вместо того чтобы попросить Internet Office переустановить TCP/IP-стек корпорации Microsoft, прилагаемый на инсталляционных дискетах продукта Spry, мы указали программе, что ей надлежит использовать стек, уже имеющийся на ПК.

 

Поскольку на машине уже был файл WINSOCK.DLL (на самом деле их было три, не говоря о весьма таинственных файлах под названием WINSOCK.PPP и WINSOCK.LAN, которые создал Internet Office), такое решение показалось нам достаточно обоснованным. При уже установленном работающем TCP/IP-стеке и правильном файле WINSOCK.DLL не должно было возникнуть никаких проблем. Однако работа программ не была безупречной.

 

Из нескольких приложений, включенных в пакет Internet Office, просмотрщик Web Spry Mosaic работал, а AirDialer, обеспечивающий доступ к поставщикам услуг Internet по коммутируемым линиям, работать отказался, поскольку ему не понравилась ни одна из установленных версий файла WINSOCK.DLL.

 

В чем проблема, если выбрать можно из множества файлов WINSOCK.DLL? После дополнительного разбирательства мы обнаружили программу Switcher из пакета Internet Office; это утилита для идентификации различных версий WINSOCK.DLL и копирования на место библиотеки c:windows winsock.dll файла, подходящего для используемого в данный момент приложения из пакета Internet Office. Она и создала файлы WINSOCK.LAN и WINSOCK.PPP; это были копии разных “кандидатов” на роль WINSOCK.DLL, которые утилита Switcher разместила в каталоге c:windows.

 

Фирма Spry включила в пакет Internet Office около 20 приложений нескольких поставщиков, поэтому вполне понятно, что приложениям могли быть нужны разные файлы WINSOCK.DLL, хотя большинство из них хотели использовать WINSOCK.DLL корпорации Microsoft.

 

Но добавлять новые версии к уже имеющимся файлам WINSOCK.DLL  -  это уже перебор. Мы решили эту проблему так: переименовали все версии этого файла, запустили инсталляционную программу заново и позволили продукту Spry установить устраивающий ее WINSOCK.DLL. Теперь Internet Office и различные файлы WINSOCK.DLL работают, но нет никакой гарантии, что другие “Winsock-совместимые” приложения от этого не пострадали.

 

Ключ к решению проблемы правильного применения Winsock  -  в том, чтобы обеспечить использование стека протокола, необходимого данному приложению, и файла WINSOCK.DLL, также соответствующего приложению. Убедитесь, что в INI-файлах, используемых приложениями Windows, указаны правильные версии WINSOCK.DLL, и включите каталоги этих файлов в переменную окружения PATH вашей системы. Большинство приложений ищут файл WINSOCK. DLL в каталоге c:windows, но некоторые программы могут предполагать, что он находится в другом месте.

 

В качестве общего эмпирического правила разумно разрешать программам использовать подкаталоги и файлы WINSOCK.DLL, заданные по умолчанию и поставляемые в комплекте с приложениями. Если после инсталляции вы не можете определить, какой WINSOCK.DLL нужен для данного приложения, обратитесь к поставщику ПО или испробуйте все имеющиеся у вас версии.

 

Будущее Winsock

 

Скоро совместимость с Winsock может стать менее проблематичной. Этим летом ожидается выпуск версии 2.0 спецификации Windows Sockets, хотя после этого пройдет некоторое время, прежде чем “Winsock 2-совместимые” приложения и стеки протоколов проложат себе дорогу на рынок. Помимо пересмотра разных частей стандарта Winsock и обеспечения совместимости сверху вниз с версией Winsock 1.1, в Winsock 2.0 был включен в дополнение к теперешним Winsock API и DLL третий компонент  -  Winsock SPI (Service Provider Interface  -  интерфейс поставщика услуг). SPI призван устранить проблемы, порождаемые специфическими для определенных протоколов модулями DLL за счет того, что к стекам протоколов TCP/IP и IPX/SPX можно будет одновременно обращаться через API Winsock 2.

 

SPI будет также поддерживать новые сетевые технологии, такие, как беспроводные, ATM- и ISDN-сети, а также запросы к службам наименования DNS и X.500. Например, “Winsock 2-совместимые” приложения будут “уметь” вызывать API для дешифровки запроса к DNS (система доменных имен), а также инициировать передачу файлов или HTTP-соединений с серверами World-Wide Web через базовый TCP/IP-стек.

 

Для поддержки “беспроводных” и мультимедийных приложений в Winsock 2 также включена функция гарантированного качества сервиса QoS (Quality of Service). Она гарантирует мультимедийному приложению минимальную скорость передачи данных. Для беспроводных коммуникаций QoS будет уведомлять приложение в случае временного или спорадического отключения сети.

 

Одна из задач Winsock 2  -  включить многие созданные корпорацией Microsoft расширения стандарта Winsock 1.1 в спецификацию Winsock 2, которая будет поддерживать специфические для поставщика расширения такого типа, но они будут четко отличаться от стандартных вызовов Winsock 2.

 

         Уильям Датчер

Скоро подоспеет подмога

 

Скоро совместимость с Winsock может стать менее проблематичной. Этим летом ожидается выпуск версии 2.0

 

Игра в лото

 

Ключ к решению проблемы правильного применения Winsock  -  в том, чтобы обеспечить использование стека протокола, необходимого данному приложению