2006 年 9 月 17 日 23 時 28 分

持続性接続の実験


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真]


持続性接続がどれくらい影響を与えているか
実際の通信でためしてみよう。

以下のページには画像を掲載しているが、
画像を 8 x 6 に分割して表に配置している。
このページを読み込むためには、
HTML と 画像 48 個の 49 回の通信が必要である。

■細切れ画像のテストページ
http://loafer.jp/mixi/image-grid/

最近の Web ブラウザは、HTTP 1.1 に対応している。
通常、HTTP 1.0 を使うメリットはないため、
純粋な HTTP 1.0 を使って通信されるのは難しい。

今日は、Internet Explorer を使おう。
インターネットオプションの詳細設定には、
「HTTP 1.1 設定」という項目があり、
1.0 と 1.1 を切り替えて試すことができる。

しかしながら、Internet Explorer は、
たとえ HTTP 1.0 で通信する設定にしても、
拡張機能として持続性接続を行う能力をもつ。
これをオフにするのは困難だ。

幸い、Fiddler をプロキシとして介在させることにより、
Fiddler と Web ブラウザの間で、
HTTP 1.1 と、1.0 に近い動作を切り替えることができる。

Fiddler は既定で Web サーバと間に持続性接続を使うので、
Web サーバに過度の負担を掛けずにテストが可能だ。

最初は、インターネットオプションの詳細設定で、
HTTP 1.1 関係のチェックを両方オンにする。
そして、キャッシュを全てクリアしておく。

Fiddler を起動し、Internet Explorer で、
上記の URL にアクセスしてみる。
回線速度やサーバの負荷にもよるので一概には言えないが、
画像は左上から順番にさささっと表示されるはずだ。

持続性接続が有効かどうか netstat で調べてみよう。

C:\>netstat

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    ironeagle:8888        localhost:3654        ESTABLISHED
  TCP    ironeagle:3654        localhost:8888        ESTABLISHED
  TCP    ironeagle:3658        loafer.jp:http  ESTABLISHED

上記は、関係する項目だけ抜き出している。
ポート 8888 は Fiddler の待機ポートだ。

上の 2 行は Web ブラウザと Fiddler の接続である。
両方このコンピュータの接続なので、2 つの接続が表示されている。
そして、下の 1 行が Fiddler と Web サーバとの接続である。

このケースでは、Web ブラウザと、Fiddler、
そして Fiddler と Web サーバとの間には、
1 つの TCP 接続しか行われていないことになる。

では、次に、HTTP 1.0 で試してみよう。

インターネットオプションの詳細設定で、
HTTP 1.1 関係のチェックを両方オフにする。
そして、忘れずにキャッシュをクリアしておく。

念のため、Fiddler を再起動し、
上記の URL にアクセスしてみる。
今度は、先ほどよりも少しだけもたつくはずだ。

同様に、 netstat で調べてみよう。

