現状UDPヘッダには、TCPやSCTPにあるようなオプションを指定できません。
新しい「Transport Options for UDP」という仕様では、UDPにおいてオプションを付けられるようになります。
その仕組が面白かったので簡単に紹介します。
どこが面白いかというと、UDPヘッダは下記の通り「送信元ポート」「送信先ポート」「長さ」「チェックサム」からなり、その後に実際のデータが続きます。
固定長のヘッダしかないUDPにおいて、既存の実装に対してもそのままUDPパケットを扱えるようにオプション領域をどう確保したのか、考えてみると面白そうと感じていただけると思います。
Transport Options for UDP
「Transport Options for UDP」では、UDPオプションを格納するのにsurplus areaという領域を確保します。それはIPヘッダについても知る必要があります。
surplus area
IPv4ヘッダとUDPヘッダをくっつけると次のようになります
IPヘッダ領域とUDPヘッダ領域の両方に長さを示す領域があります。IPヘッダで示されたTotal Lengthを全てUDPで使い切る必要はありません。余らせても仕様上は問題ありません。この余らせた領域をUDPオプションを格納する領域 (surplus area) として利用します。
(そのようなことをしてもLinux, MacOS, NATでUDPは正しく扱われるとdraftには記述されています)
図にすると次のように、長さの差からsurplus areaが生まれています。
この仕様に対応していない実装はこの領域をそのまま無視しますので、そのまま通信を継続できます。
UDP Options
surplus areaにはまず、2バイト境界まで0でパディングされます。そのあとにOCS (The Option Checksum)が続きます。OCSはOption領域の整合性を確認できるできるチェックサムです。
UDP Optionは基本的には、Kind・Length/データからなる可変長データです
詳細はを割愛しますが、Kindについては、すでに定義されているものもあります。
- 0 End of Options List (EOL)
- 1 No operation (NOP)
- 2 Alternate payload checksum (APC)
- 3 Fragmentation (FRAG)
- 4 Maximum datagram size (MDS)
- 5 Maximum reassembled datagram size (MRDS)
- 6 Request (REQ)
- 7 Response (RES)
- 8 Timestamps (TIME)
- 9 Authentication (AUTH)
- 10-126 UNASSIGNED (assignable by IANA)
- 127 RFC 3692-style experiments (EXP)
- 128-191 RESERVED
- 192 Encryption (UENC)
- 193-253 UNASSIGNED-UNSAFE (assignable by IANA)
- 254 RFC 3692-style experiments (UEXP)
- 255 RESERVED-UNSAFE
0~7は実装が必要なオプションです。Reserved領域はまだ使用されていない領域です。SAFEなオプション(0~191)とは無視されても通信に影響を与えないオプションであり、UNSAFE(192~255)は無視するとパケットを正しく解釈できなくなるオプションです。