В вычислительной технике Windows Sockets API ( WSA ) , позже сокращенный до Winsock , представляет собой интерфейс прикладного программирования (API), который определяет, как сетевое прикладное программное обеспечение Windows должно получать доступ к сетевым службам, особенно TCP/IP . Он определяет стандартный интерфейс между клиентским приложением Windows TCP/IP (таким как клиент FTP или веб-браузер ) и базовым стеком протоколов TCP/IP . Номенклатура основана на API сокетов Беркли , используемом в 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 года. [1] Он основан на спецификациях сокетов, созданных NetManage и переданных в общественное достояние на этой встрече. В то время сокет NetManage был единственным доступным многопоточным продуктом для Windows 3.0, полностью основанным на DLL. Первое издание спецификации было создано Мартином Холлом, Марком Тофиком из Microdyne (позже Sun Microsystems ), Джеффом Арнольдом из Sun Microsystems , а также Генри Сандерсом и Дж. Аллардом из Microsoft , при содействии многих других. [ необходима цитата ] Было некоторое обсуждение того, как лучше всего решать вопросы авторского права, интеллектуальной собственности и потенциальных антимонопольных проблем, и было рассмотрено сотрудничество с IETF или создание некоммерческого фонда. В конце концов, было решено, что спецификация будет просто защищена авторским правом пяти авторов как (неаффилированных) лиц.
Все участвующие разработчики долгое время сопротивлялись сокращению имени до простого Winsock, [ нужна цитата ] поскольку среди пользователей возникало много путаницы между API и файлом библиотеки DLL (winsock.dll), который предоставлял общие интерфейсы WSA только приложениям, расположенным выше. Пользователи обычно считали, что только наличие файла DLL в системе обеспечит полную поддержку протокола TCP/IP. [ нужна цитата ]
Спецификация API Windows Sockets определяет два интерфейса: API, используемый разработчиками приложений , и SPI , который предоставляет разработчикам сетевого программного обеспечения возможность добавлять новые модули протоколов в систему. Каждый интерфейс представляет собой контракт. API гарантирует, что соответствующее приложение будет работать правильно с соответствующей реализацией протокола от любого поставщика сетевого программного обеспечения. Контракт SPI гарантирует, что соответствующий модуль протокола может быть добавлен в Windows и, таким образом, будет доступен для использования приложением, совместимым с API. Хотя эти контракты были важны, когда впервые был выпущен Windows Sockets, поскольку сетевые среды требовали поддержки нескольких протоколов (см. выше), сейчас они представляют только академический интерес. В версию API Windows Sockets 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 меньше отличаются от сокетов BSD , чем последние от STREAMS ). Все вызовы функций в API начинаются с моникера WSA , например, WSASend() для отправки данных на подключенный сокет.
Однако целью разработки Windows Sockets было то, чтобы разработчикам было относительно легко переносить приложения на основе сокетов из Unix в Windows. Было сочтено недостаточным создание API, который был бы полезен только для новых программ Windows. По этой причине Windows Sockets включал ряд элементов, которые были разработаны для облегчения переноса. Например, приложения Unix могли использовать одну и ту же переменную errno для записи как сетевых ошибок, так и ошибок, обнаруженных в стандартных функциях библиотеки C. Поскольку это было невозможно в Windows, Windows Sockets представил специальную функцию WSAGetLastError() для извлечения информации об ошибках. Такие механизмы были полезны, но перенос приложений оставался чрезвычайно сложным. Многие оригинальные приложения TCP/IP были реализованы с использованием системных функций, специфичных для Unix , таких как псевдотерминалы и системный вызов fork , и воспроизведение такой функциональности в Windows было проблематичным. В течение относительно короткого времени перенос уступил место разработке специальных приложений Windows.
Windows 8 включает расширения "RIO" (Registered IO) для Winsock. [2] Эти расширения предназначены для снижения накладных расходов при переходе пользователя в режим ядра для сетевого пути данных и пути уведомления, но используют остальную часть обычного стека Windows TCP и UDP (и используют существующие сетевые карты). Путь настройки (например, функция "connect") не отличается от обычного пути Winsock.