# Winsock

In de computerwereld is Winsock (afkorting voor Windows Sockets) een specificatie die definieert hoe Windows netwerkmogelijkheden aanbiedt aan toepassingen, met name TCP/IP.

## Achtergrond

De eerste besturingssystemen van Microsoft, zowel MS-DOS als Windows boden beperkte netwerkmogelijkheden, hoofdzakelijk gebaseerd op NetBIOS (een technologie van IBM die Microsoft overnam). Microsoft negeerde de protocol-stack TCP/IP volkomen. Een aantal groepen van universiteiten en commerciële aanbieders, waaronder de PC/IP-groep van het MIT, FTP Software, Sun Microsystems, Ungermann-Bass en Excelan, introduceerden TCP/IP-producten voor MS-DOS, vaak als onderdeel van een hardware/software-bundel. Toen Microsoft Windows werd uitgebracht, sloten aanbieders zoals Distinct en Netmanage zich aan in het aanbieden van TCP/IP voor Windows. Zelfs Microsoft leverde een product met beperkte mogelijkheden.
Het nadeel, dat al deze aanbieders voor ogen kwam, was dat ieder van hen zijn eigen API gebruikte. Zonder een enkel standaard programmeermodel was het moeilijk om onafhankelijke softwareontwikkelaars netwerkapplicaties te laten maken en gebruikers waren terughoudend om zich vast te binden aan een enkele aanbieder.
Er was in de loop der jaren al een aantal succesvolle standaardisatiepogingen gedaan op het gebied van netwerken met pc's. De eerste ervan was een ontwikkelingsprogramma, gesponsord door de luchtmacht van de VS, voor RFC1001/1002, een NetBIOS-implementatie lopend via TCP/IP. Een tweede was de poging voor een packet-driver van Crynwr die gestart werd door FTP software en geleid werd door Russ Nelson.
Winsock werd voorgesteld door Martin Hall van JSB Software (het latere Stardust Technologies) tijdens de Interop van oktober 1991, tijdens een "Birds of a Feather"-sessie. De eerste uitgave van de specificatie werd geschreven door Martin Hall, Mark Towfiq van Microdyne (later behorende bij Sun Microsystems), Geoff Arnold van Sun Microsystems, en Henry Sanders van Microsoft, met hulp van vele anderen. Er ontstond enige discussie over hoe het kopieerrecht, intellectueel eigendom en andere potentiële 'anti-trust'-zaken te omschrijven en er werd uiteindelijk voorgesteld om het te overleggen aan de IETF of om een non-profitorganisatie hiervoor op te richten. Uiteindelijk werd besloten om het kopieerrecht van de specificatie neer te leggen bij de vier auteurs in de vorm van (onafhankelijke) individuen.

## Technologie

De Winsock-specificatie definieert twee interfaces: de API die gebruikt wordt door applicatie-ontwikkelaars en de SPI die netwerksoftware-ontwikkelaars in mogelijkheden voorziet om nieuwe protocol-modules aan het systeem toe te voegen. Iedere interface vertegenwoordigt een contract. De API garandeert dat een bindende applicatie zich correct zal gedragen met een overeenkomende protocolimplementatie van willekeurig welke software-aanbieder. De SPI garandeert dat een overeenkomende protocolmodule aan Windows toegevoegd kan worden en daardoor bruikbaar is voor een, aan de API gebonden, applicatie. Alhoewel deze contracten belangrijk waren toen Winsock voor het eerst werd uitgebracht, zijn ze nu slechts nog interessant voor academici. Microsoft levert tegenwoordig een TCP/IP-stack van hoge kwaliteit bij alle recente versies van Windows en er zijn geen andere belangrijke onafhankelijke alternatieven. Noch is er een overmatige interesse om andere protocollen te implementeren behalve TCP/IP.
Winsock is gebaseerd op BSD-sockets, maar voorziet tevens in toegevoegde functionaliteit om de API samen te laten werken met het standaard programmeermodel van Windows. De Winsock API dekt bijna alle mogelijkheden van de API van de BSD-sockets, maar er waren enkele onvermijdbare hindernissen die voortkwamen uit het fundamentele verschil tussen UNIX en Windows (alhoewel eerlijkheidshalve Winsock minder van de BSD-sockets verschilde dan deze laatste ten opzichte van STREAMS).
Het was echter al als doel gesteld tijdens het ontwerp van Winsock dat het relatief makkelijk zou zijn voor ontwikkelaars om applicaties van Unix naar Windows te porteren op basis van sockets. Het maken van een API die alleen geschikt was voor het schrijven van nieuwe Windowsprogramma's werd niet als voldoende beschouwd. Daarom bevatte Winsock een aantal elementen die ontwikkeld waren om portering te faciliteren. Bijvoorbeeld, Unix-applicaties konden dezelfde errno-variabele gebruiken om netwerkfouten en fouten in de standaard C-bibliotheken op te sporen. Omdat dit in Windows niet mogelijk was, introduceerde Winsock een vaste toegewijde functie, WSAGetLastError, om informatie omtrent fouten op te sporen. Zulke mechanismen waren handig, maar het porteren van applicaties bleef behoorlijk complex. Vele traditionele TCP/IP-applicaties zijn geïmplementeerd met gebruikmaking van mogelijkheden die Unixspecifiek zijn, zoals pseudoterminals en de gevorkte systeemaanroepen. Het reproduceren van dit soort mogelijkheden in Windows was problematisch. Binnen een zeer korte tijd maakte porteren plaats voor de ontwikkeling van op Windows toegespitste applicaties.

