クリックした荷物は、どうやって海を渡るのか:ネットワークを「配送」として理解する【第6回】
pingが返ってこないとき、何が詰まっているのか分からない。APIが遅いとき、自分のコードの問題か、相手の問題か、経路の問題か分からない。この記事を読み終えると、リクエストが辿る道のりを「配送」として説明でき、遅延をどこで生まれているかで切り分けられるようになります。ジュニアエンジニア向けコンピュータサイエンス入門シリーズ(全8回)の第6回です。
🎯 テーマの主役:「配送網としてのネットワーク」
今回の主役はネットワークです。一言で言えば、データを小さな荷物に分け、住所を頼りに中継しながら、世界中のどこへでも届ける配送網です。
日常の例えで言うなら、宅配便です。あなたが大きな家具を送りたいとします。そのままでは運べないので、運べる大きさに分解して箱詰めする。箱には宛先と差出人を書いた送り状を付ける。あとは配送網が、複数の中継センターを経由して目的地へ運ぶ。途中の箱が1つ遅れても、残りは先に届く。もし箱が壊れていたら、受け取った側が気づいて再送を頼める。
ネットワークは、これをほぼそのままの形でやっています。分解することをパケット分割、送り状をヘッダ、中継センターをルーター、再送の仕組みをTCPと呼びます。用語が変わっているだけで、やっていることは配送業です。
第3回で「1回のアクセスに何サイクルかかるか」を、第5回で「何回アクセスするか」を扱いました。今回はその延長線上で、一番遠い場所へのアクセスを扱います。第3回の階段に「大陸間ネットワーク:100〜150ms」という段がありました。あの段の正体を、今回ようやく見に行きます。
この仕組みを理解すると、次の4つができるようになります。第一に、「なぜ遠いサーバーは遅いのか」を物理的な理由から説明できること。第二に、リクエストが届かないときに「どの段階で止まっているか」を切り分けられること。第三に、https が何を守っていて何を守っていないかを正確に言えること。第四に、第5回で扱った「ネットワーク往復が O(n) 回」というアンチパターンを、具体的な秒数に換算して判断できることです。
ネットワークの階層を、対応する配送の役割と用語で整理しておきます。層に分かれているので、止まった場所を特定できます。これが第1回の「エラーの階切り分け」の、ネットワーク版です。
| 層 | 配送の役割 | 主な技術 | 失敗したときの症状 |
|---|---|---|---|
| アプリケーション層 | 「何を送るか」の約束 | HTTP・DNS・SMTP・SSH | 404、401、プロトコル不一致 |
| トランスポート層 | 箱詰め・再送・順番の保証 | TCP・UDP | 接続拒否(ECONNREFUSED)、タイムアウト |
| ネットワーク層 | 宛先住所と経路の決定 | IP・ICMP・ルーティング | 宛先到達不能、経路なし |
| リンク層 | 隣の中継センターまでの運搬 | Ethernet・Wi-Fi・PPP | ケーブル断、Wi-Fi切れ |
😓 動機:遅い・繋がらないの原因が、手元では分からない
ネットワークのトラブルが厄介なのは、目の前に原因がないことです。自分のコードは正しい。サーバーも動いている。それでも繋がらない。あるいは繋がるけれど遅い。
よくある場面を4つ挙げます。ひとつ目は、ping が通らない。相手が生きているのか、経路が塞がっているのか、そもそも名前解決に失敗しているのか分からない。ふたつ目は、APIが3秒かかる。自分のコードの遅さなのか、相手の処理の遅さなのか、経路の遅さなのか分からない。みっつ目は、https にしたのに安全なのか不安。どこが守られていて、どこが守られていないのか説明できない。よっつ目は、ローカルでは速いのに本番では遅い。同じコードなのに、何が違うのか分からない。
これらは、ネットワークが「見えない箱」になっていることから来ます。しかし配送として捉え直すと、見るべき場所が3つに絞られます。宛先を調べる段階(DNS)、経路を進む段階(ルーティング)、受け渡しする段階(TCP・TLS・HTTP)。この3つを分けて考えるだけで、原因の切り分けが一気に楽になります。
そして、この視点はAI時代にむしろ重要です。AIが書いたコードは、ループの中で1件ずつAPIを呼ぶ実装を平気で出してきます。動きますし、テストも通ります。しかし本番では、往復の回数がそのまま秒数になります。第5回で見た O(n) の往復が、ここで具体的な時間として牙をむくのです。
🧪 仮説:ネットワークの遅さは「物理的な距離」と「往復の回数」でほとんど決まる
仮説を立てます。ネットワークの遅延は、おおよそ「光が進む距離」と「往復した回数」の積で決まる。そして経路の混雑や機器の処理は、その上に乗る上振れ分である。
この仮説を支持する観察が3つあります。第一に、光ファイバーの中を進む信号は、真空中の光速より遅く、おおよそ光速の3分の2(秒速約20万km)です。つまり1,000kmで約5ミリ秒、10,000kmで約50ミリ秒という物理的な下限があります。第二に、経路には中継する機器が何段もあり、各段でわずかな処理時間が積み上がります。第三に、同じ距離でも往復を何回するかで総時間が変わります。1回の往復が150ミリ秒なら、100回の往復は15秒です。
この仮説が正しければ、遅さへの打ち手は明確になります。距離を縮める(近い場所にサーバーを置く)か、往復回数を減らす(まとめて取る)か。この2つです。どちらも第3回・第5回で扱った「階をまたぐ回数を減らす」という原則の、具体的な現れです。
🔬 検証①:クリックから表示まで、5つの段階
まず、あなたがブラウザでURLを開いたときに何が起きるかを、段階に分けて追います。各段階が独立した「失敗ポイント」であり、切り分けの単位です。
この5段階を、距離ごとの所要時間で見てみます。物理的な下限が支配していることが分かります。
| 区間の距離 | 片道の目安(光速の2/3) | ②接続(往復1.5回) | ③暗号化(往復1〜2回) | ④HTTP(往復1回) | 合計の目安 |
|---|---|---|---|---|---|
| 同じデータセンター内 | 0.05ms未満 | 約0.1ms | 約0.1〜0.2ms | 約0.1ms | 1ms未満 |
| 同じ国内(500km) | 約2.5ms | 約4ms | 約5ms | 約5ms | 15〜20ms |
| 同じ大陸(3,000km) | 約15ms | 約23ms | 約30ms | 約30ms | 80〜100ms |
| 大陸間(10,000km) | 約50ms | 約75ms | 約100ms | 約100ms | 300〜400ms |
| 地球の裏側(20,000km) | 約100ms | 約150ms | 約200ms | 約200ms | 600〜700ms |
数値は経路や中継機器の数で変わる目安ですが、桁は変わりません。ここから3つの結論が出ます。
第一に、同じデータセンター内なら1ms未満です。 つまり、サーバーを近くに置くだけで100〜400倍速くなります。これがCDN(コンテンツ配送網)が存在する理由です。画面の見た目は同じでも、遅延は桁で違います。
第二に、大陸間では物理的に下限があります。 光速を超えられないので、10,000kmを往復するのに100ms以下にはできません。これは技術の問題ではなく、物理の制約です。「東京から米国西海岸へのAPIは遅い」という現象は、どんなに最適化しても消えません。消せるのは往復の回数だけです。
第三に、往復の回数が効きます。 上の表は「1つのリクエスト」の話です。もし100個のリソースを取得するなら、3-wayハンドシェイクとTLSが100回起きる可能性があります。接続を使い回せば(これをコネクションの再利用と呼びます)、この回数を1回に減らせます。同じ物理距離でも、総時間が10倍以上変わります。
🔬 検証②:名前解決——住所を調べる段階
最初の段階、DNS(Domain Name System)から見ます。これは「名前」から「番号」への変換です。
なぜ番号に変換する必要があるのか。第2回で扱ったとおり、コンピュータは人間が読める名前ではなく、番号で相手を識別します。この番号が IPアドレスです。1981年に定められた当初の方式(IPv4)では32ビットで、約42億通り。現在は128ビットのIPv6も広く使われています(IPv6は1998年に標準化されました)。
DNSの仕組みは、階層を上から順にたどるというものです。「www.example.co.jp を教えて」と聞かれたら、まずjp を管理するサーバーに聞き、次に co.jp を管理するサーバーに聞き、最後に example.co.jp を管理するサーバーに聞きます。ちょうど郵便番号の上位桁から順に絞っていく形です。
ここで覚えておきたい性質が3つあります。第一に、結果はキャッシュされます。だから2回目以降は速い。第二に、「名前解決が遅い」ことは十分ありえます。キャッシュが切れている、あるいは大量の名前を引いている場合です。第三に、DNSは暗号化されていない方式が長く使われてきました。そのため、問い合わせ内容を第三者に観測される問題が指摘され、その対策として問い合わせを暗号化する方式(DoT・DoH)が標準化されました。
🔬 検証③:経路——なぜ遠回りするのか
次は、実際に荷物が運ばれる段階です。ここでよく誤解されるのが「インターネットは1本の管で繋がっている」というイメージです。実際は違います。
インターネットは、無数のネットワークが相互に接続した網です。各ネットワーク(プロバイダ、企業、データセンター)が互いに接続し、その間をパケットが中継されます。中継する機器がルーターで、どの経路を使うかを自分で決めます。しかもその判断は刻一刻と変わります。混雑している経路は避けられ、故障した経路は迂回されます。
ここで、到着順序が入れ替わるという性質に注目してください。1/3、2/3、3/3 の順に送っても、3/3 が最初に届くことがあります。これをそのまま受け入れるのが UDP です。動画の配信や音声通話のように、多少抜けても待たないほうがよい用途で使われます。逆に、番号で並べ直し、欠けたら再送を頼むのが TCP です。Webページやファイル転送のように、全部揃わないと意味がない用途で使われます。
同じ「通信」でも、何を優先するかで方式が違う。これは第2回で扱った「型は将来の壊れ方を選ぶ」という話と同じ構造です。TCPとUDPは、何を犠牲にするかの選択なのです。
| 観点 | TCP | UDP |
|---|---|---|
| 到着の保証 | 欠けたら再送を頼む | 保証しない。欠けても待たない |
| 順序 | 番号で並べ直す | 届いた順のまま |
| 速さの立ち上がり | 接続の確立が必要(往復1.5回) | いきなり送れる |
| 向いているもの | Web・ファイル転送・メール・DB接続 | ライブ配信・音声通話・ゲーム・DNSの問い合わせ |
| 弱み | 欠損を待つため、遅延が跳ねることがある | 重要データでも消える。なりすましにも弱い |
そして、もう1つ重要な性質があります。TCPの再送は遅延を増幅させます。パケットが1つ失われると、受け取り側は「来ていない」ことに気づくまで待ち、それから再送を頼みます。この待ち時間のあいだ、後続のデータは届いても処理が進みません(順序の保証があるためです)。だからパケットロスは、遅延そのものより遥かに大きな影響を出すことがあります。1%のロスが、体感速度を数倍悪化させることは珍しくありません。
🔬 検証④:暗号化——何を守り、何を守らないのか
次は https の話です。ここは誤解が多いので、正確に押さえます。
TLS(Transport Layer Security) が提供するのは、主に3つです。第一に盗聴の防止(内容が読めない)。第二に改ざんの検知(途中で書き換えられたら気づく)。第三に相手の確認(本当にそのサーバーか)。この3つ目だけは、条件があります。証明書が正しく検証された場合に限る、ということです。
一方で、TLSが守らないものがあります。第一に、接続先のIPアドレスは隠れません。第二に、通信の長さや回数から何をしているかを推測される可能性があります。第三に、サーバー側で何が起きているかは守りません。第四に、アプリケーションの脆弱性は守りません。SQLインジェクションや認可の欠陥は、暗号化されていても成立します。
| 守られるもの | 守られないもの |
|---|---|
| 通信内容の機密性(読めない) | 接続先のIPアドレス・ポート(誰と通信したか) |
| 通信内容の完全性(改ざん検知) | 通信の量・タイミングから推測される情報 |
| サーバーの同一性(証明書が正しい場合) | サーバー内部の処理・保存データの安全性 |
| — | アプリケーション層の脆弱性(認可・入力検証など) |
ここで押さえておくべきことがあります。「https だから安全」は半分だけ正しいということです。通信路は守られても、その先のサーバーが正しく実装されているかは別問題です。暗号化は鍵で守るが、認可は設計で守る。この区別が、セキュリティの議論で最も混乱しやすいところです。
なお、TLSの歴史には学ぶべき失敗があります。TLS 1.0(1999年、当時はSSL 3.0の後継)から1.2を経て、TLS 1.3 が2018年にRFC 8446として標準化されました。古いバージョンには複数の攻撃手法が報告されてきたため、現在は1.2以降の使用が推奨されます。「動いているから古いままでよい」が通用しない分野の代表例です。
🔬 検証⑤:往復の回数を数える——第5回との合流点
ここで第5回と合流します。第5回で「ループの内側で外部に問い合わせると、往復が O(n) 回になる」と書きました。その深刻さを、今回の知識で数字に換算します。
シナリオ:100件のデータについて、1件ずつAPIを呼んで詳細を取得する。
- 1回の往復(TCP確立+TLS+HTTP)が、同じ国内で約20ms
- 100件なら 20ms × 100 = 2,000ms = 2秒
ところが、接続を再利用して1回の往復でまとめて取るとします。
- TCP確立とTLSが1回(約10ms)
- 1回のリクエストで100件を返す(応答サイズは大きいが、帯域は広い)
- 合計で 数十ms
差は数十倍です。コードの見た目は「1件ずつ取る」から「まとめて取る」に変わっただけです。しかし、距離が物理的にあるから、この差は埋まりません。ローカル環境(往復0.1ms)では2秒が10msになり、差が見えない。本番(往復20ms)で初めて牙をむく。これが「ローカルでは速いのに本番では遅い」の最も多い原因です。
ここから、実務で使える見積もりの式が得られます。
総時間の目安 = 往復の回数 × 1往復の時間
この式を知っていると、レビューで「この処理は何秒かかるか」をコードを読むだけで見積もれます。100件を1件ずつ取る実装を見たら、反射的に「往復100回」と数え、距離を知って掛け算する。これができるかどうかが、性能の議論で発言できるかの分かれ目です。
📊 結果:症状から段階を特定する
ここまでの内容を、切り分けの形にまとめます。「どの段階で止まっているか」を先に決めるのがポイントです。第1回の「階の切り分け」のネットワーク版です。
| 症状 | 疑う段階 | 確認する道具・方法 | よくある原因 |
|---|---|---|---|
| 「名前が解決できない」と出る | ① DNS | nslookup・dig で解決を確認する | ドメインの設定ミス、DNSサーバの不調、キャッシュの不整合 |
| 応答がまったく返らない | ② 経路・接続 | traceroute・tcping で途中まで届くか確認する | ファイアウォール、経路の断、相手の停止 |
Connection refused | ② 接続 | 相手のポートが開いているか確認する | サービスが起動していない、ポート番号の誤り |
| 証明書の警告が出る | ③ 暗号化 | 証明書の有効期限・ドメイン名・発行元を見る | 期限切れ、ドメイン不一致、中間証明書の欠落 |
| 特定のAPIだけ遅い | ④ HTTP | サーバー側の処理時間と往復時間を分けて計測する | 相手の処理が重い。1回の応答の裏で多数の問い合わせが走っている(N+1。第7回で詳しく扱います) |
| 全体的に遅く、たまに失敗する | ②④ 往復とロス | 往復の回数と、失われた割合を計測する | 往復回数が多い、パケットロスで再送が多発 |
| 大きなファイルだけ遅い | ⑤ 応答受信 | 転送量と帯域を確認する | サイズが大きい、圧縮していない |
| ローカルでは速いのに本番で遅い | 往復の回数 | 往復回数 × 1往復の時間で見積もる | 1件ずつ問い合わせている、接続を再利用していない |
特に最後の1行は、今回いちばん持ち帰ってほしい症状です。原因が自分のコードにあるのに、環境のせいに見える。往復回数を数えるという作業だけで、原因が特定できます。
💭 考察:ネットワークは「時間」と「失敗」を設計に持ち込む
ここまでの話を一段深く掘ります。ネットワークが他の階と決定的に違うのは、「時間」と「失敗」が設計の前提になっていることです。
メモリのアクセス(第3回)は、失敗しません。ディスク(第4回)は遅いですが、原則として成功します。ところがネットワークは、遅れることが常態であり、途中で消えることが前提です。だから、タイムアウト、再送、冪等性(何度実行しても同じ結果になる性質)、リトライの上限。これらは「念のための保険」ではなく、ネットワークの性質そのものへの対処です。
この前提を理解すると、設計の見方が変わります。「失敗しない前提」で書かれたコードは、ネットワークを含んだ瞬間に壊れます。第1回で「抽象は漏れる」と書きましたが、ネットワークは最も漏れやすい抽象です。ローカルでは全て成功するからです。
もう1つ、深い見方があります。ネットワークは「距離にコストがある」唯一の階だということです。メモリのアクセスは、どのアドレスでもほぼ同じ時間です(正確にはキャッシュの階層がありますが、地理的な差はありません)。ところがネットワークは、東京とサンパウロで100ms違います。これは、設計の段階で地理を考えなければならないということを意味します。
だから、データをどこに置くかが設計判断になります。ユーザーに近い場所にデータを置く、計算を近くで済ませる、そもそも往復を減らす。これは第3回の「何を近くに置くか」という問いの、地球規模版です。速い記憶は小さく、遠い記憶は遅いという原則が、そのまま「近いサーバーは速く、遠いサーバーは遅い」に現れています。
そして3つ目に、ネットワークは「全体を1人で制御できない」唯一の階です。メモリもOSもディスクも、自分のマシンの中にあります。ところがネットワークは、自分の管理外の機器が何十台も挟まります。そのどれかが混雑しても、故障しても、自分のコードに責任はありません。しかし影響は受けます。この「制御できないものに依存する」という性質が、分散システムの難しさの源です。第8回で扱う並行処理の難しさも、この性質の延長にあります。
📌 注目ポイント
この記事の核心を4点に絞ります。
第一に、ネットワークは配送業です。 分解して箱詰めし、送り状を付けて、中継センターを経由させ、受け取った側で組み立て直します。この比喩が分かれば、用語がすべて自然に理解できます。
第二に、遅延の下限は物理で決まります。 光ファイバーの中の信号は光速の約3分の2。10,000kmで片道50ms、往復100msが下限です。どんなに最適化しても、この壁は超えられません。超えられるのは往復回数だけです。
第三に、https は通信路を守りますが、サーバーの中は守りません。 盗聴・改ざん・相手の確認は守られますが、接続先のIPは隠れず、アプリの脆弱性も守られません。暗号化は鍵で守り、認可は設計で守る。
第四に、往復回数が総時間を決めます。 総時間 = 往復の回数 × 1往復の時間。この式だけで、本番とローカルの性能差の多くが説明できます。
💡 活用事例:1つの住所から始まった分散の仕組み
ここまでの話がどう現実のインフラになったかを見ます。DNSの歴史です。
今日のDNSは、世界中で同じ名前が同じ答えを返すことを前提にしています。しかしその前提は、自然に成立したものではありません。
1980年代初め、インターネットの前身であるARPANETでは、ホスト名の一覧を1つのファイルで配っていました(HOSTS.TXT)。すべてのマシンがこのファイルをダウンロードして使っていたのです。ところがネットワークが育つにつれて、この方式は破綻します。理由は単純で、追加・変更のたびに全員が同じファイルを更新しなければならず、中央の1点に負荷が集中したからです。
そこで1983年、ポール・モカペトリスが階層型の名前解決の仕組みを設計し、RFC 882・883として公開されました(のちにRFC 1034・1035として整理されます)。この設計の要点は3つです。第一に、名前空間を木構造に分ける。第二に、各階層の管理者に権限を委譲する。第三に、結果をキャッシュしてよいと定める。
この設計からジュニアエンジニアが持ち帰れる教訓は3つあります。第一に、「中央に集める」設計は規模で必ず破綻します。第二に、分けて委譲すると、変更の影響範囲を狭められます(第1回の階層の話と同じ発想です)。第三に、キャッシュは大規模システムの必須技術です。第3回で「答えを先に計算しておく」という話をしましたが、DNSはそれを世界規模で実践しています。
そして、この事例にはもう1つ深い教訓があります。DNSは「遅れる」ことを前提に設計されているのです。キャッシュには有効期限(TTL)があり、その間は古い答えが返ることがあります。正確さより速さと耐障害性を選んだ。第2回で「誤差を許容するかどうか」を扱いましたが、分散システムは常にこのトレードオフの上に成り立っています。
✅ 要点まとめ
読み終えたあなたが持ち帰るべきエッセンスを、6つに圧縮します。
- ネットワークは配送業。分解・送り状・中継・組み立て直しの4工程で理解できる
- 遅延の下限は物理で決まる。光ファイバーは光速の約3分の2。大陸間の往復100msは超えられない壁
- 1回のクリックの裏に5段階(DNS・接続・暗号化・リクエスト・応答)がある。段階ごとに見れば原因を特定できる
- 到着順は保証されない。順序と再送を選ぶのがTCP、速さを選ぶのがUDP。犠牲にするものを選ぶ設計
httpsは通信路を守る。IPアドレスは隠れず、サーバー内部も守らない。暗号化は鍵、認可は設計- 総時間 = 往復の回数 × 1往復の時間。この式だけで本番とローカルの差の多くが説明できる
🚀 取り込み方
「明日から使うには何をすればいいか」を、期間ごとに分けて示します。
今日(5分でできること)
自分の環境で、往復時間と経路を実際に見てください。数字を見れば、この記事の話が自分の環境の話になります。
# 名前解決にかかる時間を測る(Linux・macOS)
dig example.com | grep "Query time"
# 経路をたどる(どこで時間が増えているかを見る)
traceroute example.com # macOS / Linux
# Windows の場合: tracert example.com
# 応答時間を測る(往復時間と、ロスした割合の両方を見る)
ping -c 5 example.com
traceroute の出力で行ごとの時間が急に増える地点が、距離の壁か、経路の混雑か、国境の先かを教えてくれます。ping の「loss」の行も必ず見てください。1%のロスでも体感速度に大きく効きます。
今週(小さく試す)
担当コードから、次の3つを探してください。(1) ループの内側で外部に問い合わせている箇所、(2) 複数のリソースを順番に取得している箇所(並行にできる可能性があります)、(3) タイムアウトを設定していない外部呼び出し。見つけたら、「往復の回数 × 想定の往復時間」で総時間を見積もってみてください。これができると、レビューで「本番だと何秒かかるか」を答えられるようになります。
今月(業務に組み込む)
チームに次の3点を提案できないか検討してください。(1) 外部呼び出しには必ずタイムアウトとリトライ上限を設定する、(2) まとめられる呼び出しはまとめる、(3) 接続は再利用する。どれも「往復回数を減らす」という1つの方針にまとまります。あわせて、計測の習慣として「サーバー側の処理時間」と「通信の往復時間」を分けて記録することを提案してみてください。原因が自分の側か相手の側かが、一目で分かるようになります。
🔥 ハマりポイント
つまずきやすい5つの落とし穴を、「〜と思いがちだが、実は〜」の形で整理します。
その1:速い回線なら遠くても速いと思いがちだが、実は距離の下限がある
症状は、帯域を増やしたのに遅さが改善しないこと。原因は、帯域(1秒に運べる量)と遅延(往復にかかる時間)が別物であること。対処法は、「帯域か遅延か」を先に判定することです。大きなファイルの転送は帯域が効きますが、小さなリクエストを何度も往復する処理は遅延が効きます。この2つは改善策がまったく違います。
その2:https なら安全だと思いがちだが、実は守られない範囲がある
症状は、暗号化しているのに情報が漏れたり攻撃が成立したりすること。原因は、TLSが通信路だけを守り、アプリケーション層の脆弱性は守らないこと。対処法は、「守る層」を分けて考えることです。通信路はTLS、アクセス制御は認可の設計、入力の扱いはバリデーション。それぞれ別の対策が必要です。
その3:タイムアウトは念のためと思いがちだが、実は必須の設計要素
症状は、相手が応答しなくなったときに自分のプロセスが固まること(第4回で扱ったOSの資源を待ち続けて消費します)。原因は、既定のタイムアウトが非常に長い、あるいは無限であること。対処法は、すべての外部呼び出しに明示的なタイムアウトを設定することです。「いつまでも待つ」は、自分の資源を相手に差し出す行為です。
その4:ローカルで速ければ本番でも速いと思いがちだが、実は往復回数が効く
症状は、本番だけ極端に遅いこと。原因は、ローカルでは往復が0.1ms、本番では20msで、200倍の差があること。対処法は、往復回数を数えることです。10回の往復なら本番で200ms、100回なら2秒。ローカルの計測結果は、本番の性能を予測しません。
その5:リトライを増やせば信頼性が上がると思いがちだが、実は障害を悪化させる
症状は、相手が重いときにリトライでさらに負荷をかけてしまうこと(これをリトライストームと呼びます)。原因は、失敗したリクエストが同じタイミングで一斉に再送されること。対処法は、リトライに上限を設け、間隔を徐々に広げ、揺らぎ(同時に集中しないためのばらつき)を加えることです。第8回で扱う並行処理の話にも通じます。
🔄 比較:4つの層で「何を保証するか」
最後に、ネットワークの各層が「何を保証し、何を保証しないか」を整理します。保証を積み上げる構造が見えるはずです。
| 層 | 保証すること | 保証しないこと | 対応する技術 |
|---|---|---|---|
| リンク層 | 隣の機器まで届ける | その先の到達 | Ethernet・Wi-Fi |
| ネットワーク層 | 宛先までの経路を選ぶ努力 | 到着・順序・重複の排除 | IP・ICMP |
| トランスポート層 | (TCPの場合)到着・順序・重複排除 | 遅延の上限・帯域 | TCP・UDP |
| アプリケーション層 | 意味と形式(何をどう解釈するか) | 通信路の安全性 | HTTP・DNS・TLS |
この表から持ち帰ってほしいのは、「どの層も『これだけは守る』を積み上げている」という構造です。TCPが到着を保証するからHTTPは内容に集中でき、TLSが通信路を守るからアプリは認可に集中できる。抽象化の重ね着です。そして第1回で確認したとおり、この重ね着は漏れます。漏れたときに降りる階を知っているかどうかが、切り分けの速さを決めます。
📅 今後の展望
ネットワークは、これからどうなるのでしょうか。方向性は3つ考えられます。
第一に、物理的な下限は変わらないということです。光速は変えられないので、遠距離の遅延は永遠に残ります。だからこそ、データと計算をユーザーの近くに置く方向が進み続けます。第3回の「速い記憶は小さい」という原則が、地球規模で展開されている形です。
第二に、暗号化が既定になる方向です。通信路の暗号化は当然の前提になりつつあり、問い合わせの中身まで暗号化する方式(DNS over HTTPSなど)も広がっています。ただし、暗号化が進むと監視や最適化の手段が減るという副作用もあります。何を守り、何を失うかのトレードオフが、今後さらに議論されるでしょう。
第三に、新しい輸送方式の模索です。TCPもUDPも数十年の歴史があり、現在の使い方に合わない部分が出てきています。そのため、両者の長所を取る方式(QUIC。HTTP/3の土台として使われています)が登場しました。古い層を置き換えるのではなく、上に新しい層を積むという形で進化しています。これも「階層は残り、中身が入れ替わる」という第1回の原則の現れです。
なお、この記事で扱ったIP・TCP・DNSの基本設計は、1970年代後半から1980年代に確立したものです(TCP/IPは1981年のRFC 791・793が初期の標準)。40年以上たっても構造が変わっていないのは、「届ける」という問題設定そのものが変わっていないからです。第1回で「下の階ほど長寿」と書きましたが、インターネットの基本設計はその最たる例です。
🗺️ 次回予告:なぜ同時に触っても壊れないのか
第6回では、ネットワークを配送業として理解し、遅延の下限が物理で決まること、往復回数が総時間を決めることを見ました。
第7回は データベース を扱います。第4回で「ファイルを開くのは番号札を取ること」、第6回で「通信には往復がかかる」と学びました。では、100人が同時に同じデータを書き換えたら何が起きるのか。なぜ壊れないのか。ACID という言葉は何を約束しているのか。索引(第5回のB-tree)は、なぜ更新のときに不利になるのか。
そして、第5回・第6回で扱った「往復回数」と「計算量」が、データベースの性能を決める2大要因であることが、次回で一本につながります。N+1問題という言葉の正体も、そこで分かります。
まとめ
この記事を読んだあなたは、繋がらないときに「なぜ」と悩む代わりに、5つの段階のどこで止まっているかを順に確認するようになります。遅いときは、往復の回数 × 1往復の時間で見積もり、サーバー側か経路か自分のコードかを切り分けるようになります。
そして、https にしたから安全、速い回線にしたから速い、という短絡が消えます。ネットワークは物理でできていて、距離にはコストがあり、失敗は前提です。その前提の上で設計するとは、往復を減らし、失敗に備え、守るべき層を分けて考えることです。第1回で「下の階ほど長寿」と書きましたが、40年以上生き続けているインターネットの設計は、長く効く知識の見本です。今回あなたが手に入れたのは、その設計を読み解く目です。
参考文献
- J. Postel (ed.), “RFC 791: Internet Protocol”, IETF, 1981 — https://www.rfc-editor.org/rfc/rfc791
- J. Postel (ed.), “RFC 793: Transmission Control Protocol”, IETF, 1981 — https://www.rfc-editor.org/rfc/rfc793
- W. Eddy (ed.), “RFC 9293: Transmission Control Protocol (TCP)”, IETF, 2022(RFC 793 の改訂版) — https://www.rfc-editor.org/rfc/rfc9293
- R. Fielding, M. Nottingham, J. Reschke (eds.), “RFC 9110: HTTP Semantics”, IETF, 2022 — https://www.rfc-editor.org/rfc/rfc9110
- E. Rescorla, “RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3”, IETF, 2018 — https://www.rfc-editor.org/rfc/rfc8446
- P. Mockapetris, “RFC 1034: Domain Names - Concepts and Facilities”, IETF, 1987 — https://www.rfc-editor.org/rfc/rfc1034
- P. Mockapetris, “RFC 1035: Domain Names - Implementation and Specification”, IETF, 1987 — https://www.rfc-editor.org/rfc/rfc1035
- S. Deering, R. Hinden, “RFC 8200: Internet Protocol, Version 6 (IPv6) Specification”, IETF, 2017 — https://www.rfc-editor.org/rfc/rfc8200
- J. Iyengar, M. Thomson (eds.), “RFC 9000: QUIC: A UDP-Based Multiplexed and Secure Transport”, IETF, 2021 — https://www.rfc-editor.org/rfc/rfc9000
- James F. Kurose, Keith W. Ross, “Computer Networking: A Top-Down Approach”, Pearson(トップダウンで学ぶ定番教科書) — https://www.pearson.com/
- Andrew S. Tanenbaum, Nick Feamster, David J. Wetherall, “Computer Networks” (6th ed.), Pearson — https://www.pearson.com/
- Wireshark 公式ドキュメント(実際に流れているパケットを観察する道具。TCPの再送やTLSの往復を自分の目で確認できる) — https://www.wireshark.org/docs/
- Let’s Encrypt / Internet Security Research Group, “How It Works”(証明書発行と検証の実際) — https://letsencrypt.org/how-it-works/
- OWASP, “Transport Layer Security Cheat Sheet” — https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Security_Cheat_Sheet.html
- Google, “Site Reliability Engineering” 第21章 “Handling Overload”(リトライと過負荷の設計) — https://sre.google/sre-book/handling-overload/
- 総務省, 「情報通信白書」(国内のインターネットトラヒックと回線の状況。帯域と遅延の違いを実データで見る材料になる) — https://www.soumu.go.jp/johotsusintokei/whitepaper/
Rui Software