C:\>netstat

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    ironeagle:4946        localhost:8888        ESTABLISHED
  TCP    ironeagle:8888        localhost:4880        TIME_WAIT
  TCP    ironeagle:8888        localhost:4882        TIME_WAIT
  TCP    ironeagle:8888        localhost:4883        TIME_WAIT
  TCP    ironeagle:8888        localhost:4886        TIME_WAIT
  TCP    ironeagle:8888        localhost:4888        TIME_WAIT
  TCP    ironeagle:8888        localhost:4890        TIME_WAIT
  TCP    ironeagle:8888        localhost:4892        TIME_WAIT
  TCP    ironeagle:8888        localhost:4894        TIME_WAIT
  TCP    ironeagle:8888        localhost:4896        TIME_WAIT
  TCP    ironeagle:8888        localhost:4898        TIME_WAIT
  TCP    ironeagle:8888        localhost:4899        TIME_WAIT
  TCP    ironeagle:8888        localhost:4902        TIME_WAIT
  TCP    ironeagle:8888        localhost:4903        TIME_WAIT
  TCP    ironeagle:8888        localhost:4906        TIME_WAIT
  TCP    ironeagle:8888        localhost:4907        TIME_WAIT
  TCP    ironeagle:8888        localhost:4910        TIME_WAIT
  TCP    ironeagle:8888        localhost:4912        TIME_WAIT
  TCP    ironeagle:8888        localhost:4914        TIME_WAIT
  TCP    ironeagle:8888        localhost:4915        TIME_WAIT
  TCP    ironeagle:8888        localhost:4918        TIME_WAIT
  TCP    ironeagle:8888        localhost:4919        TIME_WAIT
  TCP    ironeagle:8888        localhost:4922        TIME_WAIT
  TCP    ironeagle:8888        localhost:4923        TIME_WAIT
  TCP    ironeagle:8888        localhost:4926        TIME_WAIT
  TCP    ironeagle:8888        localhost:4927        TIME_WAIT
  TCP    ironeagle:8888        localhost:4930        TIME_WAIT
  TCP    ironeagle:8888        localhost:4932        TIME_WAIT
  TCP    ironeagle:8888        localhost:4934        TIME_WAIT
  TCP    ironeagle:8888        localhost:4935        TIME_WAIT
  TCP    ironeagle:8888        localhost:4938        TIME_WAIT
  TCP    ironeagle:8888        localhost:4939        TIME_WAIT
  TCP    ironeagle:8888        localhost:4942        TIME_WAIT
  TCP    ironeagle:8888        localhost:4943        TIME_WAIT
  TCP    ironeagle:8888        localhost:4946        ESTABLISHED
  TCP    ironeagle:8888        localhost:4948        TIME_WAIT
  TCP    ironeagle:8888        localhost:4950        TIME_WAIT
  TCP    ironeagle:8888        localhost:4952        TIME_WAIT
  TCP    ironeagle:8888        localhost:4954        TIME_WAIT
  TCP    ironeagle:8888        localhost:4956        TIME_WAIT
  TCP    ironeagle:8888        localhost:4958        TIME_WAIT
  TCP    ironeagle:8888        localhost:4960        TIME_WAIT
  TCP    ironeagle:8888        localhost:4962        TIME_WAIT
  TCP    ironeagle:8888        localhost:4964        TIME_WAIT
  TCP    ironeagle:8888        localhost:4966        TIME_WAIT
  TCP    ironeagle:8888        localhost:4968        TIME_WAIT
  TCP    ironeagle:8888        localhost:4970        TIME_WAIT
  TCP    ironeagle:8888        localhost:4972        TIME_WAIT
  TCP    ironeagle:8888        localhost:4974        TIME_WAIT
  TCP    ironeagle:8888        localhost:4976        TIME_WAIT
  TCP    ironeagle:4947        loafer.jp:http  ESTABLISHED

一目瞭然である。

最後の行が、Fiddler と Web サーバとの接続である。
上でも説明したが、Fiddler は持続性接続を利用しているため、
Web サーバに対しては、1 接続しか行われていない。

さて、最後以外の ESTABLISHED 行は、
Web ブラウザと Fiddler で進行中の接続である。
この例では、最後の画像をダウンロードした瞬間である。

残りの TIME_WAIT(切断待機状態)の表示は
既にデータの転送が終了し、双方とも接続を閉じた後のものである。
これは接続が終わったことを示している。

つまり、現在通信中のものと合わせて、
49 回 TCP 接続が行われていることがわかる。

最近のパソコンは、TCP の実装性能が向上しているので、
持続性接続の有無の差が感じられない場合もあるが、
TCP による接続・切断の差があるのは明らかである。

TCP には、その接続の通信を切断する場合、
最初にデータ転送を終了した方が、
切断待機状態となり、しばらくはそのポートを使えなくなる。

HTTP の場合、通常サーバ側から切断することが多いため、
持続性接続を使わない場合、パフォーマンスだけでなく、
再利用できない TCP ポートが増える原因にもなる。
どんな性能の良いサーバでも、ポートの数は限られているため、
Web サーバの最大限の性能を引き出すためにも、
HTTP 1.1 の役割は重要なのである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.