TCP · UDP — パケット・ハンドシェイク・フロー/輻輳制御
TCP · UDP — パケット・ハンドシェイク・フロー/輻輳制御
🎯 このlessonを読み終えたら
このlessonを最後まで読むと、以下の3つを自信を持って説明できるようになります。
- ▸✅ TCP 3-wayハンドシェイク / 4-wayクローズ
- ▸✅ TCP vs UDP の選択基準
- ▸✅ TCPフロー制御 + 輻輳制御
学習目標をチェックリストとして手元に置き、すべて答えられるようになったらlessonを閉じてください。
TCP vs UDP — 信頼性 vs 速度
TCP (Transmission Control Protocol):
- ▸コネクション指向 (3-wayハンドシェイク)
- ▸信頼性 (再送・順序保証・重複排除)
- ▸フロー・輻輳制御 (ネットワーク状況に応じて速度を調整)
- ▸用途: HTTP・SSH・メール・DB
UDP (User Datagram Protocol):
- ▸コネクションレス (ハンドシェイクなし)
- ▸高速 (オーバーヘッドが少ない)
- ▸信頼性 ❌ (アプリケーションが責任を持つ)
- ▸用途: DNS・VoIP・ゲーム・リアルタイム映像・QUIC
比較:
QUIC (HTTP/3) — UDP上の信頼性:
- ▸Google開発、RFC 9000 (2021)
- ▸TCP+TLSのオーバーヘッドを回避
- ▸モバイル・リアルタイム環境に強い
- ▸YouTube・Google・Cloudflareが採用
TCP 3-way + 4-wayハンドシェイク
3-wayハンドシェイク (接続):
1. SYN — Client: 「接続要求 (seq=x)」
2. SYN-ACK — Server: 「承認 + 自分のseq=y」
3. ACK — Client: 「確認 (ack=y+1)」
以降、双方向でデータ転送が行われます。
4-wayハンドシェイク (切断):
1. FIN — Client: 「切断します」
2. ACK — Server: 「了解。少し待ってください (残りのデータを整理中)」
3. FIN — Server: 「こちらも完了」
4. ACK — Client: 「確認しました」
TIME_WAIT (2 × MSL):
- ▸最後のACKが失われた場合に再送するため
- ▸同じポートを再利用する際に古いパケットと混同しないため
- ▸Linuxのデフォルトは60秒
なぜ4ステップなのか? 切断は両側のデータ整理が必要です。接続時のようにSYNとACKをまとめることができません。
フロー制御 + 輻輳制御
フロー制御 — 受信側の処理速度に合わせる:
- ▸受信側がウィンドウサイズを通知する
- ▸送信側はその分だけ送信する
- ▸受信バッファが満杯になるとウィンドウサイズ = 0 → 送信一時停止
スライディングウィンドウ:
輻輳制御 — ネットワークの状態に合わせる:
4つのアルゴリズム:
1. スロースタート — RTTごとにウィンドウを2倍にする (指数関数的増加)
2. 輻輳回避 — 閾値を超えたら線形増加 (RTTごとに+1)
3. 高速再転送 — 重複ACKを3回受け取ったら即座に再送
4. 高速回復 — スロースタートに戻らず輻輳回避へ移行
現代のアルゴリズム:
RTT (Round-Trip Time) — ネットワークの重要指標:
- ▸ソウル → ソウル: 1-5ms
- ▸ソウル → 東京: 30ms
- ▸ソウル → カリフォルニア: 150ms
- ▸ソウル → ヨーロッパ: 250ms
> 💡 モバイルネットワークはRTTが非常に変動しやすい → BBRのような遅延ベースのアルゴリズムが有利。
🤖 AIへのプロンプト例
このlessonの概念を理解すれば、AIに具体的に指示を出せるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。
- ▸「このタスクにTCPとUDPのどちらが適切か診断して」
- ▸「TCP 3-wayハンドシェイクをWiresharkキャプチャ形式でシミュレーションして」
なぜこれでトークンが減るのか
概念を知らないと、AIの回答を受け取っても「それは何ですか?」と再度尋ねなければなりません。その「再質問」がトークンを消費します。概念を一度理解しておけば、対話が一度で完結します。