rfc9868v1.txt | rfc9868.txt | |||
---|---|---|---|---|
skipping to change at line 67 ¶ | skipping to change at line 67 ¶ | |||
9. The Option Checksum (OCS) | 9. The Option Checksum (OCS) | |||
10. UDP Options | 10. UDP Options | |||
11. SAFE UDP Options | 11. SAFE UDP Options | |||
11.1. End of Options List (EOL) | 11.1. End of Options List (EOL) | |||
11.2. No Operation (NOP) | 11.2. No Operation (NOP) | |||
11.3. Additional Payload Checksum (APC) | 11.3. Additional Payload Checksum (APC) | |||
11.4. Fragmentation (FRAG) | 11.4. Fragmentation (FRAG) | |||
11.5. Maximum Datagram Size (MDS) | 11.5. Maximum Datagram Size (MDS) | |||
11.6. Maximum Reassembled Datagram Size (MRDS) | 11.6. Maximum Reassembled Datagram Size (MRDS) | |||
11.7. Echo Request (REQ) and Echo Response (RES) | 11.7. Echo Request (REQ) and Echo Response (RES) | |||
11.8. Timestamps (TIME) | 11.8. Timestamp (TIME) | |||
11.9. Authentication (AUTH), RESERVED Only | 11.9. Authentication (AUTH), RESERVED Only | |||
11.10. Experimental (EXP) | 11.10. Experimental (EXP) | |||
12. UNSAFE Options | 12. UNSAFE Options | |||
12.1. UNSAFE Compression (UCMP) | 12.1. UNSAFE Compression (UCMP) | |||
12.2. UNSAFE Encryption (UENC) | 12.2. UNSAFE Encryption (UENC) | |||
12.3. UNSAFE Experimental (UEXP) | 12.3. UNSAFE Experimental (UEXP) | |||
13. Rules for Designing New Options | 13. Rules for Designing New Options | |||
14. Option Inclusion and Processing | 14. Option Inclusion and Processing | |||
15. UDP API Extensions | 15. UDP API Extensions | |||
16. UDP Options Are for Transport, Not Transit | 16. UDP Options Are for Transport, Not Transit | |||
17. UDP Options vs. UDP-Lite | 17. UDP Options vs. UDP-Lite | |||
18. Interactions with Legacy Devices | 18. Interactions with Legacy Devices | |||
19. Options in a Stateless, Unreliable Transport Protocol | 19. Options in a Stateless, Unreliable Transport Protocol | |||
20. UDP Option State Caching | 20. UDP Option State Caching | |||
21. Updates to RFC 768 | 21. Updates to RFC 768 | |||
22. Interactions with Other RFCs (and drafts) | 22. Interactions with Other RFCs | |||
23. Multicast and Broadcast Considerations | 23. Multicast and Broadcast Considerations | |||
24. Network Management Considerations | 24. Network Management Considerations | |||
25. Security Considerations | 25. Security Considerations | |||
25.1. General Considerations Regarding the Use of Options | 25.1. General Considerations Regarding the Use of Options | |||
25.2. Considerations Regarding On-Path Attacks | 25.2. Considerations Regarding On-Path Attacks | |||
25.3. Considerations Regarding Option Processing | 25.3. Considerations Regarding Option Processing | |||
25.4. Considerations for Fragmentation | 25.4. Considerations for Fragmentation | |||
25.5. Considerations for Providing UDP Security | 25.5. Considerations for Providing UDP Security | |||
25.6. Considerations Regarding Middleboxes | 25.6. Considerations Regarding Middleboxes | |||
26. IANA Considerations | 26. IANA Considerations | |||
skipping to change at line 122 ¶ | skipping to change at line 122 ¶ | |||
Lite, as discussed further in Section 17. | Lite, as discussed further in Section 17. | |||
2. Conventions Used in This Document | 2. Conventions Used in This Document | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
In this document, the characters ">>" preceding an indented line(s) | In this document, the characters ">>" at the beginning of a paragraph | |||
indicate a statement using the key words listed above. This | indicate a statement using the key words listed above. This | |||
convention aids reviewers in quickly identifying or finding the | convention aids reviewers in quickly identifying or finding the | |||
portions of this RFC covered by these key words. | portions of this RFC covered by these key words. | |||
3. Terminology | 3. Terminology | |||
The following terminology is used in this document: | The following terminology is used in this document: | |||
IP datagram [RFC0791] [RFC8200]: An IP packet, composed of the IP | IP datagram [RFC0791] [RFC8200]: An IP packet, composed of the IP | |||
header (including any IPv4 options) and an IP payload area | header (including any IPv4 options) and an IP payload area | |||
(including any IPv6 extension headers or other shim headers). | (including any IPv6 extension headers or other shim headers). | |||
Must-support options: UDP options that all implementations are | Must-support options: UDP Options that all implementations are | |||
required to support. Their use in individual UDP packets is | required to support. Their use in individual UDP packets is | |||
optional. | optional. | |||
SAFE options: UDP options that are designed to be safe to ignore for | SAFE options: UDP Options that are designed to be safe to ignore for | |||
a receiver that does not understand them. Such options do not | a receiver that does not understand them. Such options do not | |||
alter the UDP user data or signal a change in what its contents | alter the UDP user data or signal a change in what its contents | |||
represent. | represent. | |||
Socket pair: A pair of sockets defining a UDP exchange, defined by a | Socket pair: A pair of sockets defining a UDP exchange, defined by a | |||
remote socket and a local socket, each composed of an IP address | remote socket and a local socket, each composed of an IP address | |||
and UDP port number (most widely known from TCP [RFC0793]). | and UDP port number (most widely known from TCP [RFC0793], which | |||
has been obsoleted by [RFC9293]). | ||||
Surplus area: The area of an IP payload that follows a UDP packet; | Surplus area: The area of an IP payload that follows a UDP packet; | |||
this area is used for UDP options in this document. | this area is used for UDP Options in this document. | |||
UDP packet: The more contemporary term used herein to refer to a | UDP packet: The more contemporary term used herein to refer to a | |||
user datagram [RFC0768]. | user datagram [RFC0768]. | |||
UDP fragment: One or more components of a UDP packet and its UDP | UDP fragment: One or more components of a UDP packet and its UDP | |||
options that enable transmission over multiple IP payloads, larger | Options that enable transmission over multiple IP payloads, larger | |||
than permitted by the maximum size of a single IP packet; note | than permitted by the maximum size of a single IP packet; note | |||
that each UDP fragment is itself transmitted as a UDP packet with | that each UDP fragment is itself transmitted as a UDP packet with | |||
its own options. | its own options. | |||
(UDP) User data: The user data field of a UDP packet [RFC0768]. | (UDP) User data: The user data field of a UDP packet [RFC0768]. | |||
UDP Length: The length field of a UDP header [RFC0768]. | UDP Length: The length field of a UDP header [RFC0768]. | |||
UNSAFE options: UDP options that are not designed to be safe for a | UNSAFE options: UDP Options that are not designed to be safely | |||
receiver that does not understand them to ignore. Such options | ignored by a receiver that does not understand them. Such options | |||
could alter the UDP user data or signal a change in what its | could alter the UDP user data or signal a change in what its | |||
contents represent, but there are restrictions on how they can be | contents represent, but there are restrictions on how they can be | |||
transmitted; these restrictions are noted in Sections 10 and 12. | transmitted; these restrictions are noted in Sections 10 and 12. | |||
User: The upper layer application, protocol, or service that | User: The upper layer application, protocol, or service that | |||
produces and consumes content that UDP transfers. | produces and consumes content that UDP transfers. | |||
User datagram: A UDP packet, composed of a UDP header and UDP | User datagram: A UDP packet, composed of a UDP header and UDP | |||
payload; as discussed herein, that payload need not extend to the | payload; as discussed herein, that payload need not extend to the | |||
end of the IP datagram. In this document, the original intent | end of the IP datagram. In this document, the original intent | |||
skipping to change at line 203 ¶ | skipping to change at line 204 ¶ | |||
managed. In stateless protocols, their effect is often limited to | managed. In stateless protocols, their effect is often limited to | |||
individual packets, but they can have an aggregate effect on a | individual packets, but they can have an aggregate effect on a | |||
sequence of packets as well. | sequence of packets as well. | |||
UDP is one of the most popular protocols that lacks space for header | UDP is one of the most popular protocols that lacks space for header | |||
options [RFC0768]. The UDP header was intended to be a minimal | options [RFC0768]. The UDP header was intended to be a minimal | |||
addition to IP, providing only port numbers and a checksum for error | addition to IP, providing only port numbers and a checksum for error | |||
detection. This document extends UDP to provide a trailer area for | detection. This document extends UDP to provide a trailer area for | |||
such options, located after the UDP user data. | such options, located after the UDP user data. | |||
UDP options are possible because UDP includes its own length field, | UDP Options are possible because UDP includes its own length field, | |||
separate from that of the IP header. Other transport protocols infer | separate from that of the IP header. Other transport protocols infer | |||
transport payload length from the IP datagram length (TCP, DCCP, and | transport payload length from the IP datagram length (TCP, DCCP, and | |||
SCTP). Internet historians have suggested a number of possible | SCTP). Internet historians have suggested a number of possible | |||
reasons why the design of UDP includes this field, e.g., to support | reasons why the design of UDP includes this field, e.g., to support | |||
multiple UDP packets within the same IP datagram or to indicate the | multiple UDP packets within the same IP datagram or to indicate the | |||
length of the UDP user data as distinct from zero padding required | length of the UDP user data as distinct from zero padding required | |||
for systems that require writes that are not byte-aligned. These | for systems that cannot write an arbitrary number of bytes of data. | |||
suggestions are not consistent with earlier versions of UDP or with | These suggestions are not consistent with earlier versions of UDP or | |||
the concurrent design of multi-segment, multiplexing protocols; | with the concurrent design of multi-segment, multiplexing protocols; | |||
however, the real reason remains unknown. Regardless, this field | however, the real reason remains unknown. Regardless, this field | |||
presents an opportunity to differentiate the UDP user data from the | presents an opportunity to differentiate the UDP user data from the | |||
implied transport payload length, which this document leverages to | implied transport payload length, which this document leverages to | |||
support a trailer options field. | support a trailer options field. | |||
There are other ways to include additional header fields or options | There are other ways to include additional header fields or options | |||
in protocols that otherwise are not extensible. In particular, in- | in protocols that otherwise are not extensible. In particular, in- | |||
band encoding can be used to differentiate transport payload from | band encoding can be used to differentiate transport payload from | |||
additional fields, such as was proposed in [Hi15]. This approach can | additional fields, such as was proposed in [Hi15]. This approach can | |||
cause complications for interactions with legacy devices and is thus | cause complications for interactions with legacy devices and is thus | |||
not considered further in this document. | not considered further in this document. | |||
IPv6 Teredo extensions (TEs) [RFC4380] [RFC6081] use a similar | IPv6 Teredo extensions (TEs) [RFC4380] [RFC6081] use a similar | |||
inconsistency between UDP and IPv6 packet lengths to support | inconsistency between UDP and IPv6 packet lengths to support | |||
trailers, but in this case, the values differ between the UDP header | trailers, but in this case, the values differ between the UDP header | |||
and an IPv6 length contained as the payload of the UDP user data. | and an IPv6 length contained as the payload of the UDP user data. | |||
This allows IPv6 trailers in the UDP user data but has no relation to | This allows IPv6 trailers in the UDP user data but has no relation to | |||
the surplus area discussed in this document. As a consequence, TEs | the surplus area discussed in this document. As a consequence, TEs | |||
are compatible with UDP options. | are compatible with UDP Options. | |||
5. UDP Option Intended Uses | 5. UDP Option Intended Uses | |||
UDP options can be used to provide a soft control plane to UDP. They | UDP Options can be used to provide a soft control plane to UDP. They | |||
enable capabilities available in other transport protocols, such as | enable capabilities available in other transport protocols, such as | |||
fragmentation and reassembly, that enable UDP frames larger than the | fragmentation and reassembly, that enable UDP frames larger than the | |||
IP MTU to traverse devices that rely on transport ports, e.g., | IP MTU to traverse devices that rely on transport ports, e.g., | |||
Network Address Translations (NATs), without additional mechanisms or | Network Address Translations (NATs), without additional mechanisms or | |||
state. They add features that could, in the future, protect | state. They add features that could, in the future, protect | |||
transport integrity and validate source identity (authentication), as | transport integrity and validate source identity (authentication), as | |||
well as those that could encrypt the user payload while still | well as those that could encrypt the user payload while still | |||
protecting the UDP transport header -- unlike Datagram Transport | protecting the UDP transport header -- unlike Datagram Transport | |||
Layer Security (DTLS) [RFC9147]. They also enable Packetization | Layer Security (DTLS) [RFC9147]. They also enable Packetization | |||
Layer Path MTU Discovery (PLPMTUD) over UDP, known as Datagram | Layer Path MTU Discovery (PLPMTUD) over UDP, known as Datagram | |||
Packetization Layer Path Maximum Transmission Unit Discovery | Packetization Layer Path Maximum Transmission Unit Discovery | |||
(DPLPMTUD) [RFC9869], providing a means for probe packet validation | (DPLPMTUD) [RFC9869], providing a means for probe packet validation | |||
without affecting the user data plane, as well as providing explicit | without affecting the user data plane, as well as providing explicit | |||
indication of the receiver transport reassembly size. | indication of the receiver transport reassembly size. | |||
UDP originally assumed that such capabilities would be provided by | UDP originally assumed that such capabilities would be provided by | |||
the user or by a layer above UDP [RFC0768]. However, enough | the user or by a layer above UDP [RFC0768]. However, enough | |||
protocols have evolved to use UDP directly, so such an intermediate | protocols have evolved to use UDP directly, so such an intermediate | |||
layer would be difficult to deploy for legacy applications. UDP | layer would be difficult to deploy for legacy applications. UDP | |||
options leverage the opportunity presented by the surplus area to | Options leverage the opportunity presented by the surplus area to | |||
enable these extensions within the UDP transport layer itself. Among | enable these extensions within the UDP transport layer itself. Among | |||
the use cases where this approach could be of benefit are request- | the use cases where this approach could be of benefit are request- | |||
response protocols such as DNS over UDP [He24]. | response protocols such as DNS over UDP [He24]. | |||
6. UDP Option Design Principles | 6. UDP Option Design Principles | |||
UDP options have been designed based on the following core | UDP Options have been designed based on the following core | |||
principles. Each is an observation about (preexisting) UDP [RFC0768] | principles. Each is an observation about preexisting behavior of UDP | |||
in the absence of these extensions that this document does not intend | [RFC0768] in the absence of these extensions that this document does | |||
to change or a lesson learned from other protocol designs. | not intend to change or a lesson learned from other protocol designs. | |||
1. UDP is stateless; UDP options do not change that fact. | 1. UDP is stateless; UDP Options do not change that fact. | |||
The state required or maintained by the endpoints is intended to | The state required or maintained by the endpoints is intended to | |||
be managed either by the application or a layer/library on behalf | be managed either by the application or a layer/library on behalf | |||
of the application. Reassembly of fragments is the only limited | of the application. Reassembly of fragments is the only limited | |||
exception where this document introduces a notion of state to | exception where this document introduces a notion of state to | |||
UDP. | UDP. | |||
2. UDP is unidirectional; UDP options do not change that fact. | 2. UDP is unidirectional; UDP Options do not change that fact. | |||
Responses to options are initiated by the application or a layer/ | Responses to options are initiated by the application or a layer/ | |||
library on behalf of the application. A mechanism that requires | library on behalf of the application. A mechanism that requires | |||
bidirectionality needs to be defined in a separate document. | bidirectionality needs to be defined in a separate document. | |||
3. UDP options have no length limit separate from that of the UDP | 3. UDP Options have no length limit separate from that of the UDP | |||
packet itself. | packet itself. | |||
Past experience with other protocols confirms that static length | Past experience with other protocols confirms that static length | |||
limits will always need to be exceeded, e.g., as has been an | limits will always need to be exceeded, e.g., as has been an | |||
issue with TCP options and IPv4 addresses. Each implementation | issue with TCP options and IPv4 addresses. Each implementation | |||
can limit how long/many options there are, but a specification is | can limit how long/many options there are, but a specification is | |||
more robust when it does not introduce such a limit. | more robust when it does not introduce such a limit. | |||
4. UDP options are not intended to replace or replicate other | 4. UDP Options are not intended to replace or replicate other | |||
protocols. | protocols. | |||
This includes NTP, ICMP (notably echo), etc. UDP options are | This includes NTP, ICMP (notably echo), etc. UDP Options are | |||
intended to introduce features useful for applications, not to | intended to introduce features useful for applications, not to | |||
either replace these other protocols nor instrument UDP to | either replace these other protocols nor instrument UDP to | |||
replace the need for network testing devices. | replace the need for network testing devices. | |||
5. UDP options are a framework, not a protocol. | 5. UDP Options are a framework, not a protocol. | |||
Options can be defined in this initial document even when the | Options can be defined in this initial document even when the | |||
details are not sufficient to specify a complete protocol. Uses | details are not sufficient to specify a complete protocol. Uses | |||
of such options could then be described or supplemented in other | of such options could then be described or supplemented in other | |||
documents. Examples herein include REQ/RES and TIME; in both | documents. Examples herein include REQ/RES and TIME; in both | |||
cases, the option format is defined, but the protocol that uses | cases, the option format is defined, but the protocol that uses | |||
these is specified elsewhere (REQ/RES for DPLPMTUD [RFC9869]) or | these is specified elsewhere (REQ/RES for DPLPMTUD [RFC9869]) or | |||
left undefined (TIME). | left undefined (TIME). | |||
6. The UDP option mechanism and UDP options themselves are intended | 6. The UDP Option mechanism and UDP Options themselves are intended | |||
to default to the same behavior experienced by a legacy receiver. | to default to the same behavior experienced by a legacy receiver. | |||
By default, even when option checksums (OCS, APC), | By default, even when option checksums (OCS, APC), | |||
authentication, or decryption fail, all received packets (with | authentication, or decryption fail, all received packets (with | |||
the exception of UDP fragments) are passed (possibly with an | the exception of UDP fragments) are passed (possibly with an | |||
empty data payload) to the user application. Options that do not | empty data payload) to the user application. Options that do not | |||
modify user data are intended to (by default) result in the user | modify user data are intended to (by default) result in the user | |||
data also being passed, even if, e.g., option checksums or | data also being passed, even if, e.g., option checksums or | |||
authentication fails. It is always the user's or application's | authentication fails. It is always the user's or application's | |||
obligation to override this default behavior explicitly. | obligation to override this default behavior explicitly. | |||
These principles are intended to enable the design and use of UDP | These principles are intended to enable the design and use of UDP | |||
options with minimal impact to legacy UDP endpoints, preferably none. | Options with minimal impact to legacy UDP endpoints, preferably none. | |||
UDP is -- and remains -- a minimal transport protocol. Additional | UDP is -- and remains -- a minimal transport protocol. Additional | |||
capability is explicitly activated by user applications or libraries | capability is explicitly activated by user applications or libraries | |||
acting on their behalf. | acting on their behalf. | |||
Finally, UDP options do not attempt to match the number of zero- | Finally, UDP Options do not attempt to match the number of zero- | |||
length UDP datagrams received by legacy and option-aware receivers | length UDP datagrams received by legacy and option-aware receivers | |||
from a source using UDP fragmentation (see Section 11.4). Legacy | from a source using UDP fragmentation (see Section 11.4). Legacy | |||
receivers interpret every UDP fragment as a zero-length packet | receivers interpret every UDP fragment as a zero-length packet | |||
(because they do not perform reassembly), but option-aware receivers | (because they do not perform reassembly), but option-aware receivers | |||
would reassemble the packet as a non-zero-length packet. Zero-length | would reassemble the packet as a non-zero-length packet. Zero-length | |||
UDP packets have been used as "liveness" indicators (see Section 5 of | UDP packets have been used as "liveness" indicators (see Section 5 of | |||
[RFC8085]), but such use is dangerous because they lack unique | [RFC8085]), but such use is dangerous because they lack unique | |||
identifiers (the IPv6 base header has none, and the IPv4 ID field is | identifiers (the IPv6 base header has none, and the IPv4 ID field is | |||
deprecated for such use [RFC6994]). | deprecated for such use [RFC6994]). | |||
7. The UDP Option Area | 7. The UDP Option Area | |||
The UDP transport header includes demultiplexing and service | The UDP transport header includes demultiplexing and service | |||
identification (port numbers), an error detection checksum, and a | identification (port numbers), an error detection checksum, and a | |||
field that indicates the UDP datagram length (including UDP header). | field that indicates the UDP datagram length (including UDP header). | |||
The UDP Length field is typically redundant with the size of the | The UDP Length field is typically redundant with the size of the | |||
maximum space available as a transport protocol payload, as | maximum space available as a transport protocol payload, as | |||
determined by the IP header (see details in Section 18). The UDP | determined by the IP header (see details in Section 18). The UDP | |||
option area is created when the UDP Length indicates a smaller | Option area is created when the UDP Length indicates a smaller | |||
transport payload than implied by the IP header. | transport payload than implied by the IP header. | |||
For IPv4, the IP Total Length field indicates the total IP datagram | For IPv4, the IP Total Length field indicates the total IP datagram | |||
length (including the IP header), and the size of the IP options is | length (including the IP header), and the size of the IP options is | |||
indicated in the IP header (in 4-byte words) as the "Internet Header | indicated in the IP header (in 4-byte words) as the "Internet Header | |||
Length" (IHL) [RFC0791], as shown in Figure 1. In exceptional cases, | Length" (IHL) [RFC0791], as shown in Figure 1. In exceptional cases, | |||
the Protocol field in IPv4 might not indicate UDP (i.e., 17), e.g., | the Protocol field in IPv4 might not indicate UDP (i.e., 17), e.g., | |||
when intervening shim headers are present such as IP Security (IPsec) | when intervening shim headers are present such as IP Security (IPsec) | |||
[RFC4301] or for IP Payload Compression (IPComp) [RFC3173]. | [RFC4301] or for IP Payload Compression (IPComp) [RFC3173]. | |||
skipping to change at line 441 ¶ | skipping to change at line 442 ¶ | |||
| IP Hdr | UDP Hdr | UDP user data | surplus area | | | IP Hdr | UDP Hdr | UDP user data | surplus area | | |||
+--------+---------+----------------------+------------------+ | +--------+---------+----------------------+------------------+ | |||
<------------------------------> | <------------------------------> | |||
UDP Length | UDP Length | |||
Figure 3: IP Transport Payload vs. UDP Length | Figure 3: IP Transport Payload vs. UDP Length | |||
In most cases, the IP transport payload and UDP Length point to the | In most cases, the IP transport payload and UDP Length point to the | |||
same location, indicating that there is no surplus area. This is not | same location, indicating that there is no surplus area. This is not | |||
a requirement of UDP [RFC0768] (discussed further in Section 18). | a requirement of UDP [RFC0768] (discussed further in Section 18). | |||
This document uses the surplus area for UDP options. | This document uses the surplus area for UDP Options. | |||
The surplus area can commence at any valid byte offset, i.e., it need | The surplus area can commence at any valid byte offset, i.e., it need | |||
not be 16-bit or 32-bit aligned. In effect, this document redefines | not be 16-bit or 32-bit aligned. In effect, this document redefines | |||
the UDP Length field as a "trailer options offset". | the UDP Length field as a "trailer options offset". | |||
8. The UDP Surplus Area Structure | 8. The UDP Surplus Area Structure | |||
UDP options use the entire surplus area, i.e., the contents of the IP | UDP Options use the entire surplus area, i.e., the contents of the IP | |||
payload after the last byte of the UDP payload. They commence with a | payload after the last byte of the UDP payload. They commence with a | |||
2-byte Option Checksum (OCS) field aligned to the first 2- byte | 2-byte Option Checksum (OCS) field aligned to the first 2- byte | |||
boundary (relative to the start of the IP datagram) of that area, | boundary (relative to the start of the IP datagram) of that area, | |||
adding zeroes before OCS as needed for alignment. The UDP option | adding zeroes before OCS as needed for alignment. The UDP Option | |||
area can be used with any UDP payload length (including zero, i.e., a | area can be used with any UDP payload length (including zero, i.e., a | |||
UDP Length of 8), as long as there remains enough space for the | UDP Length of 8), as long as there remains enough space for the | |||
aligned OCS and the options used. | aligned OCS and the options used. | |||
>> UDP options MAY begin at any UDP length offset. | >> UDP Options MAY begin at any UDP Length offset. | |||
>> Option area bytes used for alignment before the OCS MUST be zero. | >> Option area bytes used for alignment before the OCS MUST be zero. | |||
If this is not the case, all options MUST be ignored and the surplus | If this is not the case, all options MUST be ignored and the surplus | |||
area silently discarded. | area silently discarded. | |||
These alignment bytes, coupled with OCS as computed over the | These alignment bytes, coupled with OCS as computed over the | |||
remainder of the surplus area, ensure that the one's complement sum | remainder of the surplus area, ensure that the one's complement sum | |||
of the surplus area is zero. OCS is half-word (2-byte) aligned to | of the surplus area is zero. OCS is half-word (2-byte) aligned to | |||
avoid the need for byte-swapping in its implementation. | avoid the need for byte-swapping in its implementation. | |||
skipping to change at line 492 ¶ | skipping to change at line 493 ¶ | |||
The Option Checksum (OCS) option is a conventional Internet checksum | The Option Checksum (OCS) option is a conventional Internet checksum | |||
[RFC0791] that detects errors in the surplus area. The OCS option | [RFC0791] that detects errors in the surplus area. The OCS option | |||
contains a 16-bit checksum that is aligned to the first 2-byte | contains a 16-bit checksum that is aligned to the first 2-byte | |||
boundary, preceded by zeroes for padding (if needed), as shown in | boundary, preceded by zeroes for padding (if needed), as shown in | |||
Figure 4. | Figure 4. | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
| UDP data | 0 | | | UDP data | 0 | | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
| OCS | UDP options... | | | OCS | UDP Options... | | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
Figure 4: UDP OCS Format, Here Using One Zero Byte for Alignment | Figure 4: UDP OCS Format, Here Using One Zero Byte for Alignment | |||
The OCS consists of a 16-bit Internet checksum [RFC1071], computed | The OCS consists of a 16-bit Internet checksum [RFC1071], computed | |||
over the surplus area and including the length of the surplus area as | over the surplus area and including the length of the surplus area as | |||
an unsigned 16-bit value. The OCS protects the surplus area from | an unsigned 16-bit value. The OCS protects the surplus area from | |||
errors in a similar way that the UDP checksum protects the UDP user | errors in a similar way that the UDP checksum protects the UDP user | |||
data (when not zero). | data (when not zero). | |||
The primary purpose of the OCS is to detect existing nonstandard | The primary purpose of the OCS is to detect existing nonstandard | |||
(i.e., non-option) uses of that area and accidental errors. It is | (i.e., non-option) uses of that area and accidental errors. It is | |||
not intended to detect attacks, as discussed further in Section 25. | not intended to detect attacks, as discussed further in Section 25. | |||
OCS is not intended to prevent future nonstandard uses of the surplus | OCS is not intended to prevent future nonstandard uses of the surplus | |||
area nor does it enable shared use with mechanisms that do not comply | area nor does it enable shared use with mechanisms that do not comply | |||
with UDP options. | with UDP Options. | |||
The design enables traversal of errant middleboxes that incorrectly | The design enables traversal of errant middleboxes that incorrectly | |||
compute the UDP checksum over the entire IP payload [Fa18] [Zu20], | compute the UDP checksum over the entire IP payload [Fa18] [Zu20], | |||
rather than only the UDP header and UDP payload (as indicated by the | rather than only the UDP header and UDP payload (as indicated by the | |||
UDP header length). Because the OCS is computed over the surplus | UDP header length). Because the OCS is computed over the surplus | |||
area and its length and then inverted, the OCS effectively negates | area and its length and then inverted, the OCS effectively negates | |||
the effect that incorrectly including the surplus has on the UDP | the effect that incorrectly including the surplus has on the UDP | |||
checksum. As a result, when OCS is non-zero, the UDP checksum is the | checksum. As a result, when OCS is non-zero, the UDP checksum is the | |||
same in either case. | same in either case. | |||
>> The OCS MUST be non-zero when the UDP checksum is non-zero. | >> The OCS MUST be non-zero when the UDP checksum is non-zero. | |||
>> When the UDP checksum is zero, the OCS MAY be unused and is then | >> When the UDP checksum is zero, the OCS MAY be unused and is then | |||
indicated by a zero OCS value. | indicated by a zero OCS value. | |||
>> UDP option implementations MUST default to using the OCS (i.e., as | >> UDP Option implementations MUST default to using the OCS (i.e., as | |||
a non-zero value); users overriding that default take the risk of not | a non-zero value); users overriding that default take the risk of not | |||
detecting nonstandard uses of the option area (of which there are | detecting nonstandard uses of the option area (of which there are | |||
none currently known). | none currently known). | |||
Like the UDP checksum, the OCS is optional under certain | Like the UDP checksum, the OCS is optional under certain | |||
circumstances and contains zero when not used. UDP checksums can be | circumstances and contains zero when not used. UDP checksums can be | |||
zero for IPv4 [RFC0791] and for IPv6 [RFC8200] when the UDP payload | zero for IPv4 [RFC0791] and for IPv6 [RFC8200] when the UDP payload | |||
is already covered by another checksum, as might occur for tunnels | is already covered by another checksum, as might occur for tunnels | |||
[RFC6935]. The same exceptions apply to the OCS when used to detect | [RFC6935]. The same exceptions apply to the OCS when used to detect | |||
bit errors; an additional exception occurs for its use in the UDP | bit errors; an additional exception occurs for its use in the UDP | |||
datagram prior to fragmentation or after reassembly (see | datagram prior to fragmentation or after reassembly (see | |||
Section 11.4). | Section 11.4). | |||
The benefits are similar to allowing UDP checksums to be zero, but | The benefits are similar to allowing UDP checksums to be zero, but | |||
the risks differ. The OCS is additionally important to ensure | the risks differ. The OCS is additionally important to ensure | |||
packets with UDP options can traverse errant middleboxes [Zu20]. | packets with UDP Options can traverse errant middleboxes [Zu20]. | |||
When the cost of computing an OCS is negligible, it is better to use | When the cost of computing an OCS is negligible, it is better to use | |||
the OCS to ensure such traversal. In cases where such traversal | the OCS to ensure such traversal. In cases where such traversal | |||
risks can safely be ignored, such as controlled environments, over | risks can safely be ignored, such as controlled environments, over | |||
paths where traversal is validated, or where upper layer protocols | paths where traversal is validated, or where upper layer protocols | |||
(applications, libraries, etc.) can adapt (by enabling the OCS when | (applications, libraries, etc.) can adapt (by enabling the OCS when | |||
packet exchange fails), and when bit errors at the UDP layer would be | packet exchange fails), and when bit errors at the UDP layer would be | |||
detected by other layers (as with the UDP checksum), the OCS can be | detected by other layers (as with the UDP checksum), the OCS can be | |||
disabled, e.g., to conserve energy or processing resources or when | disabled, e.g., to conserve energy or processing resources or when | |||
performance can be improved. This is why zeroing the OCS is only | performance can be improved. This is why zeroing the OCS is only | |||
safe when UDP checksum is also zero and why OCS might still be used | safe when UDP checksum is also zero and why OCS might still be used | |||
skipping to change at line 570 ¶ | skipping to change at line 571 ¶ | |||
default be delivered to the application layer, even if the OCS fails, | default be delivered to the application layer, even if the OCS fails, | |||
unless the endpoints have negotiated otherwise for this UDP packet's | unless the endpoints have negotiated otherwise for this UDP packet's | |||
socket pair. | socket pair. | |||
When not used (i.e., containing zero), the OCS is assumed to be | When not used (i.e., containing zero), the OCS is assumed to be | |||
"correct" for the purpose of accepting UDP datagrams at a receiver | "correct" for the purpose of accepting UDP datagrams at a receiver | |||
(see Section 14). | (see Section 14). | |||
10. UDP Options | 10. UDP Options | |||
UDP options are a minimum of two bytes in length as shown in | UDP Options are a minimum of two bytes in length as shown in | |||
Figure 5, except only the one-byte options No Operation (NOP) and End | Figure 5, except only the one-byte options No Operation (NOP) and End | |||
of Options List (EOL) described below. | of Options List (EOL) described below. | |||
+--------+--------+------- | +--------+--------+------- | |||
| Kind | Length | (remainder of option...) | | Kind | Length | (remainder of option...) | |||
+--------+--------+------- | +--------+--------+------- | |||
Figure 5: UDP Option Default Format | Figure 5: UDP Option Default Format | |||
The Kind field is always one byte and is named after the | The Kind field is always one byte and is named after the | |||
corresponding TCP field (though other protocols refer to this as | corresponding TCP field (though other protocols refer to this as | |||
"Type"). The Length field, which indicates the length in bytes of | "Type"). The Length field, which indicates the length in bytes of | |||
the entire option, including Kind and Length, is one byte for all | the entire option, including Kind and Length, is one byte for all | |||
lengths below 255 (including the Kind and Length bytes). A Length of | lengths below 255 (including the Kind and Length bytes). A Length of | |||
255 indicates use of the UDP option extended format shown in | 255 indicates use of the UDP Option extended format shown in | |||
Figure 6. The Extended Length field is a 16-bit field in network | Figure 6. The Extended Length field is a 16-bit field in network | |||
standard byte order. The length of the option refers to its Length | standard byte order. The length of the option refers to its Length | |||
field or Extended Length field, whichever is applicable. | field or Extended Length field, whichever is applicable. | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
| Kind | 255 | Extended Length | | | Kind | 255 | Extended Length | | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
| (remainder of option...) | | | (remainder of option...) | | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
Figure 6: UDP Option Extended Format | Figure 6: UDP Option Extended Format | |||
>> The UDP length MUST be at least as large as the UDP header (8) and | >> The UDP Length MUST be at least as large as the UDP header (8) and | |||
no larger than the IP transport payload. Datagrams with length | no larger than the IP transport payload. Datagrams with length | |||
values outside this range MUST be silently dropped as invalid and | values outside this range MUST be silently dropped as invalid and | |||
logged. | logged. | |||
>> All logging SHOULD be rate limited. Excess logging events can be | >> All logging SHOULD be rate limited. Excess logging events can be | |||
coalesced and reported as a count or can be silently dropped if | coalesced and reported as a count or can be silently dropped if | |||
needed to avoid resource overloading. | needed to avoid resource overloading. | |||
>> Option Lengths (or Extended Lengths, where applicable) smaller | >> Option Lengths (or Extended Lengths, where applicable) smaller | |||
than the minimum for the corresponding Kind MUST be treated as an | than the minimum for the corresponding Kind MUST be treated as an | |||
error. Such errors call into question the remainder of the surplus | error. Such errors call into question the remainder of the surplus | |||
area and thus MUST result in all UDP options being silently | area and thus MUST result in all UDP Options being silently | |||
discarded. | discarded. | |||
>> Any UDP option other than NOP or EOL whose length is 254 or less | >> Any UDP Option other than NOP or EOL whose length is 254 or less | |||
MUST use the UDP option default format shown in Figure 5. NOP and | MUST use the UDP Option default format shown in Figure 5. NOP and | |||
EOL never use either length format. | EOL never use either length format. | |||
>> Any UDP option whose length is larger than 254 MUST use the UDP | >> Any UDP Option whose length is larger than 254 MUST use the UDP | |||
option extended format shown in Figure 6. | Option extended format shown in Figure 6. | |||
>> For compactness, UDP options SHOULD use the smallest option format | >> For compactness, UDP Options SHOULD use the smallest option format | |||
possible. | possible. | |||
>> UDP options MUST be interpreted in the order in which they occur | >> UDP Options MUST be interpreted in the order in which they occur | |||
in the surplus area or, in the case of UDP fragments, in the order in | in the surplus area or, in the case of UDP fragments, in the order in | |||
which they appear in the UDP fragment option area (see Section 11.4). | which they appear in the UDP fragment option area (see Section 11.4). | |||
The following UDP options are currently defined: | The following UDP Options are currently defined: | |||
+=========+==========+==========================================+ | +=========+==========+==========================================+ | |||
| Kind | Length | Meaning | | | Kind | Length | Meaning | | |||
+=========+==========+==========================================+ | +=========+==========+==========================================+ | |||
| 0* | - | End of Options List (EOL) | | | 0* | - | End of Options List (EOL) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 1* | - | No Operation (NOP) | | | 1* | - | No Operation (NOP) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 2* | 6 | Additional Payload Checksum (APC) | | | 2* | 6 | Additional Payload Checksum (APC) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 3* | 10/12 | Fragmentation (FRAG) | | | 3* | 10/12 | Fragmentation (FRAG) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 4* | 4 | Maximum Datagram Size (MDS) | | | 4* | 4 | Maximum Datagram Size (MDS) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 5* | 5 | Maximum Reassembled Datagram Size (MRDS) | | | 5* | 5 | Maximum Reassembled Datagram Size (MRDS) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 6* | 6 | Request (REQ) | | | 6* | 6 | Request (REQ) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 7* | 6 | Response (RES) | | | 7* | 6 | Response (RES) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 8 | 10 | Timestamps (TIME) | | | 8 | 10 | Timestamp (TIME) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 9 | (varies) | RESERVED for Authentication (AUTH) | | | 9 | (varies) | RESERVED for Authentication (AUTH) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 10-126 | (varies) | Unassigned (assignable by IANA) | | | 10-126 | (varies) | Unassigned (assignable by IANA) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 127 | (varies) | RFC3692-style experiments (EXP) | | | 127 | (varies) | RFC3692-style experiments (EXP) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 128-191 | | Reserved | | | 128-191 | | Reserved | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 192 | (varies) | Reserved for Compression (UCMP) | | | 192 | (varies) | Reserved for UNSAFE Compression (UCMP) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 193 | (varies) | Reserved for Encryption (UENC) | | | 193 | (varies) | Reserved for UNSAFE Encryption (UENC) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 194-253 | | Unassigned-UNSAFE (assignable by IANA) | | | 194-253 | | Unassigned-UNSAFE (assignable by IANA) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 254 | (varies) | RFC3692-style experiments (UEXP) | | | 254 | (varies) | RFC3692-style UNSAFE experiments (UEXP) | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
| 255 | | Reserved-UNSAFE | | | 255 | | Reserved-UNSAFE | | |||
+---------+----------+------------------------------------------+ | +---------+----------+------------------------------------------+ | |||
Table 1 | Table 1 | |||
Options indicated by Kind values in the range 0..191 are known as | Options indicated by Kind values in the range 0..191 are known as | |||
SAFE options because they do not interfere with use of that data by | SAFE options because they do not interfere with use of that data by | |||
legacy endpoints or when the option is unsupported. Options | legacy endpoints or when the option is unsupported. Options | |||
indicated by Kind values in the range 192..255 are known as UNSAFE | indicated by Kind values in the range 192..255 are known as UNSAFE | |||
skipping to change at line 695 ¶ | skipping to change at line 696 ¶ | |||
Although the FRAG option modifies the original UDP payload contents | Although the FRAG option modifies the original UDP payload contents | |||
(i.e., is UNSAFE with respect to the original UDP payload), it is | (i.e., is UNSAFE with respect to the original UDP payload), it is | |||
used only in subsequent fragments with zero-length UDP user data | used only in subsequent fragments with zero-length UDP user data | |||
payloads, thus is SAFE in actual use, as discussed further in | payloads, thus is SAFE in actual use, as discussed further in | |||
Section 11.4. | Section 11.4. | |||
These options are defined in the following subsections. Options 0 | These options are defined in the following subsections. Options 0 | |||
and 1 use the same values as for TCP. | and 1 use the same values as for TCP. | |||
>> An endpoint supporting UDP options MUST support those marked with | >> An endpoint supporting UDP Options MUST support those marked with | |||
an "*" above: EOL, NOP, APC, FRAG, MDS, MRDS, REQ, and RES. This | an "*" above: EOL, NOP, APC, FRAG, MDS, MRDS, REQ, and RES. This | |||
includes both recognizing and being able to generate these options if | includes both recognizing and being able to generate these options if | |||
configured to do so. These are called "must-support" options. | configured to do so. These are called "must-support" options. | |||
The set of must-support options is defined herein. New options are | The set of must-support options is defined herein. New options are | |||
not eligible for this designation. | not eligible for this designation. | |||
>> All other SAFE options (without an "*") MAY be implemented, and | >> All other SAFE options (without an "*") MAY be implemented, and | |||
their use SHOULD be determined either out-of-band or negotiated, | their use SHOULD be determined either out-of-band or negotiated, | |||
notably if needed to detect when options are silently ignored by | notably if needed to detect when options are silently ignored by | |||
legacy receivers. | legacy receivers. | |||
>> Receivers supporting UDP options MUST silently ignore unknown or | >> Receivers supporting UDP Options MUST silently ignore unknown or | |||
malformed SAFE options (i.e., in the same way a legacy receiver would | malformed SAFE options (i.e., in the same way a legacy receiver would | |||
ignore all UDP options). An option is malformed when its length does | ignore all UDP Options). An option is malformed when its length does | |||
not indicate (one of) the value(s) stated in the option's | not indicate (one of) the value(s) stated in the option's | |||
specification. A malformed FRAG option is an exception to this rule; | specification. A malformed FRAG option is an exception to this rule; | |||
it SHALL be treated as an unsupported UNSAFE option. | it SHALL be treated as an unsupported UNSAFE option. | |||
>> Options with inherently invalid Length field values, i.e., those | >> Options with inherently invalid Length field values, i.e., those | |||
that indicate underruns of the option itself or overruns of the | that indicate underruns of the option itself or overruns of the | |||
surplus area (pointing past the end of the IP payload), MUST be | surplus area (pointing past the end of the IP payload), MUST be | |||
treated as an indication of a malformed surplus area, and all options | treated as an indication of a malformed surplus area, and all options | |||
MUST silently be discarded. | MUST silently be discarded. | |||
Receivers cannot generally treat unexpected option lengths as | Receivers cannot generally treat unexpected Option Lengths as | |||
invalid, as this would unnecessarily limit future revision of options | invalid, as this would unnecessarily limit future revision of options | |||
(e.g., defining a new APC that is defined by having a different | (e.g., defining a new APC that is defined by having a different | |||
length). | length). | |||
>> When UNSAFE options are present, the UDP user data MUST be empty, | >> When UNSAFE options are present, the UDP user data MUST be empty, | |||
and any transport payload MUST be contained in a FRAG option (see | and any transport payload MUST be contained in a FRAG option (see | |||
Section 11.4). Recall that such options may alter the transport | Section 11.4). Recall that such options may alter the transport | |||
payload or signal a change in what its contents represent. This | payload or signal a change in what its contents represent. This | |||
restriction ensures their safe use in environments that might include | restriction ensures their safe use in environments that might include | |||
legacy receivers (see Section 12), because the transport payload | legacy receivers (see Section 12), because the transport payload | |||
occurs inside the FRAG option area and is silently discarded by | occurs inside the FRAG option area and is silently discarded by | |||
legacy receivers. | legacy receivers. | |||
>> Receivers supporting UDP options that receive unsupported options | >> Receivers supporting UDP Options that receive unsupported options | |||
in the UNSAFE range MUST terminate all option processing and MUST | in the UNSAFE range MUST terminate all option processing and MUST | |||
silently drop all UDP options in that datagram. See Section 12 for | silently drop all UDP Options in that datagram. See Section 12 for | |||
further discussion of UNSAFE options. | further discussion of UNSAFE options. | |||
>> Other than FRAG, NOP, EXP, and UEXP, each option SHOULD NOT occur | >> Other than FRAG, NOP, EXP, and UEXP, each option SHOULD NOT occur | |||
more than once in a single UDP datagram. If an option other than | more than once in a single UDP datagram. If an option other than | |||
these four occurs more than once, a receiver MUST interpret only the | these four occurs more than once, a receiver MUST interpret only the | |||
first instance of that option and MUST ignore later instances. | first instance of that option and MUST ignore later instances. | |||
Section 25 provides additional advice for Denial of Service (DoS) | Section 25 provides additional advice for Denial of Service (DoS) | |||
issues that involve large numbers of options, whether valid, unknown, | issues that involve large numbers of options, whether valid, unknown, | |||
or repeating. | or repeating. | |||
skipping to change at line 777 ¶ | skipping to change at line 778 ¶ | |||
dependent on the content or presence of other options or on the | dependent on the content or presence of other options or on the | |||
remaining contents of the surplus area, i.e., the area after the last | remaining contents of the surplus area, i.e., the area after the last | |||
option (presumably EOL). | option (presumably EOL). | |||
If future options were to depend on the contents or presence of other | If future options were to depend on the contents or presence of other | |||
options, interactions between those values, the OCS, and the AUTH and | options, interactions between those values, the OCS, and the AUTH and | |||
UENC options could be unpredictable. This does not prohibit options | UENC options could be unpredictable. This does not prohibit options | |||
that modify later options (in order of appearance within a packet), | that modify later options (in order of appearance within a packet), | |||
such as would typically be the case for compression (UCMP). | such as would typically be the case for compression (UCMP). | |||
Note that there is no need to reserve area after the last UDP option | Note that there is no need to reserve area after the last UDP Option | |||
for future uses, because any such use can be supported by defining a | for future uses, because any such use can be supported by defining a | |||
new UDP option over that area instead. Using an option for this | new UDP Option over that area instead. Using an option for this | |||
purpose is safer than treating the region as an exception, because | purpose is safer than treating the region as an exception, because | |||
its use can be verified based on option Kind and Length. | its use can be verified based on option Kind and Length. | |||
>> AUTH and UENC MUST NOT be used concurrently. | >> AUTH and UENC MUST NOT be used concurrently. | |||
AUTH and UENC are never used together because UENC would serve both | AUTH and UENC are never used together because UENC would serve both | |||
purposes. | purposes. | |||
>> "Must-support" options other than NOP and EOL MUST be placed by | >> "Must-support" options other than NOP and EOL MUST be placed by | |||
the transmitter before other SAFE UDP options. A receiver MAY drop | the transmitter before other SAFE UDP Options. A receiver MAY drop | |||
all UDP options if this ordering is not honored. Such events MAY be | all UDP Options if this ordering is not honored. Such events MAY be | |||
logged for diagnostic purposes. | logged for diagnostic purposes. | |||
The requirement that must-support options come before others is | The requirement that must-support options come before others is | |||
intended to allow for endpoints to implement DoS protection, as | intended to allow for endpoints to implement DoS protection, as | |||
discussed further in Section 25. | discussed further in Section 25. | |||
11. SAFE UDP Options | 11. SAFE UDP Options | |||
SAFE UDP options can be silently ignored by legacy receivers without | SAFE UDP Options can be silently ignored by legacy receivers without | |||
affecting the meaning of the UDP user data. They stand in contrast | affecting the meaning of the UDP user data. They stand in contrast | |||
to UNSAFE options, which modify UDP user data in ways that render it | to UNSAFE options, which modify UDP user data in ways that render it | |||
unusable by legacy receivers (Section 12). The following subsections | unusable by legacy receivers (Section 12). The following subsections | |||
describe SAFE options defined in this document. | describe SAFE options defined in this document. | |||
11.1. End of Options List (EOL) | 11.1. End of Options List (EOL) | |||
The End of Options List (EOL, Kind=0) option indicates that there are | The End of Options List (EOL, Kind=0) option indicates that there are | |||
no more options. It is used to indicate the end of the list of | no more options. It is used to indicate the end of the list of | |||
options without needing to use NOP options (see the following | options without needing to use NOP options (see the following | |||
section) as padding to fill all available option space. | section) as padding to fill all available option space. | |||
+--------+ | +--------+ | |||
| Kind=0 | | | Kind=0 | | |||
+--------+ | +--------+ | |||
Figure 7: UDP EOL Option Format | Figure 7: UDP EOL Option Format | |||
>> When the UDP options do not consume the entire surplus area or the | >> When the UDP Options do not consume the entire surplus area or the | |||
options area of a UDP fragment, the last non-NOP option MUST be EOL. | options area of a UDP fragment, the last non-NOP option MUST be EOL. | |||
>> NOPs SHOULD NOT be used as padding before the EOL option. As a | >> NOPs SHOULD NOT be used as padding before the EOL option. As a | |||
one-byte option, EOL need not be otherwise aligned. | one-byte option, EOL need not be otherwise aligned. | |||
>> All bytes after EOL in the surplus area or the options area of a | >> All bytes after EOL in the surplus area or the options area of a | |||
UDP fragment MUST be set to zero on transmit. | UDP fragment MUST be set to zero on transmit. | |||
>> Bytes after EOL in the surplus area or the options area of a UDP | >> Bytes after EOL in the surplus area or the options area of a UDP | |||
fragment MAY be checked as being zero on receipt but MUST NOT be | fragment MAY be checked as being zero on receipt but MUST NOT be | |||
skipping to change at line 841 ¶ | skipping to change at line 842 ¶ | |||
>> If a receiver elects to check the bytes following EOL and finds | >> If a receiver elects to check the bytes following EOL and finds | |||
that they are not all set to zero, it MUST silently discard the | that they are not all set to zero, it MUST silently discard the | |||
options area. In this case, the UDP user data MUST be delivered to | options area. In this case, the UDP user data MUST be delivered to | |||
the application layer, unless the socket has been explicitly | the application layer, unless the socket has been explicitly | |||
configured to do otherwise, as decided by the upper layer or | configured to do otherwise, as decided by the upper layer or | |||
negotiated with the other endpoint. | negotiated with the other endpoint. | |||
Requiring the post-option surplus area to be zero prevents side- | Requiring the post-option surplus area to be zero prevents side- | |||
channel uses of this area, instead requiring that all use of the | channel uses of this area, instead requiring that all use of the | |||
surplus area be UDP options supported by both endpoints. It is | surplus area be UDP Options supported by both endpoints. It is | |||
useful to allow this area to be used for zero padding to increase the | useful to allow this area to be used for zero padding to increase the | |||
UDP datagram length without affecting the UDP user data length, e.g., | UDP datagram length without affecting the UDP user data length, e.g., | |||
for UDP DPLPMTUD (Section 4.1 of [RFC9869]). | for UDP DPLPMTUD (Section 4.1 of [RFC9869]). | |||
11.2. No Operation (NOP) | 11.2. No Operation (NOP) | |||
The No Operation (NOP, Kind=1) option is a one-byte placeholder, | The No Operation (NOP, Kind=1) option is a one-byte placeholder, | |||
intended to be used as padding, e.g., to align multi-byte options | intended to be used as padding, e.g., to align multi-byte options | |||
along 16-bit, 32-bit, or 64-bit boundaries. | along 16-bit, 32-bit, or 64-bit boundaries. | |||
skipping to change at line 910 ¶ | skipping to change at line 911 ¶ | |||
zero is a potentially valid checksum. As such, it does not indicate | zero is a potentially valid checksum. As such, it does not indicate | |||
that the APC is not used; instead, the option would simply not be | that the APC is not used; instead, the option would simply not be | |||
included if that were the desired effect. | included if that were the desired effect. | |||
The APC does not protect the UDP pseudoheader; only the current UDP | The APC does not protect the UDP pseudoheader; only the current UDP | |||
checksum provides that protection (when used). The APC cannot | checksum provides that protection (when used). The APC cannot | |||
provide that protection because it would need to be updated whenever | provide that protection because it would need to be updated whenever | |||
the UDP pseudoheader changed, e.g., during NAT address and port | the UDP pseudoheader changed, e.g., during NAT address and port | |||
translation (see [RFC1141]). | translation (see [RFC1141]). | |||
>> UDP packets with incorrect APC checksums SHOULD be passed to the | >> UDP packets with incorrect APC Option checksum fields SHOULD be | |||
application with an indication of APC failure. This is the default | passed to the application with an indication of APC Option checksum | |||
behavior for APC. | failure. This is the default behavior for APC. | |||
>> Like all SAFE UDP options, the APC MUST be silently ignored when | >> Like all SAFE UDP Options, the APC MUST be silently ignored when | |||
failing, unless the receiver has been explicitly configured to do | failing, unless the receiver has been explicitly configured to do | |||
otherwise. | otherwise. | |||
Although all UDP option-aware endpoints support the APC (being in the | Although all UDP Option aware endpoints support the APC (being in the | |||
required set), this silently ignored behavior ensures that option- | required set), this silently ignored behavior ensures that option- | |||
aware receivers operate the same as legacy receivers unless | aware receivers operate the same as legacy receivers unless | |||
overridden. Another reason is because the APC check could fail even | overridden. Another reason is because the APC check could fail even | |||
where the user data has not been corrupted, such as when its contents | where the user data has not been corrupted, such as when its contents | |||
have been intentionally overwritten, e.g., by a middlebox to update | have been intentionally overwritten, e.g., by a middlebox to update | |||
embedded port numbers or IP addresses. Such overwrites could be | embedded port numbers or IP addresses. Such overwrites could be | |||
intentional and not widely known; defaulting to silent ignore ensures | intentional and not widely known; defaulting to silent ignore ensures | |||
that option-aware endpoints do not change how users or applications | that option-aware endpoints do not change how users or applications | |||
operate unless explicitly directed to do otherwise. | operate unless explicitly directed to do otherwise. | |||
>> UDP packets with unrecognized APC lengths MUST receive the same | >> UDP packets with unrecognized APC lengths MUST receive the same | |||
treatment as UDP packets with incorrect APC checksums. | treatment as UDP packets with incorrect APC Option checksum fields. | |||
Ensuring that unrecognized APC lengths are treated as incorrect | Ensuring that unrecognized APC lengths are treated as incorrect | |||
checksums enables future variants of APC to be treated like APC. | checksums enables future variants of APC to be treated like APC. | |||
The APC is reported to the user and useful only per-datagram, because | The APC is reported to the user and useful only per-datagram, because | |||
fragments have no UDP user data. | fragments have no UDP user data. | |||
11.4. Fragmentation (FRAG) | 11.4. Fragmentation (FRAG) | |||
The Fragmentation (FRAG, Kind=3) option supports UDP fragmentation | The Fragmentation (FRAG, Kind=3) option supports UDP fragmentation | |||
and reassembly, which can be used to transfer UDP messages larger | and reassembly, which can be used to transfer UDP messages larger | |||
than allowed by the IP receive MTU (Effective MTU for Receiving | than allowed by the IP Effective MTU for Receiving (EMTU_R) | |||
(EMTU_R) [RFC1122]). FRAG includes a copy of the same UDP transport | [RFC1122]. FRAG includes a copy of the same UDP transport ports in | |||
ports in each fragment, enabling them to traverse stateless Network | each fragment, enabling them to traverse stateless Network Address | |||
Address (and port) Translation (NAT) devices, in contrast to the | (and port) Translation (NAT) devices, in contrast to the behavior of | |||
behavior of IP fragments [RFC4787]. FRAG is typically used with the | IP fragments [RFC4787]. FRAG is typically used with the UDP MDS and | |||
UDP MDS and MRDS options to enable more efficient use of large | MRDS options to enable more efficient use of large messages, both at | |||
messages, both at the UDP and IP layers. The design of FRAG is | the UDP and IP layers. The design of FRAG is similar to that of the | |||
similar to that of the IPv6 Fragmentation Header [RFC8200], except | IPv6 Fragmentation Header [RFC8200], except that the UDP variant uses | |||
that the UDP variant uses a 16-bit Offset measured in bytes, rather | a 16-bit Offset measured in bytes, rather than IPv6's 13-bit Fragment | |||
than IPv6's 13-bit Fragment Offset measured in 8-byte units. This | Offset measured in 8-byte units. This UDP variant avoids creating | |||
UDP variant avoids creating reserved fields. | reserved fields. | |||
The FRAG header also enables use of options that modify the contents | The FRAG header also enables use of options that modify the contents | |||
of the UDP payload, such as encryption (UENC, see Section 12.2). | of the UDP payload, such as encryption (UENC, see Section 12.2). | |||
Like FRAG, such options would not be safely used on UDP payloads | Like FRAG, such options would not be safely used on UDP payloads | |||
because they would be misinterpreted by legacy receivers. FRAG | because they would be misinterpreted by legacy receivers. FRAG | |||
allows use of these options, either on fragments or on a whole, | allows use of these options, either on fragments or on a whole, | |||
unfragmented message (i.e., an "atomic" fragment at the UDP layer, | unfragmented message (i.e., an "atomic" fragment at the UDP layer, | |||
similar to atomic IP datagrams [RFC6864]). This is safe because FRAG | similar to atomic IP datagrams [RFC6864]). This is safe because FRAG | |||
hides the payload from legacy receivers by placing it within the | hides the payload from legacy receivers by placing it within the | |||
surplus area. | surplus area. | |||
>> When FRAG is present, it SHOULD come as early as possible in the | >> When FRAG is present, it SHOULD come as early as possible in the | |||
UDP options list. | UDP Options list. | |||
When present, placing FRAG first can simplify some implementations, | When present, placing FRAG first can simplify some implementations, | |||
notably those using hardware acceleration that assume a fixed | notably those using hardware acceleration that assume a fixed | |||
location for the FRAG option. However, there are cases where FRAG | location for the FRAG option. However, there are cases where FRAG | |||
cannot occur first, such as when combined with per-fragment UENC or | cannot occur first, such as when combined with per-fragment UENC or | |||
UCMP. In those cases, encryption or compression (or both) would | UCMP. In those cases, encryption or compression (or both) would | |||
precede FRAG when they also encrypt or compress the fragment option | precede FRAG when they also encrypt or compress the fragment option | |||
itself. Additional cases could include recoding, such as could be | itself. Additional cases could include recoding, such as could be | |||
used to support Forward Error Correction (FEC) over a group of | used to support Forward Error Correction (FEC) over a group of | |||
fragments. FRAG not being first might result in software (so-called | fragments. FRAG not being first might result in software (so-called | |||
"slow path") option processing or might also be accommodated via a | "slow path") option processing or might also be accommodated via a | |||
small set of known cases. | small set of known cases. | |||
>> When FRAG is present, the UDP user data MUST be empty. If the | >> When FRAG is present, the UDP user data MUST be empty. If the | |||
user data is not empty, all UDP options MUST be silently ignored and | user data is not empty, all UDP Options MUST be silently ignored and | |||
the user data received sent to the user. | the user data received MUST be sent to the user. | |||
Legacy receivers interpret FRAG messages as zero-length user data UDP | Legacy receivers interpret FRAG messages as zero-length user data UDP | |||
packets (i.e., UDP Length field is 8, the length of just the UDP | packets (i.e., UDP Length field is 8, the length of just the UDP | |||
header), which would not affect the receiver unless the presence of | header), which would not affect the receiver unless the presence of | |||
the UDP packet itself were a signal (see Section 5 of [RFC8085]). In | the UDP packet itself were a signal (see Section 5 of [RFC8085]). In | |||
this manner, the FRAG option also helps hide UNSAFE options so they | this manner, the FRAG option also helps hide UNSAFE options so they | |||
can be used more safely in the presence of legacy receivers. | can be used more safely in the presence of legacy receivers. | |||
The FRAG option has two formats: non-terminal fragments use the | The FRAG option has two formats: non-terminal fragments use the | |||
shorter variant (Figure 10) and terminal fragments use the longer | shorter variant (Figure 10) and terminal fragments use the longer | |||
skipping to change at line 1011 ¶ | skipping to change at line 1012 ¶ | |||
+--------+--------+ | +--------+--------+ | |||
Figure 10: UDP Non-Terminal FRAG Option Format | Figure 10: UDP Non-Terminal FRAG Option Format | |||
Most fields are common to both FRAG option formats. The option Len | Most fields are common to both FRAG option formats. The option Len | |||
field indicates whether there are more fragments (Len=10) or no more | field indicates whether there are more fragments (Len=10) or no more | |||
fragments (Len=12). | fragments (Len=12). | |||
The Frag. Start field indicates the location of the beginning of the | The Frag. Start field indicates the location of the beginning of the | |||
fragment data, measured from the beginning of the UDP header of the | fragment data, measured from the beginning of the UDP header of the | |||
fragment. The fragment data follows the remainder of the UDP options | fragment. The fragment data follows the remainder of the UDP Options | |||
and continues to the end of the IP datagram (i.e., the end of the | and continues to the end of the IP datagram (i.e., the end of the | |||
surplus area). Those options (i.e., any that precede or follow the | surplus area). Those options (i.e., any that precede or follow the | |||
FRAG option) are applied to this UDP fragment. | FRAG option) are applied to this UDP fragment. | |||
The Frag. Offset field indicates the location of this fragment | The Frag. Offset field indicates the location of this fragment | |||
relative to the original UDP datagram (prior to fragmentation or | relative to the original UDP datagram (prior to fragmentation or | |||
after reassembly), measured from the start of the original UDP | after reassembly), measured from the start of the original UDP | |||
datagram's header. | datagram's header. | |||
The Identification field is a 32-bit value that, when used in | The Identification field is a 32-bit value that, when used in | |||
skipping to change at line 1040 ¶ | skipping to change at line 1041 ¶ | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
| Frag. Offset |Reass DgOpt Start| | | Frag. Offset |Reass DgOpt Start| | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
Figure 11: UDP Non-Terminal FRAG Option Format | Figure 11: UDP Non-Terminal FRAG Option Format | |||
The terminal FRAG option format adds a Reassembled Datagram Option | The terminal FRAG option format adds a Reassembled Datagram Option | |||
Start (RDOS) pointer, measured from the start of the original UDP | Start (RDOS) pointer, measured from the start of the original UDP | |||
datagram header, indicating the end of the reassembled data and the | datagram header, indicating the end of the reassembled data and the | |||
start of the surplus area within the original UDP datagram. UDP | start of the surplus area within the original UDP datagram. UDP | |||
options that apply to the reassembled datagram are contained in the | Options that apply to the reassembled datagram are contained in the | |||
reassembled surplus area, as indicated by RDOS. UDP options that | reassembled surplus area, as indicated by RDOS. UDP Options that | |||
occur within the fragment are processed on the fragment itself. This | occur within the fragment are processed on the fragment itself. This | |||
allows either pre-reassembly or post-reassembly UDP option effects, | allows either pre-reassembly or post-reassembly UDP Option effects, | |||
such as using UENC on each fragment while also using TIME on the | such as using UENC on each fragment while also using TIME on the | |||
reassembled datagram for round-trip latency measurements. | reassembled datagram for round-trip latency measurements. | |||
An example showing the relationship between UDP fragments and the | An example showing the relationship between UDP fragments and the | |||
original UDP datagram is provided in Figure 12. In this example, the | original UDP datagram is provided in Figure 12. In this example, the | |||
trailer containing per-datagram options resides entirely within the | trailer containing per-datagram options resides entirely within the | |||
terminal fragment, but this need not always be the case. | terminal fragment, but this need not always be the case. | |||
Constituent UDP Fragments Original UDP Datagram | Constituent UDP Fragments Original UDP Datagram | |||
skipping to change at line 1098 ¶ | skipping to change at line 1099 ¶ | |||
Figure 12: UDP Fragments and Original UDP Datagram | Figure 12: UDP Fragments and Original UDP Datagram | |||
The FRAG option does not need a "more fragments" bit (as used by IP | The FRAG option does not need a "more fragments" bit (as used by IP | |||
fragmentation) because it provides the same indication by using the | fragmentation) because it provides the same indication by using the | |||
longer, 12-byte variant, as shown in Figure 11. | longer, 12-byte variant, as shown in Figure 11. | |||
>> The FRAG option MAY be used on a single fragment; in which case, | >> The FRAG option MAY be used on a single fragment; in which case, | |||
the Frag. Offset would be zero and the option would have the 12-byte | the Frag. Offset would be zero and the option would have the 12-byte | |||
format. | format. | |||
>> Endpoints supporting UDP options MUST be capable of fragmenting | >> Endpoints supporting UDP Options MUST be capable of fragmenting | |||
and reassembling at least two fragments, each of a size that will fit | and reassembling at least two fragments, each of a size that will fit | |||
within the standard Ethernet MTU of 1,500 bytes. For further | within the standard Ethernet MTU of 1,500 bytes. For further | |||
details, please see Section 11.6. | details, please see Section 11.6. | |||
Use of the single fragment variant can be helpful in supporting use | Use of the single fragment variant can be helpful in supporting use | |||
of UNSAFE options without undesirable impact to receivers that do not | of UNSAFE options without undesirable impact to receivers that do not | |||
support either UDP options or the specific UNSAFE options. | support either UDP Options or the specific UNSAFE options. | |||
During fragmentation, the UDP header checksum of each fragment | During fragmentation, the UDP header checksum of each fragment | |||
remains constant. It does not depend on the fragment data (which | remains constant. It does not depend on the fragment data (which | |||
appears in the surplus area) because all fragments have a zero- | appears in the surplus area) because all fragments have a zero- | |||
length user data field. | length user data field. | |||
>> The Identification field is a 32-bit value that MUST be unique | >> The Identification field is a 32-bit value that MUST be unique | |||
over the expected fragment reassembly timeout. | over the expected fragment reassembly timeout. | |||
>> The Identification field SHOULD be generated in a manner similar | >> The Identification field SHOULD be generated in a manner similar | |||
skipping to change at line 1135 ¶ | skipping to change at line 1136 ¶ | |||
in this case (to avoid a potential DoS attack turning into an ICMP | in this case (to avoid a potential DoS attack turning into an ICMP | |||
storm in the reverse direction). | storm in the reverse direction). | |||
>> Note that fragments might be duplicated in the network. Instead | >> Note that fragments might be duplicated in the network. Instead | |||
of treating these exact duplicate fragments as overlapping fragments, | of treating these exact duplicate fragments as overlapping fragments, | |||
an implementation MAY choose to detect this case and drop exact | an implementation MAY choose to detect this case and drop exact | |||
duplicate fragments while keeping the other fragments belonging to | duplicate fragments while keeping the other fragments belonging to | |||
the same UDP packet. | the same UDP packet. | |||
UDP fragmentation relies on a fragment expiration timer, which can be | UDP fragmentation relies on a fragment expiration timer, which can be | |||
preset or could use a value computed using the UDP Timestamp option. | preset or could use a value computed using the UDP Timestamp Option. | |||
>> The default UDP reassembly expiration timeout SHOULD be no more | >> The default UDP reassembly expiration timeout SHOULD be no more | |||
than 2 minutes. | than 2 minutes. | |||
>> UDP reassembly expiration MUST NOT generate an ICMP error. Such | >> UDP reassembly expiration MUST NOT generate an ICMP error. Such | |||
events are not an IP error and can be addressed by the user/ | events are not an IP error and can be addressed by the user/ | |||
application layer if desired. | application layer if desired. | |||
>> UDP reassembly space SHOULD be limited to reduce the impact of DoS | >> UDP reassembly space SHOULD be limited to reduce the impact of DoS | |||
attacks on resource use. | attacks on resource use. | |||
>> UDP reassembly space limits SHOULD NOT be computed as a shared | >> UDP reassembly space limits SHOULD NOT be computed as a shared | |||
resource across multiple sockets, to avoid cross-socket pair DoS | resource across multiple sockets, to avoid cross-socket pair DoS | |||
attacks. | attacks. | |||
>> Individual UDP fragments MUST NOT be forwarded to the user. The | >> Individual UDP fragments MUST NOT be forwarded to the user. The | |||
reassembled datagram is received only after complete reassembly, | reassembled datagram is received only after complete reassembly, | |||
checksum validation, and continued processing of the remaining UDP | checksum validation, and continued processing of the remaining UDP | |||
options. | Options. | |||
Per-fragment UDP options, if used in addition to FRAG, occur before | Per-fragment UDP Options, if used in addition to FRAG, occur before | |||
the fragment data. They typically occur after the FRAG option, | the fragment data. They typically occur after the FRAG option, | |||
except where they modify the FRAG option itself (e.g., UENC or UCMP). | except where they modify the FRAG option itself (e.g., UENC or UCMP). | |||
Per-fragment options are processed before the fragment is included in | Per-fragment options are processed before the fragment is included in | |||
the reassembled datagram. Such options can be useful to protect the | the reassembled datagram. Such options can be useful to protect the | |||
reassembly process itself, e.g., to prevent the reassembly cache from | reassembly process itself, e.g., to prevent the reassembly cache from | |||
being polluted (using AUTH or UENC). | being polluted (using AUTH or UENC). | |||
>> Fragments of a single datagram MAY use different sets of options. | >> Fragments of a single datagram MAY use different sets of options. | |||
It is expected to be computationally expensive to validate uniformity | It is expected to be computationally expensive to validate uniformity | |||
across all fragments, and there could be legitimate reasons for | across all fragments, and there could be legitimate reasons for | |||
including options in a fragment but not all fragments (e.g., MDS and | including options in a fragment but not all fragments (e.g., MDS and | |||
MRDS). | MRDS). | |||
If an option is used per-fragment but defined as not usable per- | If an option is used per-fragment but defined as not usable per- | |||
fragment, it is treated the same as any other unknown option. | fragment, it is treated the same as any other unknown option. | |||
Per-datagram UDP options, if used, reside in the surplus area of the | Per-datagram UDP Options, if used, reside in the surplus area of the | |||
original UDP datagram. Processing of those options occurs after | original UDP datagram. Processing of those options occurs after | |||
reassembly is complete. This enables the safe use of UNSAFE options, | reassembly is complete. This enables the safe use of UNSAFE options, | |||
which are required to result in discarding the entire UDP datagram if | which are required to result in discarding the entire UDP datagram if | |||
they are unknown to the receiver or otherwise fail (see Section 12). | they are unknown to the receiver or otherwise fail (see Section 12). | |||
In general, UDP packets are fragmented as follows: | In general, UDP packets are fragmented as follows: | |||
1. Create a UDP packet with data and UDP options. This is the | 1. Create a UDP packet with data and UDP Options. This is the | |||
original UDP datagram, which we will call "D". The UDP options | original UDP datagram, which we will call "D". The UDP Options | |||
follow the UDP user data and occur in the surplus area, just as | follow the UDP user data and occur in the surplus area, just as | |||
in an unfragmented UDP datagram with UDP options. | in an unfragmented UDP datagram with UDP Options. | |||
>> UDP options for the original packet MUST be fully prepared | >> UDP Options for the original packet MUST be fully prepared | |||
before the rest of the fragmentation steps that follow here. | before the rest of the fragmentation steps that follow here. | |||
>> The UDP checksum of the original packet SHOULD be set to zero | >> The UDP checksum of the original packet SHOULD be set to zero | |||
because it is never transmitted. Equivalent protection is | because it is never transmitted. Equivalent protection is | |||
provided if each fragment has a non-zero OCS value, as will be | provided if each fragment has a non-zero OCS value, as will be | |||
the case if each fragment's UDP checksum is non-zero. Similarly, | the case if each fragment's UDP checksum is non-zero. Similarly, | |||
the OCS value of the original packet SHOULD be zero if each | the OCS value of the original packet SHOULD be zero if each | |||
fragment will have a non-zero OCS value, as will be the case if | fragment will have a non-zero OCS value, as will be the case if | |||
each fragment's UDP checksum is non-zero. | each fragment's UDP checksum is non-zero. | |||
skipping to change at line 1211 ¶ | skipping to change at line 1212 ¶ | |||
3. Fragment "D" into chunks of size no larger than "S"-12 each (10 | 3. Fragment "D" into chunks of size no larger than "S"-12 each (10 | |||
for the non-terminal FRAG option and 2 for OCS), with one final | for the non-terminal FRAG option and 2 for OCS), with one final | |||
chunk no larger than "S"-14 (12 for the terminal FRAG option and | chunk no larger than "S"-14 (12 for the terminal FRAG option and | |||
2 for OCS). Note that all the per-datagram options in step #1 | 2 for OCS). Note that all the per-datagram options in step #1 | |||
need not be limited to the terminal fragment, i.e., the RDOS | need not be limited to the terminal fragment, i.e., the RDOS | |||
pointer can indicate the start of the original surplus area | pointer can indicate the start of the original surplus area | |||
anywhere in the reassembled datagram. | anywhere in the reassembled datagram. | |||
4. For each chunk of "D" in step #3, create a UDP packet with no | 4. For each chunk of "D" in step #3, create a UDP packet with no | |||
user data (UDP Length=8) followed by the word-aligned OCS, the | user data (UDP Length=8) followed by the word-aligned OCS, the | |||
FRAG option, and any additional per-fragment UDP options, | FRAG option, and any additional per-fragment UDP Options, | |||
followed by the FRAG data chunk. | followed by the FRAG data chunk. | |||
5. Complete the processing associated with creating these additional | 5. Complete the processing associated with creating these additional | |||
per-fragment UDP options for each fragment. | per-fragment UDP Options for each fragment. | |||
Receivers reverse the above sequence. They process all received | Receivers reverse the above sequence. They process all received | |||
options in each fragment. When the FRAG option is encountered, the | options in each fragment. When the FRAG option is encountered, the | |||
FRAG data is used in reassembly. After all fragments are received, | FRAG data is used in reassembly. After all fragments are received, | |||
the entire UDP packet is processed with any trailing UDP options | the entire UDP packet is processed with any trailing UDP Options | |||
applying to the reassembled user data. | applying to the reassembled user data. | |||
>> Reassembly failures at the receiver result in silent discard of | >> Reassembly failures at the receiver result in silent discard of | |||
any per-fragment options and fragment contents, and such failures | any per-fragment options and fragment contents, and such failures | |||
SHOULD NOT generate zero-length frames to the user. | SHOULD NOT generate zero-length frames to the user. | |||
>> Finally, because fragmentation processing can be expensive, the | >> Finally, because fragmentation processing can be expensive, the | |||
FRAG option SHOULD be avoided unless the original datagram requires | FRAG option SHOULD be avoided unless the original datagram requires | |||
fragmentation or it is needed for "safe" use of UNSAFE options. | fragmentation or it is needed for "safe" use of UNSAFE options. | |||
>> The FRAG option MAY also be used to provide limited support for | >> The FRAG option MAY also be used to provide limited support for | |||
UDP options in systems that have access to only the initial portion | UDP Options in systems that have access to only the initial portion | |||
of the data in incoming or outgoing packets, as such systems could | of the data in incoming or outgoing packets, as such systems could | |||
potentially access per-fragment options. Such packets would, of | potentially access per-fragment options. Such packets would, of | |||
course, be silently ignored by legacy receivers that do not support | course, be silently ignored by legacy receivers that do not support | |||
UDP options. | UDP Options. | |||
The presence of the FRAG option is not reported to the user. | The presence of the FRAG option is not reported to the user. | |||
11.5. Maximum Datagram Size (MDS) | 11.5. Maximum Datagram Size (MDS) | |||
The Maximum Datagram Size (MDS, Kind=4) option is a 16-bit hint of | The Maximum Datagram Size (MDS, Kind=4) option is a 16-bit hint of | |||
the largest UDP packet or UDP fragment that an endpoint believes can | the largest UDP packet or UDP fragment that an endpoint believes can | |||
be received without use of IP fragmentation. It helps UDP | be received without use of IP fragmentation. It helps UDP | |||
applications limit the largest UDP packet that can be sent without | applications limit the largest UDP packet that can be sent without | |||
UDP fragmentation and helps UDP fragmentation determine the largest | UDP fragmentation and helps UDP fragmentation determine the largest | |||
UDP fragment to send -- in both cases, to avoid IP fragmentation. | UDP fragment to send -- in both cases, to avoid IP fragmentation. | |||
As with the TCP Maximum Segment Size (MSS) option [RFC9293], the size | As with the TCP Maximum Segment Size (MSS) option [RFC9293], the size | |||
indicated is the IP layer MTU decreased by the fixed IP and UDP | indicated is the IP layer MTU decreased by the fixed IP and UDP | |||
headers only [RFC9293]. The space needed for IP and UDP options | headers only [RFC9293]. The space needed for IP and UDP Options | |||
needs to be adjusted by the sender when using the value indicated. | needs to be adjusted by the sender when using the value indicated. | |||
The value transmitted is based on EMTU_R, the largest IP datagram | The value transmitted is based on EMTU_R, the largest IP datagram | |||
that can be received (i.e., reassembled at the receiver) [RFC1122]. | that can be received (i.e., reassembled at the receiver) [RFC1122]. | |||
However, as with TCP, this value is only a hint at what the receiver | However, as with TCP, this value is only a hint at what the receiver | |||
believes, as when used with PLPMTUD at the UDP layer, as discussed | believes, as when used with PLPMTUD at the UDP layer, as discussed | |||
later in this section. | later in this section. | |||
>> MDS does not indicate a known path MTU and thus MUST NOT be used | >> MDS does not indicate a known path MTU and thus MUST NOT be used | |||
to limit transmissions. | to limit transmissions. | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
| Kind=4 | Len=4 | MDS size | | | Kind=4 | Len=4 | MDS size | | |||
+--------+--------+--------+--------+ | +--------+--------+--------+--------+ | |||
Figure 13: UDP MDS Option Format | Figure 13: UDP MDS Option Format | |||
>> The UDP MDS option MAY be used as a hint for path MTU discovery | >> The UDP MDS Option MAY be used as a hint for path MTU discovery | |||
[RFC1191] [RFC8201], but this could be difficult because of known | [RFC1191] [RFC8201], but this could be difficult because of known | |||
issues with ICMP blocking [RFC2923] as well as UDP lacking automatic | issues with ICMP blocking [RFC2923] as well as UDP lacking automatic | |||
retransmission. | retransmission. | |||
MDS is more likely to be useful when coupled with IP source | MDS is more likely to be useful when coupled with IP source | |||
fragmentation or UDP fragmentation to limit the largest reassembled | fragmentation or UDP fragmentation to limit the largest reassembled | |||
UDP message as indicated by MRDS (see Section 11.6), e.g., when | UDP message as indicated by MRDS (see Section 11.6), e.g., when | |||
EMTU_R is larger than the required minimums (576 for IPv4 [RFC0791] | EMTU_R is larger than the required minimums (576 for IPv4 [RFC0791] | |||
and 1500 for IPv6 [RFC8200]). | and 1500 for IPv6 [RFC8200]). | |||
skipping to change at line 1292 ¶ | skipping to change at line 1293 ¶ | |||
MDS is reported to the user, whether used per-datagram or per- | MDS is reported to the user, whether used per-datagram or per- | |||
fragment (as defined in Section 11.4). When used per-fragment, the | fragment (as defined in Section 11.4). When used per-fragment, the | |||
reported value is the minimum of the MDS values received per- | reported value is the minimum of the MDS values received per- | |||
fragment. | fragment. | |||
11.6. Maximum Reassembled Datagram Size (MRDS) | 11.6. Maximum Reassembled Datagram Size (MRDS) | |||
The Maximum Reassembled Datagram Size (MRDS, Kind=5) option is a 16- | The Maximum Reassembled Datagram Size (MRDS, Kind=5) option is a 16- | |||
bit indicator of the largest reassembled UDP datagram that can be | bit indicator of the largest reassembled UDP datagram that can be | |||
received, including the UDP header and any per-datagram UDP options, | received, including the UDP header and any per-datagram UDP Options, | |||
accompanied by an 8-bit indication of how many UDP fragments can be | accompanied by an 8-bit indication of how many UDP fragments can be | |||
reassembled. MRDS size is the UDP equivalent of IP's EMTU_R, but the | reassembled. The MRDS size field is the UDP equivalent of IP's | |||
two are not related [RFC1122]. Using the FRAG option (Section 11.4), | EMTU_R, but the two are not related [RFC1122]. Using the FRAG option | |||
UDP packets can be transmitted as transport fragments, each in their | (Section 11.4), UDP packets can be transmitted as transport | |||
own (presumably not fragmented) IP datagram, and be reassembled at | fragments, each in their own (presumably not fragmented) IP datagram, | |||
the UDP layer. MRDS segs is the number of UDP fragments that can be | and be reassembled at the UDP layer. MRDS segs is the number of UDP | |||
reassembled. | fragments that can be reassembled. | |||
+--------+--------+--------+--------+---------+ | +--------+--------+--------+--------+---------+ | |||
| Kind=5 | Len=5 | MRDS size |MRDS segs| | | Kind=5 | Len=5 | MRDS size |MRDS segs| | |||
+--------+--------+--------+--------+---------+ | +--------+--------+--------+--------+---------+ | |||
Figure 14: UDP MRDS Option Format | Figure 14: UDP MRDS Option Format | |||
>> Endpoints supporting UDP options MUST support a local MRDS size of | >> Endpoints supporting UDP Options MUST support a local MRDS size of | |||
at least 2,926 bytes for IPv4 and 2,886 bytes for IPv6. Support for | at least 2,926 bytes for IPv4 and 2,886 bytes for IPv6. Support for | |||
larger values is encouraged. | larger values is encouraged. | |||
>> Endpoints supporting UDP options MUST support a local MRDS segs | >> Endpoints supporting UDP Options MUST support a local MRDS segs | |||
value of at least 2. Support for larger values is encouraged. | value of at least 2. Support for larger values is encouraged. | |||
These parameters plus the Path MTU (PMTU) allow a sender to compute | These parameters plus the Path MTU (PMTU) allow a sender to compute | |||
the size of the largest pre-fragmentation UDP packet that a receiver | the size of the largest pre-fragmentation UDP packet that a receiver | |||
will guarantee to accept. Suppose that MMS_S is the PMTU less the | will guarantee to accept. Define MMS_S as the PMTU less the size of | |||
size of the IP header and the UDP header, i.e., the maximum UDP | the IP header and the UDP header, i.e., the maximum UDP message size | |||
message size that can be successfully sent in a single UDP datagram | that can be successfully sent in a single UDP datagram if there are | |||
if there are no IP options or extension headers and no UDP per- | no IP options or extension headers and no UDP per-fragment options. | |||
fragment options. | ||||
Then, the size of the largest pre-fragmentation UDP packet that the | Then, the size of the largest pre-fragmentation UDP packet that the | |||
receiver will guarantee to accept is the smaller of the MRDS size and | receiver will guarantee to accept is the smaller of the MRDS size and | |||
(MMS_S - 12) * (MRDS segs) - 2 - (Total Per-Frag IP/UDP Options) + 8 | (MMS_S - 12) * (MRDS segs) - 2 - (Total Per-Frag IP/UDP Options) + 8 | |||
where Total Per-Frag IP/UDP Options includes the size of all IP | where Total Per-Frag IP/UDP Options includes the size of all IP | |||
options and extension headers and all per-fragment UDP options, | options and extension headers and all per-fragment UDP Options, | |||
except for OCS and FRAG, that are in the sequence of UDP fragments. | except for OCS and FRAG, that are in the sequence of UDP fragments. | |||
>> If no MRDS option has been received, a sender MUST assume that | >> If no MRDS option has been received, a sender MUST assume that | |||
MRDS size is 2,926 bytes for IPv4 and 2,886 bytes for IPv6 and that | MRDS size is 2,926 bytes for IPv4 and 2,886 bytes for IPv6 and that | |||
MRDS segs is 2, i.e., the minimum values allowed. | MRDS segs is 2, i.e., the minimum values allowed. | |||
MRDS is reported to the user, whether used per-datagram or per- | MRDS is reported to the user, whether used per-datagram or per- | |||
fragment (as defined in Section 11.4). When used per-fragment, the | fragment (as defined in Section 11.4). When used per-fragment, the | |||
reported value is the minimum of the MRDS values received per- | reported value is the minimum of the MRDS values received per- | |||
fragment. | fragment. | |||
11.7. Echo Request (REQ) and Echo Response (RES) | 11.7. Echo Request (REQ) and Echo Response (RES) | |||
The echo Request (REQ, Kind=6) and echo Response (RES, Kind=7) | The echo Request (REQ, Kind=6) and echo Response (RES, Kind=7) | |||
options provides UDP packet-level acknowledgments as a capability for | options provides UDP packet-level acknowledgments as a capability for | |||
use by upper layer protocols, e.g., user applications, libraries, | use by upper layer protocols, e.g., user applications, libraries, | |||
operating systems, etc. Both the REQ and RES are under the control | operating systems, etc. Both the REQ and RES are under the control | |||
of these upper layers, i.e., UDP option support described in this | of these upper layers, i.e., UDP Option support described in this | |||
document never automatically responds to a REQ with a RES. Instead, | document never automatically responds to a REQ with a RES. Instead, | |||
the REQ is delivered to the upper layer, which decides whether and | the REQ is delivered to the upper layer, which decides whether and | |||
when to issue a RES. | when to issue a RES. | |||
One such use is described as part of DPLPMTUD [RFC9869]. This use | One such use is described as part of DPLPMTUD [RFC9869]. This use | |||
case is described as part of UDP options but is logically considered | case is described as part of UDP Options but is logically considered | |||
to be a capability of an upper layer that uses UDP options. The | to be a capability of an upper layer that uses UDP Options. The | |||
options both have the format indicated in Figure 15, in which the | options both have the format indicated in Figure 15, in which the | |||
token has no internal structure or meaning. | token has no internal structure or meaning. | |||
+--------+--------+-----------------+ | +--------+--------+-----------------+ | |||
| Kind | Len=6 | token | | | Kind | Len=6 | token | | |||
+--------+--------+-----------------+ | +--------+--------+-----------------+ | |||
1 byte 1 byte 4 bytes | 1 byte 1 byte 4 bytes | |||
Figure 15: UDP REQ and RES Options Format | Figure 15: UDP REQ and RES Options Format | |||
>> As advice to upper layer protocol/library designers, when | >> As advice to upper layer protocol/library designers, when | |||
supporting REQ/RES and responding with a RES, the upper layer SHOULD | supporting REQ/RES and responding with a RES, the upper layer SHOULD | |||
respond with the most recently received REQ token. | respond with the most recently received REQ token. | |||
>> If the implementation includes a layer/library that produces and | >> If the implementation includes a layer/library that produces and | |||
consumes REQ/RES on behalf of the user/application, then that layer | consumes REQ/RES on behalf of the user/application, then that layer | |||
MUST be disabled by default; in which case, REQ/RES are simply sent | MUST be disabled by default; in which case, REQ/RES are simply sent | |||
upon request by the user/application and passed to it when received, | upon request by the user/application and passed to it when received, | |||
as with most other UDP options. | as with most other UDP Options. | |||
For example, an application needs to explicitly enable the generation | For example, an application needs to explicitly enable the generation | |||
of a RES response by DPLPMTUD when using UDP Options [RFC9869]. | of a RES option by DPLPMTUD when using UDP Options [RFC9869]. | |||
>> The token transmitted in a RES option MUST be a token received in | >> The token transmitted in a RES option MUST be a token received in | |||
a REQ option by the transmitter. This ensures that the response is | a REQ option by the transmitter. This ensures that the response is | |||
to a received request. | to a received request. | |||
REQ and RES option kinds each appear at most once in each UDP packet, | REQ and RES option kinds each appear at most once in each UDP packet, | |||
as with most other options. A single packet can include both | as with most other options. A single packet can include both | |||
options, though they would be otherwise unrelated to each other. | options, though they would be otherwise unrelated to each other. | |||
Note also that the FRAG option is not used when sending DPLPMTUD | Note also that the FRAG option is not used when sending DPLPMTUD | |||
probes to determine a PLPMTU [RFC9869]. | probes to determine a PLPMTU [RFC9869]. | |||
REQ and RES are reported to the user, whether used per-datagram or | REQ and RES are reported to the user, whether used per-datagram or | |||
per-fragment (as defined in Section 11.4). When used per-fragment, | per-fragment (as defined in Section 11.4). When used per-fragment, | |||
the reported value indicates the most recently received token. | the reported value indicates the most recently received token. | |||
11.8. Timestamps (TIME) | 11.8. Timestamp (TIME) | |||
Timestamps are provided as a capability to be used by applications | Timestamps are provided as a capability to be used by applications | |||
and other upper layer protocols. They are based on a notion of time | and other upper layer protocols. They are based on a notion of time | |||
as a monotonically non-decreasing unsigned integer, with wraparound. | as a monotonically non-decreasing unsigned integer, with wraparound. | |||
They are defined the same way as TCP Protection Against Wrapped | They are defined the same way as TCP Protection Against Wrapped | |||
Sequence (PAWS) numbers, i.e., "without any connection to [real- | Sequence (PAWS) numbers, i.e., "without any connection to [real- | |||
world, classical physics wall-clock] time" [RFC7323]. They are quite | world, classical physics wall-clock] time" [RFC7323]. They are quite | |||
similar to the behavior of relativistic time or the individual | similar to the behavior of relativistic time or the individual | |||
scalars of Lamport clocks [La78]. However, if desired, they can | scalars of Lamport clocks [La78]. However, if desired, they can | |||
correspond to real-world time, e.g., as used for round-trip time | correspond to real-world time, e.g., as used for round-trip time | |||
(RTT) estimation. This option makes no assertions as to which is the | (RTT) estimation. This option makes no assertions as to which is the | |||
case; the decision is up to the application layer using this option. | case; the decision is up to the application layer using this option. | |||
The Timestamp (TIME, Kind=8) option exchanges two four-byte unsigned | The Timestamp (TIME, Kind=8) option exchanges two four-byte unsigned | |||
timestamp fields. It serves a similar purpose to TCP's TS option | timestamp fields. It serves a similar purpose to TCP's Timestamp | |||
[RFC7323], enabling UDP to estimate the RTT between hosts. For UDP, | (TS) option [RFC7323], enabling UDP to estimate the RTT between | |||
this RTT can be useful for establishing UDP fragment reassembly | hosts. For UDP, this RTT can be useful for establishing UDP fragment | |||
timeouts or transport-layer rate limiting [RFC8085]. | reassembly timeouts or transport-layer rate limiting [RFC8085]. | |||
+--------+--------+------------------+------------------+ | +--------+--------+------------------+------------------+ | |||
| Kind=8 | Len=10 | TSval | TSecr | | | Kind=8 | Len=10 | TSval | TSecr | | |||
+--------+--------+------------------+------------------+ | +--------+--------+------------------+------------------+ | |||
1 byte 1 byte 4 bytes 4 bytes | 1 byte 1 byte 4 bytes 4 bytes | |||
Figure 16: UDP TIME Option Format | Figure 16: UDP TIME Option Format | |||
TS Value (TSval) and TS Echo Reply (TSecr) are used in a similar | TS Value (TSval) and TS Echo Reply (TSecr) are used in a similar | |||
manner to the TCP TS option [RFC7323]. On transmitted UDP packets | manner to the TCP TS option [RFC7323]. On transmitted UDP packets | |||
using the option, TSval is always set based on the local "time" | using the option, TSval is always set based on the local "time" | |||
value. Received TSval and TSecr values are provided to the | value. Received TSval and TSecr field contents are provided to the | |||
application, which can pass the TSval value to be used as TSecr on | application, which can pass the received TSval to be used as TSecr in | |||
UDP messages sent in response (i.e., to echo the received TSval). A | UDP messages sent in response (i.e., to echo the received TSval). A | |||
received TSecr of zero indicates that the TSval was not echoed by the | received TSecr of zero indicates that the TSval was not echoed by the | |||
transmitter, i.e., from a previously received UDP packet. | transmitter, i.e., from a previously received UDP packet. | |||
>> TIME MAY use an RTT estimate based on non-zero Timestamp values as | >> TIME MAY use an RTT estimate based on non-zero Timestamp values as | |||
a hint for fragmentation reassembly, rate limiting, or other | a hint for fragmentation reassembly, rate limiting, or other | |||
mechanisms that benefit from such an estimate. | mechanisms that benefit from such an estimate. | |||
>> An application MAY use TIME to compute this RTT estimate for | >> An application MAY use TIME to compute this RTT estimate for | |||
further use by the user. | further use by the user. | |||
skipping to change at line 1465 ¶ | skipping to change at line 1464 ¶ | |||
>> TIME values MUST NOT use zeros as valid time values, because they | >> TIME values MUST NOT use zeros as valid time values, because they | |||
are used as indicators of requests and responses. | are used as indicators of requests and responses. | |||
TIME is reported to the user, whether used per-datagram or per- | TIME is reported to the user, whether used per-datagram or per- | |||
fragment (as defined in Section 11.4). When used per-fragment, the | fragment (as defined in Section 11.4). When used per-fragment, the | |||
reported value is the minimum and maximum of each of the timestamp | reported value is the minimum and maximum of each of the timestamp | |||
values received per-fragment. | values received per-fragment. | |||
>> Use of TIME per-fragment is NOT RECOMMENDED. Exceptions include | >> Use of TIME per-fragment is NOT RECOMMENDED. Exceptions include | |||
supporting diagnostics on the reassembly process itself, which could | supporting diagnostics on the reassembly process itself, which could | |||
be more appropriate to handle within the UDP option processing | be more appropriate to handle within the UDP Option processing | |||
implementation. | implementation. | |||
11.9. Authentication (AUTH), RESERVED Only | 11.9. Authentication (AUTH), RESERVED Only | |||
The Authentication (AUTH, Kind=9) option is reserved for all UDP | The Authentication (AUTH, Kind=9) option is reserved for all UDP | |||
authentication mechanisms [To24]. AUTH is expected to cover the UDP | authentication mechanisms [To24]. AUTH is expected to cover the UDP | |||
user data and UDP options, with possible additional coverage of the | user data and UDP Options, with possible additional coverage of the | |||
IP pseudoheader and UDP header and potentially also support for NAT | IP pseudoheader and UDP header and potentially also support for NAT | |||
traversal (i.e., by zeroing the remote socket -- the source IP | traversal (i.e., by zeroing the remote socket -- the source IP | |||
address and UDP port -- before computing the check), the latter in a | address and UDP port -- before computing the check), the latter in a | |||
similar manner as per TCP Authentication Option (TCP-AO) NAT | similar manner as per TCP Authentication Option (TCP-AO) NAT | |||
traversal [RFC6978]. | traversal [RFC6978]. | |||
Like APC, AUTH is a SAFE option because it does not modify the UDP | Like APC, AUTH is a SAFE option because it does not modify the UDP | |||
user data. AUTH could fail even where the user data has not been | user data. AUTH could fail even where the user data has not been | |||
corrupted, such as when its contents have been overwritten. Such | corrupted, such as when its contents have been overwritten. Such | |||
overwrites could be intentional and not widely known; defaulting to | overwrites could be intentional and not widely known; defaulting to | |||
skipping to change at line 1526 ¶ | skipping to change at line 1525 ¶ | |||
>> The length of the Experimental option MUST be at least 4 to | >> The length of the Experimental option MUST be at least 4 to | |||
account for the Kind, Len, and 16-bit UDP ExID (similar to TCP ExIDs | account for the Kind, Len, and 16-bit UDP ExID (similar to TCP ExIDs | |||
[RFC6994]). | [RFC6994]). | |||
The UDP EXP option uses only 16-bit ExIDs, unlike TCP ExIDs. In TCP, | The UDP EXP option uses only 16-bit ExIDs, unlike TCP ExIDs. In TCP, | |||
the first 16 bits of the ExID is unique; the additional 16 bits, | the first 16 bits of the ExID is unique; the additional 16 bits, | |||
where present, are used to decrease the chance of the entire ExID | where present, are used to decrease the chance of the entire ExID | |||
occurring in legacy use of the TCP EXP option. This extended variant | occurring in legacy use of the TCP EXP option. This extended variant | |||
provides no similar use for UDP EXP because ExIDs are required. | provides no similar use for UDP EXP because ExIDs are required. | |||
The UDP EXP option also includes an extended length format, where the | The UDP EXP option also includes an Extended Length format, where the | |||
option Len is 255, followed by two bytes of extended length. | option Len is 255, followed by two bytes of Extended Length. | |||
+----------+----------+----------+----------+ | +----------+----------+----------+----------+ | |||
| Kind=127 | 255 | Extended Length | | | Kind=127 | 255 | Extended Length | | |||
+----------+----------+----------+----------+ | +----------+----------+----------+----------+ | |||
| UDP ExID |(option contents...) | | | UDP ExID |(option contents...) | | |||
+----------+----------+----------+----------+ | +----------+----------+----------+----------+ | |||
Figure 18: UDP EXP Extended Option Format | Figure 18: UDP EXP Extended Option Format | |||
Assigned UDP Experimental IDs (ExIDs) are assigned from a combined | Assigned UDP Experimental IDs (ExIDs) are assigned from a combined | |||
TCP/UDP ExID registry managed by IANA (see Section 26). Assigned | TCP/UDP ExID registry managed by IANA (see Section 26). Assigned | |||
ExIDs can be used in either the EXP or UEXP options (see Section 12.3 | ExIDs can be used in either the EXP or UEXP options (see Section 12.3 | |||
for the latter). | for the latter). | |||
12. UNSAFE Options | 12. UNSAFE Options | |||
UNSAFE options are not safe to ignore and can be used | UNSAFE options are not safe to ignore and can be used | |||
unidirectionally or without soft-state confirmation of UDP option | unidirectionally or without soft-state confirmation of UDP Option | |||
capability. They are always used only when the user data occurs | capability. They are always used only when the user data occurs | |||
inside a reassembled set of one or more UDP fragments, such that if | inside a reassembled set of one or more UDP fragments, such that if | |||
UDP fragmentation is not supported, the enclosed UDP user data would | UDP fragmentation is not supported, the enclosed UDP user data would | |||
be silently dropped anyway. | be silently dropped anyway. | |||
>> Applications using UNSAFE options SHOULD NOT also use zero-length | >> Applications using UNSAFE options SHOULD NOT also use zero-length | |||
UDP packets as signals, because they will arrive when UNSAFE options | UDP packets as signals, because they will arrive when UNSAFE options | |||
fail. Those that choose to allow such packets MUST account for such | fail. Those that choose to allow such packets MUST account for such | |||
events. | events. | |||
>> UNSAFE options MUST be used only as part of UDP fragments, used | >> UNSAFE options MUST be used only as part of UDP fragments, used | |||
either per-fragment or after reassembly. | either per-fragment or after reassembly. | |||
>> Receivers supporting UDP options MUST silently drop the UDP user | >> Receivers supporting UDP Options MUST silently drop the UDP user | |||
data of the reassembled datagram if any fragment or the entire | data of the reassembled datagram if any fragment or the entire | |||
datagram includes an UNSAFE option whose UKind is not supported or if | datagram includes an UNSAFE option whose Kind is not supported or if | |||
an UNSAFE option appears outside the context of a fragment or | an UNSAFE option appears outside the context of a fragment or | |||
reassembled fragments. | reassembled fragments. | |||
12.1. UNSAFE Compression (UCMP) | 12.1. UNSAFE Compression (UCMP) | |||
The UNSAFE Compression (UCMP, Kind=192) option is reserved for all | The UNSAFE Compression (UCMP, Kind=192) option is reserved for all | |||
UDP compression mechanisms. UCMP is expected to cover the UDP user | UDP compression mechanisms. UCMP is expected to cover the UDP user | |||
data and some (e.g., later or in sequence) UDP options. | data and some (e.g., later, in sequence) UDP Options. | |||
12.2. UNSAFE Encryption (UENC) | 12.2. UNSAFE Encryption (UENC) | |||
The UNSAFE Encryption (UENC, Kind=193) option is reserved for all UDP | The UNSAFE Encryption (UENC, Kind=193) option is reserved for all UDP | |||
encryption mechanisms. UENC is expected to provide all of the | encryption mechanisms. UENC is expected to provide all of the | |||
services of the AUTH option (Section 11.9) and in addition to encrypt | services of the AUTH option (Section 11.9) and in addition to encrypt | |||
the UDP user data and some (e.g., later or in sequence) UDP options, | the UDP user data and some (e.g., later or in sequence) UDP Options, | |||
in a similar manner as TCP Authentication Option Encryption (TCP-AO- | in a similar manner as TCP Authentication Option Extension for | |||
ENC) [To18]. | Payload Encryption (TCP-AO-ENC) [To18]. | |||
12.3. UNSAFE Experimental (UEXP) | 12.3. UNSAFE Experimental (UEXP) | |||
The UNSAFE Experimental (UEXP, Kind=254) option is reserved for | The UNSAFE Experimental (UEXP, Kind=254) option is reserved for | |||
experiments [RFC3692]. As with EXP, only one such UEXP value is | experiments [RFC3692]. As with EXP, only one such UEXP value is | |||
reserved because experiments are expected to use an Experimental ID | reserved because experiments are expected to use an Experimental ID | |||
(ExIDs) to differentiate concurrent use for different purposes, using | (ExIDs) to differentiate concurrent use for different purposes, using | |||
UDP ExIDs registered with IANA according to the approach developed | UDP ExIDs registered with IANA according to the approach developed | |||
for TCP experimental options [RFC6994]. | for TCP experimental options [RFC6994]. | |||
Assigned ExIDs can be used with either the UEXP or EXP options. | Assigned ExIDs can be used with either the UEXP or EXP options. | |||
13. Rules for Designing New Options | 13. Rules for Designing New Options | |||
The UDP option Kind space allows for the definition of new options; | The UDP Option Kind space allows for the definition of new options; | |||
however, the currently defined options (including AUTH, UENC, and | however, the currently defined options (including AUTH, UENC, and | |||
UCMP) do not allow for arbitrary new options. The following is a | UCMP) do not allow for arbitrary new options. The following is a | |||
summary of rules for new options and their rationales: | summary of rules for new options and their rationales: | |||
>> New options MUST NOT be defined as "must-implement", i.e., they | >> New options MUST NOT be defined as "must-implement", i.e., they | |||
are not eligible for the asterisk ("*") designation used in | are not eligible for the asterisk ("*") designation used in | |||
Section 10. | Section 10. | |||
This document defines the minimum set of "must-implement" UDP | This document defines the minimum set of "must-implement" UDP | |||
options. All new options are included at the discretion of a given | Options. All new options are included at the discretion of a given | |||
implementation. | implementation. | |||
>> New options MUST NOT modify the content of options that precede | >> New options MUST NOT modify the content of options that precede | |||
them (in order of appearance and thus processing). | them (in order of appearance and thus processing). | |||
>> The fields of new options MUST NOT depend on the content of other | >> The fields of new options MUST NOT depend on the content of other | |||
options. | options. | |||
UNSAFE options can both depend on and vary user data content because | UNSAFE options can both depend on and vary user data content because | |||
they are contained only inside UDP fragments and thus are processed | they are contained only inside UDP fragments and thus are processed | |||
only by receivers capable of handling UDP options. | only by receivers capable of handling UDP Options. | |||
>> New options MUST NOT declare their order relative to other | >> New options MUST NOT declare their order relative to other | |||
options, whether new or old, even as a preference. | options, whether new or old, even as a preference. | |||
>> At the sender, new options MUST NOT modify UDP packet content | >> At the sender, new options MUST NOT modify UDP packet content | |||
anywhere except within their option field, except only those | anywhere outside their option field, excepting only those contained | |||
contained within the UNSAFE option; areas that need to remain | within the UNSAFE option; areas that need to remain unmodified | |||
unmodified include the IP header, IP options, UDP user data, and | include the IP header, IP options, UDP user data, and surplus area | |||
surplus area (i.e., other options). | (i.e., other options). | |||
>> Options MUST NOT be modified in transit. This includes those | >> Options MUST NOT be modified in transit. This includes those | |||
already defined as well as new options. | already defined as well as new options. | |||
>> New options MUST NOT require or allow that any UDP options | >> New options MUST NOT require or allow that any UDP Options | |||
(including themselves) or the remaining surplus area be modified in | (including themselves) or the remaining surplus area be modified in | |||
transit. | transit. | |||
>> All options MUST indicate whether they can be used per-fragment | >> All options MUST indicate whether they can be used per-fragment | |||
and, if so, MUST also indicate how their success or failure is | and, if so, MUST also indicate how their success or failure is | |||
reported to the user. This document RECOMMENDS that options be | reported to the user. It is RECOMMENDED that options be useful per- | |||
useful per-fragment and also RECOMMENDS that options used per- | fragment; it is also RECOMMENDED that options used per-fragment be | |||
fragment be reported to the user as a finite aggregate (e.g., a sum, | reported to the user as a finite aggregate (e.g., a sum, a flag, | |||
a flag, etc.) rather than individually. | etc.) rather than individually. | |||
Note that only certain of the initially defined options violate these | With one exception, UNSAFE options are used when UDP user data needs | |||
rules: | to be modified: | |||
* >> The FRAG option modifies UDP user data, splitting it across | * >> The FRAG option modifies UDP user data, splitting it across | |||
multiple IP packets. UNSAFE options MAY modify the UDP user data, | multiple IP packets. UNSAFE options MAY modify the UDP user data, | |||
e.g., by encryption, compression, or other transformations. All | e.g., by encryption, compression, or other transformations. All | |||
other (SAFE) options MUST NOT modify the UDP user data. | other (SAFE) options MUST NOT modify the UDP user data. | |||
14. Option Inclusion and Processing | 14. Option Inclusion and Processing | |||
The following rules apply to option inclusion by senders and | The following rules apply to option inclusion by senders and | |||
processing by receivers. | processing by receivers. | |||
>> Senders MAY add any option, as configured by the API. | >> Senders MAY add any option, as configured by the API. | |||
>> All "must-support" options MUST be processed by receivers, if | >> All "must-support" options MUST be processed by receivers, if | |||
present (presuming UDP options are supported at that receiver). | present (presuming UDP Options are supported at that receiver). | |||
>> Non-"must-support" options MAY be ignored by receivers, if | >> Options that are not "must-support" options MAY, if present, be | |||
present, e.g., based on API settings. | ignored by receivers, based, e.g., on API settings. | |||
>> All options MUST be processed by receivers in the order | >> All options MUST be processed by receivers in the order | |||
encountered in the options area. | encountered in the options area. | |||
>> Unless configuration settings direct otherwise, all options except | >> Unless configuration settings direct otherwise, all options except | |||
UNSAFE options MUST result in the UDP user data being passed to the | UNSAFE options MUST result in the UDP user data being passed to the | |||
upper layer protocol or application, regardless of whether all | upper layer protocol or application, regardless of whether all | |||
options are processed, are supported, or succeed. | options are processed, are supported, or succeed. | |||
The basic premise is that, for options-aware endpoints, the sender | The basic premise is that, for options-aware endpoints, the sender | |||
skipping to change at line 1754 ¶ | skipping to change at line 1753 ¶ | |||
This API is extended to support options as follows: | This API is extended to support options as follows: | |||
* Extend the method to create receive ports to include per-packet | * Extend the method to create receive ports to include per-packet | |||
and per-fragment receive options that are required or omitted as | and per-fragment receive options that are required or omitted as | |||
indicated by the application. | indicated by the application. | |||
>> Datagrams not containing these required options MUST be | >> Datagrams not containing these required options MUST be | |||
silently dropped and SHOULD be logged. | silently dropped and SHOULD be logged. | |||
* Extend the method to create receive ports to have a means to | * Extend the method to create receive ports to have a means to | |||
indicate that all packets containing UDP options that are received | indicate that all packets containing UDP Options that are received | |||
on a particular socket pair are to be discarded. | on a particular socket pair are to be discarded. | |||
>> The default value for the setting to drop all packets | >> The default value for the setting to drop all packets | |||
containing UDP options MUST be to process packets containing UDP | containing UDP Options MUST be to process packets containing UDP | |||
options normally (i.e., not to discard them). | Options normally (i.e., not to discard them). | |||
* Extend the receive function to indicate the per-packet options and | * Extend the receive function to indicate the per-packet options and | |||
their parameters as received with the corresponding received | their parameters as received with the corresponding received | |||
datagram. Note that per-fragment options are handled within the | datagram. Note that per-fragment options are handled within the | |||
processing of each fragment. | processing of each fragment. | |||
>> Options and their processing status (success/fail) MUST be | >> Options and their processing status (success/fail) MUST be | |||
available to the user (i.e., application layer or upper layer | available to the user (i.e., application layer or upper layer | |||
protocol/service), both for the packet and for the fragment set, | protocol/service), both for the packet and for the fragment set, | |||
except for FRAG, NOP, and EOL; those three options are handled | except for FRAG, NOP, and EOL; those three options are handled | |||
within UDP option processing only. As a reminder (from | within UDP Option processing only. As a reminder (from | |||
Section 14), all options except UNSAFE options MUST result in the | Section 14), all options except UNSAFE options MUST result in the | |||
UDP user data being passed to the application layer (unless | UDP user data being passed to the application layer (unless | |||
overridden in the API), regardless of whether all options are | overridden in the API), regardless of whether all options are | |||
processed, supported, or succeed. | processed, supported, or succeed. | |||
* For fragments, success for an option is reported only when all | * For fragments, success for an option is reported only when all | |||
fragments succeed for that option. | fragments succeed for that option. | |||
>> Per-fragment option status reporting SHOULD default as needed | >> Per-fragment option status reporting SHOULD default as needed | |||
(e.g., not computed and/or not passed up to the upper layers) to | (e.g., not computed and/or not passed up to the upper layers) to | |||
skipping to change at line 1798 ¶ | skipping to change at line 1797 ¶ | |||
fragment. | fragment. | |||
* Extend the send function to indicate the options to be added to | * Extend the send function to indicate the options to be added to | |||
the corresponding sent datagram. This includes indicating which | the corresponding sent datagram. This includes indicating which | |||
options apply to individual fragments vs. which apply to the UDP | options apply to individual fragments vs. which apply to the UDP | |||
packet prior to fragmentation, if fragmentation is enabled. This | packet prior to fragmentation, if fragmentation is enabled. This | |||
includes a minimum datagram length, such that the options list | includes a minimum datagram length, such that the options list | |||
ends in EOL and additional space is zero-filled as needed. It | ends in EOL and additional space is zero-filled as needed. It | |||
also includes a maximum fragment size, e.g., as discovered by | also includes a maximum fragment size, e.g., as discovered by | |||
DPLPMTUD, whether implemented at the application layer per | DPLPMTUD, whether implemented at the application layer per | |||
[RFC8899] or in conjunction with other UDP options [RFC9869]. | [RFC8899] or in conjunction with other UDP Options [RFC9869]. | |||
Examples of API instances for Linux and FreeBSD are provided in | Examples of API instances for Linux and FreeBSD are provided in | |||
Appendix A to encourage uniform cross-platform implementations. | Appendix A to encourage uniform cross-platform implementations. | |||
APIs are not intended to provide user control over option order, | APIs are not intended to provide user control over option order, | |||
especially on a per-packet basis, as this could create a covert | especially on a per-packet basis, as this could create a covert | |||
channel (see Section 25). Similarly, APIs are not intended to | channel (see Section 25). Similarly, APIs are not intended to | |||
provide user/application control over UDP fragment boundaries on a | provide user/application control over UDP fragment boundaries on a | |||
per-packet basis; although, they are expected to allow control over | per-packet basis; although, they are expected to allow control over | |||
which options, including fragmentation, are enabled (or disabled) on | which options, including fragmentation, are enabled (or disabled) on | |||
a per-packet basis. Such control over fragmentation is critical to | a per-packet basis. Such control over fragmentation is critical to | |||
DPLPMTUD. | DPLPMTUD. | |||
16. UDP Options Are for Transport, Not Transit | 16. UDP Options Are for Transport, Not Transit | |||
UDP options are indicated in the surplus area of the IP payload that | UDP Options are indicated in the surplus area of the IP payload that | |||
is not used by UDP. That area is really part of the IP payload, not | is not used by UDP. That area is really part of the IP payload, not | |||
the UDP payload, and as such, it might be tempting to consider | the UDP payload, and as such, it might be tempting to consider | |||
whether this is a generally useful approach to extending IP. | whether this is a generally useful approach to extending IP. | |||
Unfortunately, the surplus area exists only for transports that | Unfortunately, the surplus area exists only for transports that | |||
include their own transport layer payload length indicator. TCP and | include their own transport layer payload length indicator. TCP and | |||
SCTP include header length fields that already provide space for | SCTP include header length fields that already provide space for | |||
transport options by indicating the total length of the header area, | transport options by indicating the total length of the header area, | |||
such that the entire remaining area indicated in the network layer | such that the entire remaining area indicated in the network layer | |||
(IP) is the transport payload. UDP-Lite already uses the UDP Length | (IP) is the transport payload. UDP-Lite already uses the UDP Length | |||
field to indicate the boundary between data covered by the transport | field to indicate the boundary between data covered by the transport | |||
checksum and data not covered, and so there is no remaining area | checksum and data not covered, and so there is no remaining area | |||
where the length of the UDP-Lite payload as a whole can be indicated | where the length of the UDP-Lite payload as a whole can be indicated | |||
[RFC3828]. | [RFC3828]. | |||
UDP options are transport options. They are no more (or less) | UDP Options are transport options. They are no more (or less) | |||
appropriate to be modified in-transit than any other portion of the | appropriate to be modified in-transit than any other portion of the | |||
transport datagram. | transport datagram. | |||
>> Generally, transport headers, options, and data are not intended | >> Generally, transport headers, options, and data are not intended | |||
to be modified in-transit. UDP options are no exception and are | to be modified in-transit. UDP Options are no exception and are | |||
specified here as "MUST NOT be altered in transit". | specified here as "MUST NOT be altered in transit". | |||
However, note that the UDP option mechanism provides no specific | However, note that the UDP Option mechanism provides no specific | |||
protection against in-transit modification of the UDP header, UDP | protection against in-transit modification of the UDP header, UDP | |||
payload, or surplus area, except as provided by the OCS or the | payload, or surplus area, except as provided by the OCS or the | |||
options selected (e.g., AUTH or UENC). | options selected (e.g., AUTH or UENC). | |||
Unless protected by encryption (e.g., UENC or via other layers, like | Unless protected by encryption (e.g., UENC or via other layers, like | |||
IPsec), UDP options remain visible to devices on the network path. | IPsec), UDP Options remain visible to devices on the network path. | |||
The decision to not require mandatory encryption for UDP options to | The decision to not require mandatory encryption for UDP Options to | |||
prevent such visibility was made because the key distribution and | prevent such visibility was made because the key distribution and | |||
management infrastructure necessary to support such encryption does | management infrastructure necessary to support such encryption does | |||
not exist in many of the deployment scenarios of interest, notably | not exist in many of the deployment scenarios of interest, notably | |||
those that use UDP directly as a stateless and connectionless | those that use UDP directly as a stateless and connectionless | |||
transport protocol (e.g., see [He24]). | transport protocol (e.g., see [He24]). | |||
17. UDP Options vs. UDP-Lite | 17. UDP Options vs. UDP-Lite | |||
UDP-Lite provides partial checksum coverage so that UDP packets with | UDP-Lite provides partial checksum coverage so that UDP packets with | |||
errors in some locations can be delivered to the user [RFC3828]. It | errors in some locations can be delivered to the user [RFC3828]. It | |||
uses a different transport protocol number (136) than UDP (17) to | uses a different transport protocol number (136) than UDP (17) to | |||
interpret the UDP Length field as the prefix covered by the UDP | interpret the UDP Length field as the prefix covered by the UDP | |||
checksum. | checksum. | |||
UDP (protocol 17) already defines the UDP Length field as the limit | UDP (protocol 17) already defines the UDP Length field as the limit | |||
of the UDP checksum but by default also limits the data provided to | of the UDP checksum but by default also limits the data provided to | |||
the application as that which precedes the UDP Length. A goal of | the application as that which precedes the UDP Length. A goal of | |||
UDP-Lite is to deliver data beyond UDP Length as a default, which is | UDP-Lite is to deliver data beyond UDP Length as a default, which is | |||
why a separate transport protocol number was required. | why a separate transport protocol number was required. | |||
UDP options do not use or need a separate transport protocol number | UDP Options do not use or need a separate transport protocol number | |||
because the data beyond the UDP Length offset (surplus data) is not | because the data beyond the UDP Length offset (surplus data) is not | |||
provided to the application by default. That data is interpreted | provided to the application by default. That data is interpreted | |||
exclusively within the UDP transport layer. | exclusively within the UDP transport layer. | |||
UDP-Lite cannot support UDP options, either as proposed here or in | UDP-Lite cannot support UDP Options, either as proposed here or in | |||
any other form, because the entire payload of the UDP packet is | any other form, because the entire payload of the UDP packet is | |||
already defined as user data and there is no additional field in | already defined as user data and there is no additional field in | |||
which to indicate a surplus area for options. The UDP Length field | which to indicate a surplus area for options. The UDP Length field | |||
in UDP-Lite is already used to indicate the boundary between user | in UDP-Lite is already used to indicate the boundary between user | |||
data covered by the checksum and user data not covered. | data covered by the checksum and user data not covered. | |||
18. Interactions with Legacy Devices | 18. Interactions with Legacy Devices | |||
It has always been permissible for the UDP Length to be inconsistent | It has always been permissible for the UDP Length to be inconsistent | |||
with the IP transport payload length [RFC0768]. Such inconsistency | with the IP transport payload length [RFC0768]. Such inconsistency | |||
has been utilized in UDP-Lite using a different transport number. | has been utilized in UDP-Lite using a different transport number. | |||
There are no known systems that use this inconsistency for UDP | There are no known systems that use this inconsistency for UDP | |||
[RFC3828]. It is possible that such use might interact with UDP | [RFC3828]. It is possible that such use might interact with UDP | |||
options, i.e., where legacy systems might generate UDP datagrams that | Options, i.e., where legacy systems might generate UDP datagrams that | |||
appear to have UDP options. The OCS provides protection against such | appear to have UDP Options. The OCS provides protection against such | |||
events and is stronger than a static "magic number". | events and is stronger than a static "magic number". | |||
UDP options have been tested as interoperable with Linux, macOS, and | UDP Options have been tested as interoperable with Linux, macOS, and | |||
Windows Cygwin and worked through NAT devices. These systems | Windows Cygwin and worked through NAT devices. These systems | |||
successfully delivered only the user data indicated by the UDP Length | successfully delivered only the user data indicated by the UDP Length | |||
field and silently discarded the surplus area. | field and silently discarded the surplus area. | |||
One reported embedded device passes the entire IP datagram to the UDP | One reported embedded device passes the entire IP datagram to the UDP | |||
application layer. Although this feature could enable application- | application layer. Although this feature could enable application- | |||
layer UDP option processing, it would require that conventional UDP | layer UDP Option processing, it would require that conventional UDP | |||
user applications examine only the UDP user data. | user applications examine only the UDP user data. | |||
This feature is also inconsistent with the UDP application interface | This feature is also inconsistent with the UDP application interface | |||
[RFC0768] [RFC1122]. | [RFC0768] [RFC1122]. | |||
It has been reported that Alcatel-Lucent's "Brick" Intrusion | It has been noted that Alcatel-Lucent's "Brick" Intrusion Detection | |||
Detection System has a default configuration that interprets | System has a default configuration that interprets inconsistencies | |||
inconsistencies between UDP Length and IP Length as an attack to be | between UDP Length and IP Length as an attack to be reported. Note | |||
reported. Note that other firewall systems, e.g., Check Point, use a | that other firewall systems, e.g., Check Point, use a default | |||
default "relaxed UDP length verification" to avoid falsely | "relaxed UDP Length verification" to avoid falsely interpreting this | |||
interpreting this inconsistency as an attack. | inconsistency as an attack. | |||
There are known uses of UDP exchanges of zero-length UDP user data | There are known uses of UDP exchanges of zero-length UDP user data | |||
packets, notably in the TIME protocol [RFC0868]. The need to support | packets, notably in the TIME protocol [RFC0868]. The need to support | |||
such packets is also noted in the UDP usage guidelines [RFC8085]. | such packets is also noted in the UDP usage guidelines [RFC8085]. | |||
Some of the mechanisms in this document can generate more zero- | Some of the mechanisms in this document can generate more zero-length | |||
length UDP packets for a UDP option-aware endpoint than for a legacy | UDP packets for a UDP Option aware endpoint than for a legacy | |||
(non-aware) endpoint (e.g., based on some error conditions), and some | endpoint (e.g., based on some error conditions), and some can | |||
can generate fewer (e.g., fragment reassembly). Because such packets | generate fewer (e.g., fragment reassembly). Because such packets | |||
inherently carry no unique transport header or transport content, | inherently carry no unique transport header or transport content, | |||
endpoints are already expected to be tolerant of their (inadvertent) | endpoints are already expected to be tolerant of their (inadvertent) | |||
replication or loss by the network, so such variations are not | replication or loss by the network, so such variations are not | |||
expected to be problematic. | expected to be problematic. | |||
19. Options in a Stateless, Unreliable Transport Protocol | 19. Options in a Stateless, Unreliable Transport Protocol | |||
There are two ways to interpret options for a stateless, unreliable | There are two ways to interpret options for a stateless, unreliable | |||
protocol -- an option is either local to the message or intended to | protocol -- an option is either local to the message or intended to | |||
affect a stream of messages in a soft-state manner. Either | affect a stream of messages in a soft-state manner. Either | |||
interpretation is valid for defined UDP options. | interpretation is valid for defined UDP Options. | |||
It is impossible to know in advance whether an endpoint supports a | It is impossible to know in advance whether an endpoint supports a | |||
UDP option. | UDP Option. | |||
>> All UDP options other than UNSAFE ones MUST be ignored if not | >> All UDP Options other than UNSAFE ones MUST be ignored if not | |||
supported or upon failure (e.g., APC). | supported or upon failure (e.g., APC). | |||
>> All UDP options that fail MUST result in the UDP data still being | >> All UDP Options that fail MUST result in the UDP data still being | |||
sent to the application layer by default to ensure equivalence with | sent to the application layer by default to ensure equivalence with | |||
legacy devices. | legacy devices. | |||
UDP options that rely on soft-state exchange need to allow message | UDP Options that rely on soft-state exchange need to allow message | |||
reordering and loss, in the same way as UDP applications [RFC8085]. | reordering and loss, in the same way as UDP applications [RFC8085]. | |||
The above requirements prevent using any option that cannot be safely | The above requirements prevent using any option that cannot be safely | |||
ignored unless it is hidden inside the FRAG area (i.e., UNSAFE | ignored unless it is hidden inside the FRAG area (i.e., UNSAFE | |||
options). Legacy systems also always need to be able to interpret | options). Legacy systems also always need to be able to interpret | |||
the transport fragments as individual UDP packets. | the transport fragments as individual UDP packets. | |||
20. UDP Option State Caching | 20. UDP Option State Caching | |||
Some TCP connection parameters, stored in the TCP Control Block | Some TCP connection parameters, stored in the TCP Control Block | |||
(TCB), can be usefully shared either among concurrent connections or | (TCB), can be usefully shared either among concurrent connections or | |||
between connections in sequence, known as TCP Sharing [RFC9040]. | between connections in sequence, known as TCB sharing [RFC9040]. | |||
Although UDP is stateless, some of the options proposed herein could | Although UDP is stateless, some of the options proposed herein could | |||
have similar benefits in being shared or cached. We call this UCB | have similar benefits in being shared or cached. We call this UCB | |||
sharing, or UDP Control Block sharing, by analogy. Just as TCB | sharing, or UDP Control Block sharing, by analogy. Just as TCB | |||
sharing is not a standard because it is consistent with existing TCP | sharing is not a standard because it is consistent with existing TCP | |||
specifications, UCB sharing would be consistent with existing UDP | specifications, UCB sharing would be consistent with existing UDP | |||
specifications, including this one. Both are implementation issues | specifications, including this one. Both are implementation issues | |||
that are outside the scope of their respective specifications, and so | that are outside the scope of their respective specifications, and so | |||
UCB sharing is outside the scope of this document. | UCB sharing is outside the scope of this document. | |||
21. Updates to RFC 768 | 21. Updates to RFC 768 | |||
This document updates [RFC0768] as follows: | This document updates [RFC0768] as follows: | |||
* This document defines the meaning of the IP payload area beyond | * This document defines the meaning of the IP payload area beyond | |||
the UDP length but within the IP Length as the surplus area used | the UDP Length but within the IP Length as the surplus area used | |||
herein for UDP options. | herein for UDP Options. | |||
* This document extends the UDP API to support the use of UDP | * This document extends the UDP API to support the use of UDP | |||
options. | Options. | |||
22. Interactions with Other RFCs (and drafts) | 22. Interactions with Other RFCs | |||
This document clarifies the interaction between UDP Length and IP | This document clarifies the interaction between UDP Length and IP | |||
Length that is not explicitly constrained in either UDP or the host | Length that is not explicitly constrained in either UDP or the host | |||
requirements [RFC0768] [RFC1122]. | requirements [RFC0768] [RFC1122]. | |||
Teredo extensions (TEs) define use of a similar difference between | Teredo extensions define use of a similar difference between these | |||
these lengths for trailers [RFC4380] [RFC6081]. In [RFC6081], TE | lengths for trailers [RFC4380] [RFC6081]. In [RFC6081], Teredo | |||
defines the length of an IPv6 payload inside UDP as pointing to less | extensions define the length of an IPv6 payload inside UDP as | |||
than the end of the UDP payload, enabling trailing options for that | pointing to less than the end of the UDP payload, enabling trailing | |||
IPv6 packet: | options for that IPv6 packet: | |||
| ...the IPv6 packet length (i.e., the Payload Length value in the | | ...the IPv6 packet length (i.e., the Payload Length value in the | |||
| IPv6 header plus the IPv6 header size) is less than or equal to | | IPv6 header plus the IPv6 header size) is less than or equal to | |||
| the UDP payload length (i.e., the Length value in the UDP header | | the UDP payload length (i.e., the Length value in the UDP header | |||
| minus the UDP header size) | | minus the UDP header size) | |||
UDP options are not affected by the difference between the UDP user | UDP Options are not affected by the difference between the UDP user | |||
payload end and the payload IPv6 end; both would end at the UDP user | payload end and the payload IPv6 end; both would end at the UDP user | |||
payload, which could end before the enclosing IPv4 or IPv6 header | payload, which could end before the enclosing IPv4 or IPv6 header | |||
indicates -- allowing UDP options in addition to the trailer options | indicates -- allowing UDP Options in addition to the trailer options | |||
of the IPv6 payload. The result, if UDP options were used, is shown | of the IPv6 payload. The result, if UDP Options were used, is shown | |||
in Figure 19. | in Figure 19. | |||
Outer IP Length | Outer IP Length | |||
<----------------------------------------------------------> | <----------------------------------------------------------> | |||
+--------+---------+------------------------------+----------+ | +--------+---------+------------------------------+----------+ | |||
| IP Hdr | UDP Hdr | IPv6 packet/len | TE trailer | surplus | | | IP Hdr | UDP Hdr | IPv6 packet/len | TE trailer | surplus | | |||
+--------+---------+------------------------------+----------+ | +--------+---------+------------------------------+----------+ | |||
<---------------> | <---------------> | |||
Inner IPv6 Length | Inner IPv6 Length | |||
<--------------------------------------> | <--------------------------------------> | |||
UDP Length | UDP Length | |||
Figure 19: TE Trailers and UDP Options Used Concurrently | Figure 19: TE Trailers and UDP Options Used Concurrently | |||
UDP options cannot be supported when a UDP packet has no independent | UDP Options cannot be supported when a UDP packet has no independent | |||
UDP Length. One such case is when UDP Length==0 in IPv6, intended | UDP Length. One such case is when UDP Length==0 in IPv6, intended | |||
for (but not limited to) IPv6 Jumbograms [RFC2675]. Note that | for (but not limited to) IPv6 Jumbograms [RFC2675]. Note that | |||
although this technique is "Standard", the specification did not | although this technique is "Standard", the specification did not | |||
"update" UDP [RFC0768]. Another such case arises when UDP is proxied | "update" UDP [RFC0768]. Another such case arises when UDP is proxied | |||
via HTTP [RFC9298], as the UDP header is omitted and only the UDP | via HTTP [RFC9298], as the UDP header is omitted and only the UDP | |||
user data is transported. | user data is transported. | |||
This document is consistent with the UDP profile for RObust Header | This document is consistent with the UDP profile for RObust Header | |||
Compression (ROHC) [RFC3095], noted here: | Compression (ROHC) [RFC3095], noted here: | |||
| The Length field of the UDP header MUST match the Length field(s) | | The Length field of the UDP header MUST match the Length field(s) | |||
| of the preceding subheaders, i.e., there must not be any padding | | of the preceding subheaders, i.e., there must not be any padding | |||
| after the UDP payload that is covered by the IP Length. | | after the UDP payload that is covered by the IP Length. | |||
ROHC compresses UDP headers only when this match succeeds. It does | ROHC compresses UDP headers only when this match succeeds. It does | |||
not prohibit UDP headers where the match fails; in those cases, ROHC | not prohibit UDP headers where the match fails; in those cases, ROHC | |||
default rules (Section 5.10 of [RFC3095]) would cause the UDP header | default rules (Section 5.10 of [RFC3095]) would cause the UDP header | |||
to remain uncompressed. Upon receipt of a compressed UDP header, | to remain uncompressed. Upon receipt of a compressed UDP header, | |||
Appendix A.1.3 of [RFC3095] indicates that the UDP length is | Appendix A.1.3 of [RFC3095] indicates that the UDP Length is | |||
"INFERRED"; in uncompressed packets, it would simply be explicitly | "INFERRED"; in uncompressed packets, it would simply be explicitly | |||
provided. | provided. | |||
This issue of handling UDP header compression is more explicitly | This issue of handling UDP header compression is more explicitly | |||
described in more recent specifications, e.g., Section 10.10 of | described in more recent specifications, e.g., Section 10.10 of | |||
[RFC8724]. | [RFC8724]. | |||
23. Multicast and Broadcast Considerations | 23. Multicast and Broadcast Considerations | |||
UDP options are primarily intended for unicast use. Using these | UDP Options are primarily intended for unicast use. Using these | |||
options over multicast or broadcast IP requires careful | options over multicast or broadcast IP requires careful | |||
consideration, e.g., to ensure that the options used are safe for | consideration, e.g., to ensure that the options used are safe for | |||
different endpoints to interpret differently (e.g., either to support | different endpoints to interpret differently (e.g., either to support | |||
or silently ignore) or to ensure that all receivers of a multicast or | or silently ignore) or to ensure that all receivers of a multicast or | |||
broadcast group confirm support for the options in use. | broadcast group confirm support for the options in use. | |||
24. Network Management Considerations | 24. Network Management Considerations | |||
UDP options use and configuration may be useful to track and manage | UDP Options use and configuration may be useful to track and manage | |||
remotely. IP Flow Information Export (IPFIX) [RFC7011] Information | remotely. IP Flow Information Export (IPFIX) [RFC7011] Information | |||
Elements for UDP options have been defined in [Bo24]. Similar to | Elements for UDP Options have been defined in [Bo24]. Similar to | |||
what has been done for TCP [RFC9648], a YANG model [RFC7950] for use | what has been done for TCP [RFC9648], a YANG model [RFC7950] for use | |||
by network management protocols (e.g., NETCONF [RFC6241] or RESTCONF | by network management protocols (e.g., NETCONF [RFC6241] or RESTCONF | |||
[RFC8040]) may be developed. Development of these models is outside | [RFC8040]) may be developed. Development of these models is outside | |||
the scope of this document. | the scope of this document. | |||
25. Security Considerations | 25. Security Considerations | |||
There are a number of security issues raised by the introduction of | There are a number of security issues raised by the introduction of | |||
options to UDP. Some are specific to this variant, but others are | options to UDP. Some are specific to this variant, but others are | |||
associated with any packet processing mechanism; all are discussed | associated with any packet processing mechanism; all are discussed | |||
further in this section. | further in this section. | |||
25.1. General Considerations Regarding the Use of Options | 25.1. General Considerations Regarding the Use of Options | |||
Note that any user application that considers UDP options to | Note that any user application that considers UDP Options to | |||
adversely affect security need not enable them. However, their use | adversely affect security need not enable them. However, their use | |||
does not impact security in a substantially different way than TCP | does not impact security in a substantially different way than TCP | |||
options; both enable the use of a control channel that has the | options; both enable the use of a control channel that has the | |||
potential for abuse. Similar to TCP, there are many options that, if | potential for abuse. Similar to TCP, there are many options that, if | |||
unprotected, could be used by an attacker to interfere with | unprotected, could be used by an attacker to interfere with | |||
communication. | communication. | |||
UDP options are not covered by DTLS [RFC9147]. Neither TLS [RFC8446] | UDP Options are not covered by DTLS [RFC9147]. Neither TLS [RFC8446] | |||
(Transport Layer Security for TCP) nor DTLS (TLS for UDP) protect the | (Transport Layer Security for TCP) nor DTLS (TLS for UDP) protect the | |||
transport layer; both operate as a shim layer solely on the user data | transport layer; both operate as a shim layer solely on the user data | |||
of transport packets, protecting only their contents. | of transport packets, protecting only their contents. | |||
Just as TLS does not protect the TCP header or its options, DTLS does | Just as TLS does not protect the TCP header or its options, DTLS does | |||
not protect the UDP header or the new options introduced by this | not protect the UDP header or the new options introduced by this | |||
document. Transport security is provided in TCP by the TCP | document. Transport security is provided in TCP by the TCP | |||
Authentication Option (TCP-AO) [RFC5925] and (when defined) in UDP by | Authentication Option (TCP-AO) [RFC5925] and (when defined) in UDP by | |||
the Authentication (AUTH) option (Section 11.9) and (when defined) | the Authentication (AUTH) option (Section 11.9) and (when defined) | |||
the UNSAFE Encryption (UENC) option (Section 12). Transport headers | the UNSAFE Encryption (UENC) option (Section 12). Transport headers | |||
are also protected as payload when using IP security (IPsec) | are also protected as payload when using IP security (IPsec) | |||
[RFC4301]. | [RFC4301]. | |||
Some UDP options are never passed to the receiving application, | Some UDP Options are never passed to the receiving application, | |||
notably FRAG, NOP, and EOL. They are not intended to convey | notably FRAG, NOP, and EOL. They are not intended to convey | |||
information, either by their presence (FRAG, EOL) or number (NOP). | information, either by their presence (FRAG, EOL) or number (NOP). | |||
It could also be useful to provide the options received in a | It could also be useful to provide the options received in a | |||
reference order (e.g., sorted by option number) to avoid the order of | reference order (e.g., sorted by option number) to avoid the order of | |||
options being used as a covert channel. | options being used as a covert channel. | |||
All logging is rate limited to avoid logging itself becoming a | All logging is rate limited to avoid logging itself becoming a | |||
resource vulnerability. | resource vulnerability. | |||
25.2. Considerations Regarding On-Path Attacks | 25.2. Considerations Regarding On-Path Attacks | |||
UDP options, like any options, have the potential to expose option | UDP Options, like any options, have the potential to expose option | |||
information to on-path attackers, unless the options themselves are | information to on-path attackers, unless the options themselves are | |||
encrypted (as might be the case with some configurations of UENC, | encrypted (as might be the case with some configurations of UENC, | |||
when defined). Application protocol designers are expected to ensure | when defined). Application protocol designers are expected to ensure | |||
that information in UDP options is not used with the assumption of | that information in UDP Options is not used with the assumption of | |||
privacy unless UENC provides that capability. Application protocol | privacy unless UENC provides that capability. Application protocol | |||
designers using secure payload contents (e.g., via DTLS) are expected | designers using secure payload contents (e.g., via DTLS) are expected | |||
to be aware that UDP options add information that is not inside the | to be aware that UDP Options add information that is not inside the | |||
UDP payload and thus not protected by the same mechanism and that | UDP payload and thus not protected by the same mechanism and that | |||
alternate mechanisms (again, as might be the case with some | alternate mechanisms (again, as might be the case with some | |||
configurations of UENC) could be additionally required to protect | configurations of UENC) could be additionally required to protect | |||
against information disclosure. | against information disclosure. | |||
>> Implementations concerned with the potential use of UDP options as | >> Implementations concerned with the potential use of UDP Options as | |||
a covert channel MAY consider limiting use of some or all options. | a covert channel MAY consider limiting use of some or all options. | |||
Such implementations SHOULD return options in an order not related to | Such implementations SHOULD return options in an order not related to | |||
their sequence in the received packet. | their sequence in the received packet. | |||
UDP options create new potential opportunities for Distributed DoS | UDP Options create new potential opportunities for Distributed DoS | |||
(DDos) attacks, notably through the use of fragmentation. When | (DDos) attacks, notably through the use of fragmentation. When | |||
enabled, UDP options cause additional work at the receiver; however, | enabled, UDP Options cause additional work at the receiver; however, | |||
of the "must-support" options, only REQ (e.g., when used with | of the "must-support" options, only REQ (e.g., when used with | |||
DPLPMTUD [RFC9869]) will cause the upper layer to initiate a UDP | DPLPMTUD [RFC9869]) will cause the upper layer to initiate a UDP | |||
response in the absence of user transmission. | response in the absence of user transmission. | |||
>> Implementations concerned with the potential for DoS attacks | >> Implementations concerned with the potential for DoS attacks | |||
involving large numbers of UDP options, either implemented or | involving large numbers of UDP Options, either implemented or | |||
unknown, or excessive sequences of valid repeating options (e.g., | unknown, or excessive sequences of valid repeating options (e.g., | |||
NOPs) SHOULD detect excessive numbers of such occurrences and limit | NOPs) SHOULD detect excessive numbers of such occurrences and limit | |||
resources they use, e.g., through silent packet drops. Such | resources they use, e.g., through silent packet drops. Such | |||
responses SHOULD be logged. Specific thresholds for such limits will | responses SHOULD be logged. Specific thresholds for such limits will | |||
vary based on implementation and are thus not included here. | vary based on implementation and are thus not included here. | |||
25.3. Considerations Regarding Option Processing | 25.3. Considerations Regarding Option Processing | |||
UDP options use the TLV syntax similar to that of TCP. This syntax | UDP Options use the TLV syntax similar to that of TCP. This syntax | |||
is known to require serial processing and could pose a DoS risk, | is known to require serial processing and could pose a DoS risk, | |||
e.g., if an attacker adds large numbers of unknown options that need | e.g., if an attacker adds large numbers of unknown options that need | |||
to be parsed in their entirety, as is the case for IPv6 [RFC8504]. | to be parsed in their entirety, as is the case for IPv6 [RFC8504]. | |||
The use of UDP packets with inconsistent IP and UDP Length fields has | The use of UDP packets with inconsistent IP and UDP Length fields has | |||
the potential to trigger a buffer overflow error if not properly | the potential to trigger a buffer overflow error if not properly | |||
handled, e.g., if space is allocated based on the smaller field and | handled, e.g., if space is allocated based on the smaller field and | |||
copying is based on the larger field. However, there have been no | copying is based on the larger field. However, there have been no | |||
reports of such vulnerability, and it would rely on inconsistent use | reports of such vulnerability, and it would rely on inconsistent use | |||
of the two fields for memory allocation and copying. | of the two fields for memory allocation and copying. | |||
Because required options come first and at most once each (with the | Because required options come first and at most once each (with the | |||
exception of NOPs, which never need to come in sequences of more than | exception of NOPs, which never need to come in sequences of more than | |||
seven in a row), their DoS impact is limited. Note that TLV formats | seven in a row), their DoS impact is limited. Note that TLV formats | |||
for options do require serial processing, but any format that allows | for options do require serial processing, but any format that allows | |||
future options, whether ignored or not, could introduce a similar DoS | future options, whether ignored or not, could introduce a similar DoS | |||
vulnerability. | vulnerability. | |||
>> Implementations concerned with the potential for UDP options | >> Implementations concerned with the potential for UDP Options | |||
introducing a vulnerability MAY implement only the required UDP | introducing a vulnerability MAY implement only the required UDP | |||
options and SHOULD also limit processing of TLVs, in number of non- | Options and SHOULD also limit processing of TLVs, in number of non- | |||
padding options, total length, or both. The number of non-zero TLVs | padding options, total length, or both. The number of non-zero TLVs | |||
allowed in such cases MUST be at least as many as the number of | allowed in such cases MUST be at least as many as the number of | |||
concurrent options supported with an additional few to account for | concurrent options supported with an additional few to account for | |||
unexpected unknown options but SHOULD also consider being adaptive | unexpected unknown options but SHOULD also consider being adaptive | |||
and based on the implementation to avoid locking in that limit | and based on the implementation to avoid locking in that limit | |||
globally. | globally. | |||
For example, if a system supports 10 different option types that | For example, if a system supports 10 different option types that | |||
could concurrently be used, it is expected to allow up to around | could concurrently be used, it is expected to allow up to around | |||
13-14 different options in the same packet. This document avoids | 13-14 different options in the same packet. This document avoids | |||
skipping to change at line 2194 ¶ | skipping to change at line 2193 ¶ | |||
processing of options. UNSAFE options are the only type that share | processing of options. UNSAFE options are the only type that share | |||
fate with the UDP data because of the way that data is hidden in the | fate with the UDP data because of the way that data is hidden in the | |||
surplus area until after those options are processed. All other | surplus area until after those options are processed. All other | |||
options default to being silently ignored at the transport layer but | options default to being silently ignored at the transport layer but | |||
could be dropped if that default is either overridden (e.g., by | could be dropped if that default is either overridden (e.g., by | |||
configuration) or discarded at the application layer (e.g., using | configuration) or discarded at the application layer (e.g., using | |||
information about the options processed that are passed along with | information about the options processed that are passed along with | |||
the UDP packet). | the UDP packet). | |||
Options providing UDP security, e.g., AUTH and UENC, require endpoint | Options providing UDP security, e.g., AUTH and UENC, require endpoint | |||
key and security parameter coordination, which UDP options (being | key and security parameter coordination, which UDP Options (being | |||
stateless) do not facilitate. These parameters include whether and | stateless) do not facilitate. These parameters include whether and | |||
when to override the defaults described herein, especially at the | when to override the defaults described herein, especially at the | |||
transmitter as to when emitted packets need to include AUTH and at | transmitter as to when emitted packets need to include AUTH and at | |||
the receiver as to whether (and when) packets with failed AUTH and/or | the receiver as to whether (and when) packets with failed AUTH and/or | |||
without AUTH (or that fail the AUTH checks) are not to be forwarded | without AUTH (or that fail the AUTH checks) are not to be forwarded | |||
to the user/application. | to the user/application. | |||
25.6. Considerations Regarding Middleboxes | 25.6. Considerations Regarding Middleboxes | |||
Some middleboxes operate as UDP relays, forwarding data between a UDP | Some middleboxes operate as UDP relays, forwarding data between a UDP | |||
socket and another transport socket by modifying the IP and/or UDP | socket and another transport socket by modifying the IP and/or UDP | |||
headers without properly acting as a protocol endpoint (i.e., an | headers without properly acting as a protocol endpoint (i.e., an | |||
application layer proxy). In such cases, a sender might add UDP | application layer proxy). In such cases, a sender might add UDP | |||
options that could be stripped by the middlebox before the packet is | Options that could be stripped by the middlebox before the packet is | |||
forwarded to the second socket. A remote application will not | forwarded to the second socket. A remote application will not | |||
receive the options (for SAFE options, the payload data will be | receive the options (for SAFE options, the payload data will be | |||
received; for UNSAFE options, the payload data will not be received). | received; for UNSAFE options, the payload data will not be received). | |||
In such cases, the application will function as it would if | In such cases, the application will function as it would if | |||
communicating with a remote endpoint that does not support UDP | communicating with a remote endpoint that does not support UDP | |||
options. | Options. | |||
Additionally, [Zu20] reports that packets containing UDP options do | Additionally, [Zu20] reports that packets containing UDP Options do | |||
not traverse certain Internet paths; most likely, those options were | not traverse certain Internet paths; most likely, those options were | |||
stripped (e.g., by resetting the IP Length to correspond to the UDP | stripped (e.g., by resetting the IP Length to correspond to the UDP | |||
length, truncating the surplus area) or packets with options were | Length, truncating the surplus area) or packets with options were | |||
dropped. UDP options do not function over such paths. | dropped. UDP Options do not function over such paths. | |||
26. IANA Considerations | 26. IANA Considerations | |||
IANA has created the "User Datagram Protocol (UDP)" registry group, | IANA has created the "User Datagram Protocol (UDP)" registry group, | |||
which consists of the "UDP Option Kind Numbers" registry and a | which consists of the "UDP Option Kind Numbers" registry and a | |||
pointer to the unified "TCP/UDP Experimental Option Experiment | pointer to the unified "TCP/UDP Experimental Option Experiment | |||
Identifiers (TCP/UDP ExIDs)" registry. Note that the "TCP | Identifiers (TCP/UDP ExIDs)" registry. Note that the "TCP | |||
experimental IDs (ExIDs)" registry has been renamed as the "TCP/UDP | experimental IDs (ExIDs)" registry has been renamed as the "TCP/UDP | |||
Experimental Option Experiment Identifiers (TCP/UDP ExIDs)" registry, | Experimental Option Experiment Identifiers (TCP/UDP ExIDs)" registry, | |||
and is a unified registry for both TCP and UDP ExIDs. IANA has added | and is a unified registry for both TCP and UDP ExIDs. IANA has added | |||
skipping to change at line 2250 ¶ | skipping to change at line 2249 ¶ | |||
values in this registry are to be assigned from the Unassigned values | values in this registry are to be assigned from the Unassigned values | |||
in Section 10 by IESG Approval or Standards Action [RFC8126]. Those | in Section 10 by IESG Approval or Standards Action [RFC8126]. Those | |||
assignments are subject to the conditions set forth in this document, | assignments are subject to the conditions set forth in this document, | |||
particularly (but not limited to) those in Section 13. | particularly (but not limited to) those in Section 13. | |||
>> Although option nicknames are not used in-band, new UNSAFE option | >> Although option nicknames are not used in-band, new UNSAFE option | |||
names MUST commence with the capital letter "U" and new SAFE options | names MUST commence with the capital letter "U" and new SAFE options | |||
MUST NOT commence with either uppercase or lowercase "U". | MUST NOT commence with either uppercase or lowercase "U". | |||
IANA has added the following note to the "UDP Option Kind Numbers" | IANA has added the following note to the "UDP Option Kind Numbers" | |||
indicating entries are mandatory to implement when UDP options are | indicating entries are mandatory to implement when UDP Options are | |||
supported. No new options may be created that are mandatory to | supported. No new options may be created that are mandatory to | |||
implement in all UDP options implementations. | implement in all UDP Options implementations. | |||
| Codepoints 0-7 MUST be supported on any implementation supporting | | Codepoints 0-7 MUST be supported on any implementation supporting | |||
| UDP options. All others are supported at the discretion of each | | UDP Options. All others are supported at the discretion of each | |||
| implementation. | | implementation. | |||
UDP Experimental Option Experiment Identifiers (UDP ExIDs) are | UDP Experimental Option Experiment Identifiers (UDP ExIDs) are | |||
intended for use in a similar manner as TCP ExIDs [RFC6994]. Both | intended for use in a similar manner as TCP ExIDs [RFC6994]. Both | |||
TCP and UDP ExIDs are managed as a single, unified registry because | TCP and UDP ExIDs are managed as a single, unified registry because | |||
such options could be used for both transport protocols and because | such options could be used for both transport protocols and because | |||
the option space is large enough that there is no clear need to | the option space is large enough that there is no clear need to | |||
maintain them separately. This new TCP/UDP ExIDs registry has | maintain them separately. This new TCP/UDP ExIDs registry has | |||
entries for both transports, although each codepoint needs to be | entries for both transports, although each codepoint needs to be | |||
explicitly defined for each transport protocol in which it is used, | explicitly defined for each transport protocol in which it is used, | |||
skipping to change at line 2287 ¶ | skipping to change at line 2286 ¶ | |||
ExIDs used for UDP are always 16 bits because their use in EXP and | ExIDs used for UDP are always 16 bits because their use in EXP and | |||
UEXP options is required and thus do not need a larger codepoint | UEXP options is required and thus do not need a larger codepoint | |||
value to decrease the probability of accidental occurrence with non- | value to decrease the probability of accidental occurrence with non- | |||
ExID uses of the experimental options, as is the case with TCP ExIDs | ExID uses of the experimental options, as is the case with TCP ExIDs | |||
(e.g., when using 32-bit ExIDs). ExIDs defined solely for TCP | (e.g., when using 32-bit ExIDs). ExIDs defined solely for TCP | |||
options could be either 16 or 32 bits and all ExIDs (including now | options could be either 16 or 32 bits and all ExIDs (including now | |||
UDP) need to be unique in their first 16 bits, as originally | UDP) need to be unique in their first 16 bits, as originally | |||
described for TCP [RFC6994]. | described for TCP [RFC6994]. | |||
Values in the TCP/UDP ExID registry are to be assigned by IANA using | Values in the TCP/UDP ExID registry are to be assigned by IANA using | |||
first-come, first-served (FCFS) rules applied to both the ExID value | the First Come First Served (FCFS) policy [RFC8126], which applies to | |||
and the acronym [RFC8126]. UDP options using these ExIDs are subject | both the ExID value and the acronym. UDP Options using these ExIDs | |||
to the same conditions as new UDP options, i.e., they too are subject | are subject to the same conditions as new UDP Options, i.e., they too | |||
to the conditions set forth in this document, particularly (but not | are subject to the conditions set forth in this document, | |||
limited to) those in Section 13. | particularly (but not limited to) those in Section 13. | |||
27. References | 27. References | |||
27.1. Normative References | 27.1. Normative References | |||
[RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | [RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | |||
DOI 10.17487/RFC0768, August 1980, | DOI 10.17487/RFC0768, August 1980, | |||
<https://www.rfc-editor.org/info/rfc768>. | <https://www.rfc-editor.org/info/rfc768>. | |||
[RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, | [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, | |||
skipping to change at line 2579 ¶ | skipping to change at line 2578 ¶ | |||
Appendix A. Implementation Information | Appendix A. Implementation Information | |||
The following information is provided to encourage consistent naming | The following information is provided to encourage consistent naming | |||
for API implementations. | for API implementations. | |||
System-level variables (sysctl): | System-level variables (sysctl): | |||
+=======================+=========+=======================+ | +=======================+=========+=======================+ | |||
| Name | Default | Meaning | | | Name | Default | Meaning | | |||
+=======================+=========+=======================+ | +=======================+=========+=======================+ | |||
| net.ipv4.udp_opt | 0 | UDP options available | | | net.ipv4.udp_opt | 0 | UDP Options available | | |||
+-----------------------+---------+-----------------------+ | +-----------------------+---------+-----------------------+ | |||
| net.ipv4.udp_opt_ocs | 1 | Use OCS | | | net.ipv4.udp_opt_ocs | 1 | Use OCS | | |||
+-----------------------+---------+-----------------------+ | +-----------------------+---------+-----------------------+ | |||
| net.ipv4.udp_opt_apc | 0 | Include APC | | | net.ipv4.udp_opt_apc | 0 | Include APC | | |||
+-----------------------+---------+-----------------------+ | +-----------------------+---------+-----------------------+ | |||
| net.ipv4.udp_opt_frag | 0 | Fragment | | | net.ipv4.udp_opt_frag | 0 | Fragment | | |||
+-----------------------+---------+-----------------------+ | +-----------------------+---------+-----------------------+ | |||
| net.ipv4.udp_opt_mds | 0 | Include MDS | | | net.ipv4.udp_opt_mds | 0 | Include MDS | | |||
+-----------------------+---------+-----------------------+ | +-----------------------+---------+-----------------------+ | |||
| net.ipv4.udp_opt_mrds | 0 | Include MRDS | | | net.ipv4.udp_opt_mrds | 0 | Include MRDS | | |||
skipping to change at line 2615 ¶ | skipping to change at line 2614 ¶ | |||
| net.ipv4.udp_opt_uexp | 0 | Include UEXP | | | net.ipv4.udp_opt_uexp | 0 | Include UEXP | | |||
+-----------------------+---------+-----------------------+ | +-----------------------+---------+-----------------------+ | |||
Table 2 | Table 2 | |||
Socket options (sockopt), cached for outgoing datagrams: | Socket options (sockopt), cached for outgoing datagrams: | |||
+==============+=============================+ | +==============+=============================+ | |||
| Name | Meaning | | | Name | Meaning | | |||
+==============+=============================+ | +==============+=============================+ | |||
| UDP_OPT | Enable UDP options (at all) | | | UDP_OPT | Enable UDP Options (at all) | | |||
+--------------+-----------------------------+ | +--------------+-----------------------------+ | |||
| UDP_OPT_OCS | Use UDP OCS | | | UDP_OPT_OCS | Use UDP OCS | | |||
+--------------+-----------------------------+ | +--------------+-----------------------------+ | |||
| UDP_OPT_APC | Enable UDP APC option | | | UDP_OPT_APC | Enable UDP APC option | | |||
+--------------+-----------------------------+ | +--------------+-----------------------------+ | |||
| UDP_OPT_FRAG | Enable UDP fragmentation | | | UDP_OPT_FRAG | Enable UDP fragmentation | | |||
+--------------+-----------------------------+ | +--------------+-----------------------------+ | |||
| UDP OPT MDS | Enable UDP MDS option | | | UDP OPT MDS | Enable UDP MDS option | | |||
+--------------+-----------------------------+ | +--------------+-----------------------------+ | |||
| UDP OPT MRDS | Enable UDP MRDS option | | | UDP OPT MRDS | Enable UDP MRDS option | | |||
End of changes. 171 change blocks. | ||||
243 lines changed or deleted | 242 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |