diff options
Diffstat (limited to 'doc/rfc/rfc9177.txt')
-rw-r--r-- | doc/rfc/rfc9177.txt | 2154 |
1 files changed, 2154 insertions, 0 deletions
diff --git a/doc/rfc/rfc9177.txt b/doc/rfc/rfc9177.txt new file mode 100644 index 0000000..07260b5 --- /dev/null +++ b/doc/rfc/rfc9177.txt @@ -0,0 +1,2154 @@ + + + + +Internet Engineering Task Force (IETF) M. Boucadair +Request for Comments: 9177 Orange +Category: Standards Track J. Shallow +ISSN: 2070-1721 March 2022 + + + Constrained Application Protocol (CoAP) Block-Wise Transfer Options + Supporting Robust Transmission + +Abstract + + This document specifies alternative Constrained Application Protocol + (CoAP) block-wise transfer options: Q-Block1 and Q-Block2. + + These options are similar to, but distinct from, the CoAP Block1 and + Block2 options defined in RFC 7959. The Q-Block1 and Q-Block2 + options are not intended to replace the Block1 and Block2 options but + rather have the goal of supporting Non-confirmable (NON) messages for + large amounts of data with fewer packet interchanges. Also, the + Q-Block1 and Q-Block2 options support faster recovery should any of + the blocks get lost in transmission. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9177. + +Copyright Notice + + Copyright (c) 2022 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 2. Terminology + 3. Alternative CoAP Block-Wise Transfer Options + 3.1. CoAP Response Code (4.08) Usage + 3.2. Applicability Scope + 4. The Q-Block1 and Q-Block2 Options + 4.1. Properties of the Q-Block1 and Q-Block2 Options + 4.2. Structure of the Q-Block1 and Q-Block2 Options + 4.3. Using the Q-Block1 Option + 4.4. Using the Q-Block2 Option + 4.5. Using the Observe Option + 4.6. Using the Size1 and Size2 Options + 4.7. Using the Q-Block1 and Q-Block2 Options Together + 4.8. Using the Q-Block2 Option with Multicast + 5. The Use of the 4.08 (Request Entity Incomplete) Response Code + 6. The Use of Tokens + 7. Congestion Control for Unreliable Transports + 7.1. Confirmable (CON) + 7.2. Non-confirmable (NON) + 8. Caching Considerations + 9. HTTP Mapping Considerations + 10. Examples with Non-confirmable Messages + 10.1. Q-Block1 Option + 10.1.1. A Simple Example + 10.1.2. Handling MAX_PAYLOADS Limits + 10.1.3. Handling MAX_PAYLOADS with Recovery + 10.1.4. Handling Recovery if Failure Occurs + 10.2. Q-Block2 Option + 10.2.1. A Simple Example + 10.2.2. Handling MAX_PAYLOADS Limits + 10.2.3. Handling MAX_PAYLOADS with Recovery + 10.2.4. Handling Recovery by Setting the M Bit + 10.3. Q-Block1 and Q-Block2 Options + 10.3.1. A Simple Example + 10.3.2. Handling MAX_PAYLOADS Limits + 10.3.3. Handling Recovery + 11. Security Considerations + 12. IANA Considerations + 12.1. CoAP Option Numbers Registry + 12.2. Media Type Registration + 12.3. CoAP Content-Formats Registry + 13. References + 13.1. Normative References + 13.2. Informative References + Appendix A. Examples with Confirmable Messages + A.1. Q-Block1 Option + A.2. Q-Block2 Option + Appendix B. Examples with Reliable Transports + B.1. Q-Block1 Option + B.2. Q-Block2 Option + Acknowledgments + Authors' Addresses + +1. Introduction + + The Constrained Application Protocol (CoAP) [RFC7252], although + inspired by HTTP, was designed to use UDP instead of TCP. The + message layer of CoAP over UDP includes support for reliable + delivery, simple congestion control, and flow control. CoAP supports + two message types (Section 1.2 of [RFC7252]): Confirmable (CON) and + Non-confirmable (NON). Unlike NON messages, every CON message will + elicit an acknowledgment or a reset. + + The CoAP specification recommends that a CoAP message should fit + within a single IP packet (i.e., avoid IP fragmentation). To handle + data records that cannot fit in a single IP packet, [RFC7959] + introduced the concept of block-wise transfers and the companion CoAP + Block1 and Block2 options. However, this concept is designed to work + exclusively with Confirmable messages (Section 1 of [RFC7959]). Note + that the block-wise transfer was further updated by [RFC8323] for use + over TCP, TLS, and WebSockets. + + The CoAP Block1 and Block2 options work well in environments where + there are no, or minimal, packet losses. These options operate + synchronously, i.e., each individual block has to be requested. A + CoAP endpoint can only ask for (or send) the next block when the + transfer of the previous block has completed. The packet + transmission rate, and hence the block transmission rate, is + controlled by Round-Trip Times (RTTs). + + There is a requirement for blocks of data larger than a single IP + datagram to be transmitted under network conditions where there may + be asymmetrical transient packet loss (e.g., acknowledgment responses + may get dropped). An example is when a network is subject to a + Distributed Denial of Service (DDoS) attack and there is a need for + DDoS mitigation agents relying upon CoAP to communicate with each + other (e.g., [RFC9132] [DOTS-TELEMETRY]). As a reminder, [RFC7959] + recommends the use of CON responses to handle potential packet loss. + However, such a recommendation does not work with a "flooded pipe" + DDoS situation (e.g., [RFC9132]). + + This document introduces the CoAP Q-Block1 and Q-Block2 options, + which allow block-wise transfers to work with a series of Non- + confirmable messages instead of lock-stepping using Confirmable + messages (Section 3). In other words, this document provides a + missing piece of [RFC7959], namely the support of block-wise + transfers using Non-confirmable messages where an entire body of data + can be transmitted without the requirement that intermediate + acknowledgments be received from the peer (but recovery is available + should it be needed). + + Similar to [RFC7959], this specification does not remove any of the + constraints posed by the base CoAP specification [RFC7252] it is + strictly layered on top of. + +2. Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + Readers should be familiar with the terms and concepts defined in + [RFC7252], [RFC7959], and [RFC8132]. Particularly, the document uses + the following key concepts: + + Token: used to match responses to requests independently from the + underlying messages (Section 5.3.1 of [RFC7252]). + + ETag: used as a resource-local identifier for differentiating + between representations of the same resource that vary over time + (Section 5.10.6 of [RFC7252]). + + The terms "payload" and "body" are defined in [RFC7959]. The term + "payload" is thus used for the content of a single CoAP message + (i.e., a single block being transferred), while the term "body" is + used for the entire resource representation that is being transferred + in a block-wise fashion. + + Request-Tag refers to an option that allows a CoAP server to match + message fragments belonging to the same request [RFC9175]. + + MAX_PAYLOADS is the maximum number of payloads that can be + transmitted at any one time. + + MAX_PAYLOADS_SET is the set of blocks identified by block numbers + that, when divided by MAX_PAYLOADS, have the same numeric result. + For example, if MAX_PAYLOADS is set to 10, a MAX_PAYLOADS_SET could + be blocks #0 to #9, #10 to #19, etc. Depending on the overall data + size, there could be fewer than MAX_PAYLOADS blocks in the final + MAX_PAYLOADS_SET. + +3. Alternative CoAP Block-Wise Transfer Options + + This document introduces the CoAP Q-Block1 and Q-Block2 options. + These options are designed to work in particular with NON requests + and responses. + + Using NON messages, faster transmissions can occur, as all the blocks + can be transmitted serially (akin to fragmented IP packets) without + having to wait for a response or next request from the remote CoAP + peer. Recovery of missing blocks is faster in that multiple missing + blocks can be requested in a single CoAP message. Even if there is + asymmetrical packet loss, a body can still be sent and received by + the peer whether the body comprises a single payload or multiple + payloads, assuming no recovery is required. + + A CoAP endpoint can acknowledge all or a subset of the blocks. + Concretely, the receiving CoAP endpoint either informs the sending + CoAP endpoint of successful reception or reports on all blocks in the + body that have not yet been received. The sending CoAP endpoint will + then retransmit only the blocks that have been lost in transmission. + + Note that similar transmission rate benefits can be applied to + Confirmable messages if the value of NSTART is increased from 1 + (Section 4.7 of [RFC7252]). However, the use of Confirmable messages + will not work effectively if there is asymmetrical packet loss. Some + examples with Confirmable messages are provided in Appendix A. + + There is little, if any, benefit of using these options with CoAP + running over a reliable connection [RFC8323]. In this case, there is + no differentiation between CON and NON, as they are not used. Some + examples using a reliable transport are provided in Appendix B. + + The Q-Block1 and Q-Block2 options are similar in operation to the + CoAP Block1 and Block2 options, respectively. They are not a + replacement for them but have the following benefits: + + * They can operate in environments where packet loss is highly + asymmetrical. + + * They enable faster transmissions of sets of blocks of data with + fewer packet interchanges. + + * They support faster recovery should any of the blocks get lost in + transmission. + + * They support sending an entire body using NON messages without + requiring that an intermediate response be received from the peer. + + The disadvantages of using the CoAP Block1 and Block2 options are as + follows: + + * There is a loss of lock-stepping, so payloads are not always + received in the correct order (blocks in ascending order). + + * Additional congestion control measures need to be put in place for + NON messages (Section 7.2). + + * To reduce the transmission times for CON transmissions of large + bodies, NSTART needs to be increased from 1, but this affects + congestion control and incurs a requirement to retune other + parameters (Section 4.7 of [RFC7252]). Such tuning is out of + scope of this document. + + * Mixing of NON and CON during an exchange of requests/responses + using Q-Block options is not supported. + + * The Q-Block options do not support stateless operation/random + access. + + * Proxying of Q-Block options is limited to caching full + representations. + + * There is no multicast support. + + The Q-Block1 and Q-Block2 options can be used instead of the Block1 + and Block2 options when the different transmission properties are + required. If the new options are not supported by a peer, then + transmissions can fall back to using the Block1 and Block2 options + (Section 4.1). + + The deviations from the Block1 and Block2 options are specified in + Section 4. Pointers to the appropriate sections in [RFC7959] are + provided. + + The specification refers to the base CoAP methods defined in + Section 5.8 of [RFC7252] and the new CoAP methods, FETCH, PATCH, and + iPATCH, which are introduced in [RFC8132]. + + The No-Response option [RFC7967] was considered but was abandoned, as + it does not apply to Q-Block2 responses. A unified solution is + defined in the document. + +3.1. CoAP Response Code (4.08) Usage + + This document adds a media type for the 4.08 (Request Entity + Incomplete) response defining an additional message format for + reporting on payloads using the Q-Block1 option that are not received + by the server. + + See Section 5 for more details. + +3.2. Applicability Scope + + The block-wise transfer specified in [RFC7959] covers the general + case using Confirmable messages but falls short in situations where + packet loss is highly asymmetrical or there is no need for an + acknowledgment. In other words, there is a need for Non-confirmable + support. + + The mechanism specified in this document provides roughly similar + features to the Block1/Block2 options. It provides additional + properties that are tailored towards the intended use case of Non- + confirmable transmission. Concretely, this mechanism primarily + targets applications, such as DDoS Open Threat Signaling (DOTS), that + cannot use CON requests/responses because of potential packet loss + and that support application-specific mechanisms to assess whether + the remote peer is not overloaded and thus is able to process the + messages sent by a CoAP endpoint (e.g., DOTS heartbeats in + Section 4.7 of [RFC9132]). Other use cases are when an application + sends data but has no need for an acknowledgment of receipt and any + data transmission loss is not critical. + + The mechanism includes guards to prevent a CoAP agent from + overloading the network by adopting an aggressive sending rate. + These guards MUST be followed in addition to the existing CoAP + congestion control, as specified in Section 4.7 of [RFC7252]. See + Section 7 for more details. + + Any usage outside the primary use case of Non-confirmable messages + with block transfers should be carefully weighed against the + potential loss of interoperability with generic CoAP applications + (see the disadvantages listed in Section 3). It is hoped that the + experience gained with this mechanism can feed future extensions of + the block-wise mechanism that will both be generally applicable and + serve this particular use case. + + It is not recommended that these options are used in the "NoSec" + security mode (Section 9 of [RFC7252]), as the source endpoint needs + to be trusted. Using Object Security for Constrained RESTful + Environments (OSCORE) [RFC8613] does provide a security context and + hence a trust of the source endpoint that prepared the inner OSCORE + content. However, even with OSCORE, using the NoSec mode with these + options may still be inadequate, for reasons discussed in Section 11. + +4. The Q-Block1 and Q-Block2 Options + +4.1. Properties of the Q-Block1 and Q-Block2 Options + + The properties of the Q-Block1 and Q-Block2 options are shown in + Table 1. The formatting of this table follows the one used in + Table 4 of Section 5.10 of [RFC7252]. The C, U, N, and R columns + indicate the properties Critical, UnSafe, NoCacheKey, and Repeatable, + which are defined in Section 5.4 of [RFC7252]. Only the Critical and + UnSafe columns are marked for the Q-Block1 option. The Critical, + UnSafe, and Repeatable columns are marked for the Q-Block2 option. + As these options are UnSafe, NoCacheKey has no meaning and so is + marked with a dash. + + +=====+===+===+===+===+==========+========+========+=========+ + | No. | C | U | N | R | Name | Format | Length | Default | + +=====+===+===+===+===+==========+========+========+=========+ + | 19 | x | x | - | | Q-Block1 | uint | 0-3 | (none) | + +-----+---+---+---+---+----------+--------+--------+---------+ + | 31 | x | x | - | x | Q-Block2 | uint | 0-3 | (none) | + +-----+---+---+---+---+----------+--------+--------+---------+ + + Table 1: CoAP Q-Block1 and Q-Block2 Option Properties + + The Q-Block1 and Q-Block2 options can be present in both the request + and response messages. The Q-Block1 option pertains to the request + payload, and the Q-Block2 option pertains to the response payload. + When the Content-Format option is present together with the Q-Block1 + or Q-Block2 option, the option applies to the body, not to the + payload (i.e., it must be the same for all payloads of the same + body). + + The Q-Block1 option is useful with the payload-bearing (e.g., POST, + PUT, FETCH, PATCH, and iPATCH) requests and their responses. + + The Q-Block2 option is useful, for example, with GET, POST, PUT, + FETCH, PATCH, and iPATCH requests and their payload-bearing responses + (response codes 2.01, 2.02, 2.04, and 2.05) (Section 5.5 of + [RFC7252]). + + A CoAP endpoint (or proxy) MUST support either both or neither of the + Q-Block1 and Q-Block2 options. + + If the Q-Block1 option is present in a request or the Q-Block2 option + is returned in a response, this indicates a block-wise transfer and + describes how this specific block-wise payload forms part of the + entire body being transferred. If it is present in the opposite + direction, it provides additional control on how that payload will be + formed or was processed. + + To indicate support for Q-Block2 responses, the CoAP client MUST + include the Q-Block2 option in a GET or similar request (e.g., + FETCH), the Q-Block2 option in a PUT or similar request (e.g., POST), + or the Q-Block1 option in a PUT or similar request so that the server + knows that the client supports this Q-Block functionality should it + need to send back a body that spans multiple payloads. Otherwise, + the server would use the Block2 option (if supported) to send back a + message body that is too large to fit into a single IP packet + [RFC7959]. + + How a client decides whether it needs to include a Q-Block1 or + Q-Block2 option can be driven by a local configuration parameter, + triggered by an application (e.g., DOTS), etc. Such considerations + are out of the scope of this document. + + Implementation of the Q-Block1 and Q-Block2 options is intended to be + optional. However, when a Q-Block1 or Q-Block2 option is present in + a CoAP message, it MUST be processed (or the message rejected). + Therefore, the Q-Block1 and Q-Block2 options are identified as + critical options. + + With CoAP over UDP, the way a request message is rejected for + critical options depends on the message type. A Confirmable message + with an unrecognized critical option is rejected with a 4.02 (Bad + Option) response (Section 5.4.1 of [RFC7252]). A Non-confirmable + message with an unrecognized critical option is either rejected with + a Reset message or just silently ignored (Sections 5.4.1 and 4.3 of + [RFC7252]). To reliably get a rejection message, it is therefore + REQUIRED that clients use a Confirmable message for determining + support for the Q-Block1 and Q-Block2 options. This Confirmable + message can be sent under the base CoAP congestion control setup + specified in Section 4.7 of [RFC7252] (that is, NSTART does not need + to be increased (Section 7.1)). + + The Q-Block1 and Q-Block2 options are unsafe to forward. That is, a + CoAP proxy that does not understand the Q-Block1 (or Q-Block2) option + must reject the request or response that uses either option (see + Section 5.7.1 of [RFC7252]). + + The Q-Block2 option is repeatable when requesting retransmission of + missing blocks but not otherwise. Except for that case, any request + carrying multiple Q-Block1 (or Q-Block2) options MUST be handled + following the procedure specified in Section 5.4.5 of [RFC7252]. + + The Q-Block1 and Q-Block2 options, like the Block1 and Block2 + options, are of both class E and class U for OSCORE processing + (Table 2). The Q-Block1 (or Q-Block2) option MAY be an Inner or + Outer option (Section 4.1 of [RFC8613]). The Inner and Outer values + are therefore independent of each other. The Inner option is + encrypted and integrity protected between clients and servers and + provides message body identification in case of end-to-end + fragmentation of requests. The Outer option is visible to proxies + and labels message bodies in case of hop-by-hop fragmentation of + requests. + + +========+==========+===+===+ + | Number | Name | E | U | + +========+==========+===+===+ + | 19 | Q-Block1 | x | x | + +--------+----------+---+---+ + | 31 | Q-Block2 | x | x | + +--------+----------+---+---+ + + Table 2: OSCORE + Protection of the + Q-Block1 and Q-Block2 + Options + + Note that, if the Q-Block1 or Q-Block2 options are included in a + packet as Inner options, the Block1 or Block2 options MUST NOT be + included as Inner options. Similarly, there MUST NOT be a mix of + Q-Block and Block options for the Outer options. Messages that do + not adhere to this behavior MUST be rejected with a 4.02 (Bad + Option). The Q-Block and Block options can be mixed across Inner and + Outer options, as these are handled independently of each other. For + clarity, if OSCORE is not being used, there MUST NOT be a mix of + Q-Block and Block options in the same packet. + +4.2. Structure of the Q-Block1 and Q-Block2 Options + + The structure of the Q-Block1 and Q-Block2 options follows the + structure defined in Section 2.2 of [RFC7959]. + + There is no default value for the Q-Block1 and Q-Block2 options. The + absence of one of these options is equivalent to an option value of 0 + with respect to the value of block number (NUM) and more bit (M) that + could be given in the option, i.e., it indicates that the current + block is the first and only block of the transfer (block number is + set to 0; M is unset). However, in contrast to the explicit value 0, + which would indicate a size of the block (SZX) of 0, and thus a size + value of 16 bytes, there is no specific size implied by the absence + of the option -- the size is left unspecified. (As for any uint, the + explicit value 0 is efficiently indicated by a zero-length option; + therefore, this is semantically different from the absence of the + option.) + +4.3. Using the Q-Block1 Option + + The Q-Block1 option is used when the client wants to send a large + amount of data to the server using the POST, PUT, FETCH, PATCH, or + iPATCH methods where the data and headers do not fit into a single + packet. + + When the Q-Block1 option is used, the client MUST include a Request- + Tag option [RFC9175]. The Request-Tag value MUST be the same for all + of the requests for the body of data that is being transferred. The + Request-Tag is opaque, but the client MUST ensure that it is unique + for every different body of transmitted data. + + Implementation Note: It is suggested that the client treats the + Request-Tag as an unsigned integer of 8 bytes in length. An + implementation may want to consider limiting this to 4 bytes to + reduce packet overhead size. The initial Request-Tag value should + be randomly generated and then subsequently incremented by the + client whenever a new body of data is being transmitted between + peers. + + Section 4.6 discusses the use of the Size1 option. + + For Confirmable transmission, the server continues to acknowledge + each packet, but a response is not required (whether separate or + piggybacked) until successful receipt of the body by the server. For + Non-confirmable transmission, no response is required until either + the successful receipt of the body by the server or a timer expires + with some of the payloads having not yet arrived. In the latter + case, a "retransmit missing payloads" response is needed. For + reliable transports (e.g., [RFC8323]), a response is not required + until successful receipt of the body by the server. + + Each individual message that carries a block of the body is treated + as a new request (Section 6). + + The client MUST send the payloads in order of increasing block + number, starting from zero, until the body is complete (subject to + any congestion control (Section 7)). In addition, any missing + payloads requested by the server must be separately transmitted with + increasing block numbers. + + The following response codes are used: + + 2.01 (Created) + This response code indicates successful receipt of the entire body + and that the resource was created. The token to use MUST be one + of the tokens that were received in a request for this block-wise + exchange. However, it is desirable to provide the one used in the + last received request, since that will aid any troubleshooting. + The client should then release all of the tokens used for this + body. Note that the last received payload might not be the one + with the highest block number. + + 2.02 (Deleted) + This response code indicates successful receipt of the entire body + and that the resource was deleted when using POST (Section 5.8.2 + of [RFC7252]). The token to use MUST be one of the tokens that + were received in a request for this block-wise exchange. However, + it is desirable to provide the one used in the last received + request. The client should then release all of the tokens used + for this body. + + 2.04 (Changed) + This response code indicates successful receipt of the entire body + and that the resource was updated. The token to use MUST be one + of the tokens that were received in a request for this block-wise + exchange. However, it is desirable to provide the one used in the + last received request. The client should then release all of the + tokens used for this body. + + 2.05 (Content) + This response code indicates successful receipt of the entire + FETCH request body (Section 2 of [RFC8132]) and that the + appropriate representation of the resource is being returned. The + token to use MUST be one of the tokens that were received in a + request for this block-wise exchange. However, it is desirable to + provide the one used in the last received request. + + If the FETCH request includes the Observe option, then the server + MUST use the same token as used for the 2.05 (Content) response + for returning any triggered Observe responses so that the client + can match them up. + + The client should then release all of the tokens used for this + body apart from the one used for tracking an observed resource. + + 2.31 (Continue) + This response code can be used to indicate that all of the blocks + up to and including the Q-Block1 option block NUM (all having the + M bit set) have been successfully received. The token to use MUST + be one of the tokens that were received in a request for this + latest MAX_PAYLOADS_SET block-wise exchange. However, it is + desirable to provide the one used in the last received request. + + The client should then release all of the tokens used for this + MAX_PAYLOADS_SET. + + A response using this response code MUST NOT be generated for + every received Q-Block1 option request. It SHOULD only be + generated when all the payload requests are Non-confirmable and a + MAX_PAYLOADS_SET has been received by the server. More details + about the motivations for this optimization are discussed in + Section 7.2. + + This response code SHOULD NOT be generated for CON, as this may + cause duplicated payloads to unnecessarily be sent. + + 4.00 (Bad Request) + This response code MUST be returned if the request does not + include a Request-Tag option or a Size1 option but does include a + Q-Block1 option. + + 4.02 (Bad Option) + This response code MUST be returned for a Confirmable request if + the server does not support the Q-Block options. Note that a + Reset message may be sent in case of a Non-confirmable request. + + 4.08 (Request Entity Incomplete) + As a reminder, this response code returned without content type + "application/missing-blocks+cbor-seq" (Section 12.3) is handled as + in Section 2.9.2 of [RFC7959]. + + This response code returned with content type "application/ + missing-blocks+cbor-seq" indicates that some of the payloads are + missing and need to be resent. The client then retransmits the + individual missing payloads using the same Request-Tag, Size1, and + Q-Block1 options to specify the same NUM, SZX, and M bit values as + those sent initially in the original (but not received) packets. + + The Request-Tag value to use is determined by taking the token in + the 4.08 (Request Entity Incomplete) response, locating the + matching client request, and then using its Request-Tag. + + The token to use in the 4.08 (Request Entity Incomplete) response + MUST be one of the tokens that were received in a request for this + block-wise body exchange. However, it is desirable to provide the + one used in the last received request. See Section 5 for further + information. + + If the server has not received all the blocks of a body, but one + or more NON payloads have been received, it SHOULD wait for + NON_RECEIVE_TIMEOUT (Section 7.2) before sending a 4.08 (Request + Entity Incomplete) response. + + 4.13 (Request Entity Too Large) + This response code can be returned under conditions similar to + those discussed in Section 2.9.3 of [RFC7959]. + + This response code can be returned if there is insufficient space + to create a response PDU with a block size of 16 bytes (SZX = 0) + to send back all the response options as appropriate. In this + case, the Size1 option is not included in the response. + + Further considerations related to the transmission timings of the + 4.08 (Request Entity Incomplete) and 2.31 (Continue) response codes + are discussed in Section 7.2. + + If a server receives payloads with different Request-Tags for the + same resource, it should continue to process all the bodies, as it + has no way of determining which is the latest version or which body, + if any, the client is terminating the transmission for. + + If the client elects to stop the transmission of a complete body, + then absent any local policy, the client MUST "forget" all tracked + tokens associated with the body's Request-Tag so that a Reset message + is generated for the invalid token in the 4.08 (Request Entity + Incomplete) response. On receipt of the Reset message, the server + SHOULD delete the partial body. + + If the server receives a duplicate block with the same Request-Tag, + it MUST ignore the payload of the packet but MUST still respond as if + the block was received for the first time. + + A server SHOULD maintain a partial body (missing payloads) for + NON_PARTIAL_TIMEOUT (Section 7.2). + +4.4. Using the Q-Block2 Option + + In a request for any block number, an unset M bit indicates the + request is just for that block. If the M bit is set, this has + different meanings based on the NUM value: + + NUM is zero: This is a request for the entire body. + + 'NUM modulo MAX_PAYLOADS' is zero, while NUM is not zero: This is + used to confirm that the current MAX_PAYLOADS_SET (the latest + block having block number NUM-1) has been successfully received + and that, upon receipt of this request, the server can continue to + send the next MAX_PAYLOADS_SET (the first block having block + number NUM). This is the 'Continue' Q-Block-2 and conceptually + has the same usage (i.e., continue sending the next set of data) + as the use of 2.31 (Continue) for Q-Block1. + + Any other value of NUM: This is a request for that block and for all + of the remaining blocks in the current MAX_PAYLOADS_SET. + + If the request includes multiple Q-Block2 options and these options + overlap (e.g., combination of M being set (this and later blocks) and + unset (this individual block)), resulting in an individual block + being requested multiple times, the server MUST only send back one + instance of that block. This behavior is meant to prevent + amplification attacks. + + The payloads sent back from the server as a response MUST all have + the same ETag (Section 5.10.6 of [RFC7252]) for the same body. The + server MUST NOT use the same ETag value for different representations + of a resource. + + The ETag is opaque, but the server MUST ensure that it is unique for + every different body of transmitted data. + + Implementation Note: It is suggested that the server treats the + ETag as an unsigned integer of 8 bytes in length. An + implementation may want to consider limiting this to 4 bytes to + reduce packet overhead size. The initial ETag value should be + randomly generated and then subsequently incremented by the server + whenever a new body of data is being transmitted between peers. + + Section 4.6 discusses the use of the Size2 option. + + The client may elect to request any detected missing blocks or just + ignore the partial body. This decision is implementation specific. + + For NON payloads, the client SHOULD wait for NON_RECEIVE_TIMEOUT + (Section 7.2) after the last received payload before requesting + retransmission of any missing blocks. Retransmission is requested by + issuing a GET, POST, PUT, FETCH, PATCH, or iPATCH request that + contains one or more Q-Block2 options that define the missing + block(s). Generally, the M bit on the Q-Block2 option(s) SHOULD be + unset, although the M bit MAY be set to request this and later blocks + from this MAX_PAYLOADS_SET; see Section 10.2.4 for an example of this + in operation. Further considerations related to the transmission + timing for missing requests are discussed in Section 7.2. + + The missing block numbers requested by the client MUST have an + increasing block number in each additional Q-Block2 option with no + duplicates. The server SHOULD respond with a 4.00 (Bad Request) to + requests not adhering to this behavior. Note that the ordering + constraint is meant to force the client to check for duplicates and + remove them. This also helps with troubleshooting. + + If the client receives a duplicate block with the same ETag, it MUST + silently ignore the payload. + + A client SHOULD maintain a partial body (missing payloads) for + NON_PARTIAL_TIMEOUT (Section 7.2) or as defined by the Max-Age option + (or its default of 60 seconds (Section 5.6.1 of [RFC7252])), + whichever is less. On release of the partial body, the client should + then release all of the tokens used for this body apart from the + token that is used to track a resource that is being observed. + + The ETag option should not be used in the request for missing blocks, + as the server could respond with a 2.03 (Valid) response with no + payload. It can be used in the request if the client wants to check + the freshness of the locally cached body response. + + The server SHOULD maintain a cached copy of the body when using the + Q-Block2 option to facilitate retransmission of any missing payloads. + + If the server detects partway through a body transfer that the + resource data has changed and the server is not maintaining a cached + copy of the old data, then the transmission is terminated. Any + subsequent missing block requests MUST be responded to using the + latest ETag and Size2 option values with the updated data. + + If the server responds during a body update with a different ETag + option value (as the resource representation has changed), then the + client should treat the partial body with the old ETag as no longer + being fresh. The client may then request all of the new data by + specifying Q-Block2 with block number '0' and the M bit set. + + If the server transmits a new body of data (e.g., a triggered Observe + notification) with a new ETag to the same client as an additional + response, the client should remove any partially received body held + for a previous ETag for that resource, as it is unlikely the missing + blocks can be retrieved. + + If there is insufficient space to create a response PDU with a block + size of 16 bytes (SZX = 0) to send back all the response options as + appropriate, a 4.13 (Request Entity Too Large) is returned without + the Size1 option. + + For Confirmable traffic, the server typically acknowledges the + initial request using an Acknowledgment (ACK) with a piggybacked + payload and then sends the subsequent payloads of the + MAX_PAYLOADS_SET as CON responses. These CON responses are + individually ACKed by the client. The server will detect failure to + send a packet and SHOULD terminate the body transfer, but the client + can issue, after a MAX_TRANSMIT_SPAN delay, a separate GET, POST, + PUT, FETCH, PATCH, or iPATCH for any missing blocks as needed. + +4.5. Using the Observe Option + + For a request that uses Q-Block1, the Observe value [RFC7641] MUST be + the same for all the payloads of the same body. This includes any + missing payloads that are retransmitted. + + For a response that uses Q-Block2, the Observe value MUST be the same + for all the payloads of the same body. This is different from Block2 + usage where the Observe value is only present in the first block + (Section 3.4 of [RFC7959]). This includes payloads transmitted + following receipt of the 'Continue' Q-Block2 option (Section 4.4) by + the server. If a missing payload is requested by a client, then both + the request and response MUST NOT include the Observe option. + +4.6. Using the Size1 and Size2 Options + + Section 4 of [RFC7959] defines two CoAP options: Size1 for indicating + the size of the representation transferred in requests and Size2 for + indicating the size of the representation transferred in responses. + + For the Q-Block1 and Q-Block2 options, the Size1 or Size2 option + values MUST exactly represent the size of the data on the body so + that any missing data can easily be determined. + + The Size1 option MUST be used with the Q-Block1 option when used in a + request and MUST be present in all payloads of the request, + preserving the same value. The Size2 option MUST be used with the + Q-Block2 option when used in a response and MUST be present in all + payloads of the response, preserving the same value. + +4.7. Using the Q-Block1 and Q-Block2 Options Together + + The behavior is similar to the one defined in Section 3.3 of + [RFC7959] with Q-Block1 substituted for Block1 and Q-Block2 + substituted for Block2. + +4.8. Using the Q-Block2 Option with Multicast + + Servers MUST ignore multicast requests that contain the Q-Block2 + option. As a reminder, the Block2 option can be used as stated in + Section 2.8 of [RFC7959]. + +5. The Use of the 4.08 (Request Entity Incomplete) Response Code + + The 4.08 (Request Entity Incomplete) response code has a new content + type "application/missing-blocks+cbor-seq" used to indicate that the + server has not received all of the blocks of the request body that it + needs to proceed. Such messages must not be treated by the client as + a fatal error. + + Likely causes are the client has not sent all blocks, some blocks + were dropped during transmission, or the client sent them a long + enough time ago that the server has already discarded them. + + The new data payload of the 4.08 (Request Entity Incomplete) response + with content type "application/missing-blocks+cbor-seq" is encoded as + a Concise Binary Object Representation (CBOR) Sequence [RFC8742]. It + comprises one or more missing block numbers encoded as CBOR unsigned + integers [RFC8949]. The missing block numbers MUST be unique in each + 4.08 (Request Entity Incomplete) response when created by the server; + the client MUST ignore any duplicates in the same 4.08 (Request + Entity Incomplete) response. + + The Content-Format option (Section 5.10.3 of [RFC7252]) MUST be used + in the 4.08 (Request Entity Incomplete) response. It MUST be set to + "application/missing-blocks+cbor-seq" (Section 12.3). + + The Concise Data Definition Language (CDDL) [RFC8610] (and see + Section 4.1 of [RFC8742]) for the data describing these missing + blocks is as follows: + + ; This defines an array, the elements of which are to be used + ; in a CBOR Sequence: + payload = [+ missing-block-number] + ; A unique block number not received: + missing-block-number = uint + + Figure 1: Structure of the Missing Blocks Payload + + This CDDL syntax MUST be followed. + + It is desirable that the token to use for the response is the token + that was used in the last block number received so far with the same + Request-Tag value. Note that the use of any received token with the + same Request-Tag would be acceptable, but providing the one used in + the last received payload will aid any troubleshooting. The client + will use the token to determine what was the previously sent request + to obtain the Request-Tag value that was used. + + If the size of the 4.08 (Request Entity Incomplete) response packet + is larger than that defined by Section 4.6 of [RFC7252], then the + number of reported missing blocks MUST be limited so that the + response can fit into a single packet. If this is the case, then the + server can send subsequent 4.08 (Request Entity Incomplete) responses + containing those additional missing blocks on receipt of a new + request providing a missing payload with the same Request-Tag. + + The missing blocks MUST be reported in ascending order without any + duplicates. The client SHOULD silently drop 4.08 (Request Entity + Incomplete) responses not adhering to this behavior. + + Implementation Note: Consider limiting the number of missing + payloads to MAX_PAYLOADS to minimize the need for congestion + control. The CBOR Sequence does not include any array wrapper. + + A 4.08 (Request Entity Incomplete) response with content type + "application/missing-blocks+cbor-seq" SHOULD NOT be used when using + Confirmable requests or a reliable connection [RFC8323], as the + client will be able to determine that there is a transmission failure + of a particular payload and hence that the server is missing that + payload. + +6. The Use of Tokens + + Each new request generally uses a new Token (and sometimes must; see + Section 4 of [RFC9175]). Additional responses to a request all use + the token of the request they respond to. + + Implementation Note: By using 8-byte tokens, it is possible to + easily minimize the number of tokens that have to be tracked by + clients, by keeping the bottom 32 bits the same for the same body + and the upper 32 bits containing the current body's request number + (incrementing every request, including every retransmit). This + alleviates the client's need to keep all the per-request state, + e.g., per Section 3 of [RFC8974]. However, if using NoSec, + Section 5.2 of [RFC8974] needs to be considered for security + implications. + +7. Congestion Control for Unreliable Transports + + The transmission of all the blocks of a single body over an + unreliable transport MUST either all be Confirmable or all be Non- + confirmable. This is meant to simplify the congestion control + procedure. + + As a reminder, there is no need for CoAP-specific congestion control + for reliable transports [RFC8323]. + +7.1. Confirmable (CON) + + Congestion control for CON requests and responses is specified in + Section 4.7 of [RFC7252]. In order to benefit from faster + transmission rates, NSTART will need to be increased from 1. + However, the other CON congestion control parameters will need to be + tuned to cover this change. This tuning is not specified in this + document, given that the applicability scope of the current + specification assumes that all requests and responses using Q-Block1 + and Q-Block2 will be Non-confirmable (Section 3.2) apart from the + initial Q-Block functionality negotiation. + + Following the failure to transmit a packet due to packet loss after + MAX_TRANSMIT_SPAN time (Section 4.8.2 of [RFC7252]), it is + implementation specific as to whether there should be any further + requests for missing data. + +7.2. Non-confirmable (NON) + + This document introduces the new parameters MAX_PAYLOADS, + NON_TIMEOUT, NON_TIMEOUT_RANDOM, NON_RECEIVE_TIMEOUT, + NON_MAX_RETRANSMIT, NON_PROBING_WAIT, and NON_PARTIAL_TIMEOUT + primarily for use with NON (Table 3). + + Note: Randomness may naturally be provided based on the traffic + profile, how PROBING_RATE is computed (as this is an average), and + when the peer responds. Randomness is explicitly added for some + of the congestion control parameters to handle situations where + everything is in sync when retrying. + + MAX_PAYLOADS should be configurable with a default value of 10. Both + CoAP endpoints MUST have the same value (otherwise, there will be + transmission delays in one direction), and the value MAY be + negotiated between the endpoints to a common value by using a higher- + level protocol (out of scope of this document). This is the maximum + number of payloads that can be transmitted at any one time. + + Note: The default value of 10 is chosen for reasons similar to + those discussed in Section 5 of [RFC6928], especially given the + target application discussed in Section 3.2. + + NON_TIMEOUT is used to compute the delay between sending + MAX_PAYLOADS_SET for the same body. By default, NON_TIMEOUT has the + same value as ACK_TIMEOUT (Section 4.8 of [RFC7252]). + + NON_TIMEOUT_RANDOM is the initial actual delay between sending the + first two MAX_PAYLOADS_SETs of the same body. The same delay is then + used between the subsequent MAX_PAYLOADS_SETs. It is a random + duration (not an integral number of seconds) between NON_TIMEOUT and + (NON_TIMEOUT * ACK_RANDOM_FACTOR). ACK_RANDOM_FACTOR is set to 1.5, + as discussed in Section 4.8 of [RFC7252]. + + NON_RECEIVE_TIMEOUT is the initial time to wait for a missing payload + before requesting retransmission for the first time. Every time the + missing payload is re-requested, the Time-to-Wait value doubles. The + time to wait is calculated as: + + Time-to-Wait = NON_RECEIVE_TIMEOUT * (2 ** (Re-Request-Count - 1)) + + NON_RECEIVE_TIMEOUT has a default value of twice NON_TIMEOUT. + NON_RECEIVE_TIMEOUT MUST always be greater than NON_TIMEOUT_RANDOM by + at least one second so that the sender of the payloads has the + opportunity to start sending the next MAX_PAYLOADS_SET before the + receiver times out. + + NON_MAX_RETRANSMIT is the maximum number of times a request for the + retransmission of missing payloads can occur without a response from + the remote peer. After this occurs, the local endpoint SHOULD + consider the body stale, remove any body, and release the tokens and + Request-Tag on the client (or the ETag on the server). By default, + NON_MAX_RETRANSMIT has the same value as MAX_RETRANSMIT (Section 4.8 + of [RFC7252]). + + NON_PROBING_WAIT is used to limit the potential wait needed when + using PROBING_RATE. By default, NON_PROBING_WAIT is computed in a + way similar to EXCHANGE_LIFETIME (Section 4.8.2 of [RFC7252]) but + with ACK_TIMEOUT, MAX_RETRANSMIT, and PROCESSING_DELAY substituted + with NON_TIMEOUT, NON_MAX_RETRANSMIT, and NON_TIMEOUT_RANDOM, + respectively: + + NON_PROBING_WAIT = NON_TIMEOUT * ((2 ** NON_MAX_RETRANSMIT) - 1) * + ACK_RANDOM_FACTOR + (2 * MAX_LATENCY) + NON_TIMEOUT_RANDOM + + NON_PARTIAL_TIMEOUT is used for expiring partially received bodies. + By default, NON_PARTIAL_TIMEOUT is computed in the same way as + EXCHANGE_LIFETIME (Section 4.8.2 of [RFC7252]) but with ACK_TIMEOUT + and MAX_RETRANSMIT substituted with NON_TIMEOUT and + NON_MAX_RETRANSMIT, respectively: + + NON_PARTIAL_TIMEOUT = NON_TIMEOUT * ((2 ** NON_MAX_RETRANSMIT) - + 1) * ACK_RANDOM_FACTOR + (2 * MAX_LATENCY) + NON_TIMEOUT + + +=====================+===================+ + | Parameter Name | Default Value | + +=====================+===================+ + | MAX_PAYLOADS | 10 | + +---------------------+-------------------+ + | NON_MAX_RETRANSMIT | 4 | + +---------------------+-------------------+ + | NON_TIMEOUT | 2 s | + +---------------------+-------------------+ + | NON_TIMEOUT_RANDOM | between 2-3 s | + +---------------------+-------------------+ + | NON_RECEIVE_TIMEOUT | 4 s | + +---------------------+-------------------+ + | NON_PROBING_WAIT | between 247-248 s | + +---------------------+-------------------+ + | NON_PARTIAL_TIMEOUT | 247 s | + +---------------------+-------------------+ + + Table 3: Congestion Control Parameters + + The PROBING_RATE parameter in CoAP indicates the average data rate + that must not be exceeded by a CoAP endpoint in sending to a peer + endpoint that does not respond. A single body will be subjected to + PROBING_RATE (Section 4.7 of [RFC7252]), not the individual packets. + If the wait time between sending bodies that are not being responded + to based on PROBING_RATE exceeds NON_PROBING_WAIT, then the wait time + is limited to NON_PROBING_WAIT. + + | Note: For the particular DOTS application, PROBING_RATE and + | other transmission parameters are negotiated between peers. + | Even when not negotiated, the DOTS application uses customized + | defaults, as discussed in Section 4.5.2 of [RFC9132]. Note + | that MAX_PAYLOADS, NON_MAX_RETRANSMIT, NON_TIMEOUT, + | NON_PROBING_WAIT, and NON_PARTIAL_TIMEOUT can be negotiated + | between DOTS peers, e.g., as per [DOTS-QUICK-BLOCKS]. When + | explicit values are configured for NON_PROBING_WAIT and + | NON_PARTIAL_TIMEOUT, these values are used without applying any + | jitter. + + Each NON 4.08 (Request Entity Incomplete) response is subject to + PROBING_RATE. + + Each NON GET or FETCH request using a Q-Block2 option is subject to + PROBING_RATE. + + As the sending of many payloads of a single body may itself cause + congestion, after transmission of every MAX_PAYLOADS_SET of a single + body, a delay of NON_TIMEOUT_RANDOM MUST be introduced before sending + the next MAX_PAYLOADS_SET, unless a 'Continue' is received from the + peer for the current MAX_PAYLOADS_SET, in which case the next + MAX_PAYLOADS_SET MAY start transmission immediately. + + Note: Assuming 1500-byte packets and the MAX_PAYLOADS_SET having + 10 payloads, this corresponds to 1500 * 10 * 8 = 120 kbits. With + a delay of 2 seconds between MAX_PAYLOADS_SET, this indicates an + average speed requirement of 60 kbps for a single body should + there be no responses. This transmission rate is further reduced + by being subject to PROBING_RATE. + + The sending of a set of missing blocks of a body is restricted to + those in a MAX_PAYLOADS_SET at a time. In other words, a + NON_TIMEOUT_RANDOM delay is still observed between each + MAX_PAYLOADS_SET. + + For the Q-Block1 option, if the server responds with a 2.31 + (Continue) response code for the latest payload sent, then the client + can continue to send the next MAX_PAYLOADS_SET without any further + delay. If the server responds with a 4.08 (Request Entity + Incomplete) response code, then the missing payloads SHOULD be + retransmitted before going into another NON_TIMEOUT_RANDOM delay + prior to sending the next set of payloads. + + For the server receiving NON Q-Block1 requests, it SHOULD send back a + 2.31 (Continue) response code on receipt of all of the + MAX_PAYLOADS_SET to prevent the client unnecessarily delaying the + transfer of remaining blocks. If not all of the MAX_PAYLOADS_SET + were received, the server SHOULD delay for NON_RECEIVE_TIMEOUT + (exponentially scaled based on the repeat request count for a + payload) before sending the 4.08 (Request Entity Incomplete) response + code for the missing payload(s). If all of the MAX_PAYLOADS_SET were + received and a 2.31 (Continue) response code had been sent, but no + more payloads were received for NON_RECEIVE_TIMEOUT (exponentially + scaled), the server SHOULD send a 4.08 (Request Entity Incomplete) + response detailing the missing payloads after the block number that + was indicated in the sent 2.31 (Continue) response code. If the + repeat response count of the 4.08 (Request Entity Incomplete) exceeds + NON_MAX_RETRANSMIT, the server SHOULD discard the partial body and + stop requesting the missing payloads. + + It is likely that the client will start transmitting the next + MAX_PAYLOADS_SET before the server times out on waiting for the last + block of the previous MAX_PAYLOADS_SET. On receipt of a payload from + the next MAX_PAYLOADS_SET, the server SHOULD send a 4.08 (Request + Entity Incomplete) response code indicating any missing payloads from + any previous MAX_PAYLOADS_SET. Upon receipt of the 4.08 (Request + Entity Incomplete) response code, the client SHOULD send the missing + payloads before continuing to send the remainder of the + MAX_PAYLOADS_SET and then go into another NON_TIMEOUT_RANDOM delay + prior to sending the next MAX_PAYLOADS_SET. + + For the client receiving NON Q-Block2 responses, it SHOULD send a + 'Continue' Q-Block2 request (Section 4.4) for the next + MAX_PAYLOADS_SET on receipt of all of the MAX_PAYLOADS_SET to prevent + the server unnecessarily delaying the transfer of remaining blocks. + Otherwise, the client SHOULD delay for NON_RECEIVE_TIMEOUT + (exponentially scaled based on the repeat request count for a + payload) before sending the request for the missing payload(s). If + the repeat request count for a missing payload exceeds + NON_MAX_RETRANSMIT, the client SHOULD discard the partial body and + stop requesting the missing payloads. + + The server SHOULD recognize the 'Continue' Q-Block2 request per the + definition in Section 4.4 and just continue the transmission of the + body (including the Observe option, if appropriate for an unsolicited + response) rather than treat 'Continue' as a request for the remaining + missing blocks. + + It is likely that the server will start transmitting the next + MAX_PAYLOADS_SET before the client times out on waiting for the last + block of the previous MAX_PAYLOADS_SET. Upon receipt of a payload + from the new MAX_PAYLOADS_SET, the client SHOULD send a request + indicating any missing payloads from any previous MAX_PAYLOADS_SET. + Upon receipt of such a request, the server SHOULD send the missing + payloads before continuing to send the remainder of the + MAX_PAYLOADS_SET and then go into another NON_TIMEOUT_RANDOM delay + prior to sending the next MAX_PAYLOADS_SET. + + The client does not need to acknowledge the receipt of the entire + body. + + Note: If there is asymmetric traffic loss causing responses to + never get received, a delay of NON_TIMEOUT_RANDOM after every + transmission of MAX_PAYLOADS_SET will be observed. The endpoint + receiving the body is still likely to receive the entire body. + +8. Caching Considerations + + Caching block-based information is not straightforward in a proxy. + For the Q-Block1 and Q-Block2 options, for simplicity, it is expected + that the proxy will reassemble the body (using any appropriate + recovery options for packet loss) before passing the body onward to + the appropriate CoAP endpoint. This does not preclude an + implementation doing a more complex per-payload caching, but how to + do this is out of the scope of this document. The onward + transmission of the body does not require the use of the Q-Block1 or + Q-Block2 options, as these options may not be supported in that link. + This means that the proxy must fully support the Q-Block1 and + Q-Block2 options. + + How the body is cached in the CoAP client (for Q-Block1 + transmissions) or the CoAP server (for Q-Block2 transmissions) is + implementation specific. + + As the entire body is being cached in the proxy, the Q-Block1 and + Q-Block2 options are removed as part of the block assembly and thus + do not reach the cache. + + For Q-Block2 responses, the ETag option value is associated with the + data (and transmitted onward to the CoAP client) but is not part of + the cache key. + + For requests with the Q-Block1 option, the Request-Tag option is + associated with building the body from successive payloads but is not + part of the cache key. For the onward transmission of the body using + CoAP, a new Request-Tag SHOULD be generated and used. Ideally, this + new Request-Tag should replace the Request-Tag used by the client. + + It is possible that two or more CoAP clients are concurrently + updating the same resource through a common proxy to the same CoAP + server using the Q-Block1 (or Block1) option. If this is the case, + the first client to complete building the body causes that body to + start transmitting to the CoAP server with an appropriate Request-Tag + value. When the next client completes building the body, any + existing partial body transmission to the CoAP server is terminated, + and the transmission of the new body representation starts with a new + Request-Tag value. Note that it cannot be assumed that the proxy + will always receive a complete body from a client. + + A proxy that supports the Q-Block2 option MUST be prepared to receive + a GET or similar request indicating one or more missing blocks. From + its cache, the proxy will serve the missing blocks that are available + in its cache in the same way a server would send all the appropriate + Q-Block2 responses. If a body matching the cache key is not + available in the cache, the proxy MUST request the entire body from + the CoAP server using the information in the cache key. + + How long a CoAP endpoint (or proxy) keeps the body in its cache is + implementation specific (e.g., it may be based on Max-Age). + +9. HTTP Mapping Considerations + + As a reminder, the basic normative requirements on HTTP/CoAP mappings + are defined in Section 10 of [RFC7252]. The implementation + guidelines for HTTP/CoAP mappings are elaborated in [RFC8075]. + + The rules defined in Section 5 of [RFC7959] are to be followed. + +10. Examples with Non-confirmable Messages + + This section provides some sample flows to illustrate the use of the + Q-Block1 and Q-Block2 options with NON. Examples with CON are + provided in Appendix A. + + The examples in the following subsections assume MAX_PAYLOADS is set + to 10 and NON_MAX_RETRANSMIT is set to 4. + + The list below contains the conventions that are used in the figures + in the following subsections. + + T: Token value + + O: Observe option value + + M: Message ID + + RT: Request-Tag + + ET: ETag + + QB1: Q-Block1 option values NUM/More/Size + + QB2: Q-Block2 option values NUM/More/Size + + Size: Actual block size encoded in SZX + + \: Trimming long lines + + [[]]: Comments + + -->X: Message loss (request) + + X<--: Message loss (response) + + ...: Passage of time + + Payload N: Corresponds to the CoAP message that conveys a block + number (N-1) of a given block-wise exchange. + +10.1. Q-Block1 Option + +10.1.1. A Simple Example + + Figure 2 depicts an example of a NON PUT request conveying the + Q-Block1 option. All the blocks are received by the server. + + CoAP CoAP + Client Server + | | + +--------->| NON PUT /path M:0x81 T:0xc0 RT=9 QB1:0/1/1024 + +--------->| NON PUT /path M:0x82 T:0xc1 RT=9 QB1:1/1/1024 + +--------->| NON PUT /path M:0x83 T:0xc2 RT=9 QB1:2/1/1024 + +--------->| NON PUT /path M:0x84 T:0xc3 RT=9 QB1:3/0/1024 + |<---------+ NON 2.04 M:0xf1 T:0xc3 + | ... | + + Figure 2: Example of a NON Request with the Q-Block1 option + (without Loss) + +10.1.2. Handling MAX_PAYLOADS Limits + + Figure 3 depicts an example of a NON PUT request conveying the + Q-Block1 option. The number of payloads exceeds MAX_PAYLOADS. All + the blocks are received by the server. + + CoAP CoAP + Client Server + | | + +--------->| NON PUT /path M:0x01 T:0xf1 RT=10 QB1:0/1/1024 + +--------->| NON PUT /path M:0x02 T:0xf2 RT=10 QB1:1/1/1024 + +--------->| [[Payloads 3 - 9 not detailed]] + +--------->| NON PUT /path M:0x0a T:0xfa RT=10 QB1:9/1/1024 + [[MAX_PAYLOADS_SET has been received]] + | [[MAX_PAYLOADS_SET receipt acknowledged by server]] + |<---------+ NON 2.31 M:0x81 T:0xfa + +--------->| NON PUT /path M:0x0b T:0xfb RT=10 QB1:10/0/1024 + |<---------+ NON 2.04 M:0x82 T:0xfb + | ... | + + Figure 3: Example of a MAX_PAYLOADS NON Request with the Q-Block1 + Option (without Loss) + +10.1.3. Handling MAX_PAYLOADS with Recovery + + Consider now a scenario where a new body of data is to be sent by the + client, but some blocks are dropped in transmission, as illustrated + in Figure 4. + + CoAP CoAP + Client Server + | | + +--------->| NON PUT /path M:0x11 T:0xe1 RT=11 QB1:0/1/1024 + +--->X | NON PUT /path M:0x12 T:0xe2 RT=11 QB1:1/1/1024 + +--------->| [[Payloads 3 - 8 not detailed]] + +--------->| NON PUT /path M:0x19 T:0xe9 RT=11 QB1:8/1/1024 + +--->X | NON PUT /path M:0x1a T:0xea RT=11 QB1:9/1/1024 + [[Some of the MAX_PAYLOADS_SET has been received]] + | ... | + [[NON_TIMEOUT_RANDOM (client) delay expires]] + | [[Client starts sending next MAX_PAYLOADS_SET]] + +--->X | NON PUT /path M:0x1b T:0xeb RT=11 QB1:10/1/1024 + +--------->| NON PUT /path M:0x1c T:0xec RT=11 QB1:11/1/1024 + | | + + Figure 4: Example of a MAX_PAYLOADS NON Request with the Q-Block1 + Option (with Loss) + + On seeing a payload from the next MAX_PAYLOADS_SET, the server + realizes that some blocks are missing from the previous + MAX_PAYLOADS_SET and asks for the missing blocks in one go + (Figure 5). It does so by indicating which blocks from the previous + MAX_PAYLOADS_SET have not been received in the data portion of the + response (Section 5). The token used in the response should be the + token that was used in the last received payload. The client can + then derive the Request-Tag by matching the token with the sent + request. + + CoAP CoAP + Client Server + | | + |<---------+ NON 4.08 M:0x91 T:0xec [Missing 1,9] + | [[Client responds with missing payloads]] + +--------->| NON PUT /path M:0x1d T:0xed RT=11 QB1:1/1/1024 + +--------->| NON PUT /path M:0x1e T:0xee RT=11 QB1:9/1/1024 + | [[Client continues sending next MAX_PAYLOADS_SET]] + +--------->| NON PUT /path M:0x1f T:0xef RT=11 QB1:12/0/1024 + | ... | + [[NON_RECEIVE_TIMEOUT (server) delay expires]] + | [[The server realizes a block is still missing and asks + | for the missing one]] + |<---------+ NON 4.08 M:0x92 T:0xef [Missing 10] + +--------->| NON PUT /path M:0x20 T:0xf0 RT=11 QB1:10/1/1024 + |<---------+ NON 2.04 M:0x93 T:0xf0 + | ... | + + Figure 5: Example of a NON Request with the Q-Block1 Option + (Block Recovery) + +10.1.4. Handling Recovery if Failure Occurs + + Figure 6 depicts an example of a NON PUT request conveying the + Q-Block1 option where recovery takes place but eventually fails. + + CoAP CoAP + Client Server + | | + +--------->| NON PUT /path M:0x91 T:0xd0 RT=12 QB1:0/1/1024 + +--->X | NON PUT /path M:0x92 T:0xd1 RT=12 QB1:1/1/1024 + +--------->| NON PUT /path M:0x93 T:0xd2 RT=12 QB1:2/0/1024 + | ... | + [[NON_RECEIVE_TIMEOUT (server) delay expires]] + | [[The server realizes a block is missing and asks + | for the missing one. Retry #1]] + |<---------+ NON 4.08 M:0x01 T:0xd2 [Missing 1] + | ... | + [[2 * NON_RECEIVE_TIMEOUT (server) delay expires]] + | [[The server realizes a block is still missing and asks + | for the missing one. Retry #2]] + |<---------+ NON 4.08 M:0x02 T:0xd2 [Missing 1] + | ... | + [[4 * NON_RECEIVE_TIMEOUT (server) delay expires]] + | [[The server realizes a block is still missing and asks + | for the missing one. Retry #3]] + |<---------+ NON 4.08 M:0x03 T:0xd2 [Missing 1] + | ... | + [[8 * NON_RECEIVE_TIMEOUT (server) delay expires]] + | [[The server realizes a block is still missing and asks + | for the missing one. Retry #4]] + |<---------+ NON 4.08 M:0x04 T:0xd2 [Missing 1] + | ... | + [[16 * NON_RECEIVE_TIMEOUT (server) delay expires]] + | [[NON_MAX_RETRANSMIT exceeded. Server stops requesting + | the missing blocks and releases partial body]] + | ... | + + Figure 6: Example of a NON Request with the Q-Block1 Option (with + Eventual Failure) + +10.2. Q-Block2 Option + + These examples include the Observe option to demonstrate how that + option is used. Note that the Observe option is not required for + Q-Block2. + +10.2.1. A Simple Example + + Figure 7 illustrates an example of the Q-Block2 option. The client + sends a NON GET carrying the Observe and Q-Block2 options. The + Q-Block2 option indicates a block size hint (1024 bytes). The server + replies to this request using four (4) blocks that are transmitted to + the client without any loss. Each of these blocks carries a Q-Block2 + option. The same process is repeated when an Observe is triggered, + but no loss is experienced by any of the notification blocks. + + CoAP CoAP + Client Server + | | + +--------->| NON GET /path M:0x01 T:0xc0 O:0 QB2:0/1/1024 + |<---------+ NON 2.05 M:0xf1 T:0xc0 O:1220 ET=19 QB2:0/1/1024 + |<---------+ NON 2.05 M:0xf2 T:0xc0 O:1220 ET=19 QB2:1/1/1024 + |<---------+ NON 2.05 M:0xf3 T:0xc0 O:1220 ET=19 QB2:2/1/1024 + |<---------+ NON 2.05 M:0xf4 T:0xc0 O:1220 ET=19 QB2:3/0/1024 + | ... | + | [[Observe triggered]] + |<---------+ NON 2.05 M:0xf5 T:0xc0 O:1221 ET=20 QB2:0/1/1024 + |<---------+ NON 2.05 M:0xf6 T:0xc0 O:1221 ET=20 QB2:1/1/1024 + |<---------+ NON 2.05 M:0xf7 T:0xc0 O:1221 ET=20 QB2:2/1/1024 + |<---------+ NON 2.05 M:0xf8 T:0xc0 O:1221 ET=20 QB2:3/0/1024 + | ... | + + Figure 7: Example of NON Notifications with the Q-Block2 Option + (without Loss) + +10.2.2. Handling MAX_PAYLOADS Limits + + Figure 8 illustrates the same scenario as Figure 7, but this time + with eleven (11) payloads, which exceeds MAX_PAYLOADS. There is no + loss experienced. + + CoAP CoAP + Client Server + | | + +--------->| NON GET /path M:0x01 T:0xf0 O:0 QB2:0/1/1024 + |<---------+ NON 2.05 M:0x81 T:0xf0 O:1234 ET=21 QB2:0/1/1024 + |<---------+ NON 2.05 M:0x82 T:0xf0 O:1234 ET=21 QB2:1/1/1024 + |<---------+ [[Payloads 3 - 9 not detailed]] + |<---------+ NON 2.05 M:0x8a T:0xf0 O:1234 ET=21 QB2:9/1/1024 + [[MAX_PAYLOADS_SET has been received]] + | [[MAX_PAYLOADS_SET acknowledged by client using + | 'Continue' Q-Block2]] + +--------->| NON GET /path M:0x02 T:0xf1 QB2:10/1/1024 + |<---------+ NON 2.05 M:0x8b T:0xf0 O:1234 ET=21 QB2:10/0/1024 + | ... | + | [[Observe triggered]] + |<---------+ NON 2.05 M:0x91 T:0xf0 O:1235 ET=22 QB2:0/1/1024 + |<---------+ NON 2.05 M:0x92 T:0xf0 O:1235 ET=22 QB2:1/1/1024 + |<---------+ [[Payloads 3 - 9 not detailed]] + |<---------+ NON 2.05 M:0x9a T:0xf0 O:1235 ET=22 QB2:9/1/1024 + [[MAX_PAYLOADS_SET has been received]] + | [[MAX_PAYLOADS_SET acknowledged by client using + | 'Continue' Q-Block2]] + +--------->| NON GET /path M:0x03 T:0xf2 QB2:10/1/1024 + |<---------+ NON 2.05 M:0x9b T:0xf0 O:1235 ET=22 QB2:10/0/1024 + [[Body has been received]] + | ... | + + Figure 8: Example of NON Notifications with the Q-Block2 Option + (without Loss) + +10.2.3. Handling MAX_PAYLOADS with Recovery + + Figure 9 shows an example of an Observe that is triggered but for + which some notification blocks are lost. The client detects the + missing blocks and requests their retransmission. It does so by + indicating the blocks that are missing as one or more Q-Block2 + options. + + CoAP CoAP + Client Server + | ... | + | [[Observe triggered]] + |<---------+ NON 2.05 M:0xa1 T:0xf0 O:1236 ET=23 QB2:0/1/1024 + | X<---+ NON 2.05 M:0xa2 T:0xf0 O:1236 ET=23 QB2:1/1/1024 + |<---------+ [[Payloads 3 - 9 not detailed]] + | X<---+ NON 2.05 M:0xaa T:0xf0 O:1236 ET=23 QB2:9/1/1024 + [[Some of the MAX_PAYLOADS_SET has been received]] + | ... | + [[NON_TIMEOUT_RANDOM (server) delay expires]] + | [[Server sends next MAX_PAYLOADS_SET]] + |<---------+ NON 2.05 M:0xab T:0xf0 O:1236 ET=23 QB2:10/0/1024 + | [[On seeing a payload from the next MAX_PAYLOADS_SET, + | client realizes blocks are missing and asks for the + | missing ones in one go]] + +--------->| NON GET /path M:0x04 T:0xf3 QB2:1/0/1024\ + | | QB2:9/0/1024 + | X<---+ NON 2.05 M:0xac T:0xf3 ET=23 QB2:1/1/1024 + |<---------+ NON 2.05 M:0xad T:0xf3 ET=23 QB2:9/1/1024 + | ... | + [[NON_RECEIVE_TIMEOUT (client) delay expires]] + | [[Client realizes block is still missing and asks for + | missing block]] + +--------->| NON GET /path M:0x05 T:0xf4 QB2:1/0/1024 + |<---------+ NON 2.05 M:0xae T:0xf4 ET=23 QB2:1/1/1024 + [[Body has been received]] + | ... | + + Figure 9: Example of NON Notifications with the Q-Block2 Option + (Block Recovery) + +10.2.4. Handling Recovery by Setting the M Bit + + Figure 10 shows an example where an Observe is triggered but only the + first two notification blocks reach the client. In order to retrieve + the missing blocks, the client sends a request with a single Q-Block2 + option with the M bit set. + + CoAP CoAP + Client Server + | ... | + | [[Observe triggered]] + |<---------+ NON 2.05 M:0xb1 T:0xf0 O:1237 ET=24 QB2:0/1/1024 + |<---------+ NON 2.05 M:0xb2 T:0xf0 O:1237 ET=24 QB2:1/1/1024 + | X<---+ NON 2.05 M:0xb3 T:0xf0 O:1237 ET=24 QB2:2/1/1024 + | X<---+ [[Payloads 4 - 9 not detailed]] + | X<---+ NON 2.05 M:0xb9 T:0xf0 O:1237 ET=24 QB2:9/1/1024 + [[Some of the MAX_PAYLOADS_SET has been received]] + | ... | + [[NON_TIMEOUT_RANDOM (server) delay expires]] + | [[Server sends next MAX_PAYLOADS_SET]] + | X<---+ NON 2.05 M:0xba T:0xf0 O:1237 ET=24 QB2:10/0/1024 + | ... | + [[NON_RECEIVE_TIMEOUT (client) delay expires]] + | [[Client realizes blocks are missing and asks for the + | missing ones in one go by setting the M bit]] + +--------->| NON GET /path M:0x06 T:0xf5 QB2:2/1/1024 + |<---------+ NON 2.05 M:0xbb T:0xf5 ET=24 QB2:2/1/1024 + |<---------+ [[Payloads 3 - 9 not detailed]] + |<---------+ NON 2.05 M:0xc2 T:0xf5 ET=24 QB2:9/1/1024 + [[MAX_PAYLOADS_SET has been received]] + | [[MAX_PAYLOADS_SET acknowledged by client using 'Continue' + | Q-Block2]] + +--------->| NON GET /path M:0x87 T:0xf6 QB2:10/1/1024 + |<---------+ NON 2.05 M:0xc3 T:0xf0 O:1237 ET=24 QB2:10/0/1024 + [[Body has been received]] + | ... | + + Figure 10: Example of NON Notifications with the Q-Block2 Option + (Block Recovery with the M Bit Set) + +10.3. Q-Block1 and Q-Block2 Options + +10.3.1. A Simple Example + + Figure 11 illustrates an example of a FETCH using both the Q-Block1 + and Q-Block2 options along with an Observe option. No loss is + experienced. + + CoAP CoAP + Client Server + | | + +--------->| NON FETCH /path M:0x10 T:0x90 O:0 RT=30 QB1:0/1/1024 + +--------->| NON FETCH /path M:0x11 T:0x91 O:0 RT=30 QB1:1/1/1024 + +--------->| NON FETCH /path M:0x12 T:0x93 O:0 RT=30 QB1:2/0/1024 + |<---------+ NON 2.05 M:0x60 T:0x93 O:1320 ET=90 QB2:0/1/1024 + |<---------+ NON 2.05 M:0x61 T:0x93 O:1320 ET=90 QB2:1/1/1024 + |<---------+ NON 2.05 M:0x62 T:0x93 O:1320 ET=90 QB2:2/1/1024 + |<---------+ NON 2.05 M:0x63 T:0x93 O:1320 ET=90 QB2:3/0/1024 + | ... | + | [[Observe triggered]] + |<---------+ NON 2.05 M:0x64 T:0x93 O:1321 ET=91 QB2:0/1/1024 + |<---------+ NON 2.05 M:0x65 T:0x93 O:1321 ET=91 QB2:1/1/1024 + |<---------+ NON 2.05 M:0x66 T:0x93 O:1321 ET=91 QB2:2/1/1024 + |<---------+ NON 2.05 M:0x67 T:0x93 O:1321 ET=91 QB2:3/0/1024 + | ... | + + Figure 11: Example of a NON FETCH with the Q-Block1 and Q-Block2 + Options (without Loss) + +10.3.2. Handling MAX_PAYLOADS Limits + + Figure 12 illustrates the same scenario as Figure 11, but this time + with eleven (11) payloads in both directions, which exceeds + MAX_PAYLOADS. There is no loss experienced. + + CoAP CoAP + Client Server + | | + +--------->| NON FETCH /path M:0x30 T:0xa0 O:0 RT=10 QB1:0/1/1024 + +--------->| NON FETCH /path M:0x31 T:0xa1 O:0 RT=10 QB1:1/1/1024 + +--------->| [[Payloads 3 - 9 not detailed]] + +--------->| NON FETCH /path M:0x39 T:0xa9 O:0 RT=10 QB1:9/1/1024 + [[MAX_PAYLOADS_SET has been received]] + | [[MAX_PAYLOADS_SET acknowledged by server]] + |<---------+ NON 2.31 M:0x80 T:0xa9 + +--------->| NON FETCH /path M:0x3a T:0xaa O:0 RT=10 QB1:10/0/1024 + |<---------+ NON 2.05 M:0x81 T:0xaa O:1334 ET=21 QB2:0/1/1024 + |<---------+ NON 2.05 M:0x82 T:0xaa O:1334 ET=21 QB2:1/1/1024 + |<---------+ [[Payloads 3 - 9 not detailed]] + |<---------+ NON 2.05 M:0x8a T:0xaa O:1334 ET=21 QB2:9/1/1024 + [[MAX_PAYLOADS_SET has been received]] + | [[MAX_PAYLOADS_SET acknowledged by client using + | 'Continue' Q-Block2]] + +--------->| NON FETCH /path M:0x3b T:0xab QB2:10/1/1024 + |<---------+ NON 2.05 M:0x8b T:0xaa O:1334 ET=21 QB2:10/0/1024 + | ... | + | [[Observe triggered]] + |<---------+ NON 2.05 M:0x8c T:0xaa O:1335 ET=22 QB2:0/1/1024 + |<---------+ NON 2.05 M:0x8d T:0xaa O:1335 ET=22 QB2:1/1/1024 + |<---------+ [[Payloads 3 - 9 not detailed]] + |<---------+ NON 2.05 M:0x95 T:0xaa O:1335 ET=22 QB2:9/1/1024 + [[MAX_PAYLOADS_SET has been received]] + | [[MAX_PAYLOADS_SET acknowledged by client using + | 'Continue' Q-Block2]] + +--------->| NON FETCH /path M:0x3c T:0xac QB2:10/1/1024 + |<---------+ NON 2.05 M:0x96 T:0xaa O:1335 ET=22 QB2:10/0/1024 + [[Body has been received]] + | ... | + + Figure 12: Example of a NON FETCH with the Q-Block1 and Q-Block2 + Options (without Loss) + + Note that, as 'Continue' was used, the server continues to use the + same token (0xaa), since the 'Continue' is not being used as a + request for a new set of packets but rather is being used to instruct + the server to continue its transmission (Section 7.2). + +10.3.3. Handling Recovery + + Consider now a scenario where some blocks are lost in transmission, + as illustrated in Figure 13. + + CoAP CoAP + Client Server + | | + +--------->| NON FETCH /path M:0x50 T:0xc0 O:0 RT=31 QB1:0/1/1024 + +--->X | NON FETCH /path M:0x51 T:0xc1 O:0 RT=31 QB1:1/1/1024 + +--->X | NON FETCH /path M:0x52 T:0xc2 O:0 RT=31 QB1:2/1/1024 + +--------->| NON FETCH /path M:0x53 T:0xc3 O:0 RT=31 QB1:3/0/1024 + | ... | + [[NON_RECEIVE_TIMEOUT (server) delay expires]] + + Figure 13: Example of a NON FETCH with the Q-Block1 and Q-Block2 + Options (with Loss) + + The server realizes that some blocks are missing and asks for the + missing blocks in one go (Figure 14). It does so by indicating which + blocks have not been received in the data portion of the response. + The token used in the response is the token that was used in the last + received payload. The client can then derive the Request-Tag by + matching the token with the sent request. + + CoAP CoAP + Client Server + | | + |<---------+ NON 4.08 M:0xa0 T:0xc3 [Missing 1,2] + | [[Client responds with missing payloads]] + +--------->| NON FETCH /path M:0x54 T:0xc4 O:0 RT=31 QB1:1/1/1024 + +--------->| NON FETCH /path M:0x55 T:0xc5 O:0 RT=31 QB1:2/1/1024 + | [[Server received FETCH body, + | starts transmitting response body]] + |<---------+ NON 2.05 M:0xa1 T:0xc3 O:1236 ET=23 QB2:0/1/1024 + | X<---+ NON 2.05 M:0xa2 T:0xc3 O:1236 ET=23 QB2:1/1/1024 + |<---------+ NON 2.05 M:0xa3 T:0xc3 O:1236 ET=23 QB2:2/1/1024 + | X<---+ NON 2.05 M:0xa4 T:0xc3 O:1236 ET=23 QB2:3/0/1024 + | ... | + [[NON_RECEIVE_TIMEOUT (client) delay expires]] + | | + + Figure 14: Example of a NON Request with the Q-Block1 Option + (Server Recovery) + + The client realizes that not all the payloads of the response have + been returned. The client then asks for the missing blocks in one go + (Figure 15). Note that, following Section 2.7 of [RFC7959], the + FETCH request does not include the Q-Block1 or any payload. + + CoAP CoAP + Client Server + | | + +--------->| NON FETCH /path M:0x56 T:0xc6 RT=31 QB2:1/0/1024\ + | | QB2:3/0/1024 + | [[Server receives FETCH request for missing payloads, + | starts transmitting missing blocks]] + | X<---+ NON 2.05 M:0xa5 T:0xc6 ET=23 QB2:1/1/1024 + |<---------+ NON 2.05 M:0xa6 T:0xc6 ET=23 QB2:3/0/1024 + | ... | + [[NON_RECEIVE_TIMEOUT (client) delay expires]] + | [[Client realizes block is still missing and asks for + | missing block]] + +--------->| NON FETCH /path M:0x57 T:0xc7 RT=31 QB2:1/0/1024 + | [[Server receives FETCH request for missing payload, + | starts transmitting missing block]] + |<---------+ NON 2.05 M:0xa7 T:0xc7 ET=23 QB2:1/1/1024 + [[Body has been received]] + | ... | + | [[Observe triggered]] + |<---------+ NON 2.05 M:0xa8 T:0xc3 O:1337 ET=24 QB2:0/1/1024 + | X<---+ NON 2.05 M:0xa9 T:0xc3 O:1337 ET=24 QB2:1/1/1024 + |<---------+ NON 2.05 M:0xaa T:0xc3 O:1337 ET=24 QB2:2/0/1024 + [[NON_RECEIVE_TIMEOUT (client) delay expires]] + | [[Client realizes block is still missing and asks for + | missing block]] + +--------->| NON FETCH /path M:0x58 T:0xc8 RT=31 QB2:1/0/1024 + | [[Server receives FETCH request for missing payload, + | starts transmitting missing block]] + |<---------+ NON 2.05 M:0xa7 T:0xc8 ET=24 QB2:1/1/1024 + [[Body has been received]] + | ... | + + Figure 15: Example of a NON Request with the Q-Block1 Option + (Client Recovery) + +11. Security Considerations + + Security considerations discussed in Section 7 of [RFC7959] should be + taken into account. + + Security considerations discussed in Sections 11.3 and 11.4 of + [RFC7252] should also be taken into account. + + OSCORE provides end-to-end protection of all information that is not + required for proxy operations and requires that a security context is + set up (Section 3.1 of [RFC8613]). It can be trusted that the source + endpoint is legitimate even if the NoSec mode is used. However, an + intermediary node can modify the unprotected Outer Q-Block1 and/or + Q-Block2 options to cause a Q-Block transfer to fail or keep + requesting all the blocks by setting the M bit and thus causing + attack amplification. As discussed in Section 12.1 of [RFC8613], + applications need to consider that certain message fields and message + types are not protected end to end and may be spoofed or manipulated. + Therefore, it is NOT RECOMMENDED to use the NoSec mode if either the + Q-Block1 or Q-Block2 option is used. + + If OSCORE is not used, it is also NOT RECOMMENDED to use the NoSec + mode if either the Q-Block1 or Q-Block2 option is used. + + If NoSec is being used, Appendix D.5 of [RFC8613] discusses the + security analysis and considerations for unprotected message fields + even if OSCORE is not being used. + + Security considerations related to the use of Request-Tag are + discussed in Section 5 of [RFC9175]. + +12. IANA Considerations + +12.1. CoAP Option Numbers Registry + + IANA has added the following entries to the "CoAP Option Numbers" + subregistry [IANA-Options] defined in [RFC7252] within the + "Constrained RESTful Environments (CoRE) Parameters" registry: + + +========+==========+===========+ + | Number | Name | Reference | + +========+==========+===========+ + | 19 | Q-Block1 | RFC 9177 | + +--------+----------+-----------+ + | 31 | Q-Block2 | RFC 9177 | + +--------+----------+-----------+ + + Table 4: Additions to CoAP + Option Numbers Registry + +12.2. Media Type Registration + + IANA has registered the "application/missing-blocks+cbor-seq" media + type in the "Media Types" registry [IANA-MediaTypes]. This + registration follows the procedures specified in [RFC6838]. + + Type name: application + + Subtype name: missing-blocks+cbor-seq + + Required parameters: N/A + + Optional parameters: N/A + + Encoding considerations: Must be encoded as a CBOR Sequence + [RFC8742], as defined in Section 5 of RFC 9177. + + Security considerations: See Section 11 of RFC 9177. + + Interoperability considerations: N/A + + Published specification: RFC 9177 + + Applications that use this media type: Data serialization and + deserialization. In particular, the type is used by applications + relying upon block-wise transfers, allowing a server to specify + non-received blocks and request their retransmission, as defined + in Section 4 of RFC 9177. + + Fragment identifier considerations: N/A + + Additional information: N/A + + Person & email address to contact for further information: IETF, + iesg@ietf.org + + Intended usage: COMMON + + Restrictions on usage: none + + Author: See Authors' Addresses section of RFC 9177. + + Change controller: IESG + + Provisional registration? No + +12.3. CoAP Content-Formats Registry + + IANA has registered the following CoAP Content-Format for the + "application/missing-blocks+cbor-seq" media type in the "CoAP + Content-Formats" registry [IANA-Format] defined in [RFC7252] within + the "Constrained RESTful Environments (CoRE) Parameters" registry: + + +=====================================+==========+=====+===========+ + | Media Type | Encoding | ID | Reference | + +=====================================+==========+=====+===========+ + | application/missing-blocks+cbor-seq | - | 272 | RFC 9177 | + +-------------------------------------+----------+-----+-----------+ + + Table 5: Addition to CoAP Content-Format Registry + +13. References + +13.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type + Specifications and Registration Procedures", BCP 13, + RFC 6838, DOI 10.17487/RFC6838, January 2013, + <https://www.rfc-editor.org/info/rfc6838>. + + [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained + Application Protocol (CoAP)", RFC 7252, + DOI 10.17487/RFC7252, June 2014, + <https://www.rfc-editor.org/info/rfc7252>. + + [RFC7641] Hartke, K., "Observing Resources in the Constrained + Application Protocol (CoAP)", RFC 7641, + DOI 10.17487/RFC7641, September 2015, + <https://www.rfc-editor.org/info/rfc7641>. + + [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in + the Constrained Application Protocol (CoAP)", RFC 7959, + DOI 10.17487/RFC7959, August 2016, + <https://www.rfc-editor.org/info/rfc7959>. + + [RFC8075] Castellani, A., Loreto, S., Rahman, A., Fossati, T., and + E. Dijk, "Guidelines for Mapping Implementations: HTTP to + the Constrained Application Protocol (CoAP)", RFC 8075, + DOI 10.17487/RFC8075, February 2017, + <https://www.rfc-editor.org/info/rfc8075>. + + [RFC8132] van der Stok, P., Bormann, C., and A. Sehgal, "PATCH and + FETCH Methods for the Constrained Application Protocol + (CoAP)", RFC 8132, DOI 10.17487/RFC8132, April 2017, + <https://www.rfc-editor.org/info/rfc8132>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8323] Bormann, C., Lemay, S., Tschofenig, H., Hartke, K., + Silverajan, B., and B. Raymor, Ed., "CoAP (Constrained + Application Protocol) over TCP, TLS, and WebSockets", + RFC 8323, DOI 10.17487/RFC8323, February 2018, + <https://www.rfc-editor.org/info/rfc8323>. + + [RFC8610] Birkholz, H., Vigano, C., and C. Bormann, "Concise Data + Definition Language (CDDL): A Notational Convention to + Express Concise Binary Object Representation (CBOR) and + JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610, + June 2019, <https://www.rfc-editor.org/info/rfc8610>. + + [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, + "Object Security for Constrained RESTful Environments + (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, + <https://www.rfc-editor.org/info/rfc8613>. + + [RFC8742] Bormann, C., "Concise Binary Object Representation (CBOR) + Sequences", RFC 8742, DOI 10.17487/RFC8742, February 2020, + <https://www.rfc-editor.org/info/rfc8742>. + + [RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object + Representation (CBOR)", STD 94, RFC 8949, + DOI 10.17487/RFC8949, December 2020, + <https://www.rfc-editor.org/info/rfc8949>. + + [RFC9175] Amsüss, C., Preuß Mattsson, J., and G. Selander, + "Constrained Application Protocol (CoAP): Echo, Request- + Tag, and Token Processing", RFC 9175, + DOI 10.17487/RFC9175, February 2022, + <https://www.rfc-editor.org/info/rfc9175>. + +13.2. Informative References + + [DOTS-QUICK-BLOCKS] + Boucadair, M. and J. Shallow, "Distributed Denial-of- + Service Open Threat Signaling (DOTS) Signal Channel + Configuration Attributes for Robust Block Transmission", + Work in Progress, Internet-Draft, draft-bosh-dots-quick- + blocks-03, 29 June 2021, + <https://datatracker.ietf.org/doc/html/draft-bosh-dots- + quick-blocks-03>. + + [DOTS-TELEMETRY] + Boucadair, M., Ed., Reddy.K, T., Ed., Doron, E., Chen, M., + and J. Shallow, "Distributed Denial-of-Service Open Threat + Signaling (DOTS) Telemetry", Work in Progress, Internet- + Draft, draft-ietf-dots-telemetry-19, 4 January 2022, + <https://datatracker.ietf.org/doc/html/draft-ietf-dots- + telemetry-19>. + + [IANA-Format] + IANA, "CoAP Content-Formats", + <https://www.iana.org/assignments/core-parameters/>. + + [IANA-MediaTypes] + IANA, "Media Types", + <https://www.iana.org/assignments/media-types/>. + + [IANA-Options] + IANA, "CoAP Option Numbers", + <https://www.iana.org/assignments/core-parameters/>. + + [RFC6928] Chu, J., Dukkipati, N., Cheng, Y., and M. Mathis, + "Increasing TCP's Initial Window", RFC 6928, + DOI 10.17487/RFC6928, April 2013, + <https://www.rfc-editor.org/info/rfc6928>. + + [RFC7967] Bhattacharyya, A., Bandyopadhyay, S., Pal, A., and T. + Bose, "Constrained Application Protocol (CoAP) Option for + No Server Response", RFC 7967, DOI 10.17487/RFC7967, + August 2016, <https://www.rfc-editor.org/info/rfc7967>. + + [RFC8974] Hartke, K. and M. Richardson, "Extended Tokens and + Stateless Clients in the Constrained Application Protocol + (CoAP)", RFC 8974, DOI 10.17487/RFC8974, January 2021, + <https://www.rfc-editor.org/info/rfc8974>. + + [RFC9132] Boucadair, M., Ed., Shallow, J., and T. Reddy.K, + "Distributed Denial-of-Service Open Threat Signaling + (DOTS) Signal Channel Specification", RFC 9132, + DOI 10.17487/RFC9132, September 2021, + <https://www.rfc-editor.org/info/rfc9132>. + +Appendix A. Examples with Confirmable Messages + + The following examples assume NSTART has been increased to 3. + + The conventions provided in Section 10 are used in the following + subsections. + +A.1. Q-Block1 Option + + Let's now consider the use of the Q-Block1 option with a CON request, + as shown in Figure 16. All the blocks are acknowledged (as noted + with "ACK"). + + CoAP CoAP + Client Server + | | + +--------->| CON PUT /path M:0x01 T:0xf0 RT=10 QB1:0/1/1024 + +--------->| CON PUT /path M:0x02 T:0xf1 RT=10 QB1:1/1/1024 + +--------->| CON PUT /path M:0x03 T:0xf2 RT=10 QB1:2/1/1024 + [[NSTART(3) limit reached]] + |<---------+ ACK 0.00 M:0x01 + +--------->| CON PUT /path M:0x04 T:0xf3 RT=10 QB1:3/0/1024 + |<---------+ ACK 0.00 M:0x02 + |<---------+ ACK 0.00 M:0x03 + |<---------+ ACK 2.04 M:0x04 + | | + + Figure 16: Example of a CON Request with the Q-Block1 Option + (without Loss) + + Now, suppose that a new body of data is to be sent but with some + blocks dropped in transmission, as illustrated in Figure 17. The + client will retry sending blocks for which no ACK was received. + + CoAP CoAP + Client Server + | | + +--------->| CON PUT /path M:0x05 T:0xf4 RT=11 QB1:0/1/1024 + +--->X | CON PUT /path M:0x06 T:0xf5 RT=11 QB1:1/1/1024 + +--->X | CON PUT /path M:0x07 T:0xf6 RT=11 QB1:2/1/1024 + [[NSTART(3) limit reached]] + |<---------+ ACK 0.00 M:0x05 + +--------->| CON PUT /path M:0x08 T:0xf7 RT=11 QB1:3/1/1024 + |<---------+ ACK 0.00 M:0x08 + | ... | + [[ACK TIMEOUT (client) for M:0x06 delay expires]] + | [[Client retransmits packet]] + +--------->| CON PUT /path M:0x06 T:0xf5 RT=11 QB1:1/1/1024 + [[ACK TIMEOUT (client) for M:0x07 delay expires]] + | [[Client retransmits packet]] + +--->X | CON PUT /path M:0x07 T:0xf6 RT=11 QB1:2/1/1024 + |<---------+ ACK 0.00 M:0x06 + | ... | + [[ACK TIMEOUT exponential backoff (client) delay expires]] + | [[Client retransmits packet]] + +--->X | CON PUT /path M:0x07 T:0xf6 RT=11 QB1:2/1/1024 + | ... | + [[Either body transmission failure (acknowledge retry timeout) + or successfully transmitted]] + + Figure 17: Example of a CON Request with the Q-Block1 Option + (Block Recovery) + + It is up to the implementation as to whether the application process + stops trying to send this particular body of data on reaching + MAX_RETRANSMIT for any payload or separately tries to initiate the + new transmission of the payloads that have not been acknowledged + under these adverse traffic conditions. + + If transient network losses are possible, then the use of NON should + be considered. + +A.2. Q-Block2 Option + + An example of the use of the Q-Block2 option with Confirmable + messages is shown in Figure 18. + + Client Server + | | + +--------->| CON GET /path M:0x01 T:0xf0 O:0 QB2:0/1/1024 + |<---------+ ACK 2.05 M:0x01 T:0xf0 O:1234 ET=21 QB2:0/1/1024 + |<---------+ CON 2.05 M:0xe1 T:0xf0 O:1234 ET=21 QB2:1/1/1024 + |<---------+ CON 2.05 M:0xe2 T:0xf0 O:1234 ET=21 QB2:2/1/1024 + |<---------+ CON 2.05 M:0xe3 T:0xf0 O:1234 ET=21 QB2:3/0/1024 + |--------->+ ACK 0.00 M:0xe1 + |--------->+ ACK 0.00 M:0xe2 + |--------->+ ACK 0.00 M:0xe3 + | ... | + | [[Observe triggered]] + |<---------+ CON 2.05 M:0xe4 T:0xf0 O:1235 ET=22 QB2:0/1/1024 + |<---------+ CON 2.05 M:0xe5 T:0xf0 O:1235 ET=22 QB2:1/1/1024 + |<---------+ CON 2.05 M:0xe6 T:0xf0 O:1235 ET=22 QB2:2/1/1024 + [[NSTART(3) limit reached]] + |--------->+ ACK 0.00 M:0xe4 + |<---------+ CON 2.05 M:0xe7 T:0xf0 O:1235 ET=22 QB2:3/0/1024 + |--------->+ ACK 0.00 M:0xe5 + |--------->+ ACK 0.00 M:0xe6 + |--------->+ ACK 0.00 M:0xe7 + | ... | + | [[Observe triggered]] + |<---------+ CON 2.05 M:0xe8 T:0xf0 O:1236 ET=23 QB2:0/1/1024 + | X<---+ CON 2.05 M:0xe9 T:0xf0 O:1236 ET=23 QB2:1/1/1024 + | X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 + [[NSTART(3) limit reached]] + |--------->+ ACK 0.00 M:0xe8 + |<---------+ CON 2.05 M:0xeb T:0xf0 O:1236 ET=23 QB2:3/0/1024 + |--------->+ ACK 0.00 M:0xeb + | ... | + [[ACK TIMEOUT (server) for M:0xe9 delay expires]] + | [[Server retransmits packet]] + |<---------+ CON 2.05 M:0xe9 T:0xf0 O:1236 ET=23 QB2:1/1/1024 + [[ACK TIMEOUT (server) for M:0xea delay expires]] + | [[Server retransmits packet]] + | X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 + |--------->+ ACK 0.00 M:0xe9 + | ... | + [[ACK TIMEOUT exponential backoff (server) delay expires]] + | [[Server retransmits packet]] + | X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 + | ... | + [[Either body transmission failure (acknowledge retry timeout) + or successfully transmitted]] + + Figure 18: Example of CON Notifications with the Q-Block2 Option + + It is up to the implementation as to whether the application process + stops trying to send this particular body of data on reaching + MAX_RETRANSMIT for any payload or separately tries to initiate the + new transmission of the payloads that have not been acknowledged + under these adverse traffic conditions. + + If transient network losses are possible, then the use of NON should + be considered. + +Appendix B. Examples with Reliable Transports + + The conventions provided in Section 10 are used in the following + subsections. + +B.1. Q-Block1 Option + + Let's now consider the use of the Q-Block1 option with a reliable + transport, as shown in Figure 19. There is no acknowledgment of + packets at the CoAP layer, just the final result. + + CoAP CoAP + Client Server + | | + +--------->| PUT /path T:0xf0 RT=10 QB1:0/1/1024 + +--------->| PUT /path T:0xf1 RT=10 QB1:1/1/1024 + +--------->| PUT /path T:0xf2 RT=10 QB1:2/1/1024 + +--------->| PUT /path T:0xf3 RT=10 QB1:3/0/1024 + |<---------+ 2.04 + | | + + Figure 19: Example of a Reliable Request with the Q-Block1 Option + + If transient network losses are possible, then the use of unreliable + transport with NON should be considered. + +B.2. Q-Block2 Option + + An example of the use of the Q-Block2 option with a reliable + transport is shown in Figure 20. + + Client Server + | | + +--------->| GET /path T:0xf0 O:0 QB2:0/1/1024 + |<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:0/1/1024 + |<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:1/1/1024 + |<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:2/1/1024 + |<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:3/0/1024 + | ... | + | [[Observe triggered]] + |<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:0/1/1024 + |<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:1/1/1024 + |<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:2/1/1024 + |<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:3/0/1024 + | ... | + + Figure 20: Example of Notifications with the Q-Block2 Option + + If transient network losses are possible, then the use of unreliable + transport with NON should be considered. + +Acknowledgments + + Thanks to Achim Kraus, Jim Schaad, and Michael Richardson for their + comments. + + Special thanks to Christian Amsüss, Carsten Bormann, and Marco Tiloca + for their suggestions and several reviews, which improved this + specification significantly. Thanks to Francesca Palombini for the + AD review. Thanks to Pete Resnick for the Gen-ART review, Colin + Perkins for the TSVART review, and Emmanuel Baccelli for the IOT-DIR + review. Thanks to Martin Duke, Éric Vyncke, Benjamin Kaduk, Roman + Danyliw, John Scudder, and Lars Eggert for the IESG review. + + Some text from [RFC7959] is reused for the readers' convenience. + +Authors' Addresses + + Mohamed Boucadair + Orange + 35000 Rennes + France + Email: mohamed.boucadair@orange.com + + + Jon Shallow + United Kingdom + Email: supjps-ietf@jpshallow.com |