ホーム第6章: ネットワーク
第6章 3節

TCPと信頼性のある通信

前節で学んだ「IP」は、実は「ベストエフォート(最善は尽くすが、結果は保証しない)」という無保証の仕組みです。パケットは途中でロストして消えたり、順番が入れ替わって届いたりします。メールの一部が消えたり、ファイルが破損して動かなくなっては困ります。この頼りないIP通信の上に、完璧な「信頼性のある通信」を築き上げるのが、トランスポート層のTCPです。

1. IPの限界とTCPの使命

IP(インターネット層)は、目的地へ向けてパケットを送り出しますが、そのパケットが途中のルーターの過負荷で破棄されても、通知してくれません。また、別々のルートを通ったパケットは、送信時と異なる順番で届くこともあります。

この頼りないネットワーク上で、「送信したデータが、1ビットの狂いもなく、順番通りに受信側に届く」ことを保証するのが、トランスポート層の主要プロトコルである TCP(Transmission Control Protocol) です。

2. スリーウェイ・ハンドシェイク(Three-way Handshake)

TCPは、データを送信する前に、まず送信側と受信側の間で「これから通信を開始しますよ」という合意(コネクション)をしっかりと確立します。この手順をスリーウェイ・ハンドシェイクと呼びます。

クライアント サーバー ① SYN (接続したい!) ② SYN-ACK (承諾!そちらも準備OK?) ③ ACK (こちらもOK!接続完了)
図 6-4:スリーウェイ・ハンドシェイクによる接続確立プロセス

お互いが「もしもし、聞こえますか?」「はい、聞こえますよ。そちらも聞こえますか?」「はい、聞こえます。では始めましょう」と、3ステップで対話を確認し合ってから、初めて実際のデータ送信を開始します。

3. 信頼性を保証する3つの仕組み

通信が始まった後、TCPは以下の仕組みを用いてデータの欠落や乱れを完全に修復します。

TCPの信頼性制御
  • シーケンス番号(整列): 送信する各パケットに対して、「これはデータの何バイト目か」を示す通し番号(シーケンス番号)を振ります。受信側は、パケットがバラバラの順番で届いても、この番号を頼りに元の順番へ正確にパズルを組み立て直します。
  • 確認応答(ACK): 受信側は、パケットが無事に届くたびに、送信側に対して「何バイト目まで無事に届いた」という通知メール(ACK信号)を返します。
  • 再送制御(ロスト救済): 送信側は、パケットを送った後、一定時間経っても「届いた」という通知(ACK)が返ってこない場合、そのパケットが途中でロスト(紛失)したとみなして、自動的に同じパケットをもう一度再送します。

4. IPアドレスが「住所」なら、ポート番号は「部屋番号」

TCP(およびUDP)には、通信先のプログラムを正しく特定するためにポート番号(Port Number)という概念があります。

PCに割り振られたIPアドレスが「アパートの住所(建物)」だとすれば、ポート番号は「アパートの各部屋番号(プログラム)」に相当します。

アパートの玄関まで郵便(IPパケット)が届いても、何号室宛てかが書かれていなければ、住人に渡せません。同様に、PCのOSまでデータが届いても、それがブラウザアプリ(80番や443番ポート)宛てなのか、メールアプリ(110番ポート)宛てなのかを識別するために、TCPヘッダには必ずポート番号が記載されています。

UDP(User Datagram Protocol)とは?
トランスポート層には、TCPのほかに UDP というプロトコルもあります。UDPは、TCPのようなハンドシェイクや再送制御を一切行わず、一方的にデータを送りつける「投げっぱなし」の通信です。データの欠落を防げない代わりに、TCPのような確認待ちのオーバーヘッドがないため、圧倒的に高速でリアルタイム性が高いという特徴があります。このため、数フレームのデータ欠落が許容される「オンラインゲームのリアルタイム対戦」や「動画配信(ストリーミング)」「音声通話」などの用途には、あえてUDPが使われています。

次のセクションでは、無機質な数字の羅列であるIPアドレスを、人間が覚えやすい英語名(ドメイン)に変換するインターネットの巨大な住所録「DNS」の仕組みについて学びます。