TCP(ティーシーピー)とは | 意味や読み方など丁寧でわかりやすい用語解説
TCP(ティーシーピー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
伝送制御手順 (デンソウセイギョテジュ)
英語表記
TCP (ティーシーピー)
用語解説
TCP (Transmission Control Protocol) は、インターネットを含むIPネットワーク上で、アプリケーション間で信頼性の高いデータ通信を実現するために設計された、最も重要なプロトコルの一つである。インターネットの基盤を支える技術として広く利用されており、Webサイトの閲覧、電子メールの送受信、ファイル転送、オンラインゲームなど、多くの一般的なインターネットサービスで不可欠な役割を担っている。IP (Internet Protocol) がデータの「どこへ送るか」というアドレス指定の役割を果たすのに対し、TCPは「どのようにデータを確実に、そして正しい順序で送るか」という、信頼性とデータ管理の側面を担当する。
TCPの詳細なメカニズムは多岐にわたるが、その核心は「信頼性の高い通信」を実現することにある。この信頼性は、複数の高度な機能が連携することで保証される。
まず、TCPは「コネクション指向」のプロトコルである。これは、実際にデータ転送を行う前に、送信側と受信側の間で論理的な「コネクション(接続)」を確立することを意味する。この接続確立プロセスは「スリーウェイハンドシェイク」として知られ、3つのパケットのやり取りによって行われる。具体的には、まず送信側が接続要求パケット(SYN)を受信側へ送る。次に、受信側はこれを受け取ると、送信側の要求に対する確認応答と自身の接続要求を合わせたパケット(SYN-ACK)を送信側へ返す。最後に、送信側がSYN-ACKを受け取り、最終的な確認応答パケット(ACK)を受信側へ送ることで、双方向の通信経路が確立され、実際のデータ転送が開始される。このハンドシェイクによって、互いに通信が可能であることを確認し、通信に必要な状態情報(データの送受信に必要な初期設定値など)が共有される。通信終了時も、同様に「フォーウェイハンドシェイク」と呼ばれる手順によって、コネクションを正常に切断し、リソースを解放する。
データが確実に届くことを保証するために、TCPは「シーケンス番号」と「確認応答(ACK)」の仕組みを使用する。送信するデータストリームは、小さなセグメントと呼ばれる単位に分割され、それぞれのセグメントには一意のシーケンス番号が付与される。受信側は、これらのシーケンス番号を参照して、バラバラに届いたセグメントを正しい順序に並べ替えることができる。もし途中でセグメントが失われたり、順序が入れ替わったりしても、シーケンス番号によってそれを検出し、適切な処理を行う。受信側は、データセグメントを正常に受信するたびに、送信側に対して確認応答(ACK)パケットを送り返す。このACKパケットには、次に受信したいシーケンス番号が記載されており、これにより送信側はどのデータまでが正常に届いたかを把握できる。
もし送信側が、あるデータセグメントを送信してから一定時間内に対応するACKが届かない場合、そのデータセグメントが失われたと判断し、同じセグメントを再送する。これを「タイムアウト再送」と呼ぶ。さらに、受信側が連続して同じシーケンス番号のデータセグメントに対するACKを複数回受け取った場合、まだ届いていないセグメントがあると判断し、早めに再送を促す「高速再送」といった仕組みも存在する。これにより、ネットワークの不安定さによってデータが失われた場合でも、最終的にはデータが確実に相手に届くことが保証される。
また、TCPには「フロー制御」と「輻輳制御」という重要な機能も備わっている。フロー制御は、送信側が受信側の処理能力やバッファ容量を超えてデータを送りつけないようにする仕組みである。受信側は、自身のバッファにどれくらいの空きがあるかを示す「受信ウィンドウサイズ」を送信側に通知する。送信側はこのウィンドウサイズを超えない範囲でデータを送信し、受信側がデータを処理してバッファに空きができた際に、ウィンドウサイズが更新され、さらにデータを送信できるようになる。これにより、受信側がデータであふれてしまい、処理能力を超過することを防ぎ、データロスを未然に防ぐ。
輻輳制御は、ネットワーク全体が混雑している状況(輻輳)を検知し、送信側が送るデータ量を自動的に調整する仕組みである。ACKの遅延や欠落、再送の発生頻度が増加した場合、送信側はネットワークが混雑していると判断し、一時的に送信レートを低下させる。具体的には、通信開始時に少量ずつデータを送信し、ACKが問題なく返ってくる場合は徐々に送信量を増やしていく「スロースタート」や、輻輳を示す兆候を検知した場合に、送信量を急激に減らしてネットワーク負荷を軽減する「輻輳回避」といったアルゴリズムが組み込まれている。これにより、特定の通信がネットワークを占有することを避け、ネットワーク全体のパフォーマンス劣化を防ぐことに貢献する。
さらに、TCPは同じコンピューター上で動作する複数のアプリケーションが同時にネットワーク通信を行うことを可能にするため、「ポート番号」を利用する。ポート番号は0から65535までの範囲で、特定のアプリケーションやサービスを一意に識別する論理的な番号である。例えば、Webサーバーは通常ポート番号80(HTTP)や443(HTTPS)を使用し、メールサーバーは25(SMTP)や110(POP3)などを使用する。これにより、IPアドレスが示すコンピューターにデータが届いた後、どのアプリケーションにそのデータを渡すべきかをTCPが判断し、正しくデータを配送できる。
これらのTCPプロトコルが制御のために使用する情報は、送信されるデータセグメントの先頭に付加される「TCPヘッダ」に含まれる。このヘッダには、送信元および宛先のポート番号、シーケンス番号、確認応答番号、ウィンドウサイズ、データが破損していないかを確認するためのチェックサムなど、多岐にわたるフィールドが含まれている。これらの情報が、前述した信頼性、順序保証、フロー制御、輻輳制御といった複雑なメカニズムを動かすために不可欠である。
TCPは高い信頼性を提供する反面、コネクションの確立・切断、確認応答、再送処理など、多くの制御メカニズムを必要とするため、プロトコルとしてのオーバーヘッドが大きいという特性も持つ。これは、データ転送の遅延が増加したり、利用するリソースが増えたりする原因となる場合がある。これに対し、UDP (User Datagram Protocol) は、信頼性保証や順序保証、再送制御といった機能を持たないシンプルなプロトコルである。そのため、TCPよりも高速でオーバーヘッドが少ないが、データの到着を保証しない。リアルタイム性が重視される音声や動画のストリーミング、DNSの名前解決など、一部のデータロスを許容できるが高速性を求めるアプリケーションではUDPが選択される。しかし、ほとんどの一般的なインターネット通信においては、データの完全性や正確性が求められるため、TCPが標準的に利用される。このように、TCPはインターネットの信頼性の根幹を担う、非常に重要なプロトコルである。