情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

サーバサイドウェブ開発基礎 HTTP詳説 接続や通信の制御

HTTPで接続や通信を制御する方法について解説します。

Connectionヘッダフィールド

ConnectionヘッダフィールドはHTTPリクエストやHTTPレスポンスにおいて設定できるヘッダフィールドであり、クライアントサーバ間の接続や通信に対してオプションを適用するために使用することができます。

Connectionヘッダフィールドの値には接続や通信に対して適用する1個以上のオプションのリストを,区切りで指定します。

オプションには下のようなものがあります。

  • close
  • upgrade
  • te

オプションの大文字と小文字は区別されませんが、小文字のみを使用するべきであり、大文字は使用するべきではありません。

closeオプション

closeオプションはサーバやクライアントが現在のHTTPレスポンスか現在のHTTPリクエストに対応するHTTPレスポンスの送信が完了した後にクライアントサーバ間の接続を閉じることをクライアントやサーバに要求するために使用することができます。

これにより、何もしなければ開いたままであり続けるクライアントサーバ間の接続を適切な時に閉じることができます。

サーバはConnectionヘッダフィールドの値にcloseオプションが指定されているHTTPリクエストを受け取った場合には自身もConnectionヘッダフィールドの値にcloseオプションを指定したHTTPレスポンスを返信するようにします。

サーバがConnectionヘッダフィールドの値にcloseオプションを指定したHTTPレスポンスを返信した場合にはクライアントとサーバはクライアントサーバ間の接続を閉じなければなりません。

upgradeオプション

upgradeオプションはクライアントが以降の通信を別のプロトコルに移行することをサーバに要求するために使用することができます。

これにより、何もしなければHTTP/1.1で行われるクライアントサーバ間の通信をHTTPの別のバージョンやその他のプロトコルで行うようにすることができます。

クライアントはConnectionヘッダフィールドの値にupgradeオプションを指定した場合にはUpgradeヘッダフィールドも設定しなければなりません。

このUpgradeヘッダフィールドの値にはクライアントが移行を要求する1個以上のプロトコルのリストを,区切りで指定します。また、プロトコルの後には/に続けてバージョンを指定することもできます。

サーバはConnectionヘッダフィールドの値にupgradeオプションが指定されているHTTPリクエストを受け取った場合には通信をUpgradeヘッダフィールドの値として指定されているプロトコルのリスト中の1つか2つ以上のプロトコルに移行するか、あるいは、移行しないかを決定しなければなりません。

そして、通信を別のプロトコルに移行することを決定した場合にはステータスコードが101Switching Protocols)でUpgradeヘッダフィールドの値に移行する1個以上のプロトコルのリストを,区切りで指定したHTTPレスポンスを返信するようにします。

そして、以降の通信は移行後のプロトコルで行うようにします。ただし、この場合、先に受け取ったHTTPリクエストに対する移行後のプロトコルにおける返信を最初に行わなければなりませんので注意してください。

また、通信を別のプロトコルに移行しないことを決定した場合にはHTTPリクエストに対する通常の処理を行うようにします。

Upgradeヘッダフィールド

Upgradeヘッダフィールドはサーバがどのようなプロトコルをサポートしているかをクライアントに通知するために使用することもできます。

このUpgradeヘッダフィールドの値にはサーバがサポートしている1個以上のプロトコルのリストを,区切りで指定します。

サーバは以降の通信を別のプロトコルに移行することが必要である場合にはステータスコードが426Upgrade Required)でUpgradeヘッダフィールドの値に移行することが可能な1個以上のプロトコルのリストを指定したHTTPレスポンスを返信するようにします。

teオプション

teオプションはHTTPリクエストやHTTPレスポンスのボディにトランスファーコーディングを使用した場合に使用しなければならないオプションです。

クライアントはConnectionヘッダフィールドの値にteオプションを指定した場合にはTransfer-Encodingヘッダフィールドも設定しなければなりません。

Transfer-Encodingヘッダフィールド

Transfer-Encodingヘッダフィールドはボディを含むHTTPリクエストやHTTPレスポンスにおいて設定するヘッダフィールドであり、クライアントやサーバがトランスファーコーディングを使用してボディを送信する場合にボディを送信する前に送信しなければならないヘッダフィールドです。

Transfer-Encodingヘッダフィールドの値にはボディに使用する1個以上のトランスファーコーディングのリストを,区切りで順番に指定します。

Trailerヘッダフィールド

Trailerヘッダフィールドはボディを含むHTTPリクエストやHTTPレスポンスにおいて設定するヘッダフィールドであり、クライアントやサーバがボディを送信し終わった後に追加でヘッダフィールドを送信する場合にボディを送信する前に送信しなければならないヘッダフィールドです。

Trailerヘッダフィールドの値にはボディを送信し終わった後に追加で送信する1個以上のヘッダフィールドのフィールド名のリストを,区切りで指定します。

Content-Lengthヘッダフィールド

Content-Lengthヘッダフィールドはボディを含むHTTPリクエストやHTTPレスポンスにおいて設定するヘッダフィールドであり、ボディの送信にトランスファーコーディングを使用しない場合に必ず送信しなければならないヘッダフィールドです。

Content-Lengthヘッダフィールドの値にはボディの長さをバイト単位の10進数として指定します。

サーバはボディの送信にトランスファーコーディングを使用していないにも拘らずContent-Lengthヘッダフィールドが設定されていないHTTPリクエストを受け取った場合にはステータスコードが411Length Required)のHTTPレスポンスを返信するようにします。

TEヘッダフィールド

TEヘッダフィールドはHTTPリクエストにおいて設定できるヘッダフィールドであり、クライアントがどのようなトランスファーコーディングをサポートしているかをサーバに通知するために使用することができます。

また、クライアントがボディを受け取り終わった後に追加でヘッダフィールドを受け取ることが可能であるかをサーバに通知するために使用することもできます。

TEヘッダフィールドの値には1個以上のトランスファーコーディングかtrailersのリストを,区切りで指定します。ただし、chunkedは全てのクライアントがサポートしていなければならないトランスファーコーディングですので、指定することはできません。

trailersはクライアントがボディを受け取り終わった後に追加でヘッダフィールドを受け取ることが可能であることを示します。

また、トランスファーコーディングには優先度を付加することができます(trailersに優先度を付加することはできません)。

優先度は0から1までの小数点以下3桁の値であり、値が大きいほど優先度が高いことを表します。ただし、優先度が0のトランスファーコーディングはクライアントがそのトランスファーコーディングをサポートしていないことを表します。デフォルトは1です。

トランスファーコーディングに優先度を付加する場合にはトランスファーコーディングの末尾に;q=と優先度を付加します。qは大文字でも構いませんが、小文字にすべきです。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-http, web