連載
» 2016年05月11日 05時00分 公開

「HTTP」の仕組みをおさらいしよう(その3)リトライ! 触って学ぶTCP/IP(4)(3/4 ページ)

[福永勇二(インタラクティブリサーチ),@IT]

Keep-Aliveの動作

 HTTPの基本的な動作では、「リクエストのたびに接続を確立し、1つのレスポンスを返したら接続を切る」ということを繰り返します。

 実際のWebページを見ると、そこには文字以外に複数の要素(写真、画像、音楽など)が含まれており、1つの画面を表示するにはこれら全てをサーバから取得する必要があります。そのため、Webページを見るときには通常、HTTPのリクエストを何度か繰り返して、必要な全ての情報をサーバから取得します。

 図7 HTMLを取得した後に、更にWebページ中の要素を取得するイメージ 図7 HTMLを取得した後に、さらにWebページ中の要素を取得するイメージ

 しかしながら、HTTPのリクエストとレスポンスを1つやりとりするたびに、いちいち接続を準備して切断することを繰り返すのは、明らかな無駄です。

 そこで、現在最も多く使われているバージョンのHTTP(HTTP 1.1)では、この無駄を省く仕組みが用意されています。具体的には、特に指定がない限り、レスポンスを返した後に接続を維持し、次のリクエストを送るときは、保持している接続をそのまま再利用してリクエストを送ることができるようになっています。接続を切らずに保持しておくこの動作は、「Keep-Alive」と呼ばれます。

 逆に、Keep-Aliveを無効にしたい、つまりレスポンスを返したらすぐに接続を切りたい場合は、リクエストヘッダに次の項目を加えます。

 図8 Keep-Aliveを無効にするヘッダ 図8 Keep-Aliveを無効にするヘッダ

 リクエストにこのヘッダが含まれていると、レスポンスを返した後、その接続は切断されます。また、レスポンスヘッダにも、これと同じ項目が加わります。

Keep-Aliveの動作を試してみよう

 Keep-Aliveの動作は、プロトコルビュワーを使って観察することができます。

Keep-Aliveが有効であることを確認しよう

 図9のように、2つのリクエストをプロトコルビュワーの「送信文字」欄に書いてサーバに送ると、Keep-Aliveが有効であることを簡単に確認できます。1つ目のリクエストでは「/rtcp/p00/」の中のデフォルトドキュメントを取得し、2つ目のリクエストでは「/rtcp/p00/test.html」を取得します。

 図9 Keep-Aliveの動作を確かめるためのリクエスト 図9 Keep-Aliveの動作を確かめるためのリクエスト

 サーバに接続した後、1行目、2行目と送信していき、3行目(空行)を送信して1つ目のリクエストが終わると、サーバからレスポンスが返ってきます。そのままさらに4行目、5行目、6行目と送信すると、2つ目のリクエストに対するレスポンスがサーバから返ってくることが確認できます。

図10 2つのリクエストを続けて送ったときのプロトコルビュワーの様子 図10 2つのリクエストを続けて送ったときのプロトコルビュワーの様子

 このように、Keep-Aliveが有効な状態(デフォルト)では、1度接続を作れば、複数のリクエストを続けて処理できます。

図11 接続を切らないまま2つのリクエスト、レスポンスが処理された 図11 接続を切らないまま2つのリクエスト、レスポンスが処理された

 なお、Keep-Aliveを使うと接続を切らすに複数のレスポンスを受信するため、プログラムで通信結果を処理するときなどには、各レスポンスの境目を上手に判定する必要があります。

 この判定には、レスポンスヘッダに含まれる「Content-Length」の値を使います。この値はメッセージ本体のサイズ(バイト単位)を示していますので、そのサイズ分のデータをメッセージ本体として処理します。そして、それ以降の部分は、後続する別のレスポンスとして取り扱います。こうすることで、レスポンスの切れ目をうまく処理することができます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。