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

TCPと信頼性のある通信

前節で学んだIPプロトコルによる通信は、データ到達の保証がありません。パケットは途中でロストして消失したり、送信時と異なる順序で届いたりする可能性があります。データの欠損や破損を防ぎ、このIP通信の上に信頼性の高い通信を実現するのが、トランスポート層のTCPです。

1. IPの限界とTCPの使命

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

この頼りないネットワーク上で、「送信したデータが、順番通りに受信側に届く」ことを保証するのが、トランスポート層の主要プロトコルである 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のような確認待ちのオーバーヘッドがなく、高速でリアルタイム性が高いという特徴があります。このため、一部のデータ欠落が許容される「オンラインゲームのリアルタイム対戦」や「動画ストリーミング配信」「音声通話」などの用途に利用されています。

次のセクションでは、IPアドレスと人間が識別しやすいドメイン名を対応づけるシステムである「DNS」の仕組みについて学びます。