この記事は主に、WSAやWinsockとも呼ばれるWindowsソケットAPIについて解説しています。この記事を読むことで、定義や背景、技術、実装などについて知ることができます。

Winsockの定義

Winsockは、コンピューティングにおいて、Windowsネットワークソフトウェアがネットワークサービス(特にTCP/IP)にアクセスする方法を定義するために使用する技術仕様です。Winsockは、Berkeley UNIXソケットインターフェースをWindowsに適合させたものです。ソケットは、同じコンピューターやネットワーク上の2つのプログラムプロセス間でデータを交換するための特殊な契約です。

Winsock
提示:
他のインターネットプロトコルについて詳しく知りたい方は、MiniTool公式ウェブサイトをご覧下さい。

WinsockはWindowsソケットAPI (WSA)の略称です。Windows TCP/IPクライアントアプリケーション(FTPクライアントやウェブブラウザなど)と、基本的なTCP/IPプロトコルスタックとの間の標準インターフェースを定義します。

関連記事:Netsh Winsock ResetコマンドでWindows 10のネットワーク問題を修復する

Winsockの背景

WindowsソケットAPIは、1991年10月にCompuServe BBSネットワークで、JSB Software(後のStardust Technologies)のマーティン・ホール氏が提案したものです。

仕様書の最初のバージョンは、マーティン・ホール氏、Microdyne(後のSun Microsystems)のマーク・トーフィク氏、Sun Microsystemsのジェフ・アーノルド氏、Microsoftのヘンリー・サンダース氏とJ・アラード氏によって書かれ、その他多くの人々の協力を得て作成されました。

著作権、知的財産、潜在的な独占禁止法に関する問題に対する最善の解決策、IETFを通じた活動や非営利財団の設立などが議論されました。最終的に、その仕様書の著作権は5人の(関連のない)著者のみが取得することになりました。

長い間、APIとDLLライブラリファイル(winsock.dll)の間に多くの混乱があったため、開発に参加した人々は全員、単にWinsockと略すことを拒んでいました。このファイルは、上位アプリケーションに汎用的なWSAインターフェースを公開するものでした。一般的には、システム上にDLLファイルが存在するだけで、完全なTCP/IPプロトコルを提供できると考えられています。

Winsockの技術

Windows Socket APIの仕様では、アプリケーション開発者が使用するAPIと、ネットワークソフトウェア開発者向けに新しいプロトコルモジュールをシステムに追加するSPIという、2つのインターフェースが定義されています。各インターフェースは契約を表します。

APIは、どのネットワークソフトウェアベンダーの適合プロトコル実装上でも、適合アプリケーションが正常に実行できることを保証します。SPI契約は、適合するプロトコルモジュールがWindowsに追加され、API準拠のアプリケーションで使用できることを保証します。

Windowsソケットがリリースされた当初は、このような取り決めは重要でしたが、ネットワーク環境が複数のプロトコルに対応しなければならないため、現在では学術的な意義を持っているだけに過ぎません。WindowsソケットAPIバージョン2.0には、IPX/SPXを使用する機能が含まれていますが、このプロトコルはWSA 2.0が工場から出荷されたときにはほとんど時代遅れとなっていました。

Windowsソケットのコードと設計はBSDソケットに基づいたものですが、APIが従来のWindowsプログラミングモデルに準拠するように機能が追加されています。

WindowsソケットAPIは、BSDソケットAPIのほぼすべての機能をカバーしていますが、WindowsとUnixの基本的な違いに起因する避けられない障害もあります。それでも、WindowsソケットとBSDソケットの違いは、後者とSTREAMSほどではありません。

Windowsソケットの設計目標は、UnixからWindowsにソケットベースのアプリケーションを移植しやすくすることにありました。新たに開発されたWindowsプログラムにのみ、有用なAPIを作成するだけでは足りなかったのです。

そのため、Windowsソケットには、移植しやすいように設計された要素が多く含まれていました。例えば、Unixアプリケーションは、ネットワークエラーや標準Cライブラリ関数で検出されたエラーを記録するために、同じerrno変数を使用できるようになっています。

これはWindowsでは実装できないため、Windowsソケットにはエラー情報を取得するための特別な関数「WSAGetLastError()」が導入されました。このような仕組みは非常に役に立っていたものの、アプリケーションの移植は非常に複雑でした。

多くの原始的なTCP/IPアプリケーションは、Unixに固有のシステム機能(擬似端末やフォークシステムコールなど)を使用して実装されてきましたが、Windowsでこの機能を再現する上で問題がありました。比較的短い期間のうちに、移植はWindows専用アプリケーションの開発へと発展していきました。

Winsockの実装

  • MicrosoftはWinsock 1.0を実装していません。
  • Windows for Workgroups(コードネームSnowball)向けのWinsockのバージョン1.1は、Wolverineと呼ばれるアドオンパッケージで提供されました。
  • Winsockバージョン2.1は、Windows 95のアドオンパッケージが提供されました。
  • 最新のWinsock 2.xのバージョンは、新しいWindowsバージョンとして、あるいはサービスパックの一部として提供されます。
  • Winsock 2は、レイヤードサービスプロバイダー(LSP)という仕組みを介して拡張できます。
  • hatena