TCPと信頼性のある通信
前節で学んだ「IP」は、実は「ベストエフォート(最善は尽くすが、結果は保証しない)」という無保証の仕組みです。パケットは途中でロストして消えたり、順番が入れ替わって届いたりします。メールの一部が消えたり、ファイルが破損して動かなくなっては困ります。この頼りないIP通信の上に、完璧な「信頼性のある通信」を築き上げるのが、トランスポート層のTCPです。
1. IPの限界とTCPの使命
IP(インターネット層)は、目的地へ向けてパケットを送り出しますが、そのパケットが途中のルーターの過負荷で破棄されても、通知してくれません。また、別々のルートを通ったパケットは、送信時と異なる順番で届くこともあります。
この頼りないネットワーク上で、「送信したデータが、1ビットの狂いもなく、順番通りに受信側に届く」ことを保証するのが、トランスポート層の主要プロトコルである TCP(Transmission Control Protocol) です。
2. スリーウェイ・ハンドシェイク(Three-way Handshake)
TCPは、データを送信する前に、まず送信側と受信側の間で「これから通信を開始しますよ」という合意(コネクション)をしっかりと確立します。この手順をスリーウェイ・ハンドシェイクと呼びます。
お互いが「もしもし、聞こえますか?」「はい、聞こえますよ。そちらも聞こえますか?」「はい、聞こえます。では始めましょう」と、3ステップで対話を確認し合ってから、初めて実際のデータ送信を開始します。
3. 信頼性を保証する3つの仕組み
通信が始まった後、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」の仕組みについて学びます。