UDP(User Datagram Protocol)

軽量・低レイテンシのコネクションレス通信

UDPとは

UDPは、コネクションレスで信頼性を保証しないトランスポート層プロトコルです。 ハンドシェイクなしで即座にデータを送信でき、オーバーヘッドが小さいため低レイテンシ。 DNS、NTP、動画/音声ストリーミング、ゲーム等で使用されます。

UDPヘッダ構造

送信元ポート
16ビット
宛先ポート
16ビット
長さ
16ビット
チェックサム
16ビット

ヘッダサイズ: 8バイト(TCPの20バイト以上と比較して非常にコンパクト)

TCP vs UDP 比較

特性TCPUDP
接続コネクション型(3-way handshake)コネクションレス(即送信)
信頼性確認応答・再送あり保証なし(best effort)
順序保証ありなし
ヘッダサイズ20バイト以上8バイト
レイテンシ高め(handshake、確認応答)低い
フロー制御ありなし

UDPの主な用途

DNS(ポート53)

クエリ/レスポンスが小さい。1往復で完結。 512バイト超はTCPにフォールバック。

NTP(ポート123)

時刻同期。低レイテンシ重視。 パケットロスは次回同期で補正。

リアルタイム通信

VoIP、ビデオ会議。遅延より多少のロスを許容。 RTP/RTCP over UDP。

オンラインゲーム

位置情報など頻繁な更新。古いデータは不要。 アプリレベルで信頼性実装。

QUIC(HTTP/3)

QUICはUDP上に構築された新しいトランスポートプロトコルです。 TCPの信頼性とUDPの低レイテンシを両立し、HTTP/3の基盤となっています。

QUICの特徴

  • • 0-RTT接続確立(再接続時)
  • • ストリーム多重化(HoL Blocking軽減)
  • • 常時暗号化(TLS 1.3統合)
  • • コネクションマイグレーション

使用例

  • • Google(YouTube、Gmail等)
  • • Cloudflare
  • • Facebook/Meta
  • • 主要ブラウザでサポート

UDPの課題と対策

パケットロス

UDP自体は再送しない。アプリレベルで確認応答を実装するか、 FEC(前方誤り訂正)で冗長性を持たせる。

DDoS攻撃(UDP Flood)

送信元偽装が容易。大量のUDPパケットでサーバーを過負荷に。 レートリミット、ファイアウォールで対策。

NATトラバーサル

コネクションレスのためNAT越えが難しい場合あり。 STUN/TURN/ICEで対応(WebRTC等)。

よく使うコマンド

1# UDPソケット確認
2ss -uan
3ss -uanp # プロセス情報付き
4
5# 特定ポートのリスニング確認
6ss -uan 'sport = :53'
7
8# UDPパケットキャプチャ
9tcpdump -i eth0 udp port 53 -nn
10
11# netcatでUDPテスト
12# サーバー側
13nc -u -l 9999
14# クライアント側
15echo "test" | nc -u localhost 9999
16
17# DNS問い合わせ(UDP)
18dig example.com @8.8.8.8
19
20# NTP同期確認
21ntpq -p

SRE/インフラ観点

監視項目

  • パケットロス率: UDPは自動検知しないため外部監視
  • レイテンシ: DNS応答時間など
  • 受信バッファオーバーフロー: drops統計

バッファチューニング

  • net.core.rmem_max: 受信バッファ最大
  • net.core.wmem_max: 送信バッファ最大
  • • 高スループットUDP通信で重要

セキュリティ

  • • 不要なUDPポートはファイアウォールでブロック
  • • DNS Amplification攻撃に注意
  • • レートリミットの設定
1# UDP統計
2cat /proc/net/snmp | grep Udp
3# InDatagrams: 受信成功
4# NoPorts: 宛先ポートなし
5# InErrors: 受信エラー
6# OutDatagrams: 送信
7
8# バッファオーバーフロー確認
9netstat -su | grep "receive buffer errors"