## What — 1回の通信は7段階、HTTP は最後の3つだけ URL を叩いてからレスポンスが返るまでに、7つの段階が順番に走る。**HTTP の注文と返答は最後の3段階だけ**で、前半4段階はその注文票を相手に届けるための準備。 1. **URL の分解** — 宛先(ホスト)と頼むこと(パス)に分ける 2. **DNS 名前解決** 3. **TCP 接続** 4. **TLS ハンドシェイク** 5. **HTTP リクエスト送信** — 注文票を流す(中身は [[HTTPリクエストの構造|HTTPリクエストの構造]]) 6. **サーバー処理** 7. **レスポンス返却** — 返答が戻る(中身は [[HTTPレスポンスの構造|HTTPレスポンスの構造]]) ## How — 準備の3段階は前の結果の上に次を載せる積み重ね 住所がわかって(DNS)初めて回線をつなげ(TCP)、回線があって初めて暗号化できる(TLS)という**積み重ね**。暗号化された回線の中を、HTTP のテキストが流れる。 | 段階 | 一言の役割 | | --- | --- | | DNS | 名前(ドメイン)→ 住所(IP アドレス)に引き直す電話帳 | | TCP | データが欠けず・順番どおり届く回線を張る | | TLS | その回線を暗号化して盗聴・改ざんを防ぐ | | HTTP | 回線の中を流れる「注文票と返答」の書式 | > [!info] > 電話で言うと、DNS=店名から番号を調べる、TCP=電話をかけて相手が出る、TLS=周りに聞かれない専用回線にする、HTTP=注文の言葉遣い。 ## いつ使うか — エラーを「どの段階で死んだか」で切り分ける 7段階が頭にあると、通信エラーは**エラーメッセージがどの段階の言葉か**で読み分けられる。`curl -v` で各段階のログが上から順に見える。 | エラーの出方 | 死んだ段階 | まず疑うこと | | --- | --- | --- | | `Could not resolve host` | DNS | ドメイン名の打ち間違い | | `Connection refused` / タイムアウト | TCP | サーバーが起動していない・ポート違い | | `certificate` 系エラー | TLS | 証明書切れ・http と https の取り違え | | 4xx / 5xx が返ってくる | HTTP 以降 | リクエストの中身か、サーバー側の処理 | > [!success] > ステータスコードが返ってきた時点で、段階1〜4は全部成功している。4xx / 5xx は「通信の失敗」ではなく**通信が成功した上での相手からの返答**。 ## 関連 - [[HTTPリクエストの構造|HTTPリクエストの構造]] — 段階5で流れる注文票の解剖 - [[HTTPレスポンスの構造|HTTPレスポンスの構造]] — 段階7で返ってくる返答の解剖 - [[curl]] — この流れを手で起こすコマンド - [[API]] — API まわりの地図