[14] [DFN[[[UDP]]]] は、[[インターネット]]で使われる[[トランスポート層プロトコル]]の1つです。
[[TCP]] と並び非常によく使われています。

* 仕様書

[REFS[
- [11] [CITE@en[RFC 768 - User Datagram Protocol]] ([TIME[2014-11-23 14:23:14 +09:00]] 版) <http://tools.ietf.org/html/rfc768>
]REFS]

* 性質

[18] [[UDP]] は[[信頼性]]を持ちません。[[再送制御]]や[[フロー制御]]、
[[輻輳制御]]は行いません。ただし[[検査和]]を含めることはできます。

[19] [[UDP]] は[[状態]]を持ちません。

* データグラム

[17] [[UDP]] では通信に用いるデータの単位を[RUBYB[[[データグラム]]]@en[datagram]]と呼んでいます。

[FIG(packet)[
[FIGCAPTION[
[1] UDP データグラムの書式
]FIGCAPTION]
:width:32

= 16 [[送信元ポート]] [WEAK[(0〜15 ビット)]]
= 16 [[宛先ポート]] [WEAK[(16〜31 ビット)]]
= 16 [[長さ]] [WEAK[(32〜47 ビット)]]
= 16 [[検査和]] [WEAK[(48〜63 ビット)]]
= 32... [[データ]] [WEAK[(64 ビット〜)]]
]FIG]

[2] '''[RUBYB[送信元ポート]@en[source port]]''':
- 省略可能 (未使用時は零)
- 送信プロセスのポートを示します。
- 他に情報が無ければ、返答のためのポートと理解して構いません。

[3] '''[RUBYB[宛先ポート]@en[destination port]]''':
- 特定の[[インターネット宛先番地]]の文脈で意味があります。

[4] '''[RUBYB[長さ]@en[length]]''':
- [[データグラム]]の長さです。
- [[頭部]]と[[データ]]を共に含みます。
- 従って、最小値は8です。

[13] 16ビット[[整数]]ですから、最大値は 2[SUP[16]]-1 = 65535
です。[[ヘッダー]]分を除外すると [[payload]] の最大長は 65527
バイトです。

* 検査和

[5] '''[RUBYB[検査和]@en[checksum]]''':
= [[IP]][[頭部]]から作った[[擬似頭部]], [[UDP]][[頭部]], [[データ]]に、
= [[偶数]][[オクテット]]になるように末尾に零の[[オクテット]]を加えたものの、
= [[1の補数]]和の
= [[16ビット]]の[[1の補数]]

- 誤った[[経路]]に送られたことを検出できます。
- [[TCP]]と同じ方法を使っています。
- 算出した[[検査和]]が零なら、すべて1にします
([[1の補数]]として等しい)。
- [[検査和]]の欄が零なら、転送者が[[検査和]]を生成しなかったことを表します。
-- [[虫取り]]や、上位プロトコルが[[検査和]]を要求していない時につかいます。

[6] '''[RUBYB[擬似頭部]@en[pseudo header]]''':
[[検査和]]の計算に用いる[[擬似頭部]]は、
[[IP]][[頭部]]に含まれる次の情報で、[[UDP]][[頭部]]の前に置きます。

[FIG(packet)[
:width:32

= 32 [[送信元番地]] [WEAK[(0〜31 ビット)]]
= 32 [[宛先番地]] [WEAK[(32〜63 ビット)]]
= 8 零 [WEAK[(64〜71 ビット)]]
= 8 [[プロトコル]] [WEAK[(72〜79 ビット)]]
= 16 [[UDP]][[長さ]] [WEAK[(80〜95 ビット)]]
]FIG]

* 下位層

[15] [[UDP]] は、 [[IP]] の[[上位層]]の[[プロトコル]]として使います。

[8] '''IP 界面''':
[[UDP]]モジュールは[[IP]][[頭部]]から[[送信元]]と[[宛先]]の[[IP番地]]と[[プロトコル]]欄を決定できなければなりません。

[[UDP/IP]][[界面]]の[[受信]]操作に対する応答として[[IP]][[頭部]]も含めた全体を返すのもありです。
また、[[UDP]]側が[[IP]][[頭部]]も埋めて渡すのもありです。
[[IP]]側では欄の整合性を検証して[[IP]][[頭部]]の[[検査和]]を計算することになります。

[10] '''プロトコル番号''':
[[IP]]における[[UDP]]の[[プロトコル番号]]は17です。

* 上位層

[9] [[UDP]] を[[下位層]]として使った[[プロトコル]]としては、次の[[アプリケーション層プロトコル]]があります。
[FIG(short list)[
- [[DNS]]
- [[TFTP]]
- [[SSDP]]
- [[FSP]]
]FIG]

