C
ネットワーク/TCP UDP/Lesson 03

TCP · UDP — パケット・ハンドシェイク・フロー/輻輳制御

45分·theory

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

比較:

項目TCPUDP
接続必須 (3-way)なし
ヘッダー20-60バイト8バイト
信頼性保証あり
順序保証あり
速度中程度高速
用途Web・DB・ファイル転送リアルタイム・DNS

QUIC (HTTP/3) — UDP上の信頼性:

  • Google開発、RFC 9000 (2021)
  • TCP+TLSのオーバーヘッドを回避
  • モバイル・リアルタイム環境に強い
  • YouTube・Google・Cloudflareが採用

TCP 3-way + 4-wayハンドシェイク

3-wayハンドシェイク (接続):

code
Client                              Server
  │   ── SYN, seq=x         ──▶     │
  │                                  │
  │   ◀── SYN-ACK, seq=y, ack=x+1   │
  │                                  │
  │   ── ACK, ack=y+1       ──▶     │
  │                                  │
  │       [接続確立 — データ転送開始]

1. SYN — Client: 「接続要求 (seq=x)」
2. SYN-ACK — Server: 「承認 + 自分のseq=y」
3. ACK — Client: 「確認 (ack=y+1)」

以降、双方向でデータ転送が行われます。

4-wayハンドシェイク (切断):

code
Client                              Server
  │   ── FIN              ──▶       │
  │   ◀── ACK              ─        │   (サーバーがデータを整理中)
  │                                  │
  │   ◀── FIN              ─        │
  │   ── ACK              ──▶       │
  │       [TIME_WAIT — 2*MSL待機]

1. FIN — Client: 「切断します」
2. ACK — Server: 「了解。少し待ってください (残りのデータを整理中)」
3. FIN — Server: 「こちらも完了」
4. ACK — Client: 「確認しました」

TIME_WAIT (2 × MSL):

  • 最後のACKが失われた場合に再送するため
  • 同じポートを再利用する際に古いパケットと混同しないため
  • Linuxのデフォルトは60秒

なぜ4ステップなのか? 切断は両側のデータ整理が必要です。接続時のようにSYNとACKをまとめることができません。

フロー制御 + 輻輳制御

フロー制御受信側の処理速度に合わせる:

  • 受信側がウィンドウサイズを通知する
  • 送信側はその分だけ送信する
  • 受信バッファが満杯になるとウィンドウサイズ = 0 → 送信一時停止

スライディングウィンドウ:

code
送信済み          送信可能          送信不可
[──ACK受信済み──][──未ACKの送信済み──][──ウィンドウ外──]
                   └─ ウィンドウサイズ ─┘

輻輳制御ネットワークの状態に合わせる:

4つのアルゴリズム:
1. スロースタート — RTTごとにウィンドウを2倍にする (指数関数的増加)
2. 輻輳回避 — 閾値を超えたら線形増加 (RTTごとに+1)
3. 高速再転送 — 重複ACKを3回受け取ったら即座に再送
4. 高速回復 — スロースタートに戻らず輻輳回避へ移行

現代のアルゴリズム:

アルゴリズム特徴
Reno・NewReno標準 (旧Linuxのデフォルト)
CUBICLinuxデフォルト (2.6以降) — 高帯域・高遅延向け
BBR (2016, Google)YouTube・Googleが採用。遅延ベース

RTT (Round-Trip Time) — ネットワークの重要指標:

  • ソウル → ソウル: 1-5ms
  • ソウル → 東京: 30ms
  • ソウル → カリフォルニア: 150ms
  • ソウル → ヨーロッパ: 250ms

> 💡 モバイルネットワークはRTTが非常に変動しやすい → BBRのような遅延ベースのアルゴリズムが有利。

🤖 AIへのプロンプト例

このlessonの概念を理解すれば、AIに具体的に指示を出せるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。

  • 「このタスクにTCPとUDPのどちらが適切か診断して」
  • 「TCP 3-wayハンドシェイクをWiresharkキャプチャ形式でシミュレーションして」

なぜこれでトークンが減るのか

概念を知らないと、AIの回答を受け取っても「それは何ですか?」と再度尋ねなければなりません。その「再質問」がトークンを消費します。概念を一度理解しておけば、対話が一度で完結します。

TCP · UDP — パケット・ハンドシェイク・フロー/輻輳制御 - ネットワーク