TCP101
TCPを図と演習で理解する
「タイムアウトのログは見えるが、その先が調べられない」「パケットキャプチャを開いても、seq や ack の数字が何を言っているのか分からない」— TCP は毎日使っているのに、中身は意外と説明しづらいものです。この講座では TCP を丸暗記するのではなく、キャプチャや障害ログを、シーケンス番号とウィンドウの気持ちで自分で追えるようになることを目指します。図で全体像をつかみ、各章の途中にある小問と手計算で確かめながら進む構成です。
図 → 手計算 → シミュレータ → ケース演習
全 43 問
ブラウザ内採点
localStorage 保存
所要
3〜4 時間
問題数
全 43 問
形式
7 章 + 小問 + シミュレータ
費用
無料
IP は「たぶん届く」までしか約束しません。その上に乗った TCP が、アプリケーションに代わって 3 つの約束を守ります。まずこの分担を頭に置くと、以降のすべての章が読みやすくなります。
この講座の特徴
本文のすぐ下に小問
読んだ直後に 2〜3 問ずつ解く構成なので、「分かったつもり」のまま先へ進みにくくなっています。
seq / ack を手計算する
シーケンス番号と ACK 番号、ウィンドウの残り、cwnd の成長を小さな数で実際に計算し、キャプチャの数字が読める感覚を作ります。
スライディングウィンドウのシミュレータ
第 4 章のシミュレータで、RTT・ウィンドウ・帯域を動かすと「1 RTT に送れる量」とスループットの上限がどう変わるかを目で確かめられます。
ブラウザ内採点・登録不要
全 43 問はブラウザ内で採点され、結果はお使いのブラウザの localStorage にだけ保存されます。サーバには何も送信しません。
この講座を貫く 3 つの約束
TCP の仕組みは多く見えますが、すべては 3 つの約束のどれかを守るための道具です。章が進むごとに、それぞれの約束を支える部品が増えていくイメージです。
1. 必ず届く — 届かなければ気づく
送ったバイトには番号が振られ、相手は「どこまで受け取ったか」を返す。返ってこなければ再送する。(第 2〜3 章)
2. 順番どおり
途中で追い越しや重複が起きても、受信側は番号を頼りに元のバイト列を並べ直してからアプリに渡す。(第 3 章、第 6 章)
3. 相手とネットワークに合わせて送る
相手のバッファの都合(フロー制御)と、経路の混雑の都合(輻輳制御)の、両方より速くは送らない。(第 4〜5 章)
この講座の合言葉: キャプチャや障害ログを見たら、そこで思考を止めずに問いかけてください — いま破られかけているのは、到達の約束か? 順序か? ペース合わせか?
章構成
1 導入 — TCP は何を約束するか
5 問。IP だけでは「届かない・乱れる・重複する」ことから出発し、TCP/UDP の分担とポート番号・ソケットまでを整理します。
2 コネクション — TCP の 3 ウェイハンドシェイクと切断
6 問。SYN → SYN/ACK → ACK の 3 つのパケットの意味と「なぜ 2 回でも 4 回でもなく 3 回か」、FIN による切断と TIME_WAIT までを追います。
3 シーケンス番号と再送 — TCP は届いたことをどう確かめるか
6 問。「ack 番号 = 次に欲しいバイト」を手計算で体に入れ、再送タイマーと重複 ACK・高速再転送を区別します。
4 フロー制御 — TCP のスライディングウィンドウ
6 問。ウィンドウ広告と in-flight の手計算、そしてシミュレータで「スループット上限 = ウィンドウ ÷ RTT」を体感します。
5 輻輳制御 — TCP はネットワークの混雑に譲る
6 問。相手の都合(フロー制御)とネットワークの都合(輻輳制御)を区別し、スロースタートの倍々を手計算します。
6 ストリームとフレーミング — TCP の send と recv はずれる
6 問。「1 回の send は 1 回の recv ではない」というバイトストリームの性質と、メッセージ境界を自分で作るフレーミングを学びます。
7 総合演習 — TCP の動きをパケットの気持ちで読み解く
8 問。接続拒否・再送多発・ゼロウィンドウ・TIME_WAIT 大量発生など、障害調査を模したケース問題で全章を横断します。
受講のコツ
- 本文 → すぐ下の小問の順で進めてください。まとめて後で解くより、読んだ直後に解くほうが定着します。
- 第 3〜5 章の計算問題は暗算で済ませず、バイトの番号とウィンドウの端を紙に書き出してください。キャプチャの数字が「読める」感覚は手からきます。
- 第 4 章のシミュレータは、小問を解く前後に両方触ってください。「ウィンドウ ÷ RTT」の式が体感に変わります。
- 第 7 章のケース問題でつまずいたら、対応する章へ戻って 1〜2 周だけ復習してください。全部やり直す必要はありません。
開始前の前提
- 何らかの言語でプログラムを書いた経験が少しあれば十分です。ネットワークの専門知識は前提にしません。
- 掛け算・割り算と「バイト数の足し算」ができれば、手計算はすべて進められます。
- IP アドレスが「宛先を指す住所」であることが分かっていれば大丈夫です。ルーティングの詳細には立ち入りません。