URL を打ってから画面が表示されるまで
dig / curl -v / Chrome DevTools を使って、URL から画面までの DNS → TCP → TLS → HTTP → レンダリングの各段階を自分の手で観測する
STEP 2
Web の全体像をつかむ
ブラウザ・URL・ネットワークの流れを押さえ、後続章の共通言語を揃える段階。
この STEP でできるようになること
- • Web と Internet の違いを説明できる
- • URL から画面表示までの流れを追える
- • ネットワーク障害の切り分けで使う用語が分かる
この章で手を動かすこと
- • URL 入力から画面表示までの流れを追える
- • DNS / TCP / TLS / HTTP / レンダリングの役割を説明できる
- • dig と curl -v でネットワーク各層の様子を観測できる
次に活きる章
URL を叩いてから画面が出るまでには、DNS → TCP → TLS → HTTP → レンダリングが連続して走ります。この章では dig と curl -v、Chrome DevTools を使って、各ステップを自分のコマンドで観測していきます。
URL から画面までの流れ(概念)
ブラウザに https://example.com/users?tab=home#profile と入力して Enter を押すと、次の順で処理が進みます。
| 段階 | やっていること | 観測ツール |
|---|---|---|
| 1. URL 解析 | Scheme / Host / Port / Path / Query / Fragment を分解 | ブラウザ内部 |
| 2. DNS | ホスト名を IP アドレスに変換 | dig nslookup |
| 3. TCP | クライアントとサーバーで 3-way handshake | curl -v |
| 4. TLS | 暗号鍵の交換 + 証明書検証(HTTPS のみ) | curl -v |
| 5. HTTP | リクエストとレスポンスの往復 | DevTools / curl -i |
| 6. レンダリング | HTML パース → CSS 適用 → Layout → Paint | DevTools Performance |
URL 自体は 5 要素に分解されます。
https://www.example.com:443/users?tab=home#profile└─┬─┘ └─────┬──────┘ └┬┘ └──┬──┘ └──┬──┘ └──┬─┘Scheme Host Port Path Query FragmentFragment(# 以降)はサーバーに送られません。クライアント内部でのページ内移動や SPA のルーティングに使われます。これはサーバーログから Fragment が拾えない理由でもあります。
DNS はホスト名を IP に変換する階層的な仕組みです。
ブラウザ → OS リゾルバ → 再帰リゾルバ → ルート → TLD(.com) → 権威 DNS → IPTCP は 3 回のやり取り(SYN → SYN/ACK → ACK)で双方向のトンネルを開通させます。HTTPS ではその上に TLS が乗り、証明書検証と鍵交換を 1 往復で行います。最後に HTTP メッセージが流れ、サーバーは HTML を返し、ブラウザが DOM/CSSOM を作ってレンダリングします。
作るもの
dig と curl -v を使って 1 本のリクエストの各層を可視化し、さらに Chrome DevTools で Timing の内訳を見ます。
[あなたの PC] ──dig──▶ [DNS サーバー] ──TCP/TLS/HTTP──▶ [example.com / localhost:8787][ブラウザ] ──Network タブ──▶ (DNS / Connect / SSL / Waiting / Download)準備
2 つのプロファイルを立ち上げます。netshoot は dig や traceroute が入ったネットワーク調査用コンテナ、lab-api はローカル API です。
cd exercisesdocker compose --profile netshoot up -ddocker compose --profile lab-api up -d --builddocker compose pslab-api と netshoot の両方が起動していれば準備完了です。
手順
1. DNS 解決を見る(dig)
ホスト名から IP アドレスへの変換は dig で観測できます。macOS / Linux ではそのまま、Windows の場合は netshoot コンテナ経由で実行します。
dig example.comANSWER SECTION に example.com. ... A 93.184.216.34(日によって変わります)のように IP が並びます。もし dig が無ければ、netshoot の中から実行してください。
docker compose exec netshoot dig example.comポイント: 同じコマンドを 2 回実行すると 2 回目は早く返ります。これは OS やリゾルバがキャッシュしているためです。
2. TCP + TLS + HTTP をまとめて見る(curl -v)
-v は verbose モード。接続確立からヘッダー送受信まで全部出ます。
curl -v https://example.com 2>&1 | head -30読み解くポイントは 4 つです。
* Connected to example.com (93.184.216.34) port 443← TCP 接続完了* TLSv1.3 (OUT), TLS handshake, Client hello以降 ← TLS ハンドシェイク* Server certificate:に発行者・有効期限 ← 証明書検証> GET / HTTP/2← HTTP リクエスト送信< HTTP/2 200← サーバーからの応答ステータス
つまり 1 本の curl -v で DNS → TCP → TLS → HTTP がすべて順に走っていることが確認できます。
3. Chrome DevTools で Timing を見る
curl では見えにくい「どの段階で何ミリ秒かかったか」はブラウザの DevTools が最も分かりやすいです。
- Chrome で
http://localhost:8787/okを開く - F12(macOS は
Cmd+Option+I)で DevTools を開き Network タブへ - ページをリロード(
Cmd+R/Ctrl+R) ok行をクリック → Timing タブを開く
次の内訳が見えるはずです。
| 項目 | 意味 |
|---|---|
| Queueing / Stalled | 接続を待っている時間 |
| DNS Lookup | 名前解決(localhost は 0ms) |
| Initial connection | TCP ハンドシェイク |
| SSL | TLS ハンドシェイク(http なので 0ms) |
| Waiting (TTFB) | サーバー処理時間 |
| Content Download | body のダウンロード |
http://localhost:8787/slow?ms=2000 を開き直すと Waiting (TTFB) に 2 秒 が乗るのを確認できます。サーバー処理が遅いのかネットワークが遅いのかを切り分ける基本スキルです。
4. ローカルと公開サイトでヘッダーを比べる
curl -I http://localhost:8787/okcurl -I https://example.comローカル API は Content-Type: application/json、example.com は Content-Type: text/html; charset=UTF-8 を返します。同じ HTTP という仕組みで、ローカルの小さなサーバーも世界中からアクセスされる example.com も動いている ことが実感できます。
5. (オプション)経路を覗く(traceroute)
netshoot 内から traceroute を実行すると、自分の PC から example.com までのネットワーク経路が見えます。
docker compose exec netshoot traceroute example.com途中のルーターがどこにあるか・どこで遅くなっているかの推測に使います。時間がかかる場合は Ctrl+C で止めて構いません。
手を動かす
やること
netshootとlab-apiを両方起動するdig example.comで IP を確認し、同じコマンドを 2 回実行してキャッシュの効果を観察するcurl -v https://example.com 2>&1 | head -30で DNS → TCP → TLS → HTTP の痕跡を読む- Chrome DevTools の Network タブで
http://localhost:8787/okと/slow?ms=2000の Timing を比較する
成功条件
bash exercises/scripts/verify-b00-2.sh-
dig example.comがANSWER SECTIONに A レコードを返す(またはnetshoot経由で返る) -
curl -s -o /dev/null -w '%{http_code}\n' https://example.comが200を返す -
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/okが200を返す -
verify-b00-2.shがAll b00-2 checks passedで終了する
片付け
docker compose down確認クイズ
Q1. `curl -v https://example.com` を実行したとき、ログに `TLSv1.3 (OUT), TLS handshake` という行が出るのはどの段階ですか。
正解: TCP 接続が確立したあとの TLS ハンドシェイク の段階です(DNS → TCP → TLS → HTTP の順)。
解説: TLS は TCP の上に乗る暗号層です。証明書検証と鍵交換をこの段階で行い、以降の HTTP メッセージがすべて暗号化されます。HTTP(非暗号化)の場合はこの段階がスキップされます。
Q2. DevTools の Timing で **Waiting (TTFB)** だけが長い場合、ボトルネックはどこにあると推測できますか。
正解: サーバー側の処理(DB アクセス・外部 API 呼び出しなど)に時間がかかっている可能性が高いです。
解説: TTFB は「リクエスト送信完了から最初の 1 バイトが返るまで」の時間です。DNS / Initial connection / SSL が短いのに TTFB だけ長いなら、ネットワークではなくサーバーのアプリケーション処理が疑われます。/slow?ms=2000 で同じ現象が再現できます。
この章で手を動かすときの確認
この章は 導入編 の STEP 2にある 「手を動かす」 の章です。本文を読み終えたあと、次の観点だけ確認すると次へ進みやすくなります。
この章で確認すること:
- URL 入力から画面表示までの流れを追える
- DNS / TCP / TLS / HTTP / レンダリングの役割を説明できる
- dig と curl -v でネットワーク各層の様子を観測できる
次に活きる章:
- ネットワーク基礎(TCP/IP・DNS・HTTPS)
- Git基礎
補助参照: