FIG-097

HTTPリクエストの流れ — 「ください」の前に3往復

Web 2026.09.24 公開 読了 約12分

アドレスバーにURLを打ってEnterを押すと、一瞬でページが出ます。でもその裏では、名前を調べ、回線をつなぎ、鍵を交換し、やっと「ください」と頼むという手続きが順番に進んでいます。

図1で1段階ずつ進めて、誰と誰が何往復しているかを追ってください。スライダーでサーバーまでの距離を変えたり、2回目のアクセスに切り替えたりすると、どこに時間がかかっていて、どこが省けるのかが見えてきます。

URL入力からページ表示まで — 1ページの裏で起きている往復
https:// 暗号化して話す melon-shop.example 相手の名前 /items ほしいページ
ブラウザ DNSサーバー Webサーバー 省略 — 答えを覚えている(DNSキャッシュ) 省略 — 前の接続をそのまま使う(Keep-Alive) 省略 — 前の接続をそのまま使う(Keep-Alive) melon-shop.example はどこ? 203.0.113.10 です SYN SYN / ACK Client Hello(鍵の材料) Server Hello + 証明書 GET /items 200 OK + HTML CSS・画像もください 処理中… 描画
DNS 名前解決 —
TCP 接続 —
TLS 暗号化の準備 —
リクエスト送信 —
サーバーの処理 —
レスポンス受信 —
描画と追加の読み込み —
ページが出るまで 0ms
図1 — 「ください」と頼むまでに、すでに3往復。距離が遠いほど、準備の往復が重くのしかかる

頼む前に、3往復の準備がある

ブラウザがまずやるのは、URLの分解です。https から「暗号化して話す」、melon-shop.example から「相手の名前」、/items から「ほしいページ」を読み取ります。ところが名前のままでは相手に届かないので、DNSに住所(IPアドレス)を問い合わせます。これで1往復。

住所が分かったら、TCPで回線をつなぎ(1往復)、TLSで暗号の鍵を決めます(TLS 1.3 なら1往復)。ここまで来て、ようやく GET /items と「ください」を言えるのです。図1で段階を進めると、準備の矢印が本題より先にずらりと並ぶのが分かります。

遅さの正体は、距離 × 往復の回数

1往復にかかる時間を RTT(Round Trip Time)と言います。同じ国内なら数十ミリ秒、地球の裏側なら200ミリ秒を超えます。光の速さには上限があるので、回線を太くしてもRTTは縮みません。

図1のスライダーを右に振ると、サーバーの処理時間はそのままなのに、全体がみるみる伸びていきます。ページ表示の遅さの多くはサーバーの計算ではなく、往復の回数と距離で決まっているのです。CDNで近くにコピーを置くのは、このRTTを縮めるためです。

2回目が速いのは、準備を省けるから

図1で「2回目」に切り替えると、準備の3往復がまとめて消えます。DNSの答えはしばらく覚えておけるし(DNSキャッシュ)、一度つないだ回線は閉じずに使い回せる(Keep-Alive)からです。残るのは「ください」と「どうぞ」の1往復だけ。

HTMLが届いた後も話は続きます。ブラウザはHTMLを読みながらCSSや画像が必要だと気づき、同じ回線で追加のリクエストを出します。これも1往復ずつかかるので、読み込むファイルが多いページほど遅くなります。

用語ミニ辞書
DNS
ドメイン名からIPアドレスを調べる仕組み。答えはしばらくキャッシュされる。
TCP ハンドシェイク
通信を始める前の接続のあいさつ。1往復ぶんの時間がかかる。
TLS ハンドシェイク
暗号化の鍵を決める手続き。HTTPSで必要。TLS 1.3 では1往復。
RTT
相手との1往復にかかる時間。距離でほぼ決まり、回線の太さでは縮まない。
Keep-Alive
一度つないだ接続を閉じずに、次のリクエストでも使い回すこと。

まとめ

URLを打ってからページが出るまでに、DNS・TCP・TLSの準備で3往復、「ください」と「どうぞ」で1往復、さらに追加のファイルで何往復もかかります。遅さを決めるのは多くの場合往復の回数 × 距離。キャッシュ、接続の使い回し、近くに置くCDN――速くする工夫の多くは、この往復を減らすか縮めるかのどちらかです。