タイトル: UDP
SEOタイトル: UDP 完全ガイド(コネクションレス / ヘッダ 8 バイト / TCP との違い / DNS / VoIP / QUIC / 用途)
| この記事の要点 |
|
UDP とは
UDP(User Datagram Protocol)は TCP/IP のトランスポート層プロトコルの 1 つで、コネクションレス・信頼性なしのシンプルな仕組みです。送信側はパケット(データグラム)を一方的に投げるだけで、相手の確認応答も再送も行いません。その代わり低遅延・低オーバーヘッドで動作します。
UDP と TCP の比較
| 項目 | UDP | TCP |
|---|---|---|
| 接続形態 | コネクションレス | コネクション型(3 way handshake) |
| 信頼性 | なし(届かなくてもOK) | あり(再送・順序保証) |
| 順序保証 | なし | あり |
| フロー制御 | なし | あり(ウィンドウ) |
| 輻輳制御 | なし | あり(CUBIC / BBR 等) |
| ヘッダサイズ | 8 バイト | 20 バイト〜 |
| 用途 | DNS / VoIP / 動画 / ゲーム / QUIC | HTTP / メール / SSH / FTP |
| マルチキャスト | 可能 | 不可(1 対 1) |
UDP ヘッダ構造
| フィールド | サイズ | 意味 |
|---|---|---|
| 送信元ポート | 16 ビット | 送信側のアプリポート |
| 宛先ポート | 16 ビット | 宛先側のアプリポート |
| 長さ(Length) | 16 ビット | ヘッダ + データの合計バイト数 |
| チェックサム | 16 ビット | 誤り検出(IPv6 では必須) |
合計わずか 8 バイト。TCP の 20 バイト以上に比べてヘッダオーバーヘッドが大幅に小さく、短いデータを高頻度で送る用途に向いています。
UDP の動作モデル
- 送信側がデータをパケット化(必要なら自前で分割)
- UDP ヘッダを付け、IP に渡して送信
- 受信側は届いたパケットを受け取り、UDP ポートを見てアプリに渡す
- 欠落 / 順序逆転 / 重複は気にしない(必要ならアプリ層で対処)
送信前にハンドシェイクなどの準備がないため、最初の 1 パケットから即座にデータが流れます。
主な利用プロトコル
| 用途 | プロトコル | ポート | 理由 |
|---|---|---|---|
| 名前解決 | DNS | 53 | 1 往復で完結。再問合せは簡単 |
| IP 取得 | DHCP | 67 / 68 | ブロードキャストを使う |
| 時刻同期 | NTP | 123 | 軽量・低遅延が必要 |
| 音声通話 | SIP / RTP / VoIP | 5060 / 動的 | 古いパケットを待たず流す |
| 動画ストリーミング | RTP / SRT | 動的 | 遅延より連続性を優先 |
| オンラインゲーム | 独自プロトコル | 動的 | 低遅延が最優先 |
| 機器監視 | SNMP | 161 / 162 | 軽量 |
| Web(HTTP/3) | QUIC(UDP の上) | 443 | HoL ブロッキング回避 |
なぜ UDP を使うのか
| 強み | 説明 |
|---|---|
| 低遅延 | ハンドシェイクや再送がない。1 パケットで往復が完結することも |
| 低オーバーヘッド | ヘッダ 8 バイト、状態管理なし |
| シンプル | 実装が小さく、組み込みやリアルタイム系に向く |
| マルチキャスト / ブロードキャスト | 1 対多の配信が可能 |
| 遅延より新鮮さ | 音声 / 映像は古いデータより新しいデータを優先したい |
UDP の限界
- パケット欠落・順序逆転・重複が起こりうる
- NAT 越えやファイアウォール越えで詰まりやすい
- 輻輳制御がないため、無秩序に投げるとネットワーク全体を圧迫する
- 機密性はない — DTLS や QUIC の TLS 1.3 と組み合わせて暗号化する
QUIC と HTTP/3
近年は QUIC(IETF 標準)が UDP 上に「TCP+TLS の代替」を実装する形で広がりました。HTTP/3 は QUIC を使い、次のメリットを得ます。
- 0-RTT / 1-RTT ハンドシェイクで初回接続が高速
- マルチストリーム独立で TCP の HoL ブロッキング回避
- パケット内に TLS 暗号化を内包しているため、中間機器の干渉に強い
- IP / ポートが変わってもコネクションを維持できる(接続マイグレーション)
パケットキャプチャ例
# DNS の UDP/53 を可視化
sudo tcpdump -i any -nn 'udp port 53' -c 20
# Linux で UDP の統計
ss -u -a -n # UDP ソケット一覧
netstat -su # UDP の統計(パケット数 / 受信エラー)
UDP を使うアプリの設計時に注意すること
| 項目 | 対処 |
|---|---|
| 欠落 | シーケンス番号を独自に振り、抜けを検出。必要なら再送 or 諦める |
| MTU | 1 パケットの最大長を意識(IPv4 で約 1472 バイト前後が安全圏) |
| 輻輳 | 送信間隔を制御する / トークンバケットを自作 / QUIC の輻輳制御を借りる |
| 暗号化 | DTLS / QUIC を採用 |
| NAT / FW | UDP は接続概念がないので、長時間沈黙するとマッピングが切れる。キープアライブ送出 |
シンプルな UDP 通信のサンプル(Python)
# 送信側
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b"hello", ("127.0.0.1", 5005))
# 受信側
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 5005))
data, addr = sock.recvfrom(1024)
print("from", addr, "got", data)
FAQ
Q: UDP は「信頼できない」?
A: プロトコル単体では再送しないという意味で、ネットワーク的に信頼できない訳ではありません。アプリ層で再送を組めば信頼性を確保できます(DNS は再問合せ、QUIC は再送内包)。
Q: UDP のポート番号は?
A: 1〜65535 で TCP と同じレンジを使いますが、ポート空間は別管理です。同じ番号でも TCP/53 と UDP/53 は別物(DNS は両方使う)。
Q: ブロードキャストとマルチキャストの違いは?
A: ブロードキャストは「同一サブネットの全員」、マルチキャストは「指定グループの参加者」に送ります。マルチキャストは IGMP でグループ管理。
Q: 最大データグラム長は?
A: 理論上 65,507 バイト(65535 - IP/UDP ヘッダ)ですが、ネットワーク経路のMTU 制約で分割されます。実用的には 1400〜1500 バイト未満に収めるのが無難。