「HTTP - HTTPメッセージ」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == HTTPは、HTML文書等のリソースを取得するためのプロトコルである。<br> これは、Web上のあらゆるデータ交換の基礎であり、クライアントサーバプロトコルである。<br> <br> つまり、リクエストは受信者(通常はWebブラウザ)によって開始される。<br> 例えば、テキスト、レイアウト記述、画像、動画、スクリプト等、フェッチされた様々なサブ…」)
 
26行目: 26行目:
#: HTTP/2では、これらの単純なメッセージはフレームにカプセル化され、直接読むことは不可能であるが、原理は変化していない。
#: HTTP/2では、これらの単純なメッセージはフレームにカプセル化され、直接読むことは不可能であるが、原理は変化していない。
#: <br>
#: <br>
#: GET / HTTP/1.1
#: <code>GET / HTTP/1.1</code>
#: Host: developer.mozilla.org
#: <code>Host: developer.mozilla.org</code>
#: Accept-Language: fr
#: <code>Accept-Language: fr</code>
#: <br>
#: <br>
# サーバから送信されたレスポンスを読む。
# サーバから送信されたレスポンスを読む。
#: <br>
#: <br>
#: HTTP/1.1 200 OK
#: <code>HTTP/1.1 200 OK</code>
#: Date: Sat, 09 Oct 2010 14:28:02 GMT
#: <code>Date: Sat, 09 Oct 2010 14:28:02 GMT</code>
#: Server: Apache
#: <code>Server: Apache</code>
#: Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
#: <code>Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT</code>
#: ETag: "51142bc1-7449-479b075b2891b"
#: <code>ETag: "51142bc1-7449-479b075b2891b"</code>
#: Accept-Ranges: bytes
#: <code>Accept-Ranges: bytes</code>
#: Content-Length: 29769
#: <code>Content-Length: 29769</code>
#: Content-Type: text/html
#: <code>Content-Type: text/html</code>
#: <br>
#: <br>
#: <!DOCTYPE html>… (here come the 29769 bytes of the requested web page)
#: <!DOCTYPE html>… (here come the 29769 bytes of the requested web page)

2024年1月26日 (金) 23:21時点における版

概要

HTTPは、HTML文書等のリソースを取得するためのプロトコルである。
これは、Web上のあらゆるデータ交換の基礎であり、クライアントサーバプロトコルである。

つまり、リクエストは受信者(通常はWebブラウザ)によって開始される。
例えば、テキスト、レイアウト記述、画像、動画、スクリプト等、フェッチされた様々なサブドキュメントから完全なドキュメントが再構築される。

クライアントとサーバは、(データのストリームとは対照的に)個々のメッセージを交換することによって通信する。
クライアント(通常はWebブラウザ)が送信するメッセージはリクエストと呼ばれ、サーバが回答として送るメッセージはレスポンスと呼ばれる。

1990年代初頭に設計されたHTTPは、時代とともに進化してきた拡張可能なプロトコルである。
TCP、または、TLSで暗号化されたTCP接続で送信されるアプリケーション層プロトコルであるが、理論的には信頼性の高いトランスポートプロトコルであれば何でも使用できる。
その拡張性により、ハイパーテキストドキュメントだけでなく、画像や動画を取り込んだり、HTMLフォームの結果のようにコンテンツをサーバに投稿したりするのにも使用される。

また、HTTPはオンデマンドでWebページを更新するために、文書の一部をフェッチするのにも使用される。


HTTPの流れ

クライアントがサーバ (最終サーバ、または、中間プロキシ) と通信する場合、以下のような手順で実行される。

  1. TCPコネクションを開く。
    TCPコネクションは、リクエストを送信して、その回答 (レスポンス) を受信するために使用される。
    クライアントは、新しいコネクションを開いたり、既存のコネクションを再利用したり、サーバへの複数のTCPコネクションを開いたりすることができる。
  2. HTTPメッセージを送信する。
    HTTPメッセージ (HTTP/2以前) は人間が読むことができる。
    HTTP/2では、これらの単純なメッセージはフレームにカプセル化され、直接読むことは不可能であるが、原理は変化していない。

    GET / HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language: fr

  3. サーバから送信されたレスポンスを読む。

    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)

  4. 接続を閉じる、または、次のリクエストのために再利用する。



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ヘッダ
  • オプションとして、取得したリソースを含むボディ