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.」としている。クライアントは理由フレーズによって挙動を変えてはいけない。