トランスポート層の役割

TCP(Transmission Control Protocol)とUDP(User Datagram Protocol)は、いずれもOSI参照モデルのトランスポート層(第4層)で動作するプロトコルです。IPアドレスがネットワーク上の機器(ホスト)を特定するのに対し、TCP・UDPが使うポート番号は、そのホスト上のアプリケーションが提供するサービスを識別する役割を持ちます例えば同じサーバー上でWebサービス(通常ポート80/443)とSSHサービス(通常ポート22)が同時に稼働していても、ポート番号によってどちらのサービス宛の通信かを区別できます。TCPとUDPでは同じポート番号を独立して使用できます。[1]。この2つのプロトコルは、同じ役割を果たしつつも、設計思想が大きく異なります。

TCP(Transmission Control Protocol)

TCPは、信頼性を重視したコネクション型(connection-oriented)のプロトコルです。

3ウェイハンドシェイク

TCPでの通信は、実際のデータをやり取りする前に、送受信者間で接続を確立する3ウェイハンドシェイクという手順を行います。

  1. SYN:接続を開始する側が、相手へ「接続を開始したい」という意思を示すSYN(synchronize)パケットを送信します。
  2. SYN-ACK:受信した側が、SYNへの確認応答(ACK)と、自分自身のSYNをあわせたSYN-ACKパケットを返します。
  3. ACK:最初に接続を開始した側が、確認応答(ACK)を返し、ここで接続が確立します。

この手順により、通信を始める前にTCPエンドポイント間で接続を確立し、シーケンス番号を同期します。

信頼性の仕組み

  • 確認応答(acknowledgment):受信側は、受信したデータに対して確認応答を返します。確認応答は累積的であり、遅延する場合もあります。送信側は、一定時間内に確認応答が届かない場合、そのデータを再送します。
  • 順序制御(sequencing):送信するデータにはシーケンス番号が付けられており、受信側はネットワークの都合でパケットの到着順序が入れ替わっても、元の順序に並べ直せます。
  • フロー制御(flow control):受信側が処理しきれる量(ウィンドウサイズ)を送信側へ伝え、送信側はそれを超えないようにデータ量を調整します。受信側の処理能力を超えたデータ送信を防ぎます。

これらの仕組みにより、TCPはアプリケーションに対して、順序付けされた信頼性のあるバイトストリームを提供します。ネットワーク障害などにより配送できない場合は、データ到達を無限に保証するのではなく、接続エラーになることがあります。一方で、確認応答のやり取りやハンドシェイクの分だけ、UDPに比べてオーバーヘッド(余分な処理・通信量)が大きくなります。

TCPを使う代表的なアプリケーション

HTTP/1.1・HTTP/2を利用するWebアクセス、ファイル転送(FTP)、リモートログイン(SSH、Telnet)、電子メール送信(SMTP)など、データが1つでも欠けたり順序が入れ替わったりすると困る用途で使われます。なお、HTTP/3はUDP上のQUICを使用します。

UDP(User Datagram Protocol)

UDPは、速度・低オーバーヘッドを重視したコネクションレス型(connectionless)のプロトコルです。

UDPの特徴

  • ハンドシェイクが無い:接続を確立する手順を踏まず、いきなりデータ(データグラム)を送信します。
  • 確認応答・再送が無い:データが届いたかどうかを送信側は関知しません。データが失われても、UDP自身は再送を行いません。
  • 順序制御が無い:送信した順序どおりに届く保証がありません。順序が必要な場合は、UDPを使うアプリケーション側で独自に処理する必要があります。
  • オーバーヘッドが小さい:ヘッダーのサイズが小さく、ハンドシェイクや確認応答の往復も無いため、TCPに比べてプロトコル上のオーバーヘッドを抑えられます。ただし、UDP自体が低遅延を保証するわけではありません。

UDPを使う代表的なアプリケーション

DNSの名前解決クエリ、DHCPによるIPアドレスの自動割り当て、TFTPによるファイル転送、SNMPによる監視、VoIP(音声通話)やビデオストリーミングなど、多少のデータ欠落よりも速度・低遅延を優先したい用途で使われます例えばVoIP通話中に1パケット分の音声データが失われても、再送を待つより、多少音が途切れてもそのまま会話を続けられる方が実用上望ましいため、UDPが好まれます。なお、DNSは基本的にUDPを使いますが、ゾーン転送ではTCPを使用します。また、UDP応答が切り詰められた場合などには、クライアントがTCPで再試行することがあります。[2]。

TCPとUDPの比較表

観点TCPUDP
接続方式コネクション型(事前にハンドシェイクが必要)コネクションレス型(ハンドシェイク無し)
信頼性順序付けされた信頼性のあるバイトストリームを提供する。配送不能時は接続エラーとなり得る保証しない
順序制御ありなし
フロー制御ありなし
オーバーヘッド大きい小さい
速度・遅延接続確立や信頼性機能により、追加の往復や処理が生じるUDP自体は低遅延を保証しないが、接続確立や再送を行わないためオーバーヘッドを抑えられる
代表的な用途HTTP/1.1・HTTP/2を利用するWebアクセス、ファイル転送(FTP)、SSH、SMTPDNS、DHCP、TFTP、SNMP、VoIP、動画ストリーミング

補足

  1. 例えば同じサーバー上でWebサービス(通常ポート80/443)とSSHサービス(通常ポート22)が同時に稼働していても、ポート番号によってどちらのサービス宛の通信かを区別できます。TCPとUDPでは同じポート番号を独立して使用できます。 ↩
  2. 例えばVoIP通話中に1パケット分の音声データが失われても、再送を待つより、多少音が途切れてもそのまま会話を続けられる方が実用上望ましいため、UDPが好まれます。なお、DNSは基本的にUDPを使いますが、ゾーン転送ではTCPを使用します。また、UDP応答が切り詰められた場合などには、クライアントがTCPで再試行することがあります。 ↩