L4 の主役は2つだけ
ネットワーク通信の話で「TCP」「UDP」という言葉が出てきます。両方ともトランスポート層(OSI参照モデルの第4層、L4)のプロトコルで、IP アドレスで届けられたパケットを「アプリケーションのどの口(ポート)に渡すか」を決める役割を担います。
この記事では、TCP と UDP がそれぞれ何をしてくれるのか、なぜ両方存在するのかを初学者向けに解説します。
TCP は「届くまで頑張る」プロトコル
TCP(Transmission Control Protocol)は、「データが確実に、順番通りに届く」ことを保証するのが特徴です。これを実現するために多くの仕組みを持っています:
- 3-way handshake: 通信開始時に
SYN → SYN/ACK → ACKという 3 ステップで接続を確立する - シーケンス番号: 各パケットに番号を付け、受信側が並び替える
- ACK(確認応答): 受信側が「ここまで届いた」と返事する
- 再送: ACK が来なければ送信側が再送する
- 輻輳制御 / フロー制御: ネットワーク混雑時は送信速度を落とす
これらの仕組みのおかげで、HTTP / SSH / メール(SMTP/IMAP)/ ファイル転送(FTP)など「データの欠損が許されない通信」で広く使われています。
UDP は「投げっぱなし」プロトコル
UDP(User Datagram Protocol)は、TCP のような信頼性機能を持っていません。
- コネクションを張らない(いきなり送る)
- 順序保証なし
- 到達確認なし
- 再送なし
- 輻輳制御なし
「機能が少ない=劣っている」のではなく、「機能が少ないからこそ速く軽い」のが UDP の魅力です。ヘッダーは TCP の半分以下、コネクション確立も不要なので、即座にデータを送り始められます。
機能比較
| 項目 | TCP | UDP |
|---|---|---|
| コネクション | あり(3-way handshake) | なし |
| 到達保証 | あり | なし |
| 順序保証 | あり | なし |
| 輻輳制御 | あり | なし |
| ヘッダーサイズ | 20 バイト〜 | 8 バイト |
| 速度 | 普通 | 速い |
| 用途 | 正確性重視 | リアルタイム性重視 |
用途別: どちらを選ぶか
TCP が向いているもの
- HTTP / HTTPS(Web 閲覧): ページ HTML が一部欠けたら困る
- SSH: コマンドが化けたらまずい
- メール(SMTP / IMAP): 文字が抜けると意味が変わる
- ファイル転送: 1 バイトでも欠けるとファイルが壊れる
- データベース接続
UDP が向いているもの
- DNS: 1 リクエスト 1 レスポンスで完結、軽量重視
- 動画・音声ストリーミング: 一部のフレームが欠けても次に進む方が良い(再送を待つと遅延が酷くなる)
- VoIP(音声通話): 同上
- オンラインゲーム: リアルタイム性が最優先
- NTP(時刻同期): 軽量
- SNMP(ネットワーク監視)
「TCP と UDP のいいとこ取り」を狙うプロトコル
近年は QUIC という新しいプロトコルが台頭しています。QUIC は UDP の上で動く独自プロトコルで、UDP の軽さを活かしつつ、TCP のような信頼性・暗号化(TLS 1.3 込み)・多重化を実現しています。HTTP/3 はこの QUIC の上で動いており、Google・Cloudflare 等が積極採用しています。
つまり「UDP は雑な代替」ではなく、新しい高機能プロトコルの土台としても活用されているわけです。
セキュリティ視点での違い
セキュリティを考える上での違いも知っておくと役立ちます:
- 送信元偽装: UDP はコネクションを張らないため、送信元 IP の偽装が容易です。これが DDoS の amplification attack(DNS / NTP / Memcached 反射攻撃)に使われる理由です
- ステートフル FW: TCP は接続状態を追えるためファイアウォール制御がしやすい。UDP は擬似的に「直近通信」をフロー単位で追う
- ポートスキャン: TCP は SYN/RST で開閉が判別しやすいが、UDP は応答がないことが「閉じている」とは限らないため、スキャンが遅く確実性も低い
おわりに
TCP と UDP は競合ではなく補完関係です。「データを失いたくない」なら TCP、「とにかく速く軽く」なら UDP、と覚えておけば、新しいプロトコルに出会ったときに「ああこれは TCP/UDP どちらの上で動くな」と把握しやすくなります。
ネットワーク機器のログやファイアウォールルールを見るとき、ポート番号と一緒に必ず「TCP/UDP」が書かれているのは、両者が完全に別物として扱われているからです。