User Datagram Protocol(ユーザ データグラム プロトコル、UDP)はIPネットワーク上のアプリケーション間データグラム送信を実現する通信プロトコルである。
概要
UDPは、TCPと同じく、アプリケーション間のデータ送信を担当する。しかし、TCPとは異なり、UDPは以下のような信頼性を保証する機能を持たない。
- パケットの到達保証
- パケット順序の維持
- 再送制御
つまり、パケットが入れ替わったり届かない可能性がないということである。
その代わり、UDPは処理コストが小さく、速度が速いという特性があるため、リアルタイム性が重要な通信に適している。
用途
UDPは以下のような用途で使用されている。
- DNS
- VoIP
- オンラインゲーム
- 動画配信・ストリーミング
- ネットワークブロードキャスト
- NTP
これらのアプリケーションでは、パケット損失よりもレイテンシの低さが重要されるため、UDPが適しているのだ。
ヘッダ構造
UDPのヘッダは非常にシンプルで、わずか8バイトで構成される。
フィールド | サイズ (bit) |
---|---|
送信元ポート番号 | 16 |
宛先ポート番号 | 16 |
データ長 | 16 |
チェックサム | 16 |
TCPとの比較
特徴 | UDP | TCP |
---|---|---|
コネクション | なし | あり |
信頼性 | 低い(欠落の可能性あり) | 高い(到達・順序保証) |
軽量性 | 高い(高速) | 低め(ヘッダが大きい) |
通信順序の保証 | なし | あり |
速度 | 高速 | やや遅い |
TCPは郵便配達、UDPは伝書鳩のように考えてもらえればよい。
デメリット
先程から何度か言っているように、UDPは安全性が保証されない。
パケットロス時の再送処理がない
パケットというのは、情報通信における転送データのかたまりのことである。
IPでは、大きなデータがある場合、それは一度に処理されず、いくつかのパケットに分割され転送される。
パケットロスというのは、このパケットが転送の途中で失われることであり、これが発生した場合にはデータの一部が欠落することになる。そうすると、例えば画像の一部が崩壊したりゲームのプレイヤーが意図しない動きをすることになる。
これを防ぐため、TCPやQUICには一定時間後に正常にデータが宛先に送信されたことを検証して、必要に応じて不足したパケットを送り直す処理(再送処理)が存在するのだが、この処理はUDPには存在しない。
パケットの順番が入れ替わる
UDPでは送信側のパケットの順番が保証されない。というのも、TCPなどのプロトコルでは、転送されたパケットは送信元から送信された順番で宛先に到達するが、UDPではこれが入れ替わることがある。
同じルートを同じ速度で走ればその順番のまま届くと考えるかもしれないが、ネットワークのルートは変化しがちなのでそう上手くはいかない。
パケットの順番が入れ替わるタイミングというのは、レールのポイントが切り替わったときや渋滞に引っかかったときをイメージしてもらえばわかりやすい。
対処法
これらのデメリットを解消するために生まれたプロトコルがQUICであり、ここでは再送処理やパケットの順番の保証が実装されている。その他、TLS1.3で暗号化されていたり、様々な工夫が加えられている。
ただしそこまでの重装備が必要ない場合は、パケットロスを受け入れるか、独自で再送処理を実装するなどの工夫を行うことを推奨する。