[Edit][Create New]
[ IndexPage / ネットとプログラミング / web296 / No40.txt ]

No40.txt

さて、前回までは、2ちゃんねる閉鎖騒動解決の1手段として、gzip導入の方法
を解説してきました。引き続き今回からは、キャッシュを有効にすることによっ
て行う転送量削減問題について解説していきます。

Webを利用する際、まずキャッシュとは何かという事を解説しましょう。ご存
知の通り、Web(ひいてはHTTP)では、ブラウザ等のユーザーエージェントが、
Webサーバーと呼ばれるサーバーアプリケーションに対してリクエストを出し、
サーバー側がリクエストに沿ったレスポンスを返すという単純な構造が採用さ
れています。

ここで、Webを利用していると、多くのサーバー側が返すレスポンス(返答)は、
HTMLドキュメントや、GIFイメージなど、一度変更したらしばらく変更される
ことがないものが非常に多いことに気付くでしょう。これら全く同じデータを、
何度も何度もダウンロードするのは、全くの回線の無駄と言えます。

HTTPの初期バージョンであるHTTP/0.9が主流だった当時は、この問題を解決す
るために、ブラウザ側にある機能が取り付けられました。

一度ダウンロードしたファイルは、ブラウザ側の、つまりユーザーのハード・
ディスクに蓄えられ、次回同じファイルのリクエストがあった場合は、サーバー
へは全くリクエストを送らず、代わりにハード・ディスクに取っておいた古い
ファイルを表示するようにしたのです。

この仕組みは、一般にキャッシュ(cache = 貯蔵所・備蓄物)と呼ばれます。

ただ、このブラウザ側でのみ対応したキャッシュ・システムには重大な欠陥が
ありました。ブラウザは、ハードディスクにキャッシュのファイルがあると、
サーバーへは全くリクエストを送らないので、当然サーバー側のファイルが新
しくなっていても、ブラウザ側は全く気付く事ができません。

つまり、サーバー側のファイルが更新されていても、ユーザー側のブラウザに
表示されているファイルは古いまま、という現象が頻発したわけです。そのた
め、昔のユーザーは、Webページにアクセスするとまず最初にリロードボタン
を押す、という、本末転倒な作業を行っていました。

時間が流れ、現在のHTTP/1.1では、この問題を解決するために新しいHTTPヘッ
ダが付加されています。それが、

If-Modified-Since: (日時)

ヘッダです。直訳すると「もし、(日時)以降に変更があれば……」といった所
でしょうか。ブラウザ側がこのヘッダを付けてリクエストを送信すると、サー
バー側は、サーバー側のファイルの最終更新時刻を調べ、それが(日時)よりも
新しければファイルを送信、そうでなければ何も送らずキャッシュを使うよう
にWebブラウザに指示することができるのです。ちょうど、

ブラウザ「xx月xx日より新しいファイル持ってない?」
サーバー「持ってないからキャッシュを使ってよ」

というようなやり取りが行われるわけです。

今回は、キャッシュの仕組みについてざっと解説しました。騒動以前の2ちゃ
んねるでは、この仕組みがうまく働いていなかったわけですが、次回からは、
それは一体なぜなのか、また、どういう対策が必要で実際にはどういった対策
が取られたのか、等について解説していく予定です。