TL;DR

サーバとクライアントがデータを交換する手段である。HTTP リクエストと HTTP レスポンスの両方を指す言葉として使う。

仕組み

HTTP/1.1 以前のバージョンでは、HTTP メッセージは人間にも読める形式のままコネクション上を送られる。HTTP/2 からは、メッセージを HTTP フレームに分割して送ることで、性能を上げている。

HTTP メッセージは、スタートライン、ヘッダ、ボディの 3 つで構成される。

スタートライン

リクエストではリクエストライン、レスポンスではステータスラインと呼ぶ。

リクエストラインは、HTTP メソッド、アクセスするリソース、HTTP のバージョンの 3 つを含む。RFC 7230 3.1.1 では request-line = method SP request-target SP HTTP-version CRLF と定義されている。SP は空白 1 文字、CRLF は改行を表す。

ステータスラインは、HTTP のバージョン、ステータスコード、理由フレーズ(OK や Not Found など)の 3 つを含む。RFC 7230 3.1.2 では status-line = HTTP-version SP status-code SP reason-phrase CRLF と定義されている。

ヘッダ

スタートラインの次の行から、空行までの部分である。1 つのヘッダフィールドは、: で区切った Key-Value の組で書く(RFC 7230 3.2)。

ヘッダは基本的に任意である。ただし、1 つの IP アドレスとポート番号で複数の Web サイトを運用しているとき、サーバは Host ヘッダの値でアクセス先の Web サイトを判断するので、HTTP/1.1 からはリクエストに Host ヘッダが必須になった。

ヘッダの順番に決まりはない。ただし RFC 7230 3.2.2 は、サーバがメッセージを処理しないことをできるだけ早く判断できるよう、制御データを含むヘッダ(リクエストの Host、レスポンスの Date)を先に送ることを推奨している。

ボディ

ヘッダの後の空行より後ろの部分である。GET リクエストのボディは RFC で意味が定められていないため、空であることが多い。POST や PUT リクエストには更新内容が入る。GET のレスポンスには、HTML などのリソースの内容が入る。

例

http://example.com/index.html にアクセスするリクエストは次のようになる。

GET /index.html HTTP/1.1
Host: example.com

アクセスが成功したときのレスポンスは次のようになる。

HTTP/1.1 200 OK
...
 
<!DOCTYPE html>
<html>
  ...
</html>

注意点

RFC 7230 は「A client SHOULD ignore the reason-phrase content.」としている。クライアントは理由フレーズによって挙動を変えてはいけない。

関連

出典