En informática , la API de Windows Sockets ( WSA ), posteriormente abreviada como Winsock , es una interfaz de programación de aplicaciones (API) que define cómo el software de aplicación de red de Windows debe acceder a los servicios de red, especialmente TCP/IP . Define una interfaz estándar entre una aplicación cliente TCP/IP de Windows (como un cliente FTP o un navegador web ) y la pila de protocolos TCP/IP subyacente . La nomenclatura se basa en la API de sockets de Berkeley utilizada en BSD para las comunicaciones entre programas.
Los primeros sistemas operativos de Microsoft, tanto MS-DOS como Microsoft Windows, ofrecían una capacidad de red limitada, basada principalmente en NetBIOS . En particular, Microsoft no ofrecía soporte para la pila de protocolos TCP/IP en ese momento. Varios grupos universitarios y proveedores comerciales, incluido el grupo PC/IP del MIT , FTP Software , Sun Microsystems , Ungermann-Bass y Excelan , introdujeron productos TCP/IP para MS-DOS, a menudo como parte de un paquete de hardware/software. Cuando se lanzó Windows 2.0 , a estos proveedores se unieron otros como Distinct y NetManage para ofrecer TCP/IP para Windows.
El inconveniente al que se enfrentaban todos estos proveedores era que cada uno de ellos utilizaba su propia API (interfaz de programación de aplicaciones). Sin un modelo de programación estándar único, era difícil convencer a los desarrolladores de software independientes para que crearan aplicaciones de red que funcionaran con la implementación TCP/IP subyacente de cualquier proveedor. Si a esto le añadimos el hecho de que los usuarios finales temían quedar limitados a un único proveedor, quedó claro que era necesaria cierta estandarización.
El proyecto Windows Sockets tuvo su origen en una sesión de Birds Of A Feather celebrada en Interop '91 en San José el 10 de octubre de 1991. [1] Se basa en especificaciones de socket creadas por NetManage y que se pusieron en el dominio público en esta reunión. En ese momento, el socket de NetManage era el único producto multiproceso basado en 100% DLL para Windows 3.0 disponible. La primera edición de la especificación fue escrita por Martin Hall, Mark Towfiq de Microdyne (más tarde Sun Microsystems ), Geoff Arnold de Sun Microsystems y Henry Sanders y J Allard de Microsoft , con la ayuda de muchos otros. [ cita requerida ] Hubo cierta discusión sobre la mejor manera de abordar los problemas de derechos de autor, propiedad intelectual y posibles problemas antimonopolio, y se consideró trabajar a través del IETF o establecer una fundación sin fines de lucro. Al final, se decidió que la especificación simplemente estaría protegida por derechos de autor de los cinco autores como individuos (no afiliados).
Todos los desarrolladores participantes se resistieron a acortar el nombre a Winsock durante mucho tiempo, [ cita requerida ] ya que había mucha confusión entre los usuarios entre la API y el archivo de la biblioteca DLL (winsock.dll) que solo exponía las interfaces comunes de WSA a las aplicaciones superiores. Los usuarios creían comúnmente que solo asegurarse de que el archivo DLL estuviera presente en un sistema proporcionaría soporte completo para el protocolo TCP/IP. [ cita requerida ]
La especificación de la API de Windows Sockets define dos interfaces: la API utilizada por los desarrolladores de aplicaciones y la SPI , que proporciona un medio para que los desarrolladores de software de red agreguen nuevos módulos de protocolo al sistema. Cada interfaz representa un contrato. La API garantiza que una aplicación conforme funcionará correctamente con una implementación de protocolo conforme de cualquier proveedor de software de red. El contrato SPI garantiza que se pueda agregar un módulo de protocolo conforme a Windows y, por lo tanto, será utilizable por una aplicación compatible con la API. Aunque estos contratos fueron importantes cuando se lanzó por primera vez Windows Sockets, dado que los entornos de red requerían compatibilidad con múltiples protocolos (ver más arriba), ahora solo tienen interés académico. En la versión 2.0 de la API de Windows Sockets se incluyen funciones para usar IPX/SPX , aunque el protocolo ya estaba prácticamente obsoleto en el momento en que se lanzó WSA 2.0. Microsoft ha enviado la pila de protocolos TCP/IP con todas las versiones recientes de Windows y no existen alternativas independientes significativas. Tampoco ha habido un interés significativo en implementar protocolos distintos de TCP/IP.
El código y el diseño de Windows Sockets se basan en los sockets BSD , pero proporciona una funcionalidad adicional para permitir que la API cumpla con el modelo de programación regular de Windows. La API de Windows Sockets cubría casi todas las características de la API de sockets BSD , pero había algunos obstáculos inevitables que surgían principalmente de las diferencias fundamentales entre Windows y Unix (aunque Windows Sockets se diferenciaba menos de los sockets BSD que estos últimos de STREAMS ). Todas las llamadas a funciones en la API comienzan con el apodo WSA , por ejemplo, WSASend() para enviar datos en un socket conectado.
Sin embargo, un objetivo de diseño de Windows Sockets era que fuera relativamente fácil para los desarrolladores portar aplicaciones basadas en sockets de Unix a Windows. No se consideró suficiente crear una API que solo fuera útil para programas Windows recién escritos. Por esta razón, Windows Sockets incluyó una serie de elementos que fueron diseñados para facilitar la portabilidad. Por ejemplo, las aplicaciones de Unix podían usar la misma variable errno para registrar errores de red y errores detectados dentro de las funciones de la biblioteca estándar de C. Como esto no era posible en Windows, Windows Sockets introdujo una función dedicada, WSAGetLastError() , para recuperar información de errores. Estos mecanismos fueron útiles, pero la portabilidad de aplicaciones siguió siendo extremadamente compleja. Muchas aplicaciones TCP/IP originales se habían implementado utilizando características del sistema específicas de Unix , como pseudoterminales y la llamada al sistema fork , y reproducir dicha funcionalidad en Windows era problemático. En un tiempo relativamente corto, la portabilidad dio paso al desarrollo de aplicaciones dedicadas de Windows.
Windows 8 incluye las extensiones "RIO" (Registered IO) para Winsock. [2] Estas extensiones están diseñadas para reducir la sobrecarga de la transición del usuario al modo kernel para la ruta de datos de red y la ruta de notificación, pero utilizan el resto de la pila TCP y UDP normal de Windows (y utilizan las tarjetas de red existentes). La ruta de configuración (por ejemplo, la función "conectar") no cambia con respecto a la ruta normal de Winsock.