HTTP/1.1
Web の言語。読めるテキスト、リクエスト行、ヘッダ、空行。
リクエスト
すべてのバイトが読めるテキストです。16 進の下の ASCII の行で、文字を確認できます。
0:00
フレーム全体
リクエスト全体が読める ASCII です。リクエスト行、ヘッダ 3 つ、空行。長さのフィールドはなく、空行が区切りです。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| メソッド | 0–2 バイト目 | GET | リソースに対して何をするか。GET = 取得。ほかに POST(データ送信)、PUT(置き換え)、DELETE、HEAD(ヘッダのみ)など。 |
| スペース | 3 バイト目 | 0x20 | リクエスト行の各部分は、半角スペース 1 つ(0x20)で区切ります。 |
| ターゲット | 4 バイト目 | / | 要求するパス(とクエリ)です。'/' はサイトのルート。 |
| スペース | 5 バイト目 | 0x20 | もう 1 つの区切り。 |
| バージョン | 6–13 バイト目 | HTTP/1.1 | プロトコルのバージョンを ASCII で書き下したものです。 |
| 改行 | 14–15 バイト目 | 0D 0A | 改行(CR + LF、0D 0A)が各行の終わりです。HTTP/1.1 はテキストのプロトコルで、生の TCP 接続に手で打ち込むこともできます。 |
| Host ヘッダ | 16–34 バイト目 | Host: example.com | 「名前: 値」の行がヘッダです。HTTP/1.1 で必須なのは Host だけで、多数のサイトを置くサーバに、IP アドレスだけでは伝わらない「どのサイトか」を伝えます。 |
| User-Agent ヘッダ | 35–56 バイト目 | User-Agent: curl/8.4 | クライアントソフトを識別します。サーバは統計や、送る内容の判断材料に使います。 |
| Accept ヘッダ | 57–69 バイト目 | Accept: */* | クライアントが扱えるコンテンツの種類。*/* は何でも可。 |
| 空行 | 70–71 バイト目 | 0D 0A | 空行(CRLF だけ)がヘッダの終わりを示します。GET にボディはないのでここで終わりで、POST ならボディが続きます。 |
概要
HTTP/1.1 は、1997 年からブラウザとサーバが使ってきたテキスト形式です。リクエストは、リクエスト行(メソッド・パス・バージョン)、ヘッダ、空行、任意のボディ。レスポンスはステータス行から始まる同じ形です。ボディまでは ASCII の平文で、各行は CRLF で終わります。
HTTP/2 と HTTP/3 は符号化(バイナリフレーム、ヘッダ圧縮、QUIC)を変えましたが、メソッド・ステータスコード・ヘッダという考え方は同じです。
基本情報
- トランスポート
- TCP (80, or 443 with TLS)
- 符号化
- ASCII テキスト、CRLF 区切り
- 方式
- リクエスト / レスポンス
- 必須ヘッダ
- Host
- ボディ長
- Content-Length or chunked
- 規格
- RFC 9112 / 9110
レスポンス
ステータス行、ヘッダ、空行、そしてちょうど Content-Length バイトのボディ。
0:00
フレーム全体
ステータス行、ヘッダ、空行、ボディ。Content-Length が、ボディを何バイト読むかを正確に伝えます。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| バージョン | 0–7 バイト目 | HTTP/1.1 | サーバの HTTP バージョン。 |
| スペース | 8 バイト目 | 0x20 | 区切り。 |
| ステータスコード | 9–11 バイト目 | 200 | 結果を表す数字。2xx 成功、3xx リダイレクト、4xx クライアント側エラー(404 は見つからない)、5xx サーバ側エラー。 |
| スペース | 12 バイト目 | 0x20 | 区切り。 |
| 理由句 | 13–14 バイト目 | OK | コードの人間向けの説明です。プログラムは無視して、数字のほうを見ます。 |
| 改行 | 15–16 バイト目 | 0D 0A | 改行(CR + LF、0D 0A)が各行の終わりです。HTTP/1.1 はテキストのプロトコルで、生の TCP 接続に手で打ち込むこともできます。 |
| Content-Type ヘッダ | 17–42 バイト目 | Content-Type: text/plain | ボディがどんな種類のデータかを示し、クライアントが解釈の仕方を決められるようにします(text/plain、text/html、application/json、image/png など)。 |
| Content-Length ヘッダ | 43–62 バイト目 | Content-Length: 13 | ボディの長さ(バイト)です。接続が次のリクエストのために開いたままになりうるので、クライアントはこれでボディの終わりを知ります。 |
| 空行 | 63–64 バイト目 | 0D 0A | ヘッダの終わり。 |
| ボディ | 65–77 バイト目 | Hello, world! | 内容そのもの。ちょうど Content-Length バイトです。 |
1 つの接続の上のリクエスト
キープアライブは TCP 接続を使い回します。
0:00
やり取りの全体
HTTP は、信頼できる TCP ストリームの上で、リクエストとレスポンスを順に交わす仕組みです。
1リクエスト
確立済みの TCP 接続の中で送られます(その前のハンドシェイクは TCP のページを参照)。
2レスポンス
サーバは同じ接続で答えます。HTTP/1.1 のキープアライブでは接続が開いたままなので、次のリクエストはハンドシェイクを省けます。
3次のリクエスト。ハンドシェイクなし
接続を使い回すとリクエストごとに 1 往復を節約できます。HTTP/2 と HTTP/3 はさらに進んで、多数のリクエストを同時に交互に流します。
使われる場面
- あらゆる Web サイトと、ほぼすべての Web API(REST、JSON over HTTP)
- `curl -v` はまさにこれらの行を出力します。HTTP を見る最短の方法です
- Webhook、パッケージのダウンロード、ソフトウェア更新
つまずきやすい点
- CRLF の代わりに LF だけだったり、空行が欠けていたりすると、厳密なサーバは 400 Bad Request を返します。
- Content-Length はボディの文字数ではなくバイト数に一致する必要があります。マルチバイト文字は素朴な長さの計算を壊します。
- 平文の HTTP は経路上の誰にでも読めます。HTTPS は同じテキストを TLS で包みます。
出典・規格
- RFC 9112: HTTP/1.1
- RFC 9110: HTTP Semantics