ネット上では、TCPとUDPに関して「TCPは丁寧/信頼性がある」「UDPは雑/届かない/エラー無視」といったいわゆるミーム的な説明が散見されます。
そうした説明は一見わかりやすいものの、プロトコル仕様として正確性を欠き、誤解を固定化する危険性があります。
本稿では、TCPおよびUDPの仕様と提供する機能を正確に整理し、ネットワーク層とトランスポート層の設計観点から両者の違いを説明します。
よく見かけるミームの例
たとえば以下のような説明です。
いずれも「UDPは雑で信頼性がない」「UDPはランダムに届く」といった印象を与えています。
- https://x.com/MacopeninSUTABA/status/1822612616549904464
- https://x.com/cyber_razz/status/2017189922944192945
これらの説明は初学者の理解を助ける目的で共有されているものと思われますが、仕様の本質を誤って簡略化している点が多数存在します。
UDP・TCPとは何か ― RFCで定義された本質
UDPの定義
UDP は User Datagram Protocol の略であり、RFC 768 にて定義されています。RFC 768 は次のようにUDPの性質を規定しています。
"User Datagram Protocol provides an uncomplicated datagram service that, when used with IP, provides a best-effort delivery mechanism with no protocol mechanisms to ensure reliability, ordering, or data integrity beyond basic checksumming."
ポイント:
- UDPが担保するものは データグラム単位の送受信 と 基本的なチェックサムによるエラーチェック です。
- UDP自身が再送や順序制御といった追加的な信頼性機構を持つことはありません(RFC 768)。
これを「UDPは信頼しない」と説明すると誤解が生じます。正確には、UDPは信頼性機構を持たず、その責務をアプリケーション層に委ねる設計です。
TCPの定義
TCP は Transmission Control Protocol であり、RFC 793 にて定義されています。RFC 793 は TCP を次のように説明します。
"TCP provides a reliable, ordered, and error-checked stream of octets between applications communicating across an IP network."
ポイント:
- TCPは「接続」という抽象を用いて、信頼できるバイトストリームを実現します。
- 信頼性要素(順序制御・再送制御・重複排除・フロー制御・輻輳制御)はすべてTCPの仕様として明記されています(RFC 793 以降の更新 RFC 1122 等)。
ここで重要なのは、TCPは「接続」そのものを提供しているのではなく、「信頼できるバイトストリームという抽象」を実現している点です。
TCPとUDPの差分機能
| 機能 | UDP | TCP |
|---|---|---|
| ポート番号による多重化 | ○ | ○ |
| データグラム境界 | ○ | × (バイトストリーム) |
| ヘッダチェックサム | ○ | ○ |
| 信頼性(順序保証・再送等) | × | ○ |
| フロー制御 | × | ○ |
| 輻輳制御 | × | ○ |
このように、UDPは最小限のトランスポート層機能のみを提供し、信頼性機構を持たないことが設計上の特徴です。それに対してTCPは多数の制御機能を提供します。
ミーム表現をどう置き換えるか
1) 宅配便比喩の適切な置き換え
誤解を生む比喩例
UDP = 玄関に投げる
→ この表現は、「届かない」「無責任」という誤解を生みます。
正確な比喩
UDP = 封筒をそのまま渡す
- 封筒には宛先住所があり、投函すると届く事が多い。(届かないこともある)
- 番号札や再配達はない
- 必要なら封筒に通し番号・再送依頼・暗号・署名を自分で付ける
- つまり、「最小限の単位を扱う設計」であり、信頼性機構はアプリ側で追加する
2) UDPでも信頼性を実装する例
UDP自体は信頼性機構を持ちませんが、上位層で信頼性を実装することは可能です。
QUIC
QUICはUDP上に信頼性・暗号化・多重化を実装したプロトコルです。
HTTP/3で採用されており、UDPをベースに信頼性機構を載せることの有効性を示しています(RFC 9000)。
RTP + RTCP
RTP はリアルタイム性を重視したデータグラムプロトコルで、タイミング情報を扱います。信頼性は持ちません。
RTCP は RTP と共に制御情報を交換し、統計や再送指示など一部支援を行います。
このように、必要に応じて信頼性を別レイヤーで担保できます。
DNS
DNSは基本的なクエリ/レスポンスで UDP を利用します。小さく単発の通信であるため、再送は簡単にアプリ側で実装されます。
(大きな応答は TCP にフォールバックします)
誤解を生む言い回しと正確な置き換え
| 誤解を生む表現 | 正確な表現 |
|---|---|
| UDPはエラー処理しない | UDPは再送をしない |
| UDPは順序保証しない | UDPは順序制御を持たない(必要ならアプリで実装) |
| UDPは速い | 必要な機能が少ないのでオーバーヘッドが小さいことが多い |
このように、ミーム的な表現は仕様の本質を曖昧にします。仕様に即した言葉を使うことが重要です。
まとめ
- UDPは適当にドバドバ送るではなく封筒だけ届く。
- 多くのネットミームは「直感的理解」として有用ですが、仕様としては不正確で誤解を生む可能性がある。
- UDPは「信頼しない」のではなく、最小限のトランスポート層機能を提供し、その上の信頼性はアプリ側で担保する設計である。
- TCPは「接続」ではなく、信頼できるバイトストリームという抽象を実現するプロトコルである。
- 誤解を生む表現を避け、仕様に即した言葉で理解することが、正確なネットワーク設計につながる。