HTTP

目次

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アクセスの仕組み

  1. ユーザーがブラウザにURLを入力
  2. ブラウザがHTTPリクエストを送信
  3. サーバがリクエストを解析
  4. サーバがHTTPレスポンスでデータを返送
  5. ブラウザがWebページを表示

HTTPのバージョン

HTTP/1.1、HTTP/2、HTTP/3が主に利用されています。

バージョン派生元RFC導入年特徴
HTTP/1.1RFC 91121997年リクエストごとにTCP接続を切断
HTTP/2SPDYRFC 91132015年1つのTCP接続で複数リクエストを同時処理
HTTP/3QUICRFC 91142022年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.1RFC 91121997年最初の普及版。リクエストごとにTCP接続を切断
HTTP/2SPDYRFC 91132015年多重化による効率化。高速化
HTTP/3QUICRFC 91142022年UDPベース。さらに高速で安定した通信

HTTP/2の特徴と仕組み

ストリーム

1つのTCPコネクション上で複数のHTTPリクエストとレスポンスを同時にやりとりできます。

  • 各リクエストとレスポンスの組は「ストリーム」に属する
  • ストリームには「ストリームID」が割り当てられる
  • クライアント開始のストリームIDは奇数、サーバ開始は偶数

フレーム

HTTP/2では、テキストではなくバイナリ形式の「フレーム」で通信します。
主なフレームタイプは次の通りです。

タイプフレーム名役割
0DATA本体データを送信
1HEADERSリクエスト・レスポンスのヘッダを送信
2PRIORITYストリームの優先度を指定
3RST_STREAMストリームの強制終了
4SETTINGSコネクションの設定変更
5PUSH_PROMISEサーバプッシュの準備(サーバのみ)
6PING接続確認
7GOAWAY切断処理開始
8WINDOW_UPDATEフロー制御のためのウィンドウ更新
9CONTINUATIONヘッダ送信の継続

ネゴシエーション(通信開始)

  • 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.1RFC 91121997年TCPベース。最初に普及したバージョン
HTTP/2SPDYRFC 91132015年TCPベース。多重化と効率化
HTTP/3QUICRFC 91142022年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では次のフレームが定義されています。

タイプ値フレーム名役割
0x0DATAリクエストやレスポンスのデータ本体
0x1HEADERSヘッダ情報
0x3CANCEL_PUSHサーバプッシュのキャンセル
0x4SETTINGS通信パラメータの送信
0x5PUSH_PROMISEサーバプッシュ用の予約
0x7GOAWAYコネクション切断開始
0xdMAX_PUSH_IDサーバプッシュ数の上限を通知

初心者向けのイメージとしては、HTTP/2が「車線の多い高速道路」だとすると、HTTP/3は「渋滞を避けるために複数の道を柔軟に使える自動運転道路」のようなものです。切り替えや遅延にも強く、モバイル環境で特に効果を発揮します。

◆まとめスライド

目次