ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

手作りネットプロトコル工房コミュの【HTTP】Connection: Keep-Aliveについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
HTTPサーバー/HTTP.PROXYサーバーを作成するに当たり、 HTTP/1.1とHTTP/1.0間の互換性を取るため、Connection:Keep-Aliveをめぐる実装が複雑になるようだ。

わかった事

1.Connection: Keep-Alive
Keep-Aliveを指定すると、データ取得した後、コネクションが切断されない。 この機能は HTTP/1.1ではデフォルトであり、実装が必須。

2. HTTP/1.0では Keep-Aliveの仕様策定が不完全である。
HTTP/1.0は メッセージボディーの終了をコネクションの切断を持って判定しているため、Keep-Aliveを利用するとメッセージボディーがどこで終わるかわからない。

3. Transfer-Encoding: chunked とはなにか。
メッセージボディーをいくつかのデータ塊に分ける為のフォーマット。 これはHTTP/1.1で実装が必須となっている。

4. HTTP/1.1で 何故 chunkedが必須なのか。
僕がメンテしてる会社の鯖、Apache/1.3.33 (Unix)の動作を観察した。

☆静的HTMLの場合

リクエスト
  String version = "HTTP/1.1";
  String connection = "Keep-Alive";
レスポンス
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 01:39:22 GMT
  Server: Apache/1.3.33 (Unix) ...
  Last-Modified: Tue, 29 Nov 2005 00:36:17 GMT
  ETag: "a41c020-71b-438ba281"
  Accept-Ranges: bytes
  Content-Length: 1819
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Content-Type: text/html



リクエスト
  String version = "HTTP/1.0";
  String connection = "Keep-Alive";
レスポンス
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 01:46:09 GMT
  Server: Apache/1.3.33 (Unix) ...
  Last-Modified: Tue, 29 Nov 2005 00:36:17 GMT
  ETag: "a41c020-71b-438ba281"
  Accept-Ranges: bytes
  Content-Length: 1819
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Content-Type: text/html


リクエスト
  String version = "HTTP/1.1";
  String connection = "close";
レスポンス
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 01:46:53 GMT
  Server: Apache/1.3.33 (Unix) ...
  Last-Modified: Tue, 29 Nov 2005 00:36:17 GMT
  ETag: "a41c020-71b-438ba281"
  Accept-Ranges: bytes
  Content-Length: 1819
  Connection: close
  Content-Type: text/html

リクエスト
  String version = "HTTP/1.0";
  String connection = "close";
レスポンス
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 01:47:36 GMT
  Server: Apache/1.3.33 (Unix) ...
  Last-Modified: Tue, 29 Nov 2005 00:36:17 GMT
  ETag: "a41c020-71b-438ba281"
  Accept-Ranges: bytes
  Content-Length: 1819
  Connection: close
  Content-Type: text/html


☆動的なCGIの場合

リクエスト ...
  HTTP/1.1
  Connection:Keep-Alive
レスポンス...
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 00:34:36 GMT
  Server: Apache/1.3.33 (Unix) ...
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Transfer-Encoding: chunked
  Content-Type: text/html

リクエスト
  HTTP/1.0
  Connection:Keep-Alive
レスポンス
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 00:39:25 GMT
  Server: Apache/1.3.33 (Unix) ...
  Connection: close
  Content-Type: text/html

リクエスト
  HTTP/1.1
  Connection: close
レスポンス
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 00:40:21 GMT
  Server: Apache/1.3.33 (Unix) ...
  Connection: close
  Transfer-Encoding: chunked
  Content-Type: text/html

リクエスト
  HTTP/1.0
  Connection: close
レスポンス
  HTTP/1.1 200 OK
  Date: Wed, 04 Jan 2006 00:41:09 GMT
  Server: Apache/1.3.33 (Unix) ...
  Connection: close
  Content-Type: text/html



(この確認に使ったプログラム、欲しかったら言ってください J2SE5.0/Eclipse3.2)

これを見ている限りだと、HTTP/1.0でConnectin:Keep-Aliveをやろうとすると、レスポンスは強制的にHTTP/1.1とするようだ。 これはHTTP/1.0でKeep-Aliveの実装が不完全だというrfcの記述を裏付けている。

更に CGI時はContent-Lengthが予測できないため出力できない。 Keep-Alive時は Content-Lengthがないとメッセージボディーの終わりを検出できないため、困る。

そこで、Transfer-Encoding: chunked とすると メッセージボディー内にメッセージボディーの長さを含めることが出来ることを利用してこれを解決しているらしい。



rfcをもっと詳細に見ていかないといけないものの、実際のところはrfcでもまだまだあいまいさが残っているらしく、実働しているアプリの動作を確認しないと、rfc通りなのに動かないということもありえるようだ。この辺はより経験をつむごとに明らかになっていくだろう。

不要な機能は実装せず詳細に踏み込まないで済ませたいが、Keep-Aliveは必要なので 頑張るしかない。

コメント(1)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

手作りネットプロトコル工房 更新情報

手作りネットプロトコル工房のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング