Winsock (Windows Sockets API)とは
Winsock(Windows Sockets API、WSA)は、Windows環境において、ネットワーク
ソフトウェアがネットワークサービス(特にTCP/IP)にアクセスするための標準的なインターフェースを定めた技術仕様です。このAPIは、Windows上のTCP/IPクライアントアプリケーション(FTPクライアントやGopherクライアントなど)とTCP/IPプロトコルスタック間の標準的なインターフェースとして機能します。Winsockという名称は、BSD系
UNIXでプロセス間通信に使われるソケットAPIモデルに由来しています。
`winsock.dll`というDLLファイルがWSAインターフェースの主要部分を提供していたため、開発者側ではこのAPIをWinsockという略称で呼ぶことに抵抗がありました。また、一般ユーザーの間では、`winsock.dll`があればTCP/IPプロトコルが完全にサポートされるという誤解が広まっていました。
背景
初期の
マイクロソフトのオペレーティングシステム(
MS-DOSやWindows)は、ネットワーク機能が貧弱で、主にNetBIOS/NetBEUIを使用していました。これらは、ルーティング不可能な非階層型のネットワーク機能であり、
IBMのNetBIOSを
マイクロソフトが実装したものでした。当時、
マイクロソフトはTCP/IPを軽視しており、大学グループ(MITなど)や商用ベンダー(
サン・マイクロシステムズなど)が
MS-DOS用のTCP/IPを開発し、ハードウェアに同梱して販売していました。
Windowsがリリースされると、Windows向けのTCP/IPを提供するベンダーが増加しましたが、
マイクロソフトは依然として機能の貧弱な製品を提供していました。これらのベンダーの製品の欠点は、それぞれ独自のAPIを採用していた点です。また、メモリ使用量(当時640KBが大容量とされていた)や、複数のプロトコルを並行してサポートする方法がない点も問題でした。特に、複数のネットワークサービスに接続するために、異なるブート構成が必要になるという問題は深刻でした。異なるプロトコル(例えば、ノベルはIPX/SPX、
IBMはNetBIOS APIベースのプロトコル、
マイクロソフトはNetBEUI Frames Protocol)が使用されていたため、ユーザーは使用したいサービスに合わせて、システムを再起動する必要がありました。
さらに、プログラミングモデルが統一されていなかったため、特定のベンダーのTCP/IP実装で動作するネットワークアプリケーションを開発することは非常に困難でした。この状況を打開するため、標準化が求められました。
当時、PCネットワーク分野では既に標準化が進められており、
アメリカ空軍の支援によってTCP/IP上のNetBIOS実装であるNBT(NetBIOS over TCP/IP)が標準化されました。また、FTP Software社が中心となって開発したCrynwr packet driverは、メモリ使用量の問題を回避し、ネットワークカードの割り込みを独占しないことで複数プロトコルの同時サポートを可能にしました。ノベルのODIや
マイクロソフトのNDISといったAPIも、同様の試みとして存在しました。しかし、これらのAPIはTCP/IPを含むプロトコルスタックの完全な実装ではなかったため、例えばCrynwrのRuss Nelsonが開発したQVTやWinQVTは、アプリケーション内にTCP/IPスタックを実装していました。これにより、例えばノベルのIPX/SPXでNetWareのファイルサーバにアクセスしながら、同時にTCP/IP経由でVMSにアクセスすることが可能になりました。
Windows Sockets APIの提案は、JSB SoftwareのMartin Hallによって1991年10月にCompuServeの
電子掲示板での議論から始まりました。仕様の第1版は、Martin Hall、Mark Towfiq(Microdyne)、Geoff Arnold(
サン・マイクロシステムズ)、Henry Sanders、J Allard(
マイクロソフト)らによって編集されました。著作権や知的所有権に関する議論が行われ、最終的に5人がそれぞれ著作権を所有することとなりました。その後、J Allardは
マイクロソフト社内で重要な地位を得て、ACKとNACKという名前のイグアナを飼っていたという逸話があります。
技術
Windows Socket APIは、2つのインターフェースを定義しています。1つは
アプリケーション[[ソフトウェア]]開発者が利用するAPIであり、もう1つはネットワーク
ソフトウェア開発者が新しいプロトコルモジュールをシステムに追加する際に利用するSPIです。APIは、準拠するアプリケーションがWinsockに準拠して実装された任意のプロトコルを使用して動作することを保証します。SPIは、準拠プロトコルモジュールをWindowsに追加でき、任意のAPI準拠アプリケーションから利用可能であることを保証します。当初、複数プロトコルのサポートが必須であったため、この保証は重要でしたが、現在ではほとんど学術的な興味の対象となっています。
Windows Socket version 2.0にはIPX/SPXで使用される機能も含まれていますが、リリース当時から既に廃れつつあり、現在ではほとんど使用されていません。
マイクロソフトは、最新のWindowsには高品質なTCP/IPスタックを実装しており、その代替となる有力な製品は存在しません。さらに、TCP/IP以外のプロトコルを実装する必要性も少なくなっています。
Windows Socketsは、バークレーのソケットに基づいていますが、Windowsの標準プログラミングモデルに対応するために機能が追加されています。Winsockはソケットのほとんどの機能をカバーしていますが、Windowsと
UNIXの根本的な違いから避けられない差異も存在します。APIに含まれるすべての関数名は`WSA`というプレフィックスが付きます(例:ホスト名参照の`WSAGetHostByName()`)。
BSDソケットからの拡張で特筆すべきは、「非同期ソケット」およびオーバーラップI/Oを利用した「オーバーラップソケット」です。非同期バージョンの関数には`WSAAsync`というプレフィックスが付き(例:`WSAAsyncGetHostByName()`)、結果はWindowsのウィンドウメッセージによって通知されます。非同期処理のキャンセルは`WSACancelAsyncRequest()`で行います。オーバーラップソケットは、完了通知に`WSAEVENT`オブジェクトと`WSAOVERLAPPED`構造体を使用します。Winsockの非同期ソケットやオーバーラップソケットは、BSDのノンブロッキングソケットとは異なる概念です。ブロッキングモードの`send()`および`recv()`のタイムアウト時間を設定するには、ソケット作成時に`WSA_FLAG_OVERLAPPED`属性を設定する必要があります。Winsock2では、ソケットはデフォルトでブロッキングモードで作成されます。また、BSD互換の`socket()`関数で作成されたソケットは、デフォルトで`WSA_FLAG_OVERLAPPED`属性を持ちます。
設計目標は、
UNIXからWindowsへのソケットベースのアプリケーションの移植を容易にすることでした。新たにWindows向けに書かれるプログラムにとって、そのAPIが十分かどうかはあまり考慮されていませんでした。そのため、Winsockには移植のために設計された要素が含まれており、例えば
UNIXアプリケーションではネットワークのエラーも標準C
ライブラリの関数内のエラーも同じ`errno`で表されますが、Windowsにはない機能であるため、Winsockは`WSAGetLastError()`関数でエラー情報を取得できるようにしました。このような機能は役立ちましたが、アプリケーションの移植は困難でした。多くのTCP/IPアプリケーションは、仮想端末や`fork`システムコールなど、
UNIXのシステム固有の機能を使って実装されており、これらの機能をWindowsで再現するのが困難だったためです。しかし、まもなく移植よりもWindows独自のアプリケーション開発が主流となりました。
仕様
Version 1.0 (1992年6月)
Winsockの基本定義。BSDのソケットインターフェースに忠実であり、既存アプリケーションの移植性を考慮しています。Windows固有の拡張が若干あり、主にメッセージ通知による非同期操作に関するものです。文書ではTCP/IPに限定していませんが、具体的に言及されているプロトコルはTCPとUDPのみでした。ほとんどのベンダーはTCP/IPのみをサポートしましたが、DECは
DECnetもサポートしていました。
Version 1.1 (1993年1月)
細かな修正と仕様の分類。重要な変更点としては、`gethostname()`関数が追加された点が挙げられます。
Winsock 2
Winsock 1.1との互換性を維持しつつ拡張されており、プロトコルに独立した名前解決法、イベント通知や完了ルーチンによる非同期操作、階層型プロトコル実装、マルチキャスト、
Quality of Service(QoS)をサポートしています。複数プロトコルサポートも公式化され、IPX/SPXと
DECnetが明記されました。また、プロセス間でのソケット共有、コネクションの条件付き受理、ソケットグループ処理などが可能になりました。Winsock 1.xとは大幅な違いがありますが、Winsock 1.1 APIとのソース互換性とバイナリ互換性を保っています。さらに、Service Provider Interface (SPI) APIやLayered Service Provider (LSP)もサポートされました。
Version 2.0.x (1994年3月以降)
内部ドラフトであり、標準として公開されたものではありません。
Version 2.1.0 (1996年1月)
Winsock 2としての最初の公開版。
Version 2.2.0 (1996年5月)
細かな修正、明確化、使用方法の追記など。16ビットWindowsアプリケーションのサポートが削除されました。
Version 2.2.1 (1997年5月), Version 2.2.2 (1997年8月)
細かな機能強化。ネットワーク構成やシステム構成の変化に関して問い合わせたり、通知を受け付ける機構が追加されました。
IPv6への対応はWindows 2000(2000年12月)でRFC 2553(後にRFC 3493に置換)に基づいて行われ、Windows XPのWinsockの一部となっています。
実装
マイクロソフトは、Winsock 1.0の実装を提供していません。Winsock 1.1は、Windows for Workgroupsのアドオンパッケージとして提供され、Windows 95とWindows NT 3.xでは最初から必須コンポーネントとして導入されました。Winsock 2は、Windows 95のアドオンパッケージとして提供され、Windows 98およびNT 4.0以降では必須コンポーネントとして導入されています。Winsock 2は、Windows 3.xやNT 3.x向けには提供されませんでした。Winsock 2.xは、新たなWindowsのリリース時点やサービスパックの形で提供されています。
Winsock 2は、Layered Service Provider (LSP)と呼ばれる機構で拡張可能です。Winsock LSPは、ペアレンタルコントロール、Webコンテンツのフィルタリング、QoSなどに使用されます。すべてのProviderの階層順位はWinsock Catalogで管理されます。過去には、バグのあるLSPを削除するとWinsock Catalogが破壊され、ネットワークが使用できなくなるという問題がありましたが、Windows XP SP2、Windows Server 2003 SP1、およびそれ以降のWindowsでは、LSPをアンインストールしても自動修復できるようになっています。
その他の実装
Winsock準拠のTCP/IPスタックを提供するベンダーとしては、スリーコム、Beame & Whiteside、DEC、Distinct、FTP Software、Frontier、
IBM、Microdyne、NetManage、ノベル、
サン・マイクロシステムズ、Trumpet Software Internationalなどがあります。
Trumpet Winsockは、数少ないWinsock 1.0の実装であり、Windows 3.0にインストール可能でした。Trumpetは、Windows 3.x向けのWinsockの
シェアウェア版でも知られています。2008年2月以降、Tattam Software EnterprisesがTrumpetの知的所有権を所有しています。
脚注
参考文献
Aboba, Bernard D., comp.protocols.tcp-ip.ibmpc, Frequently Asked Questions, 1993. Usenet: news:news.answers.
この記事は、2008年11月1日以前にFree On-line Dictionary of Computingから取得した項目の資料を元に、GFDLバージョン1.3以降の「RELICENSING」(再ライセンス)条件に基づいて組み込まれています。
関連項目
ソケット (BSD))
外部リンク
Windows Sockets - Winsock のオープンソース実装(リンク切れ)
Windows Sockets - Winsock のオープンソース実装(上記リンクの2009年2月のスナップショット)
Sockets FAQ - Windows Sockets FAQ
Windowns Sockets 2.0
Microsoft
MSDNライブラリ - Winsock2 Reference.aspx)
MSDNライブラリ - Winsock2 Home.aspx)
Porting Berkley Socket programs to Winsock.aspx)
Brief History of Microsoft on the Web - ウェイバックマシン(2001年1月5日アーカイブ分)
その他
WinSock Development Information
Winsock Programmer's FAQ
Komodia Inc. free open-source windows based Winsock library