
Windows Sockets API version 2.0
logo
In
computing, the
Windows Sockets
API, which was later shortened to
Winsock, is a technical specification that defines
how
Windows network software should access
network service, especially
TCP/IP. It defines a standard interface between a
Windows
TCP/IP client application (such as an
FTP client or a
web browser) and the underlying TCP/IP
protocol stack. The nomenclature is based on
the
Berkeley sockets API model used in
Berkeley UNIX for
communications between programs. Initially, all the participating
developers resisted the shortening of the name to Winsock for a
long time, since there was much confusion among users between the
API and the DLL library file (winsock.dll) which only exposed the
common WSA interfaces to applications above it. Users would
commonly believe that only making sure the
DLL file was present on a system would
provide full TCP/IP protocol support.
Background
Early Microsoft operating systems, both MS-DOS and Microsoft
Windows, offered limited networking capability, chiefly based on
NetBIOS/NetBEUI.
In particular, Microsoft did not offer support for the TCP/IP
protocol stack at that time.
A number of university groups and commercial
vendors, including the PC/IP group at MIT
, FTP
Software, Sun Microsystems,
Ungermann-Bass, and Excelan, introduced TCP/IP products for MS-DOS,
often as part of a hardware/software bundle.
When
Microsoft Windows 2.0 was
released, these vendors were joined by others such as Distinct and
NetManage in offering TCP/IP for Windows. The drawback faced by all
of these vendors was that each of them used their own API
(Application Programming Interface). Without a single standard
programming model, it was difficult to persuade independent
software developers to create networking applications which would
work with any vendor’s underlying TCP/IP implementation. Add to
this the fact that end users were wary of getting locked in to a
single vendor and it became clear that some standardization was
needed.
The Windows Sockets API was proposed by Martin Hall of JSB Software
(later Stardust Technologies) as a
BoF (
Birds of a Feather)
discussion on the
CompuServe BBS network in October 1991. The first
edition of the specification was authored by Martin Hall, Mark
Towfiq of Microdyne (later
Sun
Microsystems), Geoff Arnold of
Sun
Microsystems, and Henry Sanders and
J
Allard of
Microsoft, with assistance
from many others. There was some discussion about how best to
address the copyright, intellectual property, and potential
anti-trust issues, and consideration was given to working through
the
IETF or establishing a non-profit
foundation. In the end, it was decided that the specification would
simply be copyrighted by the five authors as (unaffiliated)
individuals.
Technology
The Windows Sockets API specification defines two interfaces: the
API used by
application developers, and the
SPI, which provides a
means for network software developers to add new protocol modules
to the system. Each interface represents a contract. The
API guarantees that a conforming application will
function correctly with a conformant protocol implementation from
any network software vendor. The
SPI contract
guarantees that a conforming protocol module may be added to
Windows and will thereby be usable by an API-conformant
application. Although these contracts were important when Windows
Sockets was first released, as network environments required
multi-protocol support (see above) they are now of only academic
interest. Included in the Windows Sockets API version 2.0 are
functions to use
IPX/SPX, but no commercial
application is known to exist which utilises this transport, since
the protocol was all but obsolete already at the time WSA 2.0
shipped.
Microsoft has shipped a
high-quality
TCP/IP stack with all recent
versions of Windows, and there are no significant independent
alternatives. Nor has there been significant interest in
implementing protocols other than TCP/IP.
Windows Sockets is based on
BSD
sockets, but provides additional functionality to allow the API
to comply with the standard Windows programming model. The Windows
Sockets API covered almost all the features of the
BSD sockets API, but there were some
unavoidable obstacles which mostly arose out of fundamental
differences between Windows and
Unix (though to
be fair Windows Sockets differed less from
BSD sockets than the latter did from
STREAMS). All function calls in the
API begin with the
moniker
WSA, e.g.
WSASend() for sending data on a
connected socket. Windows Sockets expanded on BSD Sockets
functionality, by offering "non-blocking" or asynchronous Sockets
(accessed by adding
WSAAsync before the desired function;
e.g.,
WSAAsyncGetHostByName())
However it was a design goal of Windows Sockets that it should be
relatively easy for developers to port socket-based applications
from
Unix to Windows. It was not considered
sufficient to create an API which was only useful for newly-written
Windows programs. For this reason, Windows Sockets included a
number of elements which were designed to facilitate porting. For
example,
Unix applications were able to use the
same
errno variable to record
both networking errors and errors detected within
standard C library functions. Since this
was not possible in Windows, Windows Sockets introduced a dedicated
function,
WSAGetLastError(), to retrieve error
information. Such mechanisms were helpful, but application porting
remained extremely complex. Many "traditional"
TCP/IP applications had been implemented by using
system features specific to
Unix, such as
pseudo terminals and the
fork system call, and reproducing
such functionality in Windows was problematic. Within a relatively
short time, porting gave way to the development of dedicated
Windows applications.
Specifications
- Version 1.0 (June 1992) defined the basic operation of Winsock.
It was kept very close to the existing interface of Berkeley
sockets to simplify porting of existing applications. A few
Windows-specific extensions were added, mainly for asynchronous
operations with message-based notifications.
- Although the document didn't limit support to TCP/IP, TCP and
UDP were the only protocols explicitly mentioned. Most vendors only
delivered TCP/IP support, although Winsock from DEC included DECNet support as well.
- Version 1.1 (January 1993) made many minor corrections and
clarifications of the specification. The most significant change
was the inclusion of the gethostname() function.
- Winsock 2 was a backwards-compatible extension of
Winsock 1.1. It added support for protocol-independent name
resolution, asynchronous operations with event-based notifications
and completion routines, layered protocol implementations, multicasting, and quality of service. It also formalized
support for multiple protocols, including IPX/SPX and DECnet. The new
specification allowed sockets to be optionally shared between
processes, incoming connection requests to be conditionally
accepted, and certain operations to be performed on socket groups
rather than individual sockets. Although the new specification
differed substantially from Winsock 1, it provided source- and
binary-level compatibility with the Winsock 1.1 API. One of the
lesser known additions was the Service Provider Interface (SPI) API
and Layered Service
Providers.
- Versions 2.0.x (May 1994 onwards) had internal draft status,
and were not announced as public standards.
- Version 2.1.0 (January 1996) was the first public release of
the Winsock 2 specification.
- Version 2.2.0 (May 1996) included many minor corrections,
clarifications, and usage recommendations. It was also the first
version to remove support for 16-bit Windows applications.
- Version 2.2.1 (May 1997) and Version 2.2.2 (August 1997)
introduced minor functionality enhancements. Mechanisms were added
for querying and receiving notification of changes in network and
system configuration.
- The IPv6 Technical Preview for Windows 2000 (December 2000) saw the first
implementation of RFC 2553 (March 1999,
later obsoleted by RFC 3493), a
protocol-independent API for name resolution, which would become
part of Winsock in Windows XP.
Implementations
Microsoft implementations
- Microsoft did not supply an implementation of Winsock 1.0.
- Version 1.1 of Winsock was supplied in an add-on package
(called Wolverine) for Windows for Workgroups (code named
Snowball). It was an integral component of Windows
95 and Windows NT 3.x.
- Version 2 of Winsock was supplied in an add-on package for
Windows 95. It was an integral component of Windows 98, Windows NT
4.0, and all subsequent Windows releases. (Microsoft did not
supply implementations of Winsock 2 for Windows 3.x or Windows NT
3.x.)
- Recent versions of Winsock 2.x have been delivered with new
Windows releases or as part of service packs.
- Winsock 2 is extensible by a mechanism known as a Layered Service Provider (LSP).
Winsock LSPs are available for a wide range of useful purposes,
including internet parental controls, web content filtering,
QoS etc. The layering order of
all providers is kept in the Winsock Catalog. In previous versions
of Windows, removing a buggy LSP could result in corruption of the
Winsock catalog in the registry, potentially resulting in a loss of
all network connectivity. Winsock in Windows XP Service
Pack 2, Windows Server 2003 Service Pack 1 and all later Windows
operating systems has the ability to self-heal after a user
uninstalls such an LSP.
Other implementations
- Among the other vendors offering Winsock-compliant TCP/IP
stacks were (alphabetically) 3Com, Beame &
Whiteside, DEC, Distinct, FTP Software,
Frontier, IBM, Microdyne, NetManage, Novell, Sun
Microsystems and Trumpet Software
International
- Trumpet Winsock was one of the few Winsock 1.0 implementations
that could be installed under Windows
3.0, which had no built-in support for Winsock. Trumpet was
also the most popular shareware
implementation of Winsock for Windows 3.x. Trumpet Winsock 5.0 is
available for Windows 95/98 and Windows NT and
includes a Winsock 1.1 compliant IPv6 stack for these operating
systems.
See also
References
- Trumpet Winsock v5.0
External links