HTTP - HTTPメッセージ
概要
HTTPは、HTML文書等のリソースを取得するためのプロトコルである。
これは、Web上のあらゆるデータ交換の基礎であり、クライアントサーバプロトコルである。
つまり、リクエストは受信者(通常はWebブラウザ)によって開始される。
例えば、テキスト、レイアウト記述、画像、動画、スクリプト等、フェッチされた様々なサブドキュメントから完全なドキュメントが再構築される。
クライアントとサーバは、(データのストリームとは対照的に)個々のメッセージを交換することによって通信する。
クライアント(通常はWebブラウザ)が送信するメッセージはリクエストと呼ばれ、サーバが回答として送るメッセージはレスポンスと呼ばれる。
1990年代初頭に設計されたHTTPは、時代とともに進化してきた拡張可能なプロトコルである。
TCP、または、TLSで暗号化されたTCP接続で送信されるアプリケーション層プロトコルであるが、理論的には信頼性の高いトランスポートプロトコルであれば何でも使用できる。
その拡張性により、ハイパーテキストドキュメントだけでなく、画像や動画を取り込んだり、HTMLフォームの結果のようにコンテンツをサーバに投稿したりするのにも使用される。
また、HTTPはオンデマンドでWebページを更新するために、文書の一部をフェッチするのにも使用される。
HTTPの流れ
クライアントがサーバ (最終サーバ、または、中間プロキシ) と通信する場合、以下のような手順で実行される。
- TCPコネクションを開く。
- TCPコネクションは、リクエストを送信して、その回答 (レスポンス) を受信するために使用される。
- クライアントは、新しいコネクションを開いたり、既存のコネクションを再利用したり、サーバへの複数のTCPコネクションを開いたりすることができる。
- HTTPメッセージを送信する。
- HTTPメッセージ (HTTP/2以前) は人間が読むことができる。
- HTTP/2では、これらの単純なメッセージはフレームにカプセル化され、直接読むことは不可能であるが、原理は変化していない。
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
- サーバから送信されたレスポンスを読む。
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html>… (here come the 29769 bytes of the requested web page)
- 接続を閉じる、または、次のリクエストのために再利用する。
HTTPメッセージ
HTTP/1.1以前で定義されたHTTPメッセージは、人間が読むことができる。
HTTP/2では、これらのメッセージはフレームというバイナリ構造に埋め込まれ、ヘッダの圧縮や多重化などの最適化が可能になる。
元のHTTPメッセージの一部のみがHTTP/2で送信されたとしても、各メッセージのセマンティクスは変更されず、クライアントは元のHTTP/1.1リクエストを (仮想的に) 再構成する。
したがって、HTTP/1.1形式でHTTP/2メッセージを理解することは有用である。
HTTPメッセージには、HTTPリクエストとHTTPレスポンスの2種類があり、それぞれ独自の書式をもつ。
HTTPリクエストの構成
HTTPリクエストは、以下の要素で構成される。
- HTTPメソッド
- GET、POST、DELETE、OPTIONS、HEADがあり、クライアントが実行する操作を定義する。
- 例えば、クライアントがリソースをフェッチする場合 (GET)、または、HTMLフォームの値をポストする場合 (POST) 等がある。
- フェッチするリソースのパス
- コンテキストから明らかな要素、例えば、プロトコル (http://)、ドメイン (developer.mozilla.org)、TCPポート (80番) を取り除いたリソースのURLである。
- HTTPプロトコルのバージョン
- サーバに追加情報を伝えるオプションのヘッダ
- POSTのようないくつかのメソッドでは、送信されたリソースを含むレスポンスと似たボディ
HTTPレスポンスの構成
HTTPレスポンスは、以下の要素で構成される。
- HTTPプロトコルのバージョン
- HTTPリクエストが成功したか否か、および、その理由を示すステータスコード
- ステータスメッセージ、ステータスコードの非正規の短い説明
- HTTPリクエストと同様のHTTPヘッダ
- オプションとして、取得したリソースを含むボディ