中級では、初級の4段階を実際のプロトコル名で追い直しました。上級では、その各段を「何往復かかり、どう減らせるか」という性能とキャッシュの視点で端から端まで掘り下げ、さらにHTTPそのものの進化(1.1→2→3)まで踏み込みます。ここは通信経路(ネットワーク)の深掘りを担当します。
同じ1リクエストを、サービス全体のシステム構成(フロント・バック・DB・インフラの層や、規模に耐える工夫)の側から掘るのは 1リクエストの流れ 上級です。
中級では、初級の4段階を実際のプロトコル名で追い直しました。上級では、その各段を「何往復かかり、どう減らせるか」という性能とキャッシュの視点で端から端まで掘り下げ、さらにHTTPそのものの進化(1.1→2→3)まで踏み込みます。ここは通信経路(ネットワーク)の深掘りを担当します。
同じ1リクエストを、サービス全体のシステム構成(フロント・バック・DB・インフラの層や、規模に耐える工夫)の側から掘るのは 1リクエストの流れ 上級です。
中級では「近くの控えから、なければ遠くへ」を見ました。上級では、その問い合わせの型とキャッシュ階層を精密にします。
登場人物メモ:
より詳しい階層と権威の仕組みは DNS を参照。
🎬 アニメーション『パケットの旅』の ②〜⑤ のところです!
名前解決は「近くの控えから確認し、なければ遠くへ聞きに行く」仕組みです。必ずこの順で進みます:
登場人物メモ(※の説明):
⚠️ イレギュラー(うまくいかないとき):
接続確立は往復(RTT)※1のコストそのものです。ここを削るのが高速化の主戦場になります。
TCPの3ウェイハンドシェイク — SYN → SYN-ACK → ACK。ここで1RTTを消費し、双方向到達とシーケンス番号の起点合わせを済ませます。
TLSハンドシェイク(HTTPSのみ)— 証明書の提示・検証と、鍵合意(現在は主にECDHE。盗聴前提でも2者だけの鍵を作る)を行います。
つまりHTTPSの初回は、DNS+TCP(1RTT)+TLS(1RTT)という往復の積み重ねの上で、ようやく本題に入れます。この往復を1つでも減らす工夫が、次のHTTP進化の動機です。
登場人物メモ:
TCP・TLSが通信のどの層に乗るのかは ネットワーク層 を参照。
🎬 アニメーション『パケットの旅』の ⑥〜⑧(緑の枠 = 3ウェイハンドシェイク)のところです!
IPアドレスがわかったら、そのIPのポート※1 443(HTTPSの場合)に向けて、2段階の準備をします。順序は必ず TCPが先、TLSが後です。
第1段階 — TCPの3ウェイハンドシェイク※2(初級の「3回の挨拶」の正式名):
この3ステップ(メッセージ3本=往復にして約1.5回)で「相手は実在し、双方向に届き、番号の起点を共有した」状態になり、欠落の検知・再送・順序の保証——つまり信頼できる通信が可能になります。
第2段階 — TLSハンドシェイク※4(HTTPSの場合のみ):
登場人物メモ(※の説明):
⚠️ イレギュラー(うまくいかないとき):
同じ「注文と配達」でも、何本の会話を、どうさばくかが世代で変わってきました。
keep-aliveで接続は使い回せるが、前の応答が終わるまで次が待つアプリ層のHOLブロッキング(※1)が起きる。ブラウザは接続を複数本張って無理やり並列化していた登場人物メモ:
確立した通信路の上で注文します。上級の主役は、そもそも往復を起こさない/軽く済ませるキャッシュ判定です。
Cache-Control: max-age(※1)の期限内なら、通信せずにキャッシュを即使用する(最速)If-None-Matchに、更新日時をIf-Modified-Sinceに載せて問い合わせるこのキャッシュ判定は二段構えです。手元のブラウザキャッシュ(そのユーザー専用=private)と、経路上のCDNなど共有キャッシュ(public、みんなで再利用)。近い共有キャッシュから配れば、大元のサーバまで往復せずに済みます。
登場人物メモ:
共有キャッシュの地理分散と配信の仕組みは CDN を参照。
🎬 アニメーション『パケットの旅』の ⑨〜⑪ のところです!
確立した通信路の上で、ようやく本題の注文です:
GET /index.html HTTP/1.1 という1行目に、Host や User-Agent などのヘッダ※2が続く<link>(CSS)・<img>(画像)・<script>(JS)を見つけるたびに追加リクエストを発行する登場人物メモ(※の説明):
ブラウザが実際に送っている依頼書は、たったこれだけのテキストです:
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0
Accept: text/html
Accept-Language: ja
Cookie: session=abc123
構造は上から3つだけ。必ずこの順です:
GET /index.html HTTP/1.1。「/index.html を取得(GET)したい。作法は HTTP/1.1 で」という宣言名前: 値 の形の欄外メモの束。上の例では Host(宛先のドメイン)、User-Agent(差出人=ブラウザの種類)、Accept(受け取れる形式)、Accept-Language(希望の言語)、Cookie(会員証)の5枚が全部ヘッダ返事(HTTPレスポンス)も同じ3部構造で、1行目だけが HTTP/1.1 200 OK のようなステータスラインに変わり、ボディにHTML本体が入っています。
3桁の数字は百の位がジャンルです。2xx=成功 / 3xx=案内 / 4xx=依頼側の問題 / 5xx=お店側の問題、とだけ覚えれば初見の数字も読めます。
2xx — 成功
3xx — 案内(リダイレクト)
4xx — 依頼側(あなた側)の問題
5xx — お店側の問題
⚠️ イレギュラー(うまくいかないとき):
材料が届いたら、ブラウザ内で DOM+CSSOM→レンダーツリー→レイアウト→ペイント→合成 と進みます。ここで効くのが資源の優先度です。
<script>はHTMLパースを止める。defer/asyncや配置で緩和する🎬 アニメーション『パケットの旅』の ⑫(最後のコマ)のところです!
材料が届いたら、ブラウザの中で組み立てが始まります。ここも流れ作業です:
登場人物メモ(※の説明):
⚠️ イレギュラー(割り込みと事故):
<script> は既定ではHTMLの解析を一時停止させる。JSが重いと白い画面が続くのはこのため。defer 属性や読み込み位置が表示速度に直結するつまり「描画とJS実行は絡み合いながら進む」——ここを制御するのがフロントエンド性能改善の世界で、その入口がこのセクションです。開発者ツールのNetworkタブを開いてページを再読み込みすると、今日の旅の1往復1往復が、そのまま1行ずつ並んでいるのが見えます。
max-ageが長すぎると更新が届かず、無ければ毎回往復。ETagでの再検証と適切な期限で釣り合わせるそのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. HTTP/2は1本の接続で多重化するのに、なお残ってHTTP/3(QUIC)で解消される「ある層の」ヘッドオブラインブロッキングとは?
問2. ブラウザキャッシュの有効期限が切れたあと、ブラウザがETagを付けて再検証したところ、中身は前回から変わっていなかった。サーバは何を返すか?
問3. あなた→フルサービスリゾルバへの問い合わせと、リゾルバ→ルート/TLD/権威サーバへの問い合わせの型として正しいのは?
問4. DNSで「存在しない(NXDOMAIN)」という答えも一定時間キャッシュされる。この狙いとして正しいのは?
問5. TLS 1.3の0-RTT再開について正しいのは?
問6. HTTP/3(QUIC)が持ち、回線が変わっても接続を保てる機能はどれ?
問7. 現在のTLSで主に使われ、盗聴されている前提でも2者だけの共通鍵を作れる鍵合意方式を英字5文字の略語で答えてください。
問8. 「何秒キャッシュしてよいか」「private/publicか」をブラウザやCDNへ指示する応答ヘッダの名前を答えてください。