合同会社小村ソフト
第 1 章

導入 — TCP は何を約束するか

IP だけの世界では届かない・乱れる・重複するという前提から出発し、TCP の 3 つの約束と UDP との分担、ポート番号とソケットの役割をつかむ。

「タイムアウトしました」の先へ進めない

接続タイムアウトのログは見つけた。リトライしたら直った。でも「なぜ」は分からないまま — TCP の障害調査は、多くの人がここで止まります。パケットキャプチャを開いても、seqackwin という数字の列が何を言っているのか読めないからです。

読めるようになる近道は、TCP の機能を暗記することではなく、TCP がどんな土台の上で、何を約束しようとしているかを先につかむことです。出発点は TCP の下にいる IP の性質です。IP はパケット(データの小包)を宛先ホストまで運びますが、その配達は「ベストエフォート」— 最善は尽くすが結果は保証しない、という約束です。具体的には、経路上でこうなります。

届かないことがある
混雑したルータはあふれたパケットを黙って捨てる。捨てたことは誰にも通知されない
順番が入れ替わることがある
パケットごとに通る経路が違えば、後から送ったものが先に着く
重複することがある
再送の仕組みと配達遅れが重なると、同じパケットが 2 回届く

この土台の上で「ファイルを 1 バイトも欠けさせず、順序どおりに届ける」仕事を、アプリケーションの代わりに引き受けるのが TCP(Transmission Control Protocol)です。

失う・乱す・重複させる IP の上に TCP と UDP が乗り、TCP が必ず届く・順番どおり・ペースを合わせるという 3 つの約束をアプリケーションに提供する層構造の図

IP は「たぶん届く」まで。その上で TCP は 3 つの約束を守り、UDP はあえてほぼ素通しにします。どちらが偉いのではなく、役割が違います。

TCP の 3 つの約束 — この講座の背骨

TCP の仕組みは一見たくさんありますが、すべては次の 3 つの約束のどれかを守るための道具です。この講座では毎章、いま学んでいる仕組みがどの約束のためのものかに立ち返ります。

約束意味実現する道具扱う章
必ず届く — 届かなければ気づく欠けたら検知して再送するシーケンス番号 + ACK + 再送タイマー第 2〜3 章
順番どおり乱れ・重複を直してから渡すシーケンス番号 + 受信バッファ第 3 章・第 6 章
相手とネットワークに合わせる受け手と経路の都合より速く送らないウィンドウ(フロー制御)+ cwnd(輻輳制御)第 4〜5 章

一方の UDP(User Datagram Protocol)は、この約束をあえて何もしません。IP のベストエフォートに「ポート番号」と最小限のチェックだけを足した薄い層です。手抜きではなく、再送や順序の待ち合わせが邪魔になる用途(ビデオ通話、オンラインゲーム、DNS の問い合わせなど)のための選択肢です。TCP の 3 つの約束には、遅延というコストが必ず付いてくるからです。

小問 1-1 — IP の性質と TCP/UDP の分担

「IP は何をしてくれないか」を正しく言えることが、TCP を理解する出発点です。

Q1. IP だけ(TCP なし)でデータを送ったとき、経路上で普通に起こりうることとして正しい組み合わせはどれですか。

Q2. TCP ではなく UDP を選ぶのが適切な場面はどれですか。

Q3. TCP が約束していないことはどれですか。

ポート番号とソケット — 会話の口を特定する

IP アドレスは「どのホストか」を指しますが、届いた先のホストでは Web サーバもデータベースも SSH も同時に動いています。そのホストのどのプログラム宛かを指すもう 1 つの番号がポート番号です(0〜65535。HTTPS は 443、SSH は 22 など)。

そして IP アドレス : ポート番号 の組が指す通信の口をソケットと呼びます。プログラムから見ると、ソケットは「相手に繋がったバイトの土管」で、send() で流し込み recv() で受け取ります(この土管の意外な性質が第 6 章の主役です)。

ここで大事なのは、TCP のコネクション 1 本を識別するのは宛先だけではないことです。コネクションは

(送信元 IP, 送信元ポート, 宛先 IP, 宛先ポート)

という 4 つ組で識別されます。だから 1 台のサーバのポート 443 に、何万ものクライアントが同時に接続できます — 宛先側は同じでも、送信元側の IP やポート(クライアント側は空いている番号が自動で割り当てられます)が違えば、別のコネクションだからです。

この講座の合言葉: キャプチャや障害ログを見たら問いかけてください — いま破られかけているのは、到達の約束か? 順序か? ペース合わせか?

小問 1-2 — ポート番号とソケット

IP アドレスだけでは足りない「もう 1 つの番号」の役割を確認します。

Q4. IP アドレスに加えてポート番号が必要な理由として正しいものはどれですか。

Q5. 1 台のサーバのポート 443 に、多数のクライアントが同時に接続できます。サーバが個々のコネクションを取り違えずに区別できるのはなぜですか。

この章で持ち帰ること

  • IP はベストエフォート — 失う・乱す・重複させる。しかもそれを通知しない
  • TCP の約束は 3 つ — 必ず届く(届かなければ気づく)・順番どおり・相手とネットワークに合わせる。時間の保証は無い
  • UDP は約束の代わりに低遅延を取る選択肢。用途で使い分ける
  • コネクションは (送信元 IP, 送信元ポート, 宛先 IP, 宛先ポート) の 4 つ組で識別される

次章では、この 4 つ組の両端が「これから番号を数え始めるよ」と合意する儀式 — 3 ウェイハンドシェイク — を 1 パケットずつ追います。