Введение
Техническая спецификация, определяющая поведение программного обеспечения Windows при работе по протоколу TCP/IP.
В вычислительной технике Windows Sockets API (WSA), впоследствии сокращенный до Winsock, — это интерфейс программирования приложений (API), который определяет, как программное обеспечение сетевых приложений Windows должно обращаться к сетевым службам, в частности, к TCP/IP. Он определяет стандартный интерфейс между клиентским приложением Windows, использующим TCP/IP (например, FTP-клиентом или веб-браузером), и базовым стеком протоколов TCP/IP. Терминология основана на API Berkeley sockets, используемом в BSD для организации взаимодействия между программами.
Предыстория
Ранние операционные системы Microsoft, как MS-DOS, так и Microsoft Windows, предлагали ограниченные сетевые возможности, главным образом основанные на NetBIOS. В частности, Microsoft не предоставляла поддержку стека протоколов TCP/IP в то время. Ряд университетских групп и коммерческих поставщиков, включая группу PC/IP в MIT, FTP Software, Sun Microsystems, Ungermann Bass и Excelan, представили продукты TCP/IP для MS-DOS, часто в составе аппаратного и программного комплекта. Когда была выпущена Windows 2.0, к этим поставщикам присоединились другие, такие как Distinct и NetManage, предлагающие TCP/IP для Windows. Недостатком всех этих поставщиков было то, что каждый из них использовал свой собственный API (интерфейс программирования приложений). Без единой стандартной модели программирования было сложно убедить независимых разработчиков программного обеспечения создавать сетевые приложения, которые работали бы с базовой реализацией TCP/IP любого поставщика. К этому добавьте опасения конечных пользователей оказаться привязанными к одному поставщику, и стало ясно, что необходима некоторая стандартизация. Проект Windows Sockets берет свое начало в сессии "Birds Of A Feather", прошедшей на Interop '91 в Сан-Хосе 10 октября 1991 года. Он основан на спецификациях сокетов, созданных NetManage, которые были переданы в общественное достояние на этой встрече. В то время сокет NetManage был единственным 100% DLL-ориентированным, многопоточным продуктом для Windows 3.0. Первое издание спецификации было разработано Мартином Холлом, Марком Товфиком из Microdyne (позже Sun Microsystems), Джеффом Арнольдом из Sun Microsystems, Генри Сандерсом и Дж. Аллардом из Microsoft, при участии многих других. Обсуждались вопросы авторского права, интеллектуальной собственности и потенциальных антимонопольных проблем, а также рассматривалась возможность работы через IETF или создания некоммерческого фонда. В итоге было решено, что спецификация будет просто защищена авторским правом пятью авторами как частными лицами (не связанными между собой). Все участвующие разработчики долгое время сопротивлялись сокращению названия до простого Winsock, поскольку это вызывало путаницу среди пользователей между API и файлом библиотеки DLL (winsock.dll), который предоставлял приложениям только общие интерфейсы WSA. Пользователи часто полагали, что простое наличие файла DLL в системе обеспечит полную поддержку протокола TCP/IP.
Технология
Спецификация Windows Sockets API определяет два интерфейса: API, используемый разработчиками приложений, и SPI, который предоставляет разработчикам сетевого программного обеспечения возможность добавлять новые модули протоколов в систему. Каждый интерфейс представляет собой соглашение. API гарантирует, что соответствующее приложение будет корректно работать с соответствующей реализацией протокола от любого поставщика сетевого программного обеспечения. Соглашение SPI гарантирует, что соответствующий модуль протокола может быть добавлен в Windows и, таким образом, станет доступен для приложений, совместимых с API. Хотя эти соглашения были важны при первом выпуске Windows Sockets, поскольку сетевые среды требовали поддержки нескольких протоколов (см. выше), теперь они представляют лишь академический интерес. В Windows Sockets API версии 2.0 включены функции для использования IPX/SPX, хотя протокол уже практически устарел к моменту выпуска WSA 2.0. Microsoft поставляет стек протоколов TCP/IP со всеми последними версиями Windows, и существенных независимых альтернатив не существует. Также не было значительного интереса к реализации протоколов, отличных от TCP/IP. Код и архитектура Windows Sockets основаны на BSD-сокетах, но предоставляют дополнительную функциональность, позволяющую API соответствовать стандартной модели программирования Windows. API Windows Sockets охватывал почти все возможности API BSD-сокетов, но существовали некоторые неизбежные препятствия, в основном связанные с фундаментальными различиями между Windows и Unix (хотя Windows Sockets отличался от BSD-сокетов меньше, чем последние от STREAMS). Все вызовы функций в API начинаются с префикса, например, для отправки данных через подключенный сокет. Однако одной из целей разработки Windows Sockets было обеспечение относительной простоты переноса сокетных приложений из Unix в Windows. Создание API, полезного только для новых программ Windows, считалось недостаточным. Поэтому Windows Sockets включал ряд элементов, предназначенных для облегчения переноса. Например, приложения Unix могли использовать одну и ту же переменную для регистрации как сетевых ошибок, так и ошибок, обнаруженных в стандартных функциях библиотеки C. Поскольку это было невозможно в Windows, Windows Sockets представил специальную функцию для получения информации об ошибках. Такие механизмы были полезны, но перенос приложений оставался чрезвычайно сложным. Многие оригинальные приложения TCP/IP были реализованы с использованием системных функций, специфичных для Unix, таких как псевдотерминалы и системный вызов fork, и воспроизведение такой функциональности в Windows было проблематичным. В относительно короткий срок перенос уступил место разработке специализированных приложений для Windows.
Технические характеристики
Версия 1.0 (июнь 1992) определила базовую работу Winsock. Она была максимально приближена к существующему интерфейсу сокетов Berkeley для упрощения переноса существующих приложений. Было добавлено несколько расширений, специфичных для Windows, в основном для асинхронных операций с уведомлениями, основанными на сообщениях. Хотя документ не ограничивал поддержку TCP/IP, только TCP и UDP были явно упомянуты как поддерживаемые протоколы. Большинство поставщиков предоставляли только поддержку TCP/IP, хотя Winsock от DEC также включал поддержку DECNet. Версия 1.1 (январь 1993) содержала множество незначительных исправлений и уточнений спецификации. Наиболее значительным изменением было включение функции. Winsock 2 являлся расширением Winsock 1.1 с обратной совместимостью. Он добавил поддержку независимого от протокола разрешения имен, асинхронных операций с уведомлениями, основанными на событиях, и процедурами завершения, многоуровневых реализаций протоколов, многоадресной рассылки (multicasting) и качества обслуживания (QoS). Также была формализована поддержка нескольких протоколов, включая IPX/SPX и DECnet. Новая спецификация позволяла сокетам опционально использоваться совместно между процессами, условно принимать входящие запросы на соединение, а также выполнять определенные операции над группами сокетов, а не над отдельными сокетами. Несмотря на существенные отличия от Winsock 1, новая спецификация обеспечивала совместимость на уровне исходного кода и бинарного кода с API Winsock 1.1. Одним из менее известных дополнений был API интерфейса поставщика услуг (SPI) и поставщики услуг на уровне слоев. Версии 2.0.x (с мая 1994 года) имели статус внутреннего проекта и не были объявлены как публичные стандарты. Версия 2.1.0 (январь 1996) стала первым публичным выпуском спецификации Winsock 2. Версия 2.2.0 (май 1996) включала множество незначительных исправлений, уточнений и рекомендаций по использованию. Она также стала первой версией, отказавшейся от поддержки 16-битных приложений Windows. Версии 2.2.1 (май 1997) и 2.2.2 (август 1997) внесли незначительные улучшения в функциональность. Были добавлены механизмы для запроса и получения уведомлений об изменениях в конфигурации сети и системы. В техническом превью IPv6 для Windows 2000 (декабрь 2000) была впервые реализована RFC 2553 (март 1999, позже заменена RFC 3493), API для разрешения имен, независимый от протокола, который впоследствии стал частью Winsock в Windows XP.
Обновления в Windows 8
Windows 8 включает расширения "RIO" (Registered IO) для Winsock. Эти расширения разработаны для снижения накладных расходов, связанных с переходом из пользовательского режима в режим ядра для пути передачи сетевых данных и пути уведомлений, при этом используется остальная часть стандартного стека TCP и UDP Windows (и существующие сетевые карты). Процесс настройки (например, функция "connect") остается без изменений по сравнению со стандартным путем Winsock.
Реализации Microsoft
Microsoft не поставляла реализацию Winsock 1.0. Версия 1.1 Winsock была включена в дополнительный пакет (под названием Wolverine) для Windows для рабочих групп (с кодовым названием Snowball). Она являлась неотъемлемым компонентом Windows 95 и Windows NT, начиная с версии 3.5 (первоначальная коммерчески доступная версия Windows NT, версия 3.1, включала только проприетарную и довольно неполную реализацию TCP/IP на основе API AT&T UNIX System V "STREAMS"). Версия 2.1 Winsock была включена в дополнительный пакет для Windows 95. Она являлась неотъемлемой частью Windows 98, Windows NT 4.0 и всех последующих версий Windows. (Microsoft не поставляла реализации Winsock 2 для Windows 3.x или Windows NT 3.x.) Новейшие версии Winsock 2.x поставлялись с новыми выпусками Windows или в составе пакетов обновлений. Winsock 2 расширяется с помощью механизма, известного как Layered Service Provider (LSP). Winsock LSP доступны для широкого спектра полезных целей, включая родительский контроль в Интернете, фильтрацию веб-контента, QoS и т. д. Порядок слоев всех провайдеров хранится в каталоге Winsock. В предыдущих версиях Windows удаление некорректно работающего LSP могло привести к повреждению каталога Winsock в реестре, что потенциально могло привести к потере всей сетевой связности. Winsock в Windows XP Service Pack 2, Windows Server 2003 Service Pack 1 и всех последующих операционных системах Windows обладает способностью к самовосстановлению после удаления пользователем такого LSP.
Другие варианты реализации
Среди других поставщиков, предлагавших Winsock-совместимые стеки TCP/IP и UDP/IP, были (в алфавитном порядке) 3Com, Beame & Whiteside, DEC, Distinct, Frontier, FTP Software, IBM, Microdyne, NetManage, Novell, Sun Microsystems и Trumpet Software International. Trumpet Winsock, разработанный Питером Таттамом, была одной из немногих реализаций Winsock 1.0, которые можно было установить под Windows 3.0, не имевшей встроенной поддержки Winsock. Trumpet также была самой популярной shareware-реализацией Winsock для Windows 3.x. Trumpet Winsock 5.0 доступна для Windows 95/98 и Windows NT и включает в себя стек IPv6, соответствующий Winsock 1.1, для этих операционных систем. Проект Wine содержит исходную и двоично-совместимую повторную реализацию Winsock на основе BSD API сокетов.