HTTP メッセージ構造

HTTPはクライアント/サーバー(C/S)アーキテクチャモデルに基づき、信頼性のある接続を介して情報を交換する、ステートレスなリクエスト/レスポンスプロトコルです。

HTTPメッセージはクライアントとサーバー間の通信の基盤であり、一連のテキスト行で構成され、特定のフォーマットと構造に従います。

HTTPメッセージは、リクエストメッセージとレスポンスメッセージの2つのタイプに分類されます。

HTTPクライアントは、アプリケーション(Webブラウザやその他の任意のクライアント)であり、サーバーに接続して、サーバーに対して1つまたは複数のHTTPリクエストを送信することを目的とします。

HTTPサーバーも同様にアプリケーション(通常はNginx、Apacheサーバー、IISサーバーなどのWebサービス)であり、クライアントからのリクエストを受信し、クライアントにHTTPレスポンスデータを送信します。


クライアントリクエストメッセージ

クライアントがサーバーに送信するHTTPリクエストのリクエストメッセージは、次の形式で構成されます:リクエストライン(request line)、リクエストヘッダー(header)、空行、リクエストデータの4つの部分で構成され、下図にリクエストメッセージの一般的な形式を示します。

  • リクエスト行(Request Line):

    • メソッド:GET、POST、PUT、DELETEなどがあり、実行する操作を指定します。
    • リクエスト URI(Uniform Resource Identifier):リクエストするリソースのパスで、通常はホスト名、ポート番号(デフォルトでない場合)、パス、クエリ文字列を含みます。
    • HTTP バージョン:HTTP/1.1 や HTTP/2 など。

    リクエスト行の形式の例:GET /index.html HTTP/1.1

  • リクエストヘッダー(Request Headers):

    • クライアント環境情報、リクエストボディのサイズ(存在する場合)、クライアントがサポートする圧縮タイプなどを含みます。
    • 一般的なリクエストヘッダーには、Host、User-Agent、Accept、Accept-Encoding、Content-Lengthなどがあります。
  • 空行:

    • リクエストヘッダーとリクエストボディの間の区切り文字であり、リクエストヘッダーの終わりを示します。
  • リクエストボディ(オプション):

    • 一部のタイプのHTTPリクエスト(POSTやPUTなど)では、リクエストボディにはサーバーに送信するデータが含まれます。

サーバーレスポンスメッセージ

HTTPレスポンスも4つの部分で構成されています:ステータス行、メッセージヘッダー、空行、レスポンスボディです。

  • ステータス行(Status Line):

    • HTTP バージョン:リクエストメッセージのバージョンと一致します。
    • ステータスコード:3桁の数字で、リクエストの処理結果を示します。200は成功、404はリソースが見つからないことを示します。
    • ステータスメッセージ:ステータスコードの簡単な説明です。

    ステータス行の形式の例:HTTP/1.1 200 OK

  • レスポンスヘッダー(Response Headers):

    • サーバー環境情報、レスポンスボディのサイズ、サーバーがサポートする圧縮タイプなどを含みます。
    • 一般的なレスポンスヘッダーには、Content-Type、Content-Length、Server、Set-Cookieなどがあります。
  • 空行:

    • レスポンスヘッダーとレスポンスボディの間の区切り文字であり、レスポンスヘッダーの終わりを示します。
  • レスポンスボディ(オプション):

    • サーバーが返すデータを含みます。例えば、リクエストしたWebページのコンテンツ、画像、JSONデータなどです。


例

以下に、GETを使用してデータを渡す典型的な例を示します。

クライアントリクエスト:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive

サーバーレスポンス:

HTTP/1.1 200 OK
Date: Wed, 18 Apr 2024 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
Content-Length: 12345
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <!-- The rest of the HTML content -->
</body>
</html>

実際のアプリケーションでは、HTTPメッセージにはより多くのヘッダーフィールドが含まれる場合があり、リクエストボディとレスポンスボディのサイズは転送するデータによって変わります。

その他の拡張