User Datagram Protocol

User Datagram Protocol（ユーザ データグラム プロトコル、UDP）はIPネットワーク上のアプリケーション間データグラム送信を実現する通信プロトコルである。 UDPはインターネットを始めとしたInternet Protocolネットワーク上で利用される通信プロトコルである。ホスト間通信を担うIP上でアプリケーション間通信を可能にする。通信はデータグラム方式、すなわち到達保証・流量制御・順序制御をせず、データグラムをステートレス・コネクションレスに相手側へと送信する。またブロードキャストとマルチキャストをサポートしている。 デイヴィッド・P・リード（英語版）が1980年に設計し、RFC 768 で定義した（STD番号: 6）。非常にシンプルに設計されており公式仕様のRFC 768はわずか3ページである。インターネット・プロトコル・スイートの観点ではトランスポート層プロトコルに属する。IPヘッダにおけるプロトコル番号は17である。OSI参照モデルに当てはめるのであればトランスポート層に相当する。しばしば対比されるプロトコルにTCPやSCTPがある。 アプリケーション間通信に必要な最低限の機能をもった軽量プロトコルであり、適時性・低レイテンシが要求されるサービスで利用される。特に途中でデータが抜け落ちても問題が少ない音声や画像のストリーム形式での配信（VoIP、MPEG-TS、IP放送など）、小さなデータをリアルタイムで大量に転送するオンラインゲームなどで活用される。上位プロトコルとしてはSNMP、TFTP、DNS、DHCP、RTPなどが挙げられる。 設計方針として輻輳制御を持たないため、ネットワークが輻輳する原因となるケースが問題点として存在する。 UDPはInternet Protocol上で利用されるプロトコルであり、IPと合わせてUDP/IPスタックとして機能する。一方でUDPはそれ単体でプロトコルであり、UDP自体で提供する明確な機能がある。以下はこの2つの観点に基づいた機能の説明である。 次の表はIP、UDP/IPスタック、TCP/IPスタックが提供する機能の比較である。 すなわちUDP/IPは「ネットワークのネットワークにおけるトランザクション指向のアプリケーション間データグラム送信」を実現する。UDPはこれを最小限のプロトコルで実現するよう意図されているため、UDP/IPはTCP/IPより少ない機能のみを提供する。単一パケットの到達保証や複数パケットに渡る流量制御・順序制御はサポートしていない（データグラムモデル）。このため、UDPを Unreliable Datagram Protocol（信頼できないデータグラム・プロトコル）と呼ぶこともある。 UDPは2つの機能のみを提供する。   ホスト内通信振り分け: ポート データグラム完全性チェック: チェックサム IPはホスト間通信を可能にするが、そのままだとホストへの全信号を1つのアプリケーションのみが受け取る。UDPはポート機能を提供することで1ホスト内複数アプリケーションへの通信振り分けを可能にする。またIPはヘッダチェックサムによる宛先誤り検出を可能にするが、そのままだとペイロードの破壊を検出できない。UDPはIPアドレス・ポート・ペイロードに基づくチェックサムを提供することで単一データグラムのルーティング誤りおよびデータ破壊を (100%ではないが) 検出できる。 すなわちUDPはアプリケーション間通信を可能にし、パケットトランザクション（all-or-nothing通信）を提供する。 UDPの送受信単位はユーザデータグラム（英: user datagram）であり、UDPヘッダ（英: UDP header）およびデータ（英: data）から構成される。ビット列として次の構造を持つ。 UDPヘッダには4つのフィールドがあり、それぞれ2バイト（16ビット）である。そのうち2つ（ピンク色の部分）はIPv4ではオプションである。IPv6では送信元ポート番号だけがオプションである（後述）。 送信元ポート番号 送信元のポート番号で、相手からの応答が不要の場合はゼロ。それ以外の値の場合、必要なら相手からの応答を受け付けるポート番号を示す。送信元がクライアントの場合、エフェメラルポート番号ということが多い。送信元がサーバの場合、ウェルノウンポート番号ということが多い。 宛先ポート番号 宛先のポート番号であり、必須である。送信元ポート番号と同様、宛先がクライアントならエフェメラルポート、サーバならウェルノウンポートということが多い。 データ長 ヘッダとデータを含むデータグラム全体のバイト数を指定する。ヘッダが8バイトなので、それが最小値となる。理論上の上限は65,535バイト（ヘッダ8バイト + データ65,527バイト）である。下位層がIPv4の場合、実際の上限は65,507バイト（IPヘッダ20バイトとUDPヘッダ8バイトを差し引いた値）となる。 IPv6のジャンボグラム機能では、65,535バイトを越えるサイズのUDPパケットを扱える。この場合、IPv6のオプションヘッダでサイズを指定し、最大4,294,967,295バイト（232 - 1）を指定できるので、ヘッダ部の8バイトを差し引くと最大4,294,967,287バイトのデータを扱える。 チェックサム ヘッダとデータの誤り検出に使用。送信元がチェックサムを生成しない場合、このフィールドの値はゼロとする。IPv6ではオプションではないので、ゼロにはできない。 チェックサムの計算法は RFC 768 で以下のように定義されている。 IPヘッダからの情報で作られる擬似ヘッダとUDPヘッダとデータを長さが2オクテットの倍数になるように（必要なら）値がゼロのオクテットでパディングし、各2オクテットの1の補数の総和の1の補数の下位16ビットをチェックサムとする。 つまり、全16ビットワードを1の補数演算で足しあわせる。その合計を1の補数化すればUDPのチェックサム・フィールドの値になる。 チェックサム計算の結果がゼロになる場合（16ビット全部が0）、チェックサムを省略する場合と区別するため、その1の補数（全ビットが1）を設定する。 IPv4とIPv6ではチェックサム計算に使うデータに差異がある。 IPv4上のUDPでは、実際のIPv4ヘッダからの情報から作った擬似ヘッダをチェックサム計算に使用する。擬似ヘッダは実際のIPv4ヘッダそのものではない。以下にチェックサム計算にのみ使用する擬似ヘッダを示す。 送信元IPアドレスとあて先IPアドレスはIPv4ヘッダにある値である。プロトコル番号はUDPを表すので17 (0x11) である。UDP長フィールドはUDPのヘッダとデータの全長である。 UDPチェックサム計算はIPv4ではオプションである。チェックサムを使わない場合はゼロを設定する。 IPv6上のUDPでは、チェックサムは基本的に必須である。ただしUDP上でトンネリングプロトコルを利用する場合は例外的に計算を省略しゼロに設定して良い。チェックサムの計算法は RFC 2460 で次のように文書化されている。 トランスポート層かそれより上位のプロトコルで、IPヘッダ内のアドレスをチェックサム計算に使う場合、IPv6では128ビットのIPv6のアドレスを使用する。 チェックサム計算では、実際のIPv6ヘッダを真似た次のような擬似ヘッダを用いる。 送信元IPアドレスはIPv6ヘッダにある値を使う。あて先IPアドレスは最終的なあて先であり、IPv6パケットにルーティングヘッダがなければIPv6ヘッダ内のあて先IPアドレスを使い、さもなくば送信側ではルーティングヘッダの最後の要素を、受信側ではIPv6ヘッダのあて先IPアドレスを使う。次のヘッダというフィールドはプロトコル番号を意味し、UDPなので17を指定する。UDP長フィールドはUDPのヘッダとデータを合わせた長さである。 UDPモジュールはソケットを介してプログラムからアクセスする場合が多い。ポート番号0は送信側プロセスが応答を期待していない場合は使うことも許されている。 UDPを利用するインターネットの重要なアプリケーションはいくつもある。以下はその例である。 Domain Name System (DNS): 1つのクエリに素早く1つの応答パケットを返すだけなのでUDPを使用 Simple Network Management Protocol (SNMP) Routing Information Protocol (RIP) Dynamic Host Configuration Protocol (DHCP) Network Time Protocol (NTP) ストリーミング、ゲーミング、VoIP: パケット喪失 = 若干の品質低下、再送待ちはシステムを停止させてしまう UDP上に信頼性保証プロトコルを載せて利用するケースも存在する。TFTPなどのアプリケーションでは、アプリケーション層で必要に応じて基本的な信頼性機構を付与している。消失訂正符号（英語版）は一つの選択肢である。 UDPは設計方針として輻輳制御を提供しない。これがネットワーク全体への負荷を引き起こすケースがある。 帯域の大きな部分を消費して輻輳を起こしやすいUDPアプリケーションは、インターネットの安定性を危険にさらす可能性があり、実際に帯域を大幅に占める事態が発生している。制御できないUDPトラフィックによって輻輳崩壊になる可能性を低減するためのネットワーク機構が提案されてきた。現状では、ルーターなどのネットワーク機器でのパケット・キューイングやパケット・ドロッピングが過度なUDPトラフィックをスローダウンさせる唯一の手段となっている。Datagram Congestion Control Protocol (DCCP) はこの問題を部分的に解決すべく設計されたプロトコルで、ストリーミングなどの高転送レートのUDPストリームに対してTCPのような輻輳制御を追加するものである。 POS、会計、データベースなどのTCPを使っているシステムはUDPトラフィックに圧迫されつつある。TCPでパケットを喪失すると、輻輳制御が働いて転送レートを抑えるというのも一因である。リアルタイム・アプリケーションもビジネス・アプリケーションもビジネスには重要なので、Quality of Service のソリューション開発が大切だとする者もいる。 RFC 768 – User Datagram Protocol RFC 2460 – Internet Protocol, Version 6 (IPv6) Specification RFC 2675 - IPv6 Jumbograms RFC 4113 – Management Information Base for the UDP RFC 4347 - Datagram Transport Layer Security RFC 5405 – Unicast UDP Usage Guidelines for Application Designers