ssecutils
Network / Browser-native guide

TCP と UDP の違い

信頼性と速度のトレードオフ、HTTP、DNS、動画配信、QUICなど用途別の選び方を説明します。

6Zero tracking reading surface

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 の半分以下、コネクション確立も不要なので、即座にデータを送り始められます。

機能比較

項目TCPUDP
コネクションあり(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」が書かれているのは、両者が完全に別物として扱われているからです。