[12] また次の[[プロトコル]]の[[下位層]]にも使われています。
[FIG(short list)[
- [[DTLS]]
- [[DCCP-UDP]]
- [[SOAP/UDP]]
- [[QUIC]]
]FIG]

[24] 次の [[API]] があります。
[FIG(short list)[
- [[Socket]]
]FIG]

[7] '''利用者界面''':
[[利用者界面]]は、次の機能を提供するべきです。
- 新しい[[受信ポート]]の作成。
- [[受信ポート]]での[[受信]]操作。
[[データ・オクテット]]と、[[送信元ポート]]と[[送信元番地]]を返す。
- [[データグラム]]の[[送信]]操作。
[[データ]]、[[送信元]]と[[宛先]]の[[ポート]]と[[番地]]を指定。

* 派生プロトコル

[20] [[UDP]] から派生した次の[[プロトコル]]が存在しています。
[FIG(short list)[
- [[UDP-Lite]]
]FIG]

* URL scheme

[22] [[UDP]] を使ったアクセスを表すために [DFN[[CODE(URI)@en[[[udp:]]]]]]
[[URL scheme]] が使われることがあります。

[23] [[UDP]] は[[トランスポート層プロトコル]]であり、その上位の[[アプリケーション層プロトコル]]なしに
「[[UDP]]」を使うとだけ言っても意味がありません。 [CODE(URI)@en[[[udp:]]]]
[[URL scheme]] の [[URL]] が何を表しているのかは、それ自体では自明ではありません。

[25] [[PHP]] が実装しています。

[21] [CODE(URI example)@en[udp://:1234/{e06d8023-db46-11cf-b4d1-00805f6cbbea}]]
[SRC@en[[[Media Player Classic]]]]

[FIG(quote)[
[FIGCAPTION[
[26] [CITE@en[UDP Tracker Protocol Extensions]]
([[Michael C. Toren <mct@toren.net>]]著, [TIME[2016-07-26 06:49:09 +09:00]])
<http://www.bittorrent.org/beps/bep_0041.html>
]FIGCAPTION]

> Prior to the extensions defined in this document, UDP tracker URLs that contained PATH and QUERY components were completely valid, but those components were invisible to the tracker. For example, from the tracker's perspective, the URL:
> udp://tracker.example.com:80/dir?a=b&c=d
> and the URL:
> udp://tracker.example.com:80
> were completely indistinguishable. This differs from the HTTP-based Tracker Protocol, and places restrictions on how a UDP tracker URLs may be used in practice.
> Our primary motivation was to develop an extension to the UDP protocol to allow the PATH and QUERY components to be sent to UDP trackers. Rather than implementing a protocol change that only addressed this one issue, we chose to define an extension mechanism to allow future extensions to be easily added without risk of breaking the existing protocol.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[27] [CITE@en[FFmpeg Protocols Documentation]]
([TIME[2017-01-22 02:22:36 +09:00]])
<https://ffmpeg.org/ffmpeg-protocols.html#udp>
]FIGCAPTION]

> User Datagram Protocol.
> The required syntax for an UDP URL is:
> udp://hostname:port'''['''?options''']'''
> options contains a list of &-separated options of the form key=val.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[28] [CITE@en[FFmpeg Protocols Documentation]]
([TIME[2017-01-22 02:22:36 +09:00]])
<https://ffmpeg.org/ffmpeg-protocols.html#udp>
]FIGCAPTION]

> Use ffmpeg to stream over UDP to a remote endpoint:
> ffmpeg -i input -f format udp://hostname:port
> Use ffmpeg to stream in mpegts format over UDP using 188 sized UDP packets, using a large input buffer:
> ffmpeg -i input -f mpegts udp://hostname:port?pkt_size=188&buffer_size=65535
> Use ffmpeg to receive over UDP from a remote endpoint:
> ffmpeg -i udp://'''['''multicast-address''']''':port ...

]FIG]


[29] [CITE[www.twitch.tvの名前が引けない、もしくはチェックサムが0x0000のUDPパケットの件のまとめ - (ひ)メモ]]
([TIME[2017-07-10 19:26:18 +09:00]])
<http://d.hatena.ne.jp/hirose31/20160127/1453870603>

[FIG(quote)[
[FIGCAPTION[
[30] [CITE@en[VLC command-line help - VideoLAN Wiki]]
([TIME[2017-10-10 19:17:15 +09:00]])
<https://wiki.videolan.org/VLC_command-line_help/>
]FIGCAPTION]

>   udp://'''[''''''['''<source address>''']'''@'''['''<bind address>''']''''''[''':<bind port>''']'''''']'''
>           UDP stream sent by a streaming server

]FIG]
