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