## Specificaties

* Versie 1.0 (juni 1992) definieerde de basiswerking van Winsock. Het werd zeer dicht tegen de bestaande interface van Berkely sockets gehouden om het porteren van bestaande applicaties te vereenvoudigen. Een paar uitbreidingen die specifiek voor Windows waren , werden toegevoegd, hoofdzakelijke voor asynchrone handelingen met meldingen gebaseerd op berichtgeving. Alhoewel volgens het document de ondersteuning niet beperkt was tot TCP/IP, waren TCP en UDP de enige protocollen die specifiek genoemd werden. De meeste aanbieders leverden slechts ondersteuning voor TCP/IP, Winsock van DEC voegde echter tevens ondersteuning voor DECnet toe.
* Versie 1.1 (januari 1993) paste vele kleine correcties en verhelderingen toe op de specificatie. De meest belangrijke verandering was het inbegrip van de gethostname-functie.
* Winsock 2 was een 'met-terugwerkende-kracht'-geschikte uitbreiding van Winsock 1.1. Het voegde ondersteuning toe voor protocolafhankelijke naamresolutie, asynchrone handelingen met notificaties die op gebeurtenissen gebaseerd waren en routines ter afronding, gelaagde protocolimplementaties, multicasting, en 'quality of service' (kwaliteit van de dienst). Het omvatte tevens ondersteuning voor meervoudige protocollen, waaronder IPX/SPX en DECnet. De nieuwe specificatie stond sockets toe optioneel gedeeld te laten worden tussen processen, binnenkomende verbindingsverzoeken toe om op voorwaarden toegelaten te worden en bepaalde handelingen uit te laten voeren op socketgroepen te laten uitvoeren in plaats van individuele sockets. Alhoewel de nieuwe specificatie grotendeels afweek van Winsock 1, voorzag het in compatibiliteit op bron- en binair niveau met de Winsock 1.1-API.
* Versies 2.0.x (mei 1994 en verder ) hadden een 'intern opgetekend'-status en werden niet aangekondigd als publieke standaarden.
* Versie 2.1.0 (januari 1996) was de eerste publieke uitgave van de Winsock 2-specificatie.
* Versie 2.2.0 (mei 1996) bevatte vele kleine correcties, verhelderingen en aanbevelingen voor gebruik. Het was tevens de eerste versie zonder ondersteuning voor 16 bit-Windowsapplicaties.
* Versie 2.2.1 (mei 1997) en Version 2.2.2 (augustus 1997) introduceerden kleine functionele opwaarderingen. Er werden mechanismen toegevoegd voor het opvragen en verkrijgen van notificaties over veranderingen in netwerk- of systeemconfiguratie.
* De Technische Voorsbeschouwing van IPv6 voor Windows 2000 (december 2000) zag de eerste implementatie van RFC 2553 (maart 1999, die later overbodig werd door RFC 3493), een protocolafhankelijke API voor 'name resolution', dat een onderdeel van Winsock zou worden in Windows XP.

## Implementaties
### Microsoftimplementaties

* Microsoft voorzag nooit in een Winsock 1.0.
* Versie 1.1 van Winsock werd toegevoegd in een 'add-on package' (Wolverine genaamd) voor Windows for Workgroups. Het was tevens een integrale component van Windows 95 en Windows NT 3.x.
* Versie 2 van Winsock werd toegevoegd in een 'add-on package' bij Windows 95. Het was een integraal component van Windows 98, Windows NT 4.0, en alle daarop volgende Windows uitgaven. (Microsoft leverde geen implementaties van Winsock 2 voor Windows 3.x of Windows NT 3.x.)
* Recente versies van Winsock 2.x worden geleverd met nieuwe Windows-uitgaven of als onderdeel van service packs.

### Implementaties van derden

* Onder de aanbieders die Winsock-geschikte TCP/IP-stacks leverden waren (alfabetisch) 3Com, Beame & Whiteside, DEC, Distinct, FTP Software, Frontier, IBM, Novell, Microdyne, NetManage, Sun Microsystems en Trumpet.
* Trumpet Winsock was een van de weinige Winsock 1.0-implementaties die geïnstalleerd kon worden onder Windows 3.0 (dat zelf geen ingebouwde ondersteuning voor Winsock had). Trumpet was tevens de meest populaire freeware-implementatie van Winsock voor Windows 3.x.