(Translated by https://www.hiragana.jp/)
Winsock - Wikipedia コンテンツにスキップ

Winsock

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

Winsock (Windows Sockets API, WSA) は、WindowsにおいてネットワークソフトウェアネットワークサービスとくTCP/IP)にアクセスする方法ほうほう定義ていぎした技術ぎじゅつ仕様しようである。Windows じょうTCP/IPクライアントアプリケーション(FTPクライアントや Gopherクライアント)とTCP/IPプロトコルスタックとの標準ひょうじゅんインタフェース定義ていぎしている。その名称めいしょうBSDけいUNIXでプログラムあいだ通信つうしん使つかわれたソケットばれるAPIモデルにもとづいている。winsock.dll というDLLファイルはWSAインタフェースの主要しゅよう部分ぶぶん提供ていきょうするものであったため、このAPIを Winsock という略称りゃくしょうぶことには開発かいはつしゃがわ抵抗ていこうがあったし、ユーザーがわにもおおくの混乱こんらんがあった。ユーザーは winsock.dll さえあれば、TCP/IP プロトコルが完全かんぜんにサポートされるのだと誤解ごかいしていることがおおかった。

背景はいけい

[編集へんしゅう]

初期しょきのマイクロソフトのオペレーティングシステム(MS-DOSWindowsも)は、ネットワーク機能きのう貧弱ひんじゃくで、NetBIOS/NetBEUIおも使つかっていた。これは階層かいそうされていない、ルーティング不可能ふかのうなネットワーク機能きのうであり、IBM の NetBIOS をマイクロソフトが実装じっそうしたものであった。とく当時とうじ、マイクロソフトはTCP/IP完全かんぜん無視むししていた。数々かずかず大学だいがくグループ(MIT)や商用しょうようベンダー(サン・マイクロシステムズ)がMS-DOSようTCP/IPを開発かいはつし、ハードウェアにどうこりするなどして販売はんばいしていた。Windows がリリースされると、さらに Windows け TCP/IP を提供ていきょうするベンダーがえていった。しかし、マイクロソフトは相変あいかわらず機能きのう貧弱ひんじゃく製品せいひん提供ていきょうしていた。

これらベンダーの製品せいひん弱点じゃくてんは、それぞれ独自どくじAPI採用さいようしていたてんである。また、メモリ使用しようりょう当時とうじ、640KBもあればだい容量ようりょうとされていた)や、複数ふくすうのプロトコルを並行へいこうしてサポートする方法ほうほうがないてん問題もんだいだった。とく最後さいご問題もんだいてん重要じゅうようであった。当時とうじのネットワーク環境かんきょうはベンダーごとことなり(たとえば、DECのDECnet、ノベルNetware、Banyan Vines、IBM Lan Manager など)、それぞれちがったプロトコルを使つかっていた(たとえば、ノベルは IPX/SPX、IBM は NetBIOS API ベースのプロトコル、マイクロソフトは NetBEUI Frames Protocol)。したがって、ユーザーが複数ふくすうのネットワークサービスに接続せつぞくするには、複数ふくすうのブート構成こうせい用意よういし、使つかいたいサービスにわせてなおして、対応たいおうするプロトコルを使つかえるようにする必要ひつようがあった。さらにプログラミングモデルが統一とういつされていないため、任意にんいのベンダーのTCP/IP実装じっそう動作どうさするネットワークアプリケーションの開発かいはつ非常ひじょう困難こんなんであった。なんらかの「標準ひょうじゅん」が必要ひつようであることはあきらかであった。

当時とうじすでにPCネットワークの分野ぶんやでの標準ひょうじゅんはいくつもすすめられていた。アメリカ空軍くうぐん支援しえんおこなわれた標準ひょうじゅんとして RFC 1001RFC 1002 がある。これは TCP/IP じょうの NetBIOS 実装じっそうであり、NBT (NetBIOS over TCP/IP) とばれた。つぎに FTP Software しゃ中心ちゅうしんとなってすすめられた Crynwr packet driver がある。これは、上述じょうじゅつしたメモリ使用しようりょう問題もんだいアセンブリ言語げんご実装じっそうすることで回避かいひし、ネットワークカードのみを独占どくせんしないことで複数ふくすうプロトコルの同時どうじサポート問題もんだいにも対応たいおうした。同様どうようこころみとしてノベルのODI (Open Data-Link Interface) やマイクロソフトのNDIS (Network Driver Interface Specification) といったAPIがある。これらはTCP/IPもふくめたプロトコルスタックの完全かんぜん実装じっそうではないてん重要じゅうようである。したがって、たとえば Crynwr の Russ Nelson が開発かいはつした QVTWinQVT はDECのVT220端末たんまつエミュレータだが、どちらもアプリケーションないにTCP/IPスタックをっていた。packet driver と同時どうじ使つかうことが可能かのうで、たとえばノベルのIPX/SPXNetWareのファイルサーバにアクセスすると同時どうじに、DECのVMSにTCP/IP経由けいゆでアクセスすることが可能かのうであった。あきらかにこのような環境かんきょうがこのプロジェクトの目指めざしたものであり、たとえばパリのOECDなどでそのような使つかわれかたをしていた。

Windows Sockets API を提案ていあんしたのは JSB Software の Martin Hall であり、1991ねん10がつCompuServeでの電子でんし掲示板けいじばんでの議論ぎろん最初さいしょであった。仕様しようだい1はん編集へんしゅうしたのは Martin Hall、Mark Towfiq(Microdyne、のちにサン・マイクロシステムズ)、Geoff Arnold(サン・マイクロシステムズ)、Henry Sanders と J Allard(マイクロソフト)らである。著作ちょさくけん知的ちてき所有しょゆうけんについて議論ぎろんがあり、IETFとおすとか営利えいり団体だんたい結成けっせいするといった議論ぎろんがなされた。結局けっきょく単純たんじゅん著作ちょさくけんは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使つかわれる機能きのうふくまれているが、Winsock 2.0 リリース当時とうじからすですたれつつあるプロトコルであり、いまではこれを使つかうものはほとんどないだろう。マイクロソフト最近さいきんの Windows にはかならこう品質ひんしつTCP/IPスタックを実装じっそうしており、その代替だいたいとなる有力ゆうりょく製品せいひん存在そんざいしない。さらにえば、TCP/IP 以外いがいのプロトコルを実装じっそうしなければならないつよ動機どうき存在そんざいしない。

Windows Sockets はバークレーのソケットもとづいているが、Windows の標準ひょうじゅんプログラミングモデルに対応たいおうするために機能きのう追加ついかしている。Winsock はソケットのほとんどの機能きのうをカバーしているが、Windows と UNIX根本こんぽんてきちがいからどうしてもけられない差異さいしょうじている(とはっても、STREAMSとの差異さいくらべれば、ずっとソケットにちかい)。APIにふくまれるすべての関数かんすうめいあたまにはWSAく。たとえばホストめい参照さんしょうWSAGetHostByName() などである。BSDソケットからの拡張かくちょう特筆とくひつすべきは、「非同期ひどうきソケット」およびオーバーラップI/O利用りようした「オーバーラップソケット」である。非同期ひどうきバージョンの関数かんすうは、接頭せっとうとして WSAAsyncけ、WSAAsyncGetHostByName() などという名前なまえになっており、Windowsのウィンドウメッセージによって結果けっか通知つうちする。非同期ひどうき処理しょりのキャンセルはWSACancelAsyncRequest()実行じっこうする。オーバーラップソケットは完了かんりょう通知つうちWSAEVENTオブジェクトとWSAOVERLAPPED構造こうぞうたい使用しようする。なお、Winsockの非同期ひどうきソケットやオーバーラップソケットは、BSDのノンブロッキングソケットとはことなる概念がいねんである。ブロッキングモードのsend()およびrecv()のタイムアウト時間じかん設定せっていするソケットオプションSO_SNDTIMEOおよびSO_RCVTIMEO使用しようするには、ソケット作成さくせいWSA_FLAG_OVERLAPPED属性ぞくせい設定せっていされている必要ひつようがある[1]。Winsock2では、ソケットは既定きていでブロッキングモードで作成さくせいされる[2]。またBSD互換ごかんsocket()関数かんすう使用しようして作成さくせいされたソケットは、既定きていWSA_FLAG_OVERLAPPED属性ぞくせい[3]

設計せっけい目標もくひょうは、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 もサポートしていた。
Verison 1.1 (1993ねん1がつ
こまかな修正しゅうせい仕様しよう分類ぶんるい重要じゅうよう変更へんこうてんとしては、gethostname() 関数かんすう追加ついかしたてんげられる。
Winsock 2
Winsock 1.1 との互換ごかんせい維持いじしつつ拡張かくちょうしている。プロトコルに独立どくりつした名前なまえ解決かいけつほうをサポート。イベント通知つうち完了かんりょうルーチンによる非同期ひどうき操作そうさサポート。階層かいそうがたプロトコル実装じっそうサポート。マルチキャストQuality of Service複数ふくすうプロトコルサポートも公式こうしきされ、IPX/SPXDECnet明記めいきされた。プロセスあいだでのソケット共有きょうゆう、コネクションの条件じょうけん受理じゅり、ソケットグループ処理しょりなどが可能かのうとなった。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 95Windows NT 3.x では最初さいしょから必須ひっすコンポーネントとして導入どうにゅうされた。
  • Winsock 2 は Windows 95 のアドオンパッケージとして提供ていきょうされた[4]Windows 98および NT 4.0 以降いこう必須ひっすコンポーネントとして導入どうにゅうされている。Windows 3.x や NT 3.x けに Winsock 2 が提供ていきょうされることはなかった。
  • 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 の知的ちてき所有しょゆうけんゆうしている[5]

脚注きゃくちゅう

[編集へんしゅう]

参考さんこう文献ぶんけん

[編集へんしゅう]
  • 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」(さいライセンス) 条件じょうけんもとづいてまれている。

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]
  • Windows Sockets - Winsock のオープンソース実装じっそう(リンクれ)
  • Windows Sockets - Winsock のオープンソース実装じっそう(上記じょうきリンクの2009ねん2がつのスナップショット)
  • Sockets FAQ - Windows Sockets FAQ
  • Windowns Sockets 2.0

その

[編集へんしゅう]