2006年10月23日

WindowsのHTTPスタック

今日はWindowsのHTTPスタックを紹介します。

HTTPスタックとは、HTTPを使うための各種ライブラリを集めたものです。 図を書くと、各レイヤのライブラリを積み重ねたように見えるので、スタックと呼ぶのだそうです。
アプリケーションレイヤから見ると単なるライブラリに見えますけどね。

Windowsには、WinInetとWinHttpの2つのHTTPスタックがあります。 この2つのHTTPスタックの特徴を紹介します。

WinInet

古いHTTPスタックですが、今でも広く使われています。 インターフェースはInternetOpenやInternetReadFileなどいくつかのWin32APIから構成されています。 プロキシ設定はInternetExplorerの設定から行います。HTTPだけではなく、FTPやGopherも使えます。

WinInetを使っているライブラリやツールは、以下のようなものがあります。

  • MFCのCInternetSession、CHttpConnection クラスなど
  • XMLHTTP ActiveX オブジェクト。Ajaxで使うときもありますね。(情報源)
  • Internet Explorerのバージョン6.0以下(7.0は分かりません)

また、以下のような制約やバグを抱えています。

  • サーバあたりの接続数が2~4に制限されています。(情報源)
    サーバあたりの、とありますが、複数サーバにアクセスするアプリケーションでもこの制約があるのを見たことがあるので、もうちょっと範囲は広いのかもしれません。
  • Internet Explorerの設定次第では、HTTP 1.0が使えません。(情報源)
    おかげでHTTP 1.0が必須ときは苦労します。
  • HTTP 1.1を使い、エンコード方式がchunkedのデータを受信しているときに、接続を強制中断するとハングすることがあります。(情報源)
    個人的にはこれがWinInetの最悪のバグだと思います。 このバグのため、タイムアウト機能が必要なアプリケーションでは、HTTP 1.1が使えません。

私にとってはつきあいの長いHTTPスタックですが、バグや制約が厳しいので、そろそろお別れしたいです。

WinHttp

新しいスタックですが、あまり広く使われていません。 インターフェースはWinHttp ActiveX オブジェクトが提供しています。 プロキシ設定は、proxycfgというWindows同梱のコマンドラインツールを使って行います。WinInetと違い、HTTPしか使えません。

WinHttpを使っているライブラリやツールは、以下のようなものがあります。

  • Windows UpdateやWindows インストーラ(情報源)
  • ServerXMLHTTP ActiveX オブジェクト(情報源)

WinHttpの制約やバグはちょっと分かりません。WinInetが抱えている制約やバグは大体解決されているようです。

私にとっては今後お付き合いしたいHTTPスタックです。WinInetのバグにはもう近づきたくありません。 プロキシ設定がちょいと面倒なのが難点ですけどね。

一応最後に細くしておきますが、上記のバグやライブラリなどは、私が開発をしていく中で見つけたものなので、網羅的に探したものではありません。 抜けはそれなりにあると思いますのでご注意下さい。

投稿者 MASATO : 2006年10月23日 07:45 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?