導入 — TCP は何を約束するか
IP だけの世界では届かない・乱れる・重複するという前提から出発し、TCP の 3 つの約束と UDP との分担、ポート番号とソケットの役割をつかむ。
「タイムアウトしました」の先へ進めない
接続タイムアウトのログは見つけた。リトライしたら直った。でも「なぜ」は分からないまま — TCP の障害調査は、多くの人がここで止まります。パケットキャプチャを開いても、seq や ack、win という数字の列が何を言っているのか読めないからです。
読めるようになる近道は、TCP の機能を暗記することではなく、TCP がどんな土台の上で、何を約束しようとしているかを先につかむことです。出発点は TCP の下にいる IP の性質です。IP はパケット(データの小包)を宛先ホストまで運びますが、その配達は「ベストエフォート」— 最善は尽くすが結果は保証しない、という約束です。具体的には、経路上でこうなります。
この土台の上で「ファイルを 1 バイトも欠けさせず、順序どおりに届ける」仕事を、アプリケーションの代わりに引き受けるのが TCP(Transmission Control Protocol)です。
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 なし)でデータを送ったとき、経路上で普通に起こりうることとして正しい組み合わせはどれですか。
IP の配達は「ベストエフォート」です。ルータのキューあふれで捨てられ、経路の違いで追い越され、再送の仕組みの副作用で重複します。しかも IP 自身はそれを検知も通知もしません。この「何も保証しない土台」を受け入れるところから TCP の設計が始まります。順番が守られる・必ず届く・異常が通知される、はいずれも IP には無い性質です。
Q2. TCP ではなく UDP を選ぶのが適切な場面はどれですか。
UDP は IP のベストエフォートをほぼそのままアプリに渡す薄い層です。ビデオ通話では 0.1 秒前の音声を再送してもらっても遅すぎて使えないので、「欠けたら諦めて次へ」のほうが体験が良く、UDP が向きます。ファイル転送やメールは 1 バイトの欠けも許されないので TCP の領分です。なお改ざん対策は TCP でも UDP でもなく TLS などの仕事です。
Q3. TCP が約束していないことはどれですか。
TCP は「必ず届く(届かなければ気づく)・順番どおり・相手とネットワークに合わせる」を約束しますが、時間の保証はどこにもありません。むしろ再送や待ち合わせのために遅延は増える方向です。「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 アドレスに加えてポート番号が必要な理由として正しいものはどれですか。
IP アドレスは「どのホストか」までしか指せません。1 台のホストでは Web サーバ・SSH・データベースなど複数のプログラムが同時に通信を待っているので、「そのホストのどの窓口か」を指す番号が別に必要です。それがポート番号(例: HTTPS は 443)。ルータは IP アドレスだけを見て転送し、暗号化は TLS などの仕事です。
Q5. 1 台のサーバのポート 443 に、多数のクライアントが同時に接続できます。サーバが個々のコネクションを取り違えずに区別できるのはなぜですか。
コネクションの識別子は宛先の 1 点ではなく (送信元 IP, 送信元ポート, 宛先 IP, 宛先ポート) の 4 つ組です。宛先側が全員 443 でも、送信元側の IP かポートが違えば別のコネクションになります。この 4 つ組の片端、つまり自分側の IP:ポート という通信の口がソケットです。4 つ組は第 2 章の TIME_WAIT や第 7 章のケースでも主役になります。
この章で持ち帰ること
- IP はベストエフォート — 失う・乱す・重複させる。しかもそれを通知しない
- TCP の約束は 3 つ — 必ず届く(届かなければ気づく)・順番どおり・相手とネットワークに合わせる。時間の保証は無い
- UDP は約束の代わりに低遅延を取る選択肢。用途で使い分ける
- コネクションは (送信元 IP, 送信元ポート, 宛先 IP, 宛先ポート) の 4 つ組で識別される
次章では、この 4 つ組の両端が「これから番号を数え始めるよ」と合意する儀式 — 3 ウェイハンドシェイク — を 1 パケットずつ追います。