Loading post
Jul 20, 2026
.png)
ブラウザにURLを入れると、まず住所を引き、暗号化された通信路を作り、HTMLを受け取り、そこから必要なCSS・JavaScript・画像を集め、最後に画面を組み立てる。「サーバーが完成画面を送る」とは限らない。英語版は blog-how-web-works.en.md。

https://www.example.com/products?id=42#reviews を開くと、ブラウザはURLを分解する。
| 部分 | 値 | 役割 |
|---|---|---|
| scheme | https | 通信方式とセキュリティ |
| host | www.example.com | 接続先を探す名前 |
| path | /products | サーバー上の対象 |
| query | id=42 | リクエストへ渡す追加条件 |
| fragment | reviews | 原則ブラウザ内の位置指定。通常サーバーへ送られない |
その後の全体像はこうなる。
各段階が毎回ゼロから起きるわけではない。DNS、接続、HTML、画像などはキャッシュされ、すでにあるものを再利用できる。
人は example.com を覚え、ネットワークはIPアドレスへパケットを送る。DNSはその対応を調べる分散データベースだ。
実際にはルート、TLD、権威DNSを段階的にたどることがあるが、普段は再帰resolverとキャッシュが肩代わりする。TTL は答えをどれくらい再利用してよいかの目安だ。
一つのドメインが常に一つの物理サーバーを指すとは限らない。利用地域や負荷に応じて近いCDN拠点を返すこともある。
IPアドレスが分かっても、HTTPの内容を送る前に安全な通信路が必要だ。
HTTP/3はQUIC上で動く。QUICはUDPを土台にしつつ、信頼性、複数stream、輻輳制御、TLS 1.3相当の保護を一体化する。TCP接続とTLSを別々に積む形とは異なる。
証明書が教えるのは「信頼された仕組みで、このドメイン用の鍵を持つ相手と通信している」ということだ。サイトの内容が善良、商品が高品質、運営者が道徳的という保証ではない。
簡略化したHTTPリクエストはこう見える。
GET /products?id=42 HTTP/1.1
Host: www.example.com
Accept: text/html
Accept-Encoding: br, gzip
Cookie: session=...
応答には状態、説明用ヘッダー、本文がある。
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=60
Content-Encoding: br
<!doctype html>...
よく見る状態コード:
| 系統 | 意味 | 例 |
|---|---|---|
| 2xx | 成功 | 200 OK, 204 No Content |
| 3xx | 別の場所・キャッシュ利用 | 301, 302, 304 Not Modified |
| 4xx | リクエスト側またはアクセスの問題 | 400, 401, 403, 404, 429 |
| 5xx | サーバー処理の失敗 | 500, 502, 503, 504 |
404 は「インターネットにつながらない」ではない。サーバーまで会話でき、そのサーバーが該当リソースを見つけられなかったという、かなり具体的な成功だ。
ブラウザはHTMLを上から解析してDOMを作る。CSSからCSSOMを作り、表示に必要な情報を合わせてrender treeを作る。それから各要素の大きさと位置を計算し、ピクセルへ描き、複数layerを合成する。
JavaScriptはDOMを変え、追加データをAPIから取り、クリック動作を登録する。途中で重いJavaScriptがmain threadを長く占有すれば、見た目が出ていても操作へ反応しない。
「HTMLの取得時間」だけ測っても、ユーザーが感じる速さ全体は分からない。
最速の通信は、通信しないことだ。
代表的な制御:
Cache-Control: max-age=...:指定秒数は新鮮として再利用no-cache:保存禁止ではなく、使う前に再検証no-store:保存しないETag:内容の版を示し、変化がなければ 304 Not Modifiedapp.a1b2c3.js のように内容が変わればURLも変え、長期cacheを安全に使うCDNは世界各地のedgeへ静的ファイルや応答を置き、物理距離とorigin負荷を減らす。ただし個人ごとの応答を誤って共有cacheへ入れると情報漏えいになる。cache keyに何を含めるかはセキュリティ設計でもある。
HTTPリクエストは一回ずつ独立している。ログイン状態やカートを結びつけるため、サーバーは小さな識別子をCookieとして保存させ、同じ範囲の次回リクエストで返させる。
安全なsession Cookieでは一般に次を検討する。
Secure:HTTPSでのみ送るHttpOnly:JavaScriptから読めなくするSameSite:cross-site requestで送る条件を制限Cookieにパスワードを保存する必要はない。多くの場合、ランダムなsession IDを置き、実際の状態はサーバー側で管理する。
HTMLを取るまでCSS URLが分からず、CSSを取るまでfont URLが分からないなら、依存関係が直列になる。重要リソースを早く発見できるHTML、preloadの節度ある利用、画像の適切な遅延読み込みがwaterfallを短くする。
HTTP/2は一接続で複数streamを多重化するが、下のTCPでpacket lossが起きると接続全体の後続byteが待つことがある。QUICはstreamごとの配送順を分離し、このtransport-level head-of-line blockingを減らす。ただし輻輳や帯域不足そのものが消えるわけではない。
転送サイズが小さくても、大量のJavaScriptをparse・compile・executeすれば遅い。code splitting、不要依存の削除、Web Workerへの移動、長いtaskの分割は、ネットワーク最適化と別軸で効く。
p50だけでなくp75・p95や、地域、端末性能、回線種別で分ける。開発者の高速PCと近距離Wi-Fiだけでは本番ユーザーの体験は分からない。
ブラウザの開発者ツールでNetworkを開き、ページを再読み込みする。
認証Cookie、Authorization header、個人データを含むHARファイルは、そのまま公開しないこと。
Webページは一つのファイルではなく、名前解決、接続、暗号化、要求、cache、解析、実行、描画のpipelineだ。遅いページを直す最初の一歩は「Webが遅い」と一括りにせず、どの段階が待たせているかを分けることである。