TCPとUDP

トランスポート層のプロトコルには、コネクション型のTCP(Transmission Control Protocol)と、コネクションレス型のUDP(User Datagram Protocol)があります。TCPは通信の信頼性を、UDPは効率を重視したプロトコルです。どちらを使用するかは、アプリケーション層のプロトコルによって決定されます。

TCP

TCPは、下位層にIPを置き、IPネットワークを介して確実にデータを送り届けるためのプロトコルです。
IPの役割はパケットを通信相手に届けることですが、通信相手にパケットが抜けなく正しい順番で送り届けることを保証していません。
そのため、ネットワークが混雑したり、パケットごとに途中の経路が変わってしまった場合、パケットの一部が相手に届かなかったり、送信された順番どおりに届かなかったりするケースは往々にしてあります。

その場合、アプリケーションは歯抜けのデータや意味の通らないデータを受け取ることになり、正しく処理できません。それはつまり、IPだけでは使い物にならないということです。

そこで登場するのが、IPの上位の層(トランスポート層)に位置するTCPです。

TCPは通信相手とコネクションを確立し、送信元アプリケーションから渡されたデータを受信側のTCPと確認し合いながらデータを順番どおり、確実に届けます。

UDP

TCPはデータを確実に相手に送り届けることを第一に考えて作られています。
例えば、電子メール(SMTP)やWebアクセス(HTTP)、ファイル転送(FTP)などの、大きなデータサイズになる可能性があり、再送制御や順序制御などを必要とするアプリケーション層プロトコルは、TCPを使用し、信頼性の高いデータ通信を実現します。

その一方で、通信の信頼性よりも「とにかくデータをすばやく送りたい」といったニーズもあります。
例えば、少量のデータしかやり取りしない通信や、音声などのリアルタイムに受信側で再生されるデータを送る場合です。

TCPは信頼性確保のため通信をするのにそれなりのオーバーヘッド(目的を達成するために、間接的に必要になる処理)が生じます。

UDPは、とてもシンプルな作りになっていて、TCPのような信頼性は提供されませんが、効率が良くオーバーヘッドの少ない通信を行えます。

そのため、上述のように信頼性は二の次でとにかく早く相手にデータを送り届けたいアプリケーションはUDPを使用します。

TCPとUDPの共通点

TCPとUDPの共通点は「ポート番号」です。ポート番号は、コンピュータ上で動作しているアプリケーション(プロセス)を特定するために使用されている番号のことです。
IPアドレスは「どのコンピュータか」を特定することはできますが、「どのアプリケーションに受け渡せば良いのか」判断できません。このため、TCPやUDPでは、「どのアプリケーションどうしの通信なのか」をポート番号によって識別しています。

例えば、Webブラウザのウインドを複数起動している場合でも、適切なウインドウにはWebページが表示されるのは、ポート番号によってそれぞれのブラウザが区別されているためです。

ポート番号は0から65535までの範囲で使用されます。
そのなかでも0から1023までを「ウェルノウンポート番号」と呼び、これらはIANAという団体により管理されています。メジャーなサービスやプロトコルが利用するポート番号は「ウェルノウンポート番号」として予約されています。

以下にその中でも特に代表的なプロトコルを記します。

プロトコル ポート番号 用途
FTP 20/TCP FTP(データ)
21/TCP FTP(制御)
TELNET 23/TCP Telnet
SMTP 25/TCP SMTP
DNS 53/TCP DNS(ゾーン転送)
53/UDP DNS(クエリ)
DHCP 67/UDP DHCPサーバー
68/UDP DHCPクライアント
HTTP 80/TCP Web(HTTP)
POP3 110/TCP POP3

TCPとUDPの用途の違い

TCPは信頼性を、UDPは高速化を重視するアプリケーションに向いているという点は上述のとおりです。

もう一点、TCPとUDPの違いとして、UDPはユニキャスト、マルチキャスト、ブロードキャストの全ての通信が可能ですが、TCPは1対1でのコネクション確立を行う必要があるので、ユニキャストでしか通信できないという点が挙げられます。

そのため、マルチキャストやブロードキャストを行う必要があるプロトコル(DHCPやRIPなど)はUDPを使用する必要があります。