HTTPとは
HTTP(HyperText Transfer Protocol)は、WebサーバとWebブラウザの間でデータをやり取りするためのプロトコルです。Webページを記述するHTMLファイルや、画像・音声・動画といったデータを送受信できます。
URLの構造
URL(Uniform Resource Locator)は、インターネット上の資源の場所を示します。
| 構成要素 | 説明 |
|---|---|
| スキーム | 利用するプロトコルを示す。http(80番ポート)、https(443番ポート)など。 |
| ホスト名 | アクセス先のホスト名(例:www.infraexpert.com)。省略時はデフォルトのポート番号が使われる。 |
| パス | ファイル名やディレクトリ。省略した場合は「index.html」が呼び出される。 |
HTTPのパケット
HTTPはTCPの上で動作します。利用される代表的なポート番号は80(http)、443(https)です。
Webアクセスの仕組み
- ユーザーがブラウザにURLを入力
- ブラウザがHTTPリクエストを送信
- サーバがリクエストを解析
- サーバがHTTPレスポンスでデータを返送
- ブラウザがWebページを表示
HTTPのバージョン
HTTP/1.1、HTTP/2、HTTP/3が主に利用されています。
| バージョン | 派生元 | RFC | 導入年 | 特徴 |
|---|---|---|---|---|
| HTTP/1.1 | – | RFC 9112 | 1997年 | リクエストごとにTCP接続を切断 |
| HTTP/2 | SPDY | RFC 9113 | 2015年 | 1つのTCP接続で複数リクエストを同時処理 |
| HTTP/3 | QUIC | RFC 9114 | 2022年 | UDPベース、より高速で安定した通信 |
HTTPリクエストメッセージ
| 構成要素 | 説明 |
|---|---|
| リクエスト行 | メソッド(GET、POSTなど)、URI、HTTPバージョン |
| メッセージヘッダ | ブラウザの情報や対応可能なデータ形式を通知 |
| 空白行 | ヘッダ終了を示す |
| メッセージボディ | 入力フォームの内容など送信データ |
| 代表的なメソッド | 説明 |
|---|---|
| GET | データを取得 |
| HEAD | ヘッダ情報のみ取得 |
| POST | データを送信 |
| PUT | ファイルをアップロード |
| DELETE | データを削除 |
HTTPレスポンスメッセージ
| 構成要素 | 説明 |
|---|---|
| ステータス行 | HTTPバージョン、ステータスコード(200 OKなど) |
| メッセージヘッダ | サーバの情報や返却データの形式 |
| 空白行 | ヘッダ終了を示す |
| メッセージボディ | HTML文書や画像など実際のデータ |
ステータスコードの分類
| 番号帯 | 内容 | 例 |
|---|---|---|
| 100番台 | 情報 | 100 Continue |
| 200番台 | 成功 | 200 OK |
| 300番台 | リダイレクト | 301 Moved Permanently |
| 400番台 | クライアントエラー | 404 Not Found |
| 500番台 | サーバエラー | 503 Service Unavailable |
詳細なステータスコード例
- 200 OK:リクエスト成功
- 301 Moved Permanently:恒久的な移動
- 404 Not Found:指定したページが存在しない
- 500 Internal Server Error:サーバ側のエラー
- 503 Service Unavailable:サーバ過負荷などで利用不可
HTTP/2とは
HTTP/2(Hypertext Transfer Protocol version 2)は、WebサーバとWebクライアントの間でデータをやり取りするための通信規格で、2015年に標準化されました。従来のHTTP/1.1と比べて高速かつ効率的に通信できるようになったため、現在は広く普及しています。HTTP/2の背景には、Googleが開発した「SPDY」というプロトコルの実績があります。
HTTPのバージョン
| バージョン | 派生元 | RFC | 導入年 | 特徴 |
|---|---|---|---|---|
| HTTP/1.1 | – | RFC 9112 | 1997年 | 最初の普及版。リクエストごとにTCP接続を切断 |
| HTTP/2 | SPDY | RFC 9113 | 2015年 | 多重化による効率化。高速化 |
| HTTP/3 | QUIC | RFC 9114 | 2022年 | UDPベース。さらに高速で安定した通信 |
HTTP/2の特徴と仕組み
ストリーム
1つのTCPコネクション上で複数のHTTPリクエストとレスポンスを同時にやりとりできます。
- 各リクエストとレスポンスの組は「ストリーム」に属する
- ストリームには「ストリームID」が割り当てられる
- クライアント開始のストリームIDは奇数、サーバ開始は偶数
フレーム
HTTP/2では、テキストではなくバイナリ形式の「フレーム」で通信します。
主なフレームタイプは次の通りです。
| タイプ | フレーム名 | 役割 |
|---|---|---|
| 0 | DATA | 本体データを送信 |
| 1 | HEADERS | リクエスト・レスポンスのヘッダを送信 |
| 2 | PRIORITY | ストリームの優先度を指定 |
| 3 | RST_STREAM | ストリームの強制終了 |
| 4 | SETTINGS | コネクションの設定変更 |
| 5 | PUSH_PROMISE | サーバプッシュの準備(サーバのみ) |
| 6 | PING | 接続確認 |
| 7 | GOAWAY | 切断処理開始 |
| 8 | WINDOW_UPDATE | フロー制御のためのウィンドウ更新 |
| 9 | CONTINUATION | ヘッダ送信の継続 |
ネゴシエーション(通信開始)
- http通信では「Upgradeヘッダ」を使ってHTTP/1.1からHTTP/2へ切り替える
- https通信では「TLSのALPN拡張」を使ってプロトコルを交渉する
サーバプッシュ
クライアントがリクエストしていなくても、関連するデータをサーバ側から先に送信できます。これによりページ表示の待ち時間が短縮されます。
優先度制御
ストリームごとに優先度を指定できます。例えば、CSSやJavaScriptなどページ表示に必要なデータを先に送信し、画像は後回しにするといった制御が可能です。
ヘッダ圧縮
HTTP/2では「HPACK」という仕組みでヘッダを圧縮します。これにより、同じ内容のヘッダを何度も送信する必要がなくなり、通信量が削減されます。
TLS利用時のルール
HTTP/2をTLSで利用する場合には次のような制約があります。
- TLS 1.2以上を使用すること
- ALPNでプロトコルを選択すること
- SNI拡張に対応していること
- TLS圧縮と再ネゴシエーションは無効化すること
- 鍵長はDHEで2048bit以上、ECDHEで224bit以上をサポートすること
初心者向けのイメージとしては、HTTP/1.1が「1本のレーンで1台ずつ車を通す道路」だったのに対し、HTTP/2は「複数車線の高速道路」であり、一度に多くの車(リクエストとレスポンス)が並行して走れる仕組みだと考えると理解しやすいです。
HTTP/3とは
HTTP/3(Hypertext Transfer Protocol version 3)は、WebサーバとWebブラウザの間でデータをやり取りするための最新の通信規格です。HTTP/1.1ではテキスト形式、HTTP/2ではバイナリ形式で通信してきましたが、HTTP/3もバイナリ形式を採用しています。HTTP/3はGoogleが開発したQUICプロトコルをベースとしており、2022年に標準化されました。
HTTPバージョンの比較
| バージョン | 派生元 | RFC | 導入年 | 特徴 |
|---|---|---|---|---|
| HTTP/1.1 | – | RFC 9112 | 1997年 | TCPベース。最初に普及したバージョン |
| HTTP/2 | SPDY | RFC 9113 | 2015年 | TCPベース。多重化と効率化 |
| HTTP/3 | QUIC | RFC 9114 | 2022年 | UDPベース。さらに高速で安定した通信 |
HTTP/3の基本仕組み
UDPとQUIC
HTTP/3はTCPではなくUDPを利用します。TCPの代わりにQUICが信頼性(再送制御・輻輳制御)を担い、TLS1.3がセキュリティを担保します。これによりTLS暗号化通信が必須になりました。
バージョン | 使用ポート番号 | TLSの実装 | TLSバージョン
HTTP/1.1 | TCP 80 / 443 | 任意 | 任意
HTTP/2 | TCP 80 / 443 | 任意 | TLS1.2 / 1.3
HTTP/3 | UDP 443 | 必須 | TLS1.3
接続開始の高速化
HTTP/2ではTCPの3ウェイハンドシェイクに加え、TLSハンドシェイクが必要でした。HTTP/3ではQUICによりTCPのハンドシェイクを省略し、TLS1.3のハンドシェイクから通信を始められます。さらに、0-RTT再開機能により、一度通信した相手とは次回以降すぐにデータ送信を開始できます。
HOLブロッキングの解消
TCPでは先頭パケットにエラーがあると後続パケットも待たされるHOLブロッキングが発生します。HTTP/3ではQUICにより、あるパケットが遅延しても他のパケットを同時並行で処理できるため、遅延の影響を最小化できます。
コネクションマイグレーション
TCPでは通信中にIPアドレスやポート番号が変わると接続を維持できません。しかしHTTP/3では、接続を「コネクションID」で識別するため、Wi-Fiから4G/5Gに切り替わっても通信を途切れさせずに継続できます。
サーバプッシュ(HTTP/3版)
HTTP/3でもサーバプッシュは実装されていますが、HTTP/2とは仕様が少し異なります。
- サーバはPUSH_PROMISEフレームでプッシュ用ストリームを予約
- Push IDを使ってリソースを識別
- クライアントはMAX_PUSH_IDフレームでプッシュ数を制御可能
- 不要なプッシュはCANCEL_PUSHフレームで拒否できる
ストリーム
HTTP/3ではQUIC上で「ストリーム」が使われ、単方向ストリームと双方向ストリームがあります。
| 種類 | 用途 |
|---|---|
| 単方向ストリーム(Control, Push) | 制御情報送信、サーバプッシュ |
| 双方向ストリーム(Request) | HTTPリクエストとレスポンスのやり取り |
フレームタイプ
HTTP/3では次のフレームが定義されています。
| タイプ値 | フレーム名 | 役割 |
|---|---|---|
| 0x0 | DATA | リクエストやレスポンスのデータ本体 |
| 0x1 | HEADERS | ヘッダ情報 |
| 0x3 | CANCEL_PUSH | サーバプッシュのキャンセル |
| 0x4 | SETTINGS | 通信パラメータの送信 |
| 0x5 | PUSH_PROMISE | サーバプッシュ用の予約 |
| 0x7 | GOAWAY | コネクション切断開始 |
| 0xd | MAX_PUSH_ID | サーバプッシュ数の上限を通知 |
初心者向けのイメージとしては、HTTP/2が「車線の多い高速道路」だとすると、HTTP/3は「渋滞を避けるために複数の道を柔軟に使える自動運転道路」のようなものです。切り替えや遅延にも強く、モバイル環境で特に効果を発揮します。