Logo address

技術ノート

目次

2002/04/26
Pegasus/1.0 はユーザドキュメント扱いにバグを持っていた。このバグは HTTP1.1 における持続的接続の問題と関連している。(Pegasus/1.0a では解決しています)

ユーザドキュメント

実ホストの URI を ar.aichi-u.ac.jpalicear.aichi-u.ac.jp のユーザ、 /usr/alice/web/docalice のドキュメントルートとする。
この下で URI
	http://ar.aichi-u.ac.jp/~alice/index.html
でアクセスされるファイル
	/usr/alice/web/doc/index.html                 (1)
の中の記述
	<img src="/image/logo.gif">                   (2)
について考える。この中の
	/image/logo.gif
は何を指しているか?

HTTP のルールでは、(2)は URI が

	http://ar.aichi-u.ac.jp/image/logo.gif
で示されるドキュメントを指している。つまり実ホストのファイルであり alice のファイル
	/usr/alice/web/doc/image/logo.gif              (3)
ではない。(3)のファイルを(1)で指定するには(2)ではなく
	<img src="/~alice/image/logo.gif">
とする必要がある。

実は筆者はうっかりと(2)でドキュメントを書いていた。ドキュメントを作成する立場から考えると自分のドキュメントルートを "/" で書きたくなるのである。(とりわけ Pegasus では)
そしてそのように書いても誤りが露呈しなかったのは、幸運が重なったからである。即ち、Pegasus/1.0 を HTTP/1.1 のクライアントからアクセスした場合には、持続的接続の結果として、alice のドキュメント空間の中の "/image/logo.gif" を取りに行く。

Pegasus/1.0 の誤りは(1)の中で

	<a href="http://ar.aichi-u.ac.jp">ar.aichi-u.ac.jp</a>
と書いた場合に露呈する。alice のドキュメント空間から抜け出せないのである。同様に実ホストのドキュメントの中で
	<a href="http://ar.aichi-u.ac.jp/~alice/">alice のページ</a>
としても alice のページへは飛べないであろう。

持続的接続を何時断ち切るか?

HTTP/1.1 では接続は原則として持続的に行う。そしてクライアントとサーバの何れかが接続を閉じる要求を出せば(あるいは閉じてしまえば)持続的接続は終了する。

筆者は過度な持続的接続は好まない。メモリの無駄使いになるからである。1つのページを表示するに必要なファイルが転送されれば接続を切って欲しい。しかしサーバは HTML ファイルを解析してクライアントに転送する訳ではないので、切断のタイミングの採り方は実際上クライアントに任せられる。そして、ひたすら接続を維持するクライアントが存在する(IE6.0 など)。

Pegasus においては持続的接続をサーバ側で断ち切るタイミングを捕らえる事が必要である。何故なら Pegasus のような特殊なサーバが存在することをクライアントは知らない。

	http://ar.aichi-u.ac.jp/~alice

	http://ar.aichi-u.ac.jp/
と接続を共有していても構わないとクライアントは判断するであろう。

Pegasus は持続的接続に対して次のルールを採用する。