rfc9177xml2.original.xml | rfc9177.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | ||||
<?rfc toc="yes"?> | <!DOCTYPE rfc [ | |||
<?rfc tocompact="yes"?> | <!ENTITY nbsp " "> | |||
<?rfc tocdepth="4"?> | <!ENTITY zwsp "​"> | |||
<?rfc tocindent="yes"?> | <!ENTITY nbhy "‑"> | |||
<?rfc symrefs="yes"?> | <!ENTITY wj "⁠"> | |||
<?rfc sortrefs="yes"?> | ]> | |||
<?rfc comments="yes"?> | ||||
<?rfc inline="yes"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" docName="draft-ietf-core-new-blo | |||
<?rfc compact="yes"?> | ck-14" number="9177" ipr="trust200902" obsoletes="" updates="" submissionType="I | |||
<?rfc subcompact="no"?> | ETF" category="std" consensus="true" xml:lang="en" tocInclude="true" tocDepth="4 | |||
<rfc category="std" docName="draft-ietf-core-new-block-14" ipr="trust200902"> | " symRefs="true" sortRefs="true" version="3"> | |||
<!-- xml2rfc v2v3 conversion 3.8.0 --> | ||||
<front> | <front> | |||
<title abbrev="Quick Block-Wise Transfer Options">Constrained Application | <title abbrev="Quick Block-Wise Transfer Options">Constrained Application | |||
Protocol (CoAP) Block-Wise Transfer Options Supporting Robust | Protocol (CoAP) Block-Wise Transfer Options Supporting Robust | |||
Transmission</title> | Transmission</title> | |||
<seriesInfo name="RFC" value="9177"/> | ||||
<author fullname="Mohamed Boucadair" initials="M." surname="Boucadair"> | <author fullname="Mohamed Boucadair" initials="M." surname="Boucadair"> | |||
<organization>Orange</organization> | <organization>Orange</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city>Rennes</city> | <city>Rennes</city> | |||
<region/> | ||||
<region></region> | ||||
<code>35000</code> | <code>35000</code> | |||
<country>France</country> | <country>France</country> | |||
</postal> | </postal> | |||
<email>mohamed.boucadair@orange.com</email> | <email>mohamed.boucadair@orange.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Jon Shallow" initials="J." surname="Shallow"> | <author fullname="Jon Shallow" initials="J." surname="Shallow"> | |||
<organization></organization> | <organization/> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city/> | ||||
<city></city> | <region/> | |||
<code/> | ||||
<region></region> | ||||
<code></code> | ||||
<country>United Kingdom</country> | <country>United Kingdom</country> | |||
</postal> | </postal> | |||
<email>supjps-ietf@jpshallow.com</email> | <email>supjps-ietf@jpshallow.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2022" month="March"/> | ||||
<date /> | ||||
<workgroup>CoRE Working Group</workgroup> | <workgroup>CoRE Working Group</workgroup> | |||
<keyword>Quick-Block</keyword> | <keyword>Quick-Block</keyword> | |||
<keyword>Robust-Block</keyword> | <keyword>Robust-Block</keyword> | |||
<keyword>R-Block</keyword> | <keyword>R-Block</keyword> | |||
<keyword>Tough-Block</keyword> | <keyword>Tough-Block</keyword> | |||
<keyword>Resilient-Block</keyword> | <keyword>Resilient-Block</keyword> | |||
<keyword>Fast-Block</keyword> | <keyword>Fast-Block</keyword> | |||
<keyword>Resilience</keyword> | <keyword>Resilience</keyword> | |||
<keyword>Filtering</keyword> | <keyword>Filtering</keyword> | |||
<keyword>Faster transmission</keyword> | <keyword>Faster transmission</keyword> | |||
<keyword>Large amounts of data</keyword> | <keyword>Large amounts of data</keyword> | |||
<keyword>Less packet interchange</keyword> | <keyword>Less packet interchange</keyword> | |||
<keyword>Fast recovery</keyword> | <keyword>Fast recovery</keyword> | |||
<keyword>DOTS</keyword> | <keyword>DOTS</keyword> | |||
<abstract> | <abstract> | |||
<t>This document specifies alternative Constrained Application Protocol | <t>This document specifies alternative Constrained Application Protocol | |||
(CoAP) Block-Wise transfer options: Q-Block1 and Q-Block2 Options.</t> | (CoAP) block-wise transfer options: Q-Block1 and Q-Block2.</t> | |||
<t>These options are similar to, but distinct from, the CoAP Block1 and | <t>These options are similar to, but distinct from, the CoAP Block1 and | |||
Block2 Options defined in RFC 7959. Q-Block1 and Q-Block2 Options are | Block2 options defined in RFC 7959. The Q-Block1 and Q-Block2 options are | |||
not intended to replace Block1 and Block2 Options, but rather have the | not intended to replace the Block1 and Block2 options but rather have the | |||
goal of supporting Non-confirmable messages for large amounts of data | goal of supporting Non-confirmable (NON) messages for large amounts of dat | |||
with fewer packet interchanges. Also, the Q-Block1 and Q-Block2 Options | a | |||
with fewer packet interchanges. Also, the Q-Block1 and Q-Block2 options | ||||
support faster recovery should any of the blocks get lost in | support faster recovery should any of the blocks get lost in | |||
transmission.</t> | transmission.</t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="introduction" title="Introduction"> | <section anchor="introduction" numbered="true" toc="default"> | |||
<t>The Constrained Application Protocol (CoAP) <xref | <name>Introduction</name> | |||
target="RFC7252"></xref>, although inspired by HTTP, was designed to use | <t>The Constrained Application Protocol (CoAP) <xref target="RFC7252" form | |||
at="default"/>, although inspired by HTTP, was designed to use | ||||
UDP instead of TCP. The message layer of CoAP over UDP includes support | UDP instead of TCP. The message layer of CoAP over UDP includes support | |||
for reliable delivery, simple congestion control, and flow control. CoAP | for reliable delivery, simple congestion control, and flow control. CoAP | |||
supports two message types (Section 1.2 of <xref | supports two message types (<xref target="RFC7252" section="1.2" sectionFo | |||
target="RFC7252"></xref>): Confirmable (CON) and Non-confirmable (NON) | rmat="of" | |||
messages. Unlike NON messages, every CON message will elicit an | format="default"/>): Confirmable (CON) and Non-confirmable (NON). Unlike N | |||
acknowledgement or a reset.</t> | ON | |||
messages, every CON message will elicit an acknowledgment or a reset.</t> | ||||
<t>The CoAP specification recommends that a CoAP message should fit | <t>The CoAP specification recommends that a CoAP message should fit | |||
within a single IP packet (i.e., avoid IP fragmentation). To handle data | within a single IP packet (i.e., avoid IP fragmentation). To handle data | |||
records that cannot fit in a single IP packet, <xref | records that cannot fit in a single IP packet, <xref target="RFC7959" form | |||
target="RFC7959"></xref> introduced the concept of block-wise transfer | at="default"/> introduced the concept of block-wise transfers | |||
and the companion CoAP Block1 and Block2 Options. However, this concept | and the companion CoAP Block1 and Block2 options. However, this concept | |||
is designed to work exclusively with Confirmable messages (Section 1 of | is designed to work exclusively with Confirmable messages (<xref target="R | |||
<xref target="RFC7959"></xref>). Note that the block-wise transfer was | FC7959" section="1" sectionFormat="of" format="default"/>). | |||
further updated by <xref target="RFC8323"></xref> for use over TCP, TLS, | Note that the block-wise transfer was | |||
further updated by <xref target="RFC8323" format="default"/> for use over | ||||
TCP, TLS, | ||||
and WebSockets.</t> | and WebSockets.</t> | |||
<t>The CoAP Block1 and Block2 options work well in environments where | ||||
<t>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 CoAP | synchronously, i.e., each individual block has to be requested. A CoAP | |||
endpoint can only ask for (or send) the next block when the transfer of | endpoint can only ask for (or send) the next block when the transfer of | |||
the previous block has completed. Packet transmission rate, and hence | the previous block has completed. The packet transmission rate, and hence | |||
block transmission rate, is controlled by Round Trip Times (RTTs).</t> | the block transmission rate, is controlled by Round-Trip Times (RTTs).</t> | |||
<t>There is a requirement for blocks of data larger than a single IP | <t>There is a requirement for blocks of data larger than a single IP | |||
datagram to be transmitted under network conditions where there may be | datagram to be transmitted under network conditions where there may be | |||
asymmetrical transient packet loss (e.g., acknowledgment responses may | asymmetrical transient packet loss (e.g., acknowledgment responses may | |||
get dropped). An example is when a network is subject to a Distributed | get dropped). | |||
An example is when a network is subject to a Distributed | ||||
Denial of Service (DDoS) attack and there is a need for DDoS mitigation | Denial of Service (DDoS) attack and there is a need for DDoS mitigation | |||
agents relying upon CoAP to communicate with each other (e.g., <xref | agents relying upon CoAP to communicate with each other (e.g., <xref targe | |||
target="RFC8782"></xref><xref target="I-D.ietf-dots-telemetry"></xref>). | t="RFC9132" format="default"/> <xref target="DOTS-TELEMETRY" format="default"/>) | |||
As a reminder, <xref target="RFC7959"></xref> recommends the use of CON | . | |||
responses to handle potential packet loss. However, such a | As a reminder, <xref target="RFC7959" format="default"/> recommends the us | |||
recommendation does not work with a flooded pipe DDoS situation (e.g., | e of CON responses to handle potential packet loss. However, such a | |||
<xref target="RFC8782"></xref>).</t> | recommendation does not work with a "flooded pipe" DDoS situation (e.g., | |||
<xref target="RFC9132" format="default"/>).</t> | ||||
<t>This document introduces the CoAP Q-Block1 and Q-Block2 Options which | <t>This document introduces the CoAP Q-Block1 and Q-Block2 options, which | |||
allow block-wise transfer to work with series of Non-confirmable | allow block-wise transfers to work with a series of Non-confirmable | |||
messages, instead of lock-stepping using Confirmable messages (<xref | messages instead of lock-stepping using Confirmable messages (<xref target | |||
target="alt"></xref>). In other words, this document provides a missing | ="alt" format="default"/>). | |||
piece of <xref target="RFC7959"></xref>, namely the support of | In other words, this document provides a missing | |||
block-wise transfer using Non-confirmable where an entire body of data | piece of <xref target="RFC7959" format="default"/>, namely the support of | |||
block-wise transfers using Non-confirmable messages where an entire body o | ||||
f data | ||||
can be transmitted without the requirement that intermediate | can be transmitted without the requirement that intermediate | |||
acknowledgments be received from the peer (but recovery is available | acknowledgments be received from the peer (but recovery is available | |||
should it be needed).</t> | should it be needed).</t> | |||
<t>Similar to <xref target="RFC7959" format="default"/>, this specificatio | ||||
<t>Similar to <xref target="RFC7959"></xref>, this specification does | n does | |||
not remove any of the constraints posed by the base CoAP specification | not remove any of the constraints posed by the base CoAP specification | |||
<xref target="RFC7252"></xref> it is strictly layered on top of.</t> | <xref target="RFC7252" format="default"/> it is strictly layered on top of .</t> | |||
</section> | </section> | |||
<section anchor="notation" numbered="true" toc="default"> | ||||
<section anchor="notation" title="Terminology"> | <name>Terminology</name> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | <t> | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
"OPTIONAL" in this document are to be interpreted as described in BCP 14 | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
<xref target="RFC2119"></xref><xref target="RFC8174"></xref> when, and | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
only when, they appear in all capitals, as shown here.</t> | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
be interpreted as | ||||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | ||||
when, and only when, they appear in all capitals, as shown here. | ||||
</t> | ||||
<t>Readers should be familiar with the terms and concepts defined in | <t>Readers should be familiar with the terms and concepts defined in | |||
<xref target="RFC7252"></xref>, <xref target="RFC7959"></xref>, and | <xref target="RFC7252" format="default"/>, <xref target="RFC7959" format=" | |||
<xref target="RFC8132"></xref>. Particularly, the document uses the | default"/>, and | |||
following key concepts:<list style="hanging"> | <xref target="RFC8132" format="default"/>. Particularly, the document uses | |||
<t hangText="Token:">is used to match responses to requests | the | |||
independently from the underlying messages (Section 5.3.1 of <xref | following key concepts:</t> | |||
target="RFC7252"></xref>).</t> | <dl newline="false" spacing="normal"> | |||
<dt>Token:</dt><dd>used to match responses to requests | ||||
<t hangText="ETag:">is used as a resource-local identifier for | independently from the underlying messages (<xref target="RFC7252" | |||
section="5.3.1" sectionFormat="of" format="default"/>).</dd> | ||||
<dt>ETag:</dt><dd>used as a resource-local identifier for | ||||
differentiating between representations of the same resource that | differentiating between representations of the same resource that | |||
vary over time (Section 5.10.6 of <xref | vary over time (<xref target="RFC7252" section="5.10.6" sectionFormat= | |||
target="RFC7252"></xref>).</t> | "of" | |||
</list></t> | format="default"/>).</dd> | |||
</dl> | ||||
<t>The terms "payload" and "body" are defined in <xref | <t>The terms "payload" and "body" are defined in <xref target="RFC7959" fo | |||
target="RFC7959"></xref>. The term "payload" is thus used for the | rmat="default"/>. The term "payload" is thus used for the | |||
content of a single CoAP message (i.e., a single block being | content of a single CoAP message (i.e., a single block being | |||
transferred), while the term "body" is used for the entire resource | transferred), while the term "body" is used for the entire resource | |||
representation that is being transferred in a block-wise fashion.</t> | representation that is being transferred in a block-wise fashion.</t> | |||
<t>Request-Tag refers to an option that allows a CoAP server to match | <t>Request-Tag refers to an option that allows a CoAP server to match | |||
message fragments belonging to the same request <xref | message fragments belonging to the same request <xref target="RFC9175" for | |||
target="I-D.ietf-core-echo-request-tag"></xref>.</t> | mat="default"/>.</t> | |||
<t>MAX_PAYLOADS is the maximum number of payloads that can be | <t>MAX_PAYLOADS is the maximum number of payloads that can be | |||
transmitted at any one time.</t> | transmitted at any one time.</t> | |||
<t>MAX_PAYLOADS_SET is the set of blocks identified by block numbers | <t>MAX_PAYLOADS_SET is the set of blocks identified by block numbers | |||
that, when divided by MAX_PAYLOADS, have the same numeric result. For | that, when divided by MAX_PAYLOADS, have the same numeric result. For | |||
example, if MAX_PAYLOADS is set to '10', a MAX_PAYLOADS_SET could be | example, if MAX_PAYLOADS is set to 10, a MAX_PAYLOADS_SET could be | |||
blocks #0 to #9, #10 to #19, etc. Depending on the overall data size, | 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 | there could be fewer than MAX_PAYLOADS blocks in the final | |||
MAX_PAYLOADS_SET.</t> | MAX_PAYLOADS_SET.</t> | |||
</section> | </section> | |||
<section anchor="alt" numbered="true" toc="default"> | ||||
<section anchor="alt" title="Alternative CoAP Block-Wise Transfer Options"> | <name>Alternative CoAP Block-Wise Transfer Options</name> | |||
<t>This document introduces the CoAP Q-Block1 and Q-Block2 Options. | <t>This document introduces the CoAP Q-Block1 and Q-Block2 options. | |||
These options are designed to work in particular with NON requests and | These options are designed to work in particular with NON requests and | |||
responses.</t> | responses.</t> | |||
<t>Using NON messages, faster transmissions can occur, as all the blocks | ||||
<t>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 peer. | having to wait for a response or next request from the remote CoAP peer. | |||
Recovery of missing blocks is faster in that multiple missing blocks can | Recovery of missing blocks is faster in that multiple missing blocks can | |||
be requested in a single CoAP message. Even if there is asymmetrical | be requested in a single CoAP message. Even if there is asymmetrical | |||
packet loss, a body can still be sent and received by the peer whether | packet loss, a body can still be sent and received by the peer whether | |||
the body comprises a single or multiple payloads, assuming no recovery | the body comprises a single payload or multiple payloads, assuming no reco very | |||
is required.</t> | is required.</t> | |||
<t>A CoAP endpoint can acknowledge all or a subset of the blocks. | <t>A CoAP endpoint can acknowledge all or a subset of the blocks. | |||
Concretely, the receiving CoAP endpoint either informs the CoAP sender | Concretely, the receiving CoAP endpoint either informs the sending CoAP | |||
endpoint of successful reception or reports on all blocks in the body | endpoint of successful reception or reports on all blocks in the body | |||
that have not yet been received. The CoAP sender endpoint will then | that have not yet been received. The sending CoAP endpoint will then | |||
retransmit only the blocks that have been lost in transmission.</t> | retransmit only the blocks that have been lost in transmission.</t> | |||
<t>Note that similar transmission rate benefits can be applied to | <t>Note that similar transmission rate benefits can be applied to | |||
Confirmable messages if the value of NSTART is increased from 1 (Section | Confirmable messages if the value of NSTART is increased from 1 (<xref tar | |||
4.7 of <xref target="RFC7252"></xref>). However, the use of Confirmable | get="RFC7252" section="4.7" sectionFormat="of" format="default"/>). However, the | |||
use of Confirmable | ||||
messages will not work effectively if there is asymmetrical packet loss. | messages will not work effectively if there is asymmetrical packet loss. | |||
Some examples with Confirmable messages are provided in <xref | Some examples with Confirmable messages are provided in <xref target="CON" | |||
target="CON"></xref>.</t> | format="default"/>.</t> | |||
<t>There is little, if any, benefit of using these options with CoAP | <t>There is little, if any, benefit of using these options with CoAP | |||
running over a reliable connection <xref target="RFC8323"></xref>. In | running over a reliable connection <xref target="RFC8323" format="default" | |||
this case, there is no differentiation between CON and NON as they are | />. In | |||
not used. Some examples using a reliable transport are provided in <xref | this case, there is no differentiation between CON and NON, as they are | |||
target="REL"></xref>.</t> | not used. Some examples using a reliable transport are provided in <xref t | |||
arget="REL" format="default"/>.</t> | ||||
<t>Q-Block1 and Q-Block2 Options are similar in operation to the CoAP | <t>The Q-Block1 and Q-Block2 options are similar in operation to the CoAP | |||
Block1 and Block2 Options, respectively. They are not a replacement for | Block1 and Block2 options, respectively. They are not a replacement for | |||
them, but have the following benefits:<list style="symbols"> | them but have the following benefits:</t> | |||
<t>They can operate in environments where packet loss is highly | <ul spacing="normal"> | |||
asymmetrical.</t> | <li>They can operate in environments where packet loss is highly | |||
asymmetrical.</li> | ||||
<t>They enable faster transmissions of sets of blocks of data with | <li>They enable faster transmissions of sets of blocks of data with | |||
fewer packet interchanges.</t> | fewer packet interchanges.</li> | |||
<li>They support faster recovery should any of the blocks get lost in | ||||
<t>They support faster recovery should any of the blocks get lost in | transmission.</li> | |||
transmission.</t> | <li>They support sending an entire body using NON messages without | |||
<t>They support sending an entire body using NON messages without | ||||
requiring that an intermediate response be received from the | requiring that an intermediate response be received from the | |||
peer.</t> | peer.</li> | |||
</list></t> | </ul> | |||
<t>The disadvantages of using the CoAP Block1 and Block2 options are as fo | ||||
<t>There are the following disadvantages over using CoAP Block1 and | llows:</t> | |||
Block2 Options:<list style="symbols"> | <ul spacing="normal"> | |||
<t>Loss of lock-stepping so payloads are not always received in the | <li>There is a loss of lock-stepping, so payloads are not always receive | |||
correct (block ascending) order.</t> | d in the | |||
correct order (blocks in ascending order).</li> | ||||
<t>Additional congestion control measures need to be put in place | <li>Additional congestion control measures need to be put in place | |||
for NON messages (<xref target="cc-non"></xref>).</t> | for NON messages (<xref target="cc-non" format="default"/>).</li> | |||
<li>To reduce the transmission times for CON transmissions of large | ||||
<t>To reduce the transmission times for CON transmission 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 <xref target="RFC7252"></xref>). Such | parameters (<xref target="RFC7252" section="4.7" sectionFormat="of" fo | |||
tuning is out of scope of this document.</t> | rmat="default"/>). Such | |||
tuning is out of scope of this document.</li> | ||||
<t>Mixing of NON and CON during requests/responses using Q-Block is | <li>Mixing of NON and CON during an exchange of requests/responses usin | |||
not supported.</t> | g | |||
Q-Block options is not supported.</li> | ||||
<t>The Q-Block Options do not support stateless operation/random | <li>The Q-Block options do not support stateless operation/random | |||
access.</t> | access.</li> | |||
<li>Proxying of Q-Block options is limited to caching full | ||||
<t>Proxying of Q-Block is limited to caching full | representations.</li> | |||
representations.</t> | <li>There is no multicast support.</li> | |||
</ul> | ||||
<t>There is no multicast support.</t> | <t>The Q-Block1 and Q-Block2 options can be used instead of the Block1 and | |||
</list></t> | Block2 options when the different transmission properties are required. | |||
<t>Q-Block1 and Q-Block2 Options can be used instead of Block1 and | ||||
Block2 Options when the different transmission properties are required. | ||||
If the new options are not supported by a peer, then transmissions can | If the new options are not supported by a peer, then transmissions can | |||
fall back to using Block1 and Block2 Options (<xref | fall back to using the Block1 and Block2 options (<xref target="prop" | |||
target="prop"></xref>).</t> | format="default"/>).</t> | |||
<t>The deviations from the Block1 and Block2 options are specified in <xre | ||||
<t>The deviations from Block1 and Block2 Options are specified in <xref | f | |||
target="spec"></xref>. Pointers to appropriate <xref | target="spec" format="default"/>. Pointers to the appropriate sections in | |||
target="RFC7959"></xref> sections are provided.</t> | <xref | |||
target="RFC7959" format="default"/> are provided.</t> | ||||
<t>The specification refers to the base CoAP methods defined in Section | <t>The specification refers to the base CoAP methods defined in <xref | |||
5.8 of <xref target="RFC7252"></xref> and the new CoAP methods, FETCH, | target="RFC7252" section="5.8" sectionFormat="of" format="default"/> and t | |||
PATCH, and iPATCH introduced in <xref target="RFC8132"></xref>.</t> | he new | |||
CoAP methods, FETCH, PATCH, and iPATCH, which are introduced in <xref | ||||
<t>The No-Response Option <xref target="RFC7967"></xref> was considered | target="RFC8132" format="default"/>.</t> | |||
but was abandoned as it does not apply to Q-Block2 responses. A unified | <t>The No-Response option <xref target="RFC7967" format="default"/> was co | |||
nsidered | ||||
but was abandoned, as it does not apply to Q-Block2 responses. A unified | ||||
solution is defined in the document.</t> | solution is defined in the document.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="CoAP Response Code (4.08) Usage"> | <name>CoAP Response Code (4.08) Usage</name> | |||
<t>This document adds a media type for the 4.08 (Request Entity | <t>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 | |||
reporting on payloads using the Q-Block1 Option that are not received | on | |||
by the server.</t> | payloads using the Q-Block1 option that are not received by the server.< | |||
/t> | ||||
<t>See <xref target="code"></xref> for more details.</t> | <t>See <xref target="code" format="default"/> for more details.</t> | |||
</section> | </section> | |||
<section anchor="scope" numbered="true" toc="default"> | ||||
<section anchor="scope" title="Applicability Scope"> | <name>Applicability Scope</name> | |||
<t>The block-wise transfer specified in <xref target="RFC7959"></xref> | <t>The block-wise transfer specified in <xref target="RFC7959" format="d | |||
covers the general case using Confirmable messages, but falls short in | efault"/> | |||
covers the general case using Confirmable messages but falls short in | ||||
situations where packet loss is highly asymmetrical or there is no | situations where packet loss is highly asymmetrical or there is no | |||
need for an acknowledgement. In other words, there is a need for | need for an acknowledgment. In other words, there is a need for | |||
Non-confirmable support.</t> | Non-confirmable support.</t> | |||
<t>The mechanism specified in this document provides roughly similar | <t>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 | properties that are tailored towards the intended use case of | |||
Non-confirmable transmission. Concretely, this mechanism primarily | Non-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 and | cannot use CON requests/responses because of potential packet loss and | |||
that support application-specific mechanisms to assess whether the | that support application-specific mechanisms to assess whether the | |||
remote peer is not overloaded and thus is able to process the messages | remote peer is not overloaded and thus is able to process the messages | |||
sent by a CoAP endpoint (e.g., DOTS heartbeats in Section 4.7 of <xref | sent by a CoAP endpoint (e.g., DOTS heartbeats in <xref target="RFC9132" | |||
target="RFC8782"></xref>). Other use cases are when an application | section="4.7" sectionFormat="of" format="default"/>). Other use cases are when | |||
sends data but has no need for an acknowledgement of receipt and, any | an application | |||
sends data but has no need for an acknowledgment of receipt and any | ||||
data transmission loss is not critical.</t> | data transmission loss is not critical.</t> | |||
<t>The mechanism includes guards to prevent a CoAP agent from | <t>The mechanism includes guards to prevent a CoAP agent from | |||
overloading the network by adopting an aggressive sending rate. These | overloading the network by adopting an aggressive sending rate. These | |||
guards MUST be followed in addition to the existing CoAP congestion | guards <bcp14>MUST</bcp14> be followed in addition to the existing CoAP | |||
control as specified in Section 4.7 of <xref target="RFC7252"></xref>. | congestion | |||
See <xref target="cc"></xref> for more details.</t> | control, as specified in <xref target="RFC7252" section="4.7" sectionFor | |||
mat="of" format="default"/>. | ||||
<t>Any usage outside the primary use case of Non-confirmable with | See <xref target="cc" format="default"/> for more details.</t> | |||
<t>Any usage outside the primary use case of Non-confirmable messages wi | ||||
th | ||||
block transfers should be carefully weighed against the potential loss | block transfers should be carefully weighed against the potential loss | |||
of interoperability with generic CoAP applications (See the | of interoperability with generic CoAP applications (see the | |||
disadvantages listed in <xref target="alt"></xref>). It is hoped that | disadvantages listed in <xref target="alt" format="default"/>). It is ho | |||
ped that | ||||
the experience gained with this mechanism can feed future extensions | the experience gained with this mechanism can feed future extensions | |||
of the block-wise mechanism that will both be generally applicable and | of the block-wise mechanism that will both be generally applicable and | |||
serve this particular use case.</t> | serve this particular use case.</t> | |||
<t>It is not recommended that these options are used in the "NoSec" | ||||
<t>It is not recommended that these options are used in a NoSec | security mode (<xref target="RFC7252" section="9" sectionFormat="of" for | |||
security mode (Section 9 of <xref target="RFC7252"></xref>) as the | mat="default"/>), as | |||
source endpoint needs to be trusted. Using OSCORE <xref | the source endpoint needs to be trusted. Using Object Security for Constr | |||
target="RFC8613"></xref> does provide a security context and, hence, a | ained | |||
RESTful Environments (OSCORE) <xref target="RFC8613" format="default"/> d | ||||
oes | ||||
provide a security context and hence a | ||||
trust of the source endpoint that prepared the inner OSCORE content. | trust of the source endpoint that prepared the inner OSCORE content. | |||
However, even with OSCORE, using a NoSec security mode with these | However, even with OSCORE, using the NoSec mode with these | |||
options may still be inadequate, for reasons discussed in <xref | options may still be inadequate, for reasons discussed in <xref target=" | |||
target="security"></xref>.</t> | security" format="default"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="spec" numbered="true" toc="default"> | ||||
<section anchor="spec" title="The Q-Block1 and Q-Block2 Options"> | <name>The Q-Block1 and Q-Block2 Options</name> | |||
<section anchor="prop" | <section anchor="prop" numbered="true" toc="default"> | |||
title="Properties of Q-Block1 and Q-Block2 Options"> | <name>Properties of the Q-Block1 and Q-Block2 Options</name> | |||
<t>The properties of the Q-Block1 and Q-Block2 Options are shown in | <t>The properties of the Q-Block1 and Q-Block2 options are shown in | |||
Table 1. The formatting of this table follows the one used in Table 4 | <xref target="coap" format="default"/>. The formatting of this table fol | |||
of <xref target="RFC7252"></xref> (Section 5.10). The C, U, N, and R | lows the | |||
one used in Table 4 | ||||
of <xref target="RFC7252" section="5.10" sectionFormat="of" format="defa | ||||
ult"/>. The C, U, N, and R | ||||
columns indicate the properties Critical, UnSafe, NoCacheKey, and | columns indicate the properties Critical, UnSafe, NoCacheKey, and | |||
Repeatable defined in Section 5.4 of <xref target="RFC7252"></xref>. | Repeatable, which are defined in <xref target="RFC7252" section="5.4" s | |||
Only Critical and UnSafe columns are marked for the Q-Block1 Option. | ectionFormat="of" format="default"/>. | |||
Critical, UnSafe, and Repeatable columns are marked for the Q-Block2 | Only the Critical and UnSafe columns are marked for the Q-Block1 option. | |||
Option. As these options are UnSafe, NoCacheKey has no meaning and so | The Critical, UnSafe, and Repeatable columns are marked for the Q-Block2 | |||
option. As these options are UnSafe, NoCacheKey has no meaning and so | ||||
is marked with a dash.</t> | is marked with a dash.</t> | |||
<t><figure align="center"> | <table align="center" anchor="coap"> | |||
<artwork align="center"><![CDATA[+--------+---+---+---+---+--------- | <name>CoAP Q-Block1 and Q-Block2 Option Properties</name> | |||
-----+--------+--------+---------+ | <thead> | |||
| Number | C | U | N | R | Name | Format | Length | Default | | <tr> | |||
+========+===+===+===+===+==============+========+========+=========+ | <th>No.</th> | |||
| TBA1 | x | x | - | | Q-Block1 | uint | 0-3 | (none) | | <th>C</th> | |||
| TBA2 | x | x | - | x | Q-Block2 | uint | 0-3 | (none) | | <th>U</th> | |||
+--------+---+---+---+---+--------------+--------+--------+---------+ | <th>N</th> | |||
<th>R</th> | ||||
Table 1: CoAP Q-Block1 and Q-Block2 Option Properties | <th>Name</th> | |||
]]></artwork> | <th>Format</th> | |||
</figure></t> | <th>Length</th> | |||
<th>Default</th> | ||||
<t>The Q-Block1 and Q-Block2 Options can be present in both the | </tr> | |||
request and response messages. The Q-Block1 Option pertains to the | </thead> | |||
request payload and the Q-Block2 Option pertains to the response | <tbody> | |||
payload. When the Content-Format Option is present together with the | <tr> | |||
Q-Block1 or Q-Block2 Option, the option applies to the body not to the | <td>19</td> | |||
<td>x</td> | ||||
<td>x</td> | ||||
<td>-</td> | ||||
<td></td> | ||||
<td>Q-Block1</td> | ||||
<td>uint</td> | ||||
<td>0-3</td> | ||||
<td>(none)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>31</td> | ||||
<td>x</td> | ||||
<td>x</td> | ||||
<td>-</td> | ||||
<td>x</td> | ||||
<td>Q-Block2</td> | ||||
<td>uint</td> | ||||
<td>0-3</td> | ||||
<td>(none)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The Q-Block1 and Q-Block2 options can be present in both the | ||||
request and response messages. The Q-Block1 option pertains to the | ||||
request payload, and the Q-Block2 option pertains to the response | ||||
payload. When the Content-Format option is present together with the | ||||
Q-Block1 or Q-Block2 option, the option applies to the body, not to the | ||||
payload (i.e., it must be the same for all payloads of the same | payload (i.e., it must be the same for all payloads of the same | |||
body).</t> | body).</t> | |||
<t>The Q-Block1 option is useful with the payload-bearing (e.g., POST, | ||||
<t>The Q-Block1 Option is useful with the payload-bearing, e.g., POST, | PUT, FETCH, PATCH, and iPATCH) requests and their responses.</t> | |||
PUT, FETCH, PATCH, and iPATCH requests and their responses.</t> | <t>The Q-Block2 option is useful, for example, with GET, POST, PUT, FETC | |||
H, | ||||
<t>The Q-Block2 Option is useful, e.g., with GET, POST, PUT, FETCH, | ||||
PATCH, and iPATCH requests and their payload-bearing responses | PATCH, and iPATCH requests and their payload-bearing responses | |||
(response codes 2.01, 2.02, 2.04, and 2.05) (Section 5.5 of <xref | (response codes 2.01, 2.02, 2.04, and 2.05) (<xref target="RFC7252" sect | |||
target="RFC7252"></xref>).</t> | ion="5.5" sectionFormat="of" format="default"/>).</t> | |||
<t>A CoAP endpoint (or proxy) <bcp14>MUST</bcp14> support either both or | ||||
<t>A CoAP endpoint (or proxy) MUST support either both or neither of | neither of | |||
the Q-Block1 and Q-Block2 Options.</t> | the Q-Block1 and Q-Block2 options.</t> | |||
<t>If the Q-Block1 option is present in a request or the Q-Block2 | ||||
<t>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 | |||
Option is returned in a response, this indicates a block-wise transfer | ||||
and describes how this specific block-wise payload forms part of the | and 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.</t> | formed or was processed.</t> | |||
<t>To indicate support for Q-Block2 responses, the CoAP client <bcp14>MU | ||||
<t>To indicate support for Q-Block2 responses, the CoAP client MUST | ST</bcp14> | |||
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., FETCH), t | |||
example), the Q-Block2 Option in a PUT or similar request (POST, for | he | |||
example), or the Q-Block1 Option in a PUT or similar request so that | Q-Block2 option in a PUT or similar request (e.g., POST), or the Q-Block1 | |||
option in a PUT or similar request so that | ||||
the server knows that the client supports this Q-Block functionality | the server knows that the client supports this Q-Block functionality | |||
should it need to send back a body that spans multiple payloads. | should it need to send back a body that spans multiple payloads. | |||
Otherwise, the server would use the Block2 Option (if supported) to | Otherwise, the server would use the Block2 option (if supported) to | |||
send back a message body that is too large to fit into a single IP | send back a message body that is too large to fit into a single IP | |||
packet <xref target="RFC7959"></xref>.</t> | packet <xref target="RFC7959" format="default"/>.</t> | |||
<t>How a client decides whether it needs to include a Q-Block1 or | <t>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 are out of the scope of the document.</t> | considerations are out of the scope of this document.</t> | |||
<t>Implementation of the Q-Block1 and Q-Block2 options is intended to | ||||
<t>Implementation of the Q-Block1 and Q-Block2 Options is intended to | be optional. However, when a Q-Block1 or Q-Block2 option is present in a | |||
be optional. However, when it is present in a CoAP message, it MUST be | CoAP | |||
processed (or the message rejected). Therefore, Q-Block1 and Q-Block2 | message, it <bcp14>MUST</bcp14> be | |||
Options are identified as Critical options.</t> | processed (or the message rejected). Therefore, the Q-Block1 and Q-Block | |||
2 | ||||
options are identified as critical options.</t> | ||||
<t>With CoAP over UDP, the way a request message is rejected for | <t>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 <xref target="RFC7252"></xref>). A | Option) response (<xref target="RFC7252" section="5.4.1" sectionFormat=" | |||
of" | ||||
format="default"/>). A | ||||
Non-confirmable message with an unrecognized critical option is either | Non-confirmable message with an unrecognized critical option is either | |||
rejected with a Reset message or just silently ignored (Sections 5.4.1 | rejected with a Reset message or just silently ignored (Sections <xref | |||
and 4.3 of <xref target="RFC7252"></xref>). To reliably get a | target="RFC7252" section="5.4.1" sectionFormat="bare"/> | |||
rejection message, it is therefore REQUIRED that clients use a | and <xref target="RFC7252" section="4.3" sectionFormat="bare"/> of <xref | |||
Confirmable message for determining support for Q-Block1 and Q-Block2 | target="RFC7252" format="default"/>). To reliably get a | |||
Options. This CON message can be sent under the base CoAP congestion | rejection message, it is therefore <bcp14>REQUIRED</bcp14> that clients | |||
control setup specified in Section 4.7 of <xref | use a | |||
target="RFC7252"></xref> (that is, NSTART does not need to be | Confirmable message for determining support for the Q-Block1 and Q-Block | |||
increased (<xref target="cc-con"></xref>)).</t> | 2 | |||
options. This Confirmable message can be sent under the base CoAP conges | ||||
<t>The Q-Block1 and Q-Block2 Options are unsafe to forward. That is, a | tion | |||
CoAP proxy that does not understand the Q-Block1 (or Q-Block2) Option | control setup specified in <xref target="RFC7252" section="4.7" | |||
must reject the request or response that uses either option (See | sectionFormat="of" format="default"/> (that is, NSTART does not need to b | |||
Section 5.7.1 of <xref target="RFC7252"></xref>).</t> | e | |||
increased (<xref target="cc-con" format="default"/>)).</t> | ||||
<t>The Q-Block2 Option is repeatable when requesting retransmission of | <t>The Q-Block1 and Q-Block2 options are unsafe to forward. That is, a | |||
missing blocks, but not otherwise. Except that case, any request | CoAP proxy that does not understand the Q-Block1 (or Q-Block2) option | |||
carrying multiple Q-Block1 (or Q-Block2) Options MUST be handled | must reject the request or response that uses either option (see | |||
following the procedure specified in Section 5.4.5 of <xref | <xref target="RFC7252" section="5.7.1" sectionFormat="of" format="defaul | |||
target="RFC7252"></xref>.</t> | t"/>).</t> | |||
<t>The Q-Block2 option is repeatable when requesting retransmission of | ||||
<t>The Q-Block1 and Q-Block2 Options, like the Block1 and Block2 | missing blocks but not otherwise. Except for that case, any request | |||
Options, are of both class E and class U for OSCORE processing (Table | carrying multiple Q-Block1 (or Q-Block2) options <bcp14>MUST</bcp14> be | |||
2). The Q-Block1 (or Q-Block2) Option MAY be an Inner or Outer option | handled | |||
(Section 4.1 of <xref target="RFC8613"></xref>). The Inner and Outer | following the procedure specified in <xref target="RFC7252" section="5.4 | |||
.5" | ||||
sectionFormat="of" format="default"/>.</t> | ||||
<t>The Q-Block1 and Q-Block2 options, like the Block1 and Block2 | ||||
options, are of both class E and class U for OSCORE processing (<xref | ||||
target="oscore" format="default"/>). The Q-Block1 (or Q-Block2) option | ||||
<bcp14>MAY</bcp14> be an Inner or Outer option | ||||
(<xref target="RFC8613" section="4.1" sectionFormat="of" format="default | ||||
"/>). The | ||||
Inner and Outer | ||||
values are therefore independent of each other. The Inner option is | values 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 and | fragmentation of requests. The Outer option is visible to proxies and | |||
labels message bodies in case of hop-by-hop fragmentation of | labels message bodies in case of hop-by-hop fragmentation of | |||
requests.</t> | requests.</t> | |||
<table align="center" anchor="oscore"> | ||||
<t><figure align="center"> | <name>OSCORE Protection of the Q-Block1 and Q-Block2 Options</name> | |||
<artwork align="center"><![CDATA[ +--------+------ | <thead> | |||
-----------+---+---+ | <tr> | |||
| Number | Name | E | U | | <th>Number</th> | |||
+========+=================+===+===+ | <th>Name</th> | |||
| TBA1 | Q-Block1 | x | x | | <th>E</th> | |||
| TBA2 | Q-Block2 | x | x | | <th>U</th> | |||
+--------+-----------------+---+---+ | </tr> | |||
Table 2: OSCORE Protection of Q-Block1 and Q-Block2 Options | </thead> | |||
]]></artwork> | <tbody> | |||
</figure></t> | <tr> | |||
<td>19</td> | ||||
<t></t> | <td>Q-Block1</td> | |||
<td>x</td> | ||||
<t>Note that if Q-Block1 or Q-Block2 Options are included in a packet | <td>x</td> | |||
as Inner options, Block1 or Block2 Options MUST NOT be included as | </tr> | |||
Inner options. Similarly, there MUST NOT be a mix of Q-Block and Block | <tr> | |||
for the Outer options. Messages that do not adhere with this behavior | <td>31</td> | |||
MUST be rejected with 4.02 (Bad Option). Q-Block and Block Options can | <td>Q-Block2</td> | |||
be mixed across Inner and Outer options as these are handled | <td>x</td> | |||
<td>x</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>Note that, if the Q-Block1 or Q-Block2 options are included in a pack | ||||
et | ||||
as Inner options, the Block1 or Block2 options <bcp14>MUST NOT</bcp14> b | ||||
e included | ||||
as Inner options. Similarly, there <bcp14>MUST NOT</bcp14> be a mix of Q- | ||||
Block and | ||||
Block options for the Outer options. Messages that do not adhere to this | ||||
behavior | ||||
<bcp14>MUST</bcp14> be rejected with a 4.02 (Bad Option). The Q-Block an | ||||
d 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, | 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 | there <bcp14>MUST NOT</bcp14> be a mix of Q-Block and Block options in t he same | |||
packet.</t> | packet.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<name>Structure of the Q-Block1 and Q-Block2 Options</name> | ||||
<t>The structure of the Q-Block1 and Q-Block2 options follows the | ||||
structure defined in <xref target="RFC7959" section="2.2" sectionFormat= | ||||
"of" | ||||
format="default"/>.</t> | ||||
<section title="Structure of Q-Block1 and Q-Block2 Options"> | <t>There is no default value for the Q-Block1 and Q-Block2 options. | |||
<t>The structure of Q-Block1 and Q-Block2 Options follows the | The absence of one of these options is equivalent to an option value of | |||
structure defined in Section 2.2 of <xref | 0 | |||
target="RFC7959"></xref>.</t> | ||||
<t>There is no default value for the Q-Block1 and Q-Block2 Options. | ||||
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 set | block is the first and only block of the transfer (block number is set | |||
to 0, M is unset). However, in contrast to the explicit value 0, which | to 0; M is unset). However, in contrast to the explicit value 0, which | |||
would indicate a size of the block (SZX) of 0, and thus a size value | 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 absence | of 16 bytes, there is no specific size implied by the absence | |||
of the option -- the size is left unspecified. (As for any uint, the | of the option -- the size is left unspecified. (As for any uint, the | |||
explicit value 0 is efficiently indicated by a zero-length option; | explicit value 0 is efficiently indicated by a zero-length option; | |||
this, therefore, is different in semantics from the absence of the | therefore, this is semantically different from the absence of the | |||
option).</t> | option.)</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Using the Q-Block1 Option "> | <name>Using the Q-Block1 Option</name> | |||
<t>The Q-Block1 Option is used when the client wants to send a large | <t>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.</t> | packet.</t> | |||
<t>When the Q-Block1 option is used, the client <bcp14>MUST</bcp14> incl | ||||
<t>When Q-Block1 Option is used, the client MUST include a Request-Tag | ude a | |||
Option <xref target="I-D.ietf-core-echo-request-tag"></xref>. The | Request-Tag option <xref target="RFC9175" format="default"/>. The | |||
Request-Tag value MUST be the same for all of the requests for the | Request-Tag value <bcp14>MUST</bcp14> be the same for all of the request | |||
s for the | ||||
body of data that is being transferred. The Request-Tag is opaque, but | body of data that is being transferred. The Request-Tag is opaque, but | |||
the client MUST ensure that it is unique for every different body of | the client <bcp14>MUST</bcp14> ensure that it is unique for every differ | |||
transmitted data.<list style="empty"> | ent body of | |||
<t>Implementation Note: It is suggested that the client treats the | transmitted data.</t> | |||
<t indent="3">Implementation Note: It is suggested that the client tre | ||||
ats 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.</t> | peers.</t> | |||
</list></t> | <t><xref target="size" format="default"/> discusses the use of the Size1 | |||
option.</t> | ||||
<t><xref target="size"></xref> discusses the use of Size1 Option.</t> | ||||
<t>For Confirmable transmission, the server continues to acknowledge | <t>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 the | Non-confirmable transmission, no response is required until either the | |||
successful receipt of the body by the server or a timer expires with | successful receipt of the body by the server or a timer expires with | |||
some of the payloads having not yet arrived. In the latter case, a | some of the payloads having not yet arrived. In the latter case, a | |||
"retransmit missing payloads" response is needed. For reliable | "retransmit missing payloads" response is needed. For reliable | |||
transports (e.g., <xref target="RFC8323"></xref>), a response is not | transports (e.g., <xref target="RFC8323" format="default"/>), a response is not | |||
required until successful receipt of the body by the server.</t> | required until successful receipt of the body by the server.</t> | |||
<t>Each individual message that carries a block of the body is treated | <t>Each individual message that carries a block of the body is treated | |||
as a new request (<xref target="token"></xref>).</t> | as a new request (<xref target="token" format="default"/>).</t> | |||
<t>The client <bcp14>MUST</bcp14> send the payloads in order of increasi | ||||
<t>The client MUST send the payloads in order of increasing block | ng block | |||
number, starting from zero, until the body is complete (subject to any | number, starting from zero, until the body is complete (subject to any | |||
congestion control (<xref target="cc"></xref>)). Any missing payloads | congestion control (<xref target="cc" format="default"/>)). In addition, | |||
requested by the server must in addition be separately transmitted | any | |||
missing payloads requested by the server must be separately transmitted | ||||
with increasing block numbers.</t> | with increasing block numbers.</t> | |||
<t>The following response codes are used:</t> | ||||
<t>The following Response Codes are used:</t> | <dl newline="true" spacing="normal"> | |||
<dt>2.01 (Created)</dt> | ||||
<t>2.01 (Created)<list style="empty"> | <dd>This response code indicates successful receipt of the entire | |||
<t>This Response Code indicates successful receipt of the entire | body and that the resource was created. The token to use <bcp14>MUST</bc | |||
body and that the resource was created. The token to use MUST be | p14> be | |||
one of the tokens that were received in a request for this | one of the tokens that were received in a request for this | |||
block-wise exchange. However, it is desirable to provide the one | block-wise exchange. However, it is desirable to provide the one | |||
used in the last received request, since that will aid any | used in the last received request, since that will aid any | |||
troubleshooting. The client should then release all of the tokens | troubleshooting. The client should then release all of the tokens | |||
used for this body. Note that the last received payload might not | used for this body. Note that the last received payload might not | |||
be the one with the highest block number.</t> | be the one with the highest block number.</dd> | |||
</list></t> | <dt>2.02 (Deleted)</dt> | |||
<dd>This response code indicates successful receipt of the entire | ||||
<t>2.02 (Deleted)<list style="empty"> | body and that the resource was deleted when using POST (<xref target="RF | |||
<t>This Response Code indicates successful receipt of the entire | C7252" | |||
body and that the resource was deleted when using POST (Section | section="5.8.2" sectionFormat="of" format="default"/>). The token to use | |||
5.8.2 <xref target="RFC7252"></xref>). The token to use MUST be | <bcp14>MUST</bcp14> be | |||
one of the tokens that were received in a request for this | one of the tokens that were received in a request for this | |||
block-wise exchange. However, it is desirable to provide the one | block-wise exchange. However, it is desirable to provide the one | |||
used in the last received request. The client should then release | used in the last received request. The client should then release | |||
all of the tokens used for this body.</t> | all of the tokens used for this body.</dd> | |||
</list></t> | <dt>2.04 (Changed)</dt> | |||
<dd>This response code indicates successful receipt of the entire | ||||
<t>2.04 (Changed)<list style="empty"> | body and that the resource was updated. The token to use <bcp14>MUST</bc | |||
<t>This Response Code indicates successful receipt of the entire | p14> be | |||
body and that the resource was updated. The token to use MUST be | one of the tokens that were received in a request for this | |||
one of the tokens that were received in a request for this | block-wise exchange. However, it is desirable to provide the one | |||
block-wise exchange. However, it is desirable to provide the one | used in the last received request. The client should then release | |||
used in the last received request. The client should then release | all of the tokens used for this body.</dd> | |||
all of the tokens used for this body.</t> | <dt>2.05 (Content)</dt> | |||
</list></t> | <dd><t>This response code indicates successful receipt of the entire | |||
FETCH request body (<xref target="RFC8132" section="2" sectionFormat="of | ||||
<t>2.05 (Content)<list style="empty"> | " format="default"/>) | |||
<t>This Response Code indicates successful receipt of the entire | and that the appropriate representation of the resource is being | |||
FETCH request body (Section 2 of <xref target="RFC8132"></xref>) | returned. The token to use <bcp14>MUST</bcp14> be one of the tokens that | |||
and that the appropriate representation of the resource is being | were | |||
returned. The token to use MUST be one of the tokens that were | received in a request for this block-wise exchange. However, it is | |||
received in a request for this block-wise exchange. However, it is | desirable to provide the one used in the last received | |||
desirable to provide the one used in the last received | request.</t> | |||
request.</t> | <t>If the FETCH request includes the Observe option, then the | |||
server <bcp14>MUST</bcp14> use the same token as used for the 2.05 (Cont | ||||
<t>If the FETCH request includes the Observe Option, then the | ent) | |||
server MUST use the same token as used for the 2.05 (Content) | response for returning any triggered Observe responses so that the | |||
response for returning any Observe triggered responses so that the | client can match them up.</t> | |||
client can match them up.</t> | <t>The client should then release all of the tokens used for this | |||
body apart from the one used for tracking an observed | ||||
<t>The client should then release all of the tokens used for this | resource.</t></dd> | |||
body apart from the one used for tracking an observed | <dt>2.31 (Continue)</dt> | |||
resource.</t> | <dd><t>This response code can be used to indicate that all of the | |||
</list></t> | blocks up to and including the Q-Block1 option block NUM (all | |||
having the M bit set) have been successfully received. The token | ||||
<t>2.31 (Continue)<list style="empty"> | to use <bcp14>MUST</bcp14> be one of the tokens that were received in a | |||
<t>This Response Code can be used to indicate that all of the | request | |||
blocks up to and including the Q-Block1 Option block NUM (all | for this latest MAX_PAYLOADS_SET block-wise exchange. However, it | |||
having the M bit set) have been successfully received. The token | is desirable to provide the one used in the last received | |||
to use MUST be one of the tokens that were received in a request | request.</t> | |||
for this latest MAX_PAYLOADS_SET block-wise exchange. However, it | <t>The client should then release all of the tokens used for this | |||
is desirable to provide the one used in the last received | MAX_PAYLOADS_SET.</t> | |||
request.</t> | <t>A response using this response code <bcp14>MUST NOT</bcp14> be genera | |||
ted for | ||||
<t>The client should then release all of the tokens used for this | every received Q-Block1 option request. It <bcp14>SHOULD</bcp14> only be | |||
MAX_PAYLOADS_SET.</t> | generated when all the payload requests are Non-confirmable and a | |||
MAX_PAYLOADS_SET has been received by the server. More details | ||||
<t>A response using this Response Code MUST NOT be generated for | about the motivations for this optimization are discussed in <xref | |||
every received Q-Block1 Option request. It SHOULD only be | target="cc-non" format="default"/>.</t> | |||
generated when all the payload requests are Non-confirmable and a | <t>This response code <bcp14>SHOULD NOT</bcp14> be generated for CON, as | |||
MAX_PAYLOADS_SET has been received by the server. More details | this may | |||
about the motivations for this optimization are discussed in <xref | cause duplicated payloads to unnecessarily be sent.</t></dd> | |||
target="cc-non"></xref>.</t> | <dt>4.00 (Bad Request)</dt> | |||
<dd>This response code <bcp14>MUST</bcp14> be returned if the request do | ||||
<t>This Response Code SHOULD NOT be generated for CON as this may | es not | |||
cause duplicated payloads to unnecessarily be sent.</t> | include a Request-Tag option or a Size1 option but does include a | |||
</list></t> | Q-Block1 option.</dd> | |||
<dt>4.02 (Bad Option)</dt> | ||||
<t>4.00 (Bad Request)<list style="empty"> | <dd>This response code <bcp14>MUST</bcp14> be returned for a Confirmable | |||
<t>This Response Code MUST be returned if the request does not | request | |||
include a Request-Tag Option or a Size1 Option but does include a | if the server does not support the Q-Block options. Note that a | |||
Q-Block1 option.</t> | Reset message may be sent in case of a Non-confirmable request.</dd> | |||
</list></t> | <dt>4.08 (Request Entity Incomplete)</dt> | |||
<dd><t>As a reminder, this response code returned without content type | ||||
<t>4.02 (Bad Option)<list style="empty"> | "application/missing-blocks+cbor-seq" (<xref target="new-format" | |||
<t>This Response Code MUST be returned for a Confirmable request | format="default"/>) is handled as in <xref target="RFC7959" section="2.9. | |||
if the server does not support the Q-Block Options. Note that a | 2" | |||
reset message may be sent in case of Non-confirmable request.</t> | sectionFormat="of" format="default"/>.</t> | |||
</list></t> | <t>This response code returned with content type | |||
"application/missing-blocks+cbor-seq" indicates that some of the | ||||
<t>4.08 (Request Entity Incomplete)<list style="empty"> | payloads are missing and need to be resent. The client then | |||
<t>As a reminder, this Response Code returned without Content-Type | retransmits the individual missing payloads using the same | |||
"application/missing-blocks+cbor-seq" (<xref | Request-Tag, Size1, and Q-Block1 options to specify the same NUM, | |||
target="new-format"></xref>) is handled as in Section 2.9.2 <xref | SZX, and M bit values as those sent initially in the original (but not | |||
target="RFC7959"></xref>.</t> | received) packets.</t> | |||
<t>The Request-Tag value to use is determined by taking the token | ||||
<t>This Response Code returned with Content-Type | in the 4.08 (Request Entity Incomplete) response, locating the | |||
"application/missing-blocks+cbor-seq" indicates that some of the | matching client request, and then using its Request-Tag.</t> | |||
payloads are missing and need to be resent. The client then | <t>The token to use in the 4.08 (Request Entity Incomplete) | |||
retransmits the individual missing payloads using the same | response <bcp14>MUST</bcp14> be one of the tokens that were received in | |||
Request-Tag, Size1, and, Q-Block1 Option to specify the same NUM, | a request | |||
SZX, and M bit as sent initially in the original, but not | for this block-wise body exchange. However, it is desirable to | |||
received, packet.</t> | provide the one used in the last received request. See <xref target="cod | |||
e" | ||||
<t>The Request-Tag value to use is determined by taking the token | format="default"/> for further information.</t> | |||
in the 4.08 (Request Entity Incomplete) response, locating the | <t>If the server has not received all the blocks of a body, but | |||
matching client request, and then using its Request-Tag.</t> | one or more NON payloads have been received, it <bcp14>SHOULD</bcp14> wa | |||
it for | ||||
<t>The token to use in the 4.08 (Request Entity Incomplete) | NON_RECEIVE_TIMEOUT (<xref target="cc-non" format="default"/>) before se | |||
response MUST be one of the tokens that were received in a request | nding | |||
for this block-wise body exchange. However, it is desirable to | a 4.08 (Request Entity Incomplete) response.</t></dd> | |||
provide the one used in the last received request. See <xref | <dt>4.13 (Request Entity Too Large)</dt> | |||
target="code"></xref> for further information.</t> | <dd><t>This response code can be returned under conditions similar to | |||
those discussed in <xref target="RFC7959" section="2.9.3" sectionFormat= | ||||
<t>If the server has not received all the blocks of a body, but | "of" | |||
one or more NON payloads have been received, it SHOULD wait for | format="default"/>.</t> | |||
NON_RECEIVE_TIMEOUT (<xref target="cc-non"></xref>) before sending | <t>This response code can be returned if there is insufficient | |||
a 4.08 (Request Entity Incomplete) response.</t> | space to create a response PDU with a block size of 16 bytes (SZX | |||
</list></t> | = 0) to send back all the response options as appropriate. In this | |||
case, the Size1 option is not included in the response.</t></dd> | ||||
<t>4.13 (Request Entity Too Large)<list style="empty"> | </dl> | |||
<t>This Response Code can be returned under similar conditions to | <t>Further considerations related to the transmission timings of the 4.0 | |||
those discussed in Section 2.9.3 of <xref | 8 | |||
target="RFC7959"></xref>.</t> | (Request Entity Incomplete) and 2.31 (Continue) response codes are | |||
discussed in <xref target="cc-non" format="default"/>.</t> | ||||
<t>This Response Code can be returned if there is insufficient | ||||
space to create a response PDU with a block size of 16 bytes (SZX | ||||
= 0) to send back all the response options as appropriate. In this | ||||
case, the Size1 Option is not included in the response.</t> | ||||
</list></t> | ||||
<t>Further considerations related to the transmission timings of 4.08 | ||||
(Request Entity Incomplete) and 2.31 (Continue) Response Codes are | ||||
discussed in <xref target="cc-non"></xref>.</t> | ||||
<t>If a server receives payloads with different Request-Tags for the | <t>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 has | |||
no way of determining which is the latest version, or which body, if | no way of determining which is the latest version or which body, if | |||
any, the client is terminating the transmission for.</t> | any, the client is terminating the transmission for.</t> | |||
<t>If the client elects to stop the transmission of a complete body, | <t>If the client elects to stop the transmission of a complete body, | |||
and absent any local policy, the client MUST "forget" all tracked | then absent any local policy, the client <bcp14>MUST</bcp14> "forget" al | |||
tokens associated with the body's Request-Tag so that a reset message | l | |||
tracked | ||||
tokens associated with the body's Request-Tag so that a Reset message | ||||
is generated for the invalid token in the 4.08 (Request Entity | 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.</t> | <bcp14>SHOULD</bcp14> delete the partial body.</t> | |||
<t>If the server receives a duplicate block with the same Request-Tag, | <t>If the server receives a duplicate block with the same Request-Tag, | |||
it MUST ignore the payload of the packet, but MUST still respond as if | it <bcp14>MUST</bcp14> ignore the payload of the packet but <bcp14>MUST< /bcp14> still respond as if | |||
the block was received for the first time.</t> | the block was received for the first time.</t> | |||
<t>A server <bcp14>SHOULD</bcp14> maintain a partial body (missing paylo | ||||
<t>A server SHOULD maintain a partial body (missing payloads) for | ads) for | |||
NON_PARTIAL_TIMEOUT (<xref target="cc-non"></xref>).</t> | NON_PARTIAL_TIMEOUT (<xref target="cc-non" format="default"/>).</t> | |||
</section> | </section> | |||
<section anchor="qblock2" numbered="true" toc="default"> | ||||
<section anchor="qblock2" title="Using the Q-Block2 Option"> | <name>Using the Q-Block2 Option</name> | |||
<t>In a request for any block number, the M bit unset indicates the | <t>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:<list style="hanging"> | different meanings based on the NUM value:</t> | |||
<t hangText="NUM is zero:">This is a request for the entire | <dl newline="false" spacing="normal"> | |||
body.</t> | <dt>NUM is zero:</dt> | |||
<dd>This is a request for the entire body.</dd> | ||||
<t | <dt>'NUM modulo MAX_PAYLOADS' is zero, while NUM is not zero:</dt> | |||
hangText="'NUM modulo MAX_PAYLOADS' is zero, while NUM is not zero:" | <dd>This is used to confirm that the current MAX_PAYLOADS_SET (the lat | |||
>This | est | |||
is 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 has | |||
number NUM). This is the 'Continue' Q-Block-2 and conceptually has | the same usage (i.e., continue sending the next set of data) as | |||
the same usage (i.e., continue sending the next set of data) as | the use of 2.31 (Continue) for Q-Block1.</dd> | |||
the use of 2.31 (Continue) for Q-Block1.</t> | <dt>Any other value of NUM:</dt> | |||
<dd>This is a request for that block and for all of the remaining bloc | ||||
<t hangText="Any other value of NUM:">This is a request for that | ks in the | |||
block and for all of the remaining blocks in the current | current MAX_PAYLOADS_SET.</dd> | |||
MAX_PAYLOADS_SET.</t> | </dl> | |||
</list></t> | <t>If the request includes multiple Q-Block2 options and these options | |||
<t>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 <bcp14>MUST</bcp14> 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.</t> | amplification attacks.</t> | |||
<t>The payloads sent back from the server as a response <bcp14>MUST</bcp | ||||
<t>The payloads sent back from the server as a response MUST all have | 14> all have | |||
the same ETag (Section 5.10.6 of <xref target="RFC7252"></xref>) for | the same ETag (<xref target="RFC7252" section="5.10.6" sectionFormat="of | |||
the same body. The server MUST NOT use the same ETag value for | " format="default"/>) for | |||
the same body. The server <bcp14>MUST NOT</bcp14> use the same ETag valu | ||||
e for | ||||
different representations of a resource.</t> | different representations of a resource.</t> | |||
<t>The ETag is opaque, but the server <bcp14>MUST</bcp14> ensure that it | ||||
<t>The ETag is opaque, but the server MUST ensure that it is unique | is unique | |||
for every different body of transmitted data.</t> | for every different body of transmitted data.</t> | |||
<t indent="3">Implementation Note: It is suggested that the server treat | ||||
<t><list style="empty"> | s the | |||
<t>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.</t> | |||
whenever a new body of data is being transmitted between | <t><xref target="size" format="default"/> discusses the use of the Size2 | |||
peers.</t> | option.</t> | |||
</list></t> | ||||
<t><xref target="size"></xref> discusses the use of Size2 Option.</t> | ||||
<t>The client may elect to request any detected missing blocks or just | <t>The client may elect to request any detected missing blocks or just | |||
ignore the partial body. This decision is implementation specific.</t> | ignore the partial body. This decision is implementation specific.</t> | |||
<t>For NON payloads, the client <bcp14>SHOULD</bcp14> wait for NON_RECEI | ||||
<t>For NON payloads, the client SHOULD wait NON_RECEIVE_TIMEOUT (<xref | VE_TIMEOUT (<xref target="cc-non" format="default"/>) after the last received pa | |||
target="cc-non"></xref>) after the last received payload before | yload before | |||
requesting retransmission of any missing blocks. Retransmission is | requesting retransmission of any missing blocks. Retransmission is | |||
requested by issuing a GET, POST, PUT, FETCH, PATCH, or iPATCH request | requested by issuing a GET, POST, PUT, FETCH, PATCH, or iPATCH request | |||
that contains one or more Q-Block2 Options that define the missing | that contains one or more Q-Block2 options that define the missing | |||
block(s). Generally the M bit on the Q-Block2 Option(s) SHOULD be | block(s). Generally, the M bit on the Q-Block2 option(s) <bcp14>SHOULD</ | |||
unset, although the M bit MAY be set to request this and later blocks | bcp14> be | |||
from this MAX_PAYLOADS_SET, see <xref target="sec-nonb411"></xref> for | unset, although the M bit <bcp14>MAY</bcp14> be set to request this and | |||
later | ||||
blocks | ||||
from this MAX_PAYLOADS_SET; see <xref target="sec-nonb411" format="defau | ||||
lt"/> for | ||||
an example of this in operation. Further considerations related to the | an example of this in operation. Further considerations related to the | |||
transmission timing for missing requests are discussed in <xref | transmission timing for missing requests are discussed in <xref target=" | |||
target="cc-non"></xref>.</t> | cc-non" format="default"/>.</t> | |||
<t>The missing block numbers requested by the client <bcp14>MUST</bcp14> | ||||
<t>The missing block numbers requested by the client MUST have an | 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 <bcp14>SHOULD</bcp14> respond with a 4.00 (Bad Re | |||
quest) 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.</t> | remove them. This also helps with troubleshooting.</t> | |||
<t>If the client receives a duplicate block with the same ETag, it | <t>If the client receives a duplicate block with the same ETag, it | |||
MUST silently ignore the payload.</t> | <bcp14>MUST</bcp14> silently ignore the payload.</t> | |||
<t>A client <bcp14>SHOULD</bcp14> maintain a partial body (missing paylo | ||||
<t>A client SHOULD maintain a partial body (missing payloads) for | ads) for | |||
NON_PARTIAL_TIMEOUT (<xref target="cc-non"></xref>) or as defined by | NON_PARTIAL_TIMEOUT (<xref target="cc-non" format="default"/>) or as def | |||
the Max-Age Option (or its default of 60 seconds (Section 5.6.1 of | ined by | |||
<xref target="RFC7252"></xref>)), whichever is the less. On release of | the Max-Age option (or its default of 60 seconds (<xref target="RFC7252" | |||
section="5.6.1" sectionFormat="of" format="default"/>)), whichever is les | ||||
s. | ||||
On release of | ||||
the partial body, the client should then release all of the tokens | the partial body, the client should then release all of the tokens | |||
used for this body apart from the token that is used to track a | used for this body apart from the token that is used to track a | |||
resource that is being observed.</t> | resource that is being observed.</t> | |||
<t>The ETag option should not be used in the request for missing | ||||
<t>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 | |||
blocks as the server could respond with a 2.03 (Valid) response with | ||||
no payload. It can be used in the request if the client wants to check | no payload. It can be used in the request if the client wants to check | |||
the freshness of the locally cached body response.</t> | the freshness of the locally cached body response.</t> | |||
<t>The server <bcp14>SHOULD</bcp14> maintain a cached copy of the body w | ||||
<t>The server SHOULD maintain a cached copy of the body when using the | hen using the | |||
Q-Block2 Option to facilitate retransmission of any missing | Q-Block2 option to facilitate retransmission of any missing | |||
payloads.</t> | payloads.</t> | |||
<t>If the server detects partway through a body transfer that the | ||||
<t>If the server detects part way 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 <bcp14>MUST</bcp14> be responded to us | |||
latest ETag and Size2 Option values with the updated data.</t> | ing the | |||
latest ETag and Size2 option values with the updated data.</t> | ||||
<t>If the server responds during a body update with a different ETag | <t>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.</t> | specifying Q-Block2 with block number '0' and the M bit set.</t> | |||
<t>If the server transmits a new body of data (e.g., a triggered | <t>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 | Observe notification) with a new ETag to the same client as an | |||
additional response, the client should remove any partially received | additional response, the client should remove any partially received | |||
body held for a previous ETag for that resource as it is unlikely the | body held for a previous ETag for that resource, as it is unlikely the | |||
missing blocks can be retrieved.</t> | missing blocks can be retrieved.</t> | |||
<t>If there is insufficient space to create a response PDU with a | <t>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 | block size of 16 bytes (SZX = 0) to send back all the response options | |||
as appropriate, a 4.13 (Request Entity Too Large) is returned without | as appropriate, a 4.13 (Request Entity Too Large) is returned without | |||
the Size1 Option.</t> | the Size1 option.</t> | |||
<t>For Confirmable traffic, the server typically acknowledges the | <t>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 payload and then | |||
sends the subsequent payloads of the MAX_PAYLOADS_SET as CON | sends the subsequent payloads of the MAX_PAYLOADS_SET as CON | |||
responses. These CON responses are individually ACKed by the client. | responses. These CON responses are individually ACKed by the client. | |||
The server will detect failure to send a packet and SHOULD terminate | The server will detect failure to send a packet and <bcp14>SHOULD</bcp14 > terminate | |||
the body transfer, but the client can issue, after a MAX_TRANSMIT_SPAN | the body transfer, but the client can issue, after a MAX_TRANSMIT_SPAN | |||
delay, a separate GET, POST, PUT, FETCH, PATCH, or iPATCH for any | delay, a separate GET, POST, PUT, FETCH, PATCH, or iPATCH for any | |||
missing blocks as needed.</t> | missing blocks as needed.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Using Observe Option"> | <name>Using the Observe Option</name> | |||
<t>For a request that uses Q-Block1, the Observe value <xref | <t>For a request that uses Q-Block1, the Observe value <xref target="RFC | |||
target="RFC7641"></xref> MUST be the same for all the payloads of the | 7641" format="default"/> <bcp14>MUST</bcp14> be the same for all the payloads of | |||
the | ||||
same body. This includes any missing payloads that are | same body. This includes any missing payloads that are | |||
retransmitted.</t> | retransmitted.</t> | |||
<t>For a response that uses Q-Block2, the Observe value <bcp14>MUST</bcp | ||||
<t>For a response that uses Q-Block2, the Observe value MUST be the | 14> be the | |||
same for all the payloads of the same body. This is different from | same for all the payloads of the same body. This is different from | |||
Block2 usage where the Observe value is only present in the first | Block2 usage where the Observe value is only present in the first | |||
block (Section 3.4 of <xref target="RFC7959"></xref>). This includes | block (<xref target="RFC7959" section="3.4" sectionFormat="of" format="d efault"/>). This includes | |||
payloads transmitted following receipt of the 'Continue' Q-Block2 | payloads transmitted following receipt of the 'Continue' Q-Block2 | |||
Option (<xref target="qblock2"></xref>) by the server. If a missing | option (<xref target="qblock2" format="default"/>) by the server. If a m issing | |||
payload is requested by a client, then both the request and response | payload is requested by a client, then both the request and response | |||
MUST NOT include the Observe Option.</t> | <bcp14>MUST NOT</bcp14> include the Observe option.</t> | |||
</section> | </section> | |||
<section anchor="size" numbered="true" toc="default"> | ||||
<section anchor="size" title="Using Size1 and Size2 Options"> | <name>Using the Size1 and Size2 Options</name> | |||
<t>Section 4 of <xref target="RFC7959"></xref> defines two CoAP | <t><xref target="RFC7959" section="4" sectionFormat="of" format="default | |||
"/> defines two CoAP | ||||
options: Size1 for indicating the size of the representation | options: Size1 for indicating the size of the representation | |||
transferred in requests and Size2 for indicating the size of the | transferred in requests and Size2 for indicating the size of the | |||
representation transferred in responses.</t> | representation transferred in responses.</t> | |||
<t>For the Q-Block1 and Q-Block2 options, the Size1 or Size2 option valu | ||||
<t>For Q-Block1 and Q-Block2 Options, the Size1 or Size2 Option values | es | |||
MUST exactly represent the size of the data on the body so that any | <bcp14>MUST</bcp14> exactly represent the size of the data on the body s | |||
o that any | ||||
missing data can easily be determined.</t> | missing data can easily be determined.</t> | |||
<t>The Size1 option <bcp14>MUST</bcp14> be used with the Q-Block1 option | ||||
<t>The Size1 Option MUST be used with the Q-Block1 Option when used in | when used in | |||
a request and MUST be present in all payloads of the request, | a request and <bcp14>MUST</bcp14> be present in all payloads of the requ | |||
preserving the same value. The Size2 Option MUST be used with the | est, | |||
Q-Block2 Option when used in a response and MUST be present in all | preserving the same value. The Size2 option <bcp14>MUST</bcp14> be used | |||
with the | ||||
Q-Block2 option when used in a response and <bcp14>MUST</bcp14> be prese | ||||
nt in all | ||||
payloads of the response, preserving the same value.</t> | payloads of the response, preserving the same value.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Using Q-Block1 and Q-Block2 Options Together"> | <name>Using the Q-Block1 and Q-Block2 Options Together</name> | |||
<t>The behavior is similar to the one defined in Section 3.3 of <xref | <t>The behavior is similar to the one defined in <xref target="RFC7959" | |||
target="RFC7959"></xref> with Q-Block1 substituted for Block1 and | section="3.3" sectionFormat="of" format="default"/> with Q-Block1 substituted fo | |||
Q-Block2 for Block2.</t> | r Block1 and | |||
Q-Block2 substituted for Block2.</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Using Q-Block2 Option With Multicast"> | <name>Using the Q-Block2 Option with Multicast</name> | |||
<t>Servers MUST ignore multicast requests that contain the Q-Block2 | <t>Servers <bcp14>MUST</bcp14> ignore multicast requests that contain th | |||
Option. As a reminder, Block2 Option can be used as stated in Section | e Q-Block2 | |||
2.8 of <xref target="RFC7959"></xref>.</t> | option. As a reminder, the Block2 option can be used as stated in <xref | |||
target="RFC7959" section="2.8" sectionFormat="of" format="default"/>.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="code" numbered="true" toc="default"> | ||||
<section anchor="code" | <name>The Use of the 4.08 (Request Entity Incomplete) Response Code</name> | |||
title="The Use of 4.08 (Request Entity Incomplete) Response Code"> | <t>The 4.08 (Request Entity Incomplete) response code has a new content ty | |||
<t>4.08 (Request Entity Incomplete) Response Code has a new Content-Type | pe | |||
"application/missing-blocks+cbor-seq" used to indicate that the server | "application/missing-blocks+cbor-seq" used to indicate that the server | |||
has not received all of the blocks of the request body that it needs to | has not received all of the blocks of the request body that it needs to | |||
proceed. Such messages must not be treated by the client as a fatal | proceed. Such messages must not be treated by the client as a fatal | |||
error.</t> | error.</t> | |||
<t>Likely causes are the client has not sent all blocks, some blocks | <t>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 | |||
sufficiently long ago that the server has already discarded them.</t> | a long enough time ago that the server has already discarded them.</t> | |||
<t>The new data payload of the 4.08 (Request Entity Incomplete) response | <t>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 a CBOR Sequence <xref target="RFC8742"></xref>. It comprises | encoded as a Concise Binary Object Representation (CBOR) Sequence <xref | |||
target="RFC8742" format="default"/>. It comprises | ||||
one or more missing block numbers encoded as CBOR unsigned integers | one or more missing block numbers encoded as CBOR unsigned integers | |||
<xref target="RFC8949"></xref>. The missing block numbers MUST be unique | <xref target="RFC8949" format="default"/>. The missing block numbers <bcp1 4>MUST</bcp14> be unique | |||
in each 4.08 (Request Entity Incomplete) response when created by the | in each 4.08 (Request Entity Incomplete) response when created by the | |||
server; the client MUST ignore any duplicates in the same 4.08 (Request | server; the client <bcp14>MUST</bcp14> ignore any duplicates in the same 4 .08 (Request | |||
Entity Incomplete) response.</t> | Entity Incomplete) response.</t> | |||
<t>The Content-Format option (<xref target="RFC7252" section="5.10.3" sect | ||||
ionFormat="of" format="default"/>) <bcp14>MUST</bcp14> be used in the 4.08 (Requ | ||||
est Entity | ||||
Incomplete) response. It <bcp14>MUST</bcp14> be set to | ||||
"application/missing-blocks+cbor-seq" (<xref target="new-format" format="d | ||||
efault"/>).</t> | ||||
<t>The Concise Data Definition Language (CDDL) <xref target="RFC8610" form | ||||
at="default"/> | ||||
(and see <xref target="RFC8742" section="4.1" sectionFormat="of" | ||||
format="default"/>) for the data describing these missing blocks is as fol | ||||
lows:</t> | ||||
<t>The Content-Format Option (Section 5.10.3 of <xref | <figure anchor="cddl"> | |||
target="RFC7252"></xref>) MUST be used in the 4.08 (Request Entity | <name>Structure of the Missing Blocks Payload</name> | |||
Incomplete) response. It MUST be set to | <sourcecode type="cddl"><![CDATA[ | |||
"application/missing-blocks+cbor-seq" (<xref | ; This defines an array, the elements of which are to be used | |||
target="new-format"></xref>).</t> | ||||
<t>The Concise Data Definition Language <xref target="RFC8610"></xref> | ||||
(and see Section 4.1 <xref target="RFC8742"></xref>) for the data | ||||
describing these missing blocks is as follows:</t> | ||||
<figure align="center" anchor="cddl" | ||||
title="Structure of the Missing Blocks Payload"> | ||||
<artwork align="center"><![CDATA[; This defines an array, the elements o | ||||
f 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 | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>This CDDL syntax <bcp14>MUST</bcp14> be followed.</t> | ||||
<t>This CDDL syntax MUST be followed.</t> | ||||
<t>It is desirable that the token to use for the response is the token | <t>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 same | Request-Tag value. Note that the use of any received token with the same | |||
Request-Tag would be acceptable, but providing the one used in the last | Request-Tag would be acceptable, but providing the one used in the last | |||
received payload will aid any troubleshooting. The client will use the | received payload will aid any troubleshooting. The client will use the | |||
token to determine what was the previously sent request to obtain the | token to determine what was the previously sent request to obtain the | |||
Request-Tag value that was used.</t> | Request-Tag value that was used.</t> | |||
<t>If the size of the 4.08 (Request Entity Incomplete) response packet | <t>If the size of the 4.08 (Request Entity Incomplete) response packet | |||
is larger than that defined by Section 4.6 <xref | is larger than that defined by <xref target="RFC7252" section="4.6" | |||
target="RFC7252"></xref>, then the number of reported missing blocks | sectionFormat="of" format="default"/>, then the number of reported missing | |||
MUST be limited so that the response can fit into a single packet. If | blocks | |||
<bcp14>MUST</bcp14> be limited so that the response can fit into a single | ||||
packet. If | ||||
this is the case, then the server can send subsequent 4.08 (Request | this is the case, then the server can send subsequent 4.08 (Request | |||
Entity Incomplete) responses containing the missing other blocks on | Entity Incomplete) responses containing those additional missing blocks on | |||
receipt of a new request providing a missing payload with the same | receipt of a new request providing a missing payload with the same | |||
Request-Tag.</t> | Request-Tag.</t> | |||
<t>The missing blocks <bcp14>MUST</bcp14> be reported in ascending order w | ||||
<t>The missing blocks MUST be reported in ascending order without any | ithout any | |||
duplicates. The client SHOULD silently drop 4.08 (Request Entity | duplicates. The client <bcp14>SHOULD</bcp14> silently drop 4.08 (Request E | |||
Incomplete) responses not adhering with this behavior.</t> | ntity | |||
Incomplete) responses not adhering to this behavior.</t> | ||||
<t><list style="hanging"> | <t indent="3">Implementation Note: Consider limiting the number of | |||
<t hangText="Implementation Note:">Consider limiting the number of | missing payloads to MAX_PAYLOADS to minimize the need for congestion contr | |||
missing payloads to MAX_PAYLOADS to minimize congestion control | ol. | |||
being needed. The CBOR sequence does not include any array | The CBOR Sequence does not include any array | |||
wrapper.</t> | wrapper.</t> | |||
</list></t> | <t>A 4.08 (Request Entity Incomplete) response with content type | |||
"application/missing-blocks+cbor-seq" <bcp14>SHOULD NOT</bcp14> be used wh | ||||
<t>The 4.08 (Request Entity Incomplete) with Content-Type | en using | |||
"application/missing-blocks+cbor-seq" SHOULD NOT be used when using | Confirmable requests or a reliable connection <xref target="RFC8323" forma | |||
Confirmable requests or a reliable connection <xref | t="default"/>, as the client will be able to determine that | |||
target="RFC8323"></xref> as the client will be able to determine that | ||||
there is a transmission failure of a particular payload and hence that | there is a transmission failure of a particular payload and hence that | |||
the server is missing that payload.</t> | the server is missing that payload.</t> | |||
</section> | </section> | |||
<section anchor="token" numbered="true" toc="default"> | ||||
<section anchor="token" title="The Use of Tokens"> | <name>The Use of Tokens</name> | |||
<t>Each new request generally uses a new Token (and sometimes must, see | <t>Each new request generally uses a new Token (and sometimes must; see | |||
Section 4 of <xref target="I-D.ietf-core-echo-request-tag"></xref>). | <xref target="RFC9175" section="4" sectionFormat="of" format="default"/>). | |||
Additional responses to a request all use the token of the request they | Additional responses to a request all use the token of the request they | |||
respond to.</t> | respond to.</t> | |||
<t indent="3">Implementation Note: By using 8-byte tokens, it is | ||||
<t><list style="hanging"> | possible to easily minimize the number of tokens that have to be | |||
<t hangText="Implementation Note:">By using 8-byte tokens, it is | tracked by clients, by keeping the bottom 32 bits the same for the | |||
possible to easily minimize the number of tokens that have to be | same body and the upper 32 bits containing the current body's | |||
tracked by clients, by keeping the bottom 32 bits the same for the | request number (incrementing every request, including every | |||
same body and the upper 32 bits containing the current body's | retransmit). This alleviates the client's need to keep | |||
request number (incrementing every request, including every | all the per-request state, e.g., per <xref target="RFC8974" section="3" se | |||
re-transmit). This allows the client to be alleviated from keeping | ctionFormat="of" format="default"/>. However, if using NoSec, <xref target="RFC8 | |||
all the per-request-state, e.g., in Section 3 of <xref | 974" section="5.2" sectionFormat="of" format="default"/> needs to be considered | |||
target="RFC8974"></xref>. However, if using NoSec, Section 5.2 of | for security | |||
<xref target="RFC8974"></xref> needs to be considered for security | implications.</t> | |||
implications.</t> | ||||
</list></t> | ||||
</section> | </section> | |||
<section anchor="cc" numbered="true" toc="default"> | ||||
<section anchor="cc" title="Congestion Control for Unreliable Transports"> | <name>Congestion Control for Unreliable Transports</name> | |||
<t>The transmission of all the blocks of a single body over an | <t>The transmission of all the blocks of a single body over an | |||
unreliable transport MUST either all be Confirmable or all be | unreliable transport <bcp14>MUST</bcp14> either all be Confirmable or all be | |||
Non-confirmable. This is meant to simplify the congestion control | Non-confirmable. This is meant to simplify the congestion control | |||
procedure.</t> | procedure.</t> | |||
<t>As a reminder, there is no need for CoAP-specific congestion control | <t>As a reminder, there is no need for CoAP-specific congestion control | |||
for reliable transports <xref target="RFC8323"></xref>.</t> | for reliable transports <xref target="RFC8323" format="default"/>.</t> | |||
<section anchor="cc-con" numbered="true" toc="default"> | ||||
<section anchor="cc-con" title="Confirmable (CON)"> | <name>Confirmable (CON)</name> | |||
<t>Congestion control for CON requests and responses is specified in | <t>Congestion control for CON requests and responses is specified in | |||
Section 4.7 of <xref target="RFC7252"></xref>. In order to benefit | <xref target="RFC7252" section="4.7" sectionFormat="of" format="default" />. In order to benefit | |||
from faster transmission rates, NSTART will need to be increased from | from faster transmission rates, NSTART will need to be increased from | |||
1. However, the other CON congestion control parameters will need to | 1. However, the other CON congestion control parameters will need to | |||
be tuned to cover this change. This tuning is not specified in this | be tuned to cover this change. This tuning is not specified in this | |||
document, given that the applicability scope of the current | document, given that the applicability scope of the current | |||
specification assumes that all requests and responses using Q-Block1 | specification assumes that all requests and responses using Q-Block1 | |||
and Q-Block2 will be Non-confirmable (<xref target="scope"></xref>) | and Q-Block2 will be Non-confirmable (<xref target="scope" format="defau lt"/>) | |||
apart from the initial Q-Block functionality negotiation.</t> | apart from the initial Q-Block functionality negotiation.</t> | |||
<t>Following the failure to transmit a packet due to packet loss after | <t>Following the failure to transmit a packet due to packet loss after | |||
MAX_TRANSMIT_SPAN time (Section 4.8.2 of <xref | MAX_TRANSMIT_SPAN time (<xref target="RFC7252" section="4.8.2" sectionFo | |||
target="RFC7252"></xref>), it is implementation specific as to whether | rmat="of" format="default"/>), it is implementation specific as to whether | |||
there should be any further requests for missing data.</t> | there should be any further requests for missing data.</t> | |||
</section> | </section> | |||
<section anchor="cc-non" numbered="true" toc="default"> | ||||
<section anchor="cc-non" title="Non-confirmable (NON)"> | <name>Non-confirmable (NON)</name> | |||
<t>This document introduces new parameters MAX_PAYLOADS, NON_TIMEOUT, | <t>This document introduces the new parameters MAX_PAYLOADS, NON_TIMEOUT | |||
, | ||||
NON_TIMEOUT_RANDOM, NON_RECEIVE_TIMEOUT, NON_MAX_RETRANSMIT, | NON_TIMEOUT_RANDOM, NON_RECEIVE_TIMEOUT, NON_MAX_RETRANSMIT, | |||
NON_PROBING_WAIT, and NON_PARTIAL_TIMEOUT primarily for use with NON | NON_PROBING_WAIT, and NON_PARTIAL_TIMEOUT primarily for use with NON | |||
(Table 3).<list style="empty"> | (<xref target="congestion" format="default"/>).</t> | |||
<t>Note: Randomness may naturally be provided based on the traffic | <t indent="3">Note: Randomness may naturally be provided based on the tr | |||
profile, how PROBING_RATE is computed (as this is an average), and | affic | |||
when the peer responds. Randomness is explicitly added for some of | profile, how PROBING_RATE is computed (as this is an average), and | |||
the congestion control parameters to handle situations where every | when the peer responds. Randomness is explicitly added for some of | |||
thing is in sync when retrying.</t> | the congestion control parameters to handle situations where everything | |||
</list></t> | is in sync when retrying.</t> | |||
<t>MAX_PAYLOADS should be configurable with a default value of 10. | <t>MAX_PAYLOADS should be configurable with a default value of 10. | |||
Both CoAP endpoints MUST have the same value (otherwise there will be | Both CoAP endpoints <bcp14>MUST</bcp14> have the same value (otherwise, | |||
transmission delays in one direction) and the value MAY be negotiated | there will be | |||
between the endpoints to a common value by using a higher level | transmission delays in one direction), and the value <bcp14>MAY</bcp14> | |||
be negotiated | ||||
between the endpoints to a common value by using a higher-level | ||||
protocol (out of scope of this document). This is the maximum number | protocol (out of scope of this document). This is the maximum number | |||
of payloads that can be transmitted at any one time.<list | of payloads that can be transmitted at any one time.</t> | |||
style="empty"> | <t indent="3">Note: The default value of 10 is chosen for reasons simila | |||
<t>Note: The default value of 10 is chosen for reasons similar to | r to | |||
those discussed in Section 5 of <xref target="RFC6928"></xref>, | those discussed in <xref target="RFC6928" section="5" sectionFormat="of" | |||
especially given the target application discussed in <xref | format="default"/>, | |||
target="scope"></xref>.</t> | especially given the target application discussed in <xref target="scope | |||
</list></t> | " | |||
format="default"/>.</t> | ||||
<t>NON_TIMEOUT is used to compute the delay between sending | <t>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 <xref | same value as ACK_TIMEOUT (<xref target="RFC7252" section="4.8" sectionF | |||
target="RFC7252"></xref>).</t> | ormat="of" format="default"/>).</t> | |||
<t>NON_TIMEOUT_RANDOM is the initial actual delay between sending the | <t>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 duration | used between the subsequent MAX_PAYLOADS_SETs. It is a random duration | |||
(not an integral number of seconds) between NON_TIMEOUT and | (not an integral number of seconds) between NON_TIMEOUT and | |||
(NON_TIMEOUT * ACK_RANDOM_FACTOR). ACK_RANDOM_FACTOR is set to 1.5 as | (NON_TIMEOUT * ACK_RANDOM_FACTOR). ACK_RANDOM_FACTOR is set to 1.5, as | |||
discussed in Section 4.8 of <xref target="RFC7252"></xref>.</t> | discussed in <xref target="RFC7252" section="4.8" sectionFormat="of" for | |||
mat="default"/>.</t> | ||||
<t>NON_RECEIVE_TIMEOUT is the initial time to wait for a missing | <t>NON_RECEIVE_TIMEOUT is the initial time to wait for a missing | |||
payload before requesting retransmission for the first time. Every | payload before requesting retransmission for the first time. Every | |||
time the missing payload is re-requested, the time to wait value | time the missing payload is re-requested, the Time-to-Wait value | |||
doubles. The time to wait is calculated as:<list style="empty"> | doubles. The time to wait is calculated as:</t> | |||
<t>Time-to-Wait = NON_RECEIVE_TIMEOUT * (2 ** (Re-Request-Count - | <t indent="3">Time-to-Wait = NON_RECEIVE_TIMEOUT * (2 ** (Re-Request-Cou | |||
nt - | ||||
1))</t> | 1))</t> | |||
</list></t> | ||||
<t>NON_RECEIVE_TIMEOUT has a default value of twice NON_TIMEOUT. | <t>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 <bcp14>MUST</bcp14> always be greater than NON_TIMEO UT_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.</t> | receiver times out.</t> | |||
<t>NON_MAX_RETRANSMIT is the maximum number of times a request for the | <t>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 consider | the remote peer. After this occurs, the local endpoint <bcp14>SHOULD</bc | |||
the body stale, remove any body, and release Tokens and Request-Tag on | p14> consider | |||
the body stale, remove any body, and release the tokens and Request-Tag | ||||
on | ||||
the client (or the ETag on the server). By default, NON_MAX_RETRANSMIT | the client (or the ETag on the server). By default, NON_MAX_RETRANSMIT | |||
has the same value as MAX_RETRANSMIT (Section 4.8 of <xref | has the same value as MAX_RETRANSMIT (<xref target="RFC7252" section="4. | |||
target="RFC7252"></xref>).</t> | 8" sectionFormat="of" format="default"/>).</t> | |||
<t>NON_PROBING_WAIT is used to limit the potential wait needed when | <t>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 way | |||
similar way as EXCHANGE_LIFETIME (Section 4.8.2 of <xref | similar to EXCHANGE_LIFETIME (<xref target="RFC7252" section="4.8.2" sec | |||
target="RFC7252"></xref>) but with ACK_TIMEOUT, MAX_RETRANSMIT, and | tionFormat="of" format="default"/>) but with ACK_TIMEOUT, MAX_RETRANSMIT, and | |||
PROCESSING_DELAY substituted with NON_TIMEOUT, NON_MAX_RETRANSMIT, and | PROCESSING_DELAY substituted with NON_TIMEOUT, NON_MAX_RETRANSMIT, and | |||
NON_TIMEOUT_RANDOM, respectively:<list style="empty"> | NON_TIMEOUT_RANDOM, respectively:</t> | |||
<t>NON_PROBING_WAIT = NON_TIMEOUT * ((2 ** NON_MAX_RETRANSMIT) - | <t indent="3">NON_PROBING_WAIT = NON_TIMEOUT * ((2 ** NON_MAX_RETRANSMIT | |||
1) * ACK_RANDOM_FACTOR + (2 * MAX_LATENCY) + | ) - | |||
NON_TIMEOUT_RANDOM</t> | 1) * ACK_RANDOM_FACTOR + (2 * MAX_LATENCY) + NON_TIMEOUT_RANDOM</t> | |||
</list></t> | ||||
<t>NON_PARTIAL_TIMEOUT is used for expiring partially received bodies. | <t>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 <xref target="RFC7252"></xref>) | EXCHANGE_LIFETIME (<xref target="RFC7252" section="4.8.2" sectionFormat= "of" format="default"/>) | |||
but with ACK_TIMEOUT and MAX_RETRANSMIT substituted with NON_TIMEOUT | but with ACK_TIMEOUT and MAX_RETRANSMIT substituted with NON_TIMEOUT | |||
and NON_MAX_RETRANSMIT, respectively:<list style="empty"> | and NON_MAX_RETRANSMIT, respectively:</t> | |||
<t>NON_PARTIAL_TIMEOUT = NON_TIMEOUT * ((2 ** NON_MAX_RETRANSMIT) | <t indent="3">NON_PARTIAL_TIMEOUT = NON_TIMEOUT * ((2 ** NON_MAX_RETRANS | |||
- 1) * ACK_RANDOM_FACTOR + (2 * MAX_LATENCY) + NON_TIMEOUT</t> | MIT) | |||
</list></t> | - 1) * ACK_RANDOM_FACTOR + (2 * MAX_LATENCY) + NON_TIMEOUT</t> | |||
<table align="center" anchor="congestion"> | ||||
<t><figure align="center"> | <name>Congestion Control Parameters</name> | |||
<artwork align="center"><![CDATA[+---------------------+------------ | <thead> | |||
-------+ | <tr> | |||
| Parameter Name | Default Value | | <th>Parameter Name</th> | |||
+=====================+===================+ | <th>Default Value</th> | |||
| MAX_PAYLOADS | 10 | | </tr> | |||
| NON_MAX_RETRANSMIT | 4 | | </thead> | |||
| NON_TIMEOUT | 2 s | | <tbody> | |||
| NON_TIMEOUT_RANDOM | between 2-3 s | | <tr> | |||
| NON_RECEIVE_TIMEOUT | 4 s | | <td>MAX_PAYLOADS</td> | |||
| NON_PROBING_WAIT | between 247-248 s | | <td>10</td> | |||
| NON_PARTIAL_TIMEOUT | 247 s | | </tr> | |||
+---------------------+-------------------+ | <tr> | |||
<td>NON_MAX_RETRANSMIT</td> | ||||
Table 3: Congestion Control Parameters]]></artwork> | <td>4</td> | |||
</figure></t> | </tr> | |||
<tr> | ||||
<td>NON_TIMEOUT</td> | ||||
<td>2 s</td> | ||||
</tr> | ||||
<tr> | ||||
<td>NON_TIMEOUT_RANDOM</td> | ||||
<td>between 2-3 s</td> | ||||
</tr> | ||||
<tr> | ||||
<td>NON_RECEIVE_TIMEOUT</td> | ||||
<td>4 s</td> | ||||
</tr> | ||||
<tr> | ||||
<td>NON_PROBING_WAIT</td> | ||||
<td>between 247-248 s</td> | ||||
</tr> | ||||
<tr> | ||||
<td>NON_PARTIAL_TIMEOUT</td> | ||||
<td>247 s</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The PROBING_RATE parameter in CoAP indicates the average data rate | <t>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 <xref target="RFC7252"></xref>), not the | PROBING_RATE (<xref target="RFC7252" section="4.7" sectionFormat="of" fo rmat="default"/>), not the | |||
individual packets. If the wait time between sending bodies that are | individual packets. If the wait time between sending bodies that are | |||
not being responded to based on PROBING_RATE exceeds NON_PROBING_WAIT, | not being responded to based on PROBING_RATE exceeds NON_PROBING_WAIT, | |||
then the wait time is limited to NON_PROBING_WAIT.<list style="empty"> | then the wait time is limited to NON_PROBING_WAIT.</t> | |||
<t>Note: For the particular DOTS application, PROBING_RATE and | <aside><t>Note: For the particular DOTS application, PROBING_RATE and | |||
other transmission parameters are negotiated between peers. Even | other transmission parameters are negotiated between peers. Even | |||
when not negotiated, the DOTS application uses customized defaults | when not negotiated, the DOTS application uses customized defaults, | |||
as discussed in Section 4.5.2 of <xref target="RFC8782"></xref>. | as discussed in <xref target="RFC9132" section="4.5.2" sectionFormat="of | |||
Note that MAX_PAYLOADS, NON_MAX_RETRANSMIT, NON_TIMEOUT, | " format="default"/>. | |||
NON_PROBING_WAIT, and NON_PARTIAL_TIMEOUT can be negotiated | Note that MAX_PAYLOADS, NON_MAX_RETRANSMIT, NON_TIMEOUT, | |||
between DOTS peers, e.g., as per <xref | NON_PROBING_WAIT, and NON_PARTIAL_TIMEOUT can be negotiated | |||
target="I-D.bosh-dots-quick-blocks"></xref>. When explicit values | between DOTS peers, e.g., as per <xref target="I-D.bosh-dots-quick-blocks | |||
are configured for NON_PROBING_WAIT and NON_PARTIAL_TIMEOUT, these | " | |||
values are used without applying any jitter.</t> | format="default"/>. When explicit values | |||
</list>Each NON 4.08 (Request Entity Incomplete) response is subject | are configured for NON_PROBING_WAIT and NON_PARTIAL_TIMEOUT, these | |||
values are used without applying any jitter.</t></aside> | ||||
<t>Each NON 4.08 (Request Entity Incomplete) response is subject | ||||
to PROBING_RATE.</t> | to PROBING_RATE.</t> | |||
<t>Each NON GET or FETCH request using a Q-Block2 option is subject to | ||||
<t>Each NON GET or FETCH request using a Q-Block2 Option is subject to | ||||
PROBING_RATE.</t> | PROBING_RATE.</t> | |||
<t>As the sending of many payloads of a single body may itself cause | <t>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 <bcp14>MUST</bcp14> be introduced be | |||
the next MAX_PAYLOADS_SET unless a 'Continue' is received from the | fore sending | |||
the next MAX_PAYLOADS_SET, unless a 'Continue' is received from the | ||||
peer for the current MAX_PAYLOADS_SET, in which case the next | peer for the current MAX_PAYLOADS_SET, in which case the next | |||
MAX_PAYLOADS_SET MAY start transmission immediately.</t> | MAX_PAYLOADS_SET <bcp14>MAY</bcp14> start transmission immediately.</t> | |||
<t indent="3">Note: Assuming 1500-byte packets and the MAX_PAYLOADS_SET | ||||
<t><list style="empty"> | having 10 payloads, this corresponds to 1500 * 10 * 8 = 120 kbits. | |||
<t>Note: Assuming 1500-byte packets and the MAX_PAYLOADS_SET | With a delay of 2 seconds between MAX_PAYLOADS_SET, this indicates | |||
having 10 payloads, this corresponds to 1500 * 10 * 8 = 120 Kbits. | an average speed requirement of 60 kbps for a single body should | |||
With a delay of 2 seconds between MAX_PAYLOADS_SET, this indicates | there be no responses. This transmission rate is further reduced | |||
an average speed requirement of 60 Kbps for a single body should | by being subject to PROBING_RATE.</t> | |||
there be no responses. This transmission rate is further reduced | ||||
by being subject to PROBING_RATE.</t> | ||||
</list></t> | ||||
<t>The sending of a set of missing blocks of a body is restricted to | <t>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.</t> | MAX_PAYLOADS_SET.</t> | |||
<t>For the Q-Block1 option, if the server responds with a 2.31 (Continue | ||||
<t>For Q-Block1 Option, if the server responds with a 2.31 (Continue) | ) | |||
Response Code for the latest payload sent, then the client can | response code for the latest payload sent, then the client can | |||
continue to send the next MAX_PAYLOADS_SET without any further delay. | continue to send the next MAX_PAYLOADS_SET without any further delay. | |||
If the server responds with a 4.08 (Request Entity Incomplete) | If the server responds with a 4.08 (Request Entity Incomplete) | |||
Response Code, then the missing payloads SHOULD be retransmitted | response code, then the missing payloads <bcp14>SHOULD</bcp14> be retran smitted | |||
before going into another NON_TIMEOUT_RANDOM delay prior to sending | before going into another NON_TIMEOUT_RANDOM delay prior to sending | |||
the next set of payloads.</t> | the next set of payloads.</t> | |||
<t>For the server receiving NON Q-Block1 requests, it <bcp14>SHOULD</bcp | ||||
<t>For the server receiving NON Q-Block1 requests, it SHOULD send back | 14> send | |||
a 2.31 (Continue) Response Code on receipt of all of the | back a 2.31 (Continue) response code on receipt of all of the | |||
MAX_PAYLOADS_SET to prevent the client unnecessarily delaying. If not | MAX_PAYLOADS_SET to prevent the client unnecessarily delaying the transf | |||
all of the MAX_PAYLOADS_SET were received, the server SHOULD delay for | er of remaing blocks. If not | |||
all of the MAX_PAYLOADS_SET were received, the server <bcp14>SHOULD</bcp | ||||
14> delay for | ||||
NON_RECEIVE_TIMEOUT (exponentially scaled based on the repeat request | NON_RECEIVE_TIMEOUT (exponentially scaled based on the repeat request | |||
count for a payload) before sending the 4.08 (Request Entity | count for a payload) before sending the 4.08 (Request Entity | |||
Incomplete) Response Code for the missing payload(s). If all of the | Incomplete) response code for the missing payload(s). If all of the | |||
MAX_PAYLOADS_SET were received and a 2.31 (Continue) had been sent, | MAX_PAYLOADS_SET were received and a 2.31 (Continue) response code had b | |||
een sent, | ||||
but no more payloads were received for NON_RECEIVE_TIMEOUT | but no more payloads were received for NON_RECEIVE_TIMEOUT | |||
(exponentially scaled), the server SHOULD send a 4.08 (Request Entity | (exponentially scaled), the server <bcp14>SHOULD</bcp14> send a 4.08 (Re quest Entity | |||
Incomplete) response detailing the missing payloads after the block | Incomplete) response detailing the missing payloads after the block | |||
number that was indicated in the sent 2.31 (Continue). If the repeated | number that was indicated in the sent 2.31 (Continue) response code. If the repeat | |||
response count of the 4.08 (Request Entity Incomplete) exceeds | response count of the 4.08 (Request Entity Incomplete) exceeds | |||
NON_MAX_RETRANSMIT, the server SHOULD discard the partial body and | NON_MAX_RETRANSMIT, the server <bcp14>SHOULD</bcp14> discard the partial body and | |||
stop requesting the missing payloads.</t> | stop requesting the missing payloads.</t> | |||
<t>It is likely that the client will start transmitting the next | <t>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 blo ck | |||
of the previous MAX_PAYLOADS_SET. On receipt of a payload from the | of the previous MAX_PAYLOADS_SET. On receipt of a payload from the | |||
next MAX_PAYLOADS_SET, the server SHOULD send a 4.08 (Request Entity | next MAX_PAYLOADS_SET, the server <bcp14>SHOULD</bcp14> send a 4.08 (Req | |||
Incomplete) Response Code indicating any missing payloads from any | uest Entity | |||
Incomplete) response code indicating any missing payloads from any | ||||
previous MAX_PAYLOADS_SET. Upon receipt of the 4.08 (Request Entity | previous MAX_PAYLOADS_SET. Upon receipt of the 4.08 (Request Entity | |||
Incomplete) Response Code, the client SHOULD send the missing payloads | Incomplete) response code, the client <bcp14>SHOULD</bcp14> send the mis | |||
before continuing to send the remainder of the MAX_PAYLOADS_SET and | sing | |||
payloads before continuing to send the remainder of the MAX_PAYLOADS_SET | ||||
and | ||||
then go into another NON_TIMEOUT_RANDOM delay prior to sending the | then go into another NON_TIMEOUT_RANDOM delay prior to sending the | |||
next MAX_PAYLOADS_SET.</t> | next MAX_PAYLOADS_SET.</t> | |||
<t>For the client receiving NON Q-Block2 responses, it <bcp14>SHOULD</bc | ||||
<t>For the client receiving NON Q-Block2 responses, it SHOULD send a | p14> send a | |||
'Continue' Q-Block2 request (<xref target="qblock2"></xref>) for the | 'Continue' Q-Block2 request (<xref target="qblock2" format="default"/>) | |||
next MAX_PAYLOADS_SET on receipt of all of the MAX_PAYLOADS_SET, to | for the | |||
prevent the server unnecessarily delaying. Otherwise the client SHOULD | next MAX_PAYLOADS_SET on receipt of all of the MAX_PAYLOADS_SET to | |||
prevent the server unnecessarily delaying the transfer of remaining bloc | ||||
ks. Otherwise, the client <bcp14>SHOULD</bcp14> | ||||
delay for NON_RECEIVE_TIMEOUT (exponentially scaled based on the | delay for NON_RECEIVE_TIMEOUT (exponentially scaled based on the | |||
repeat request count for a payload), before sending the request for | repeat request count for a payload) before sending the request for | |||
the missing payload(s). If the repeat request count for a missing | the missing payload(s). If the repeat request count for a missing | |||
payload exceeds NON_MAX_RETRANSMIT, the client SHOULD discard the | payload exceeds NON_MAX_RETRANSMIT, the client <bcp14>SHOULD</bcp14> dis card the | |||
partial body and stop requesting the missing payloads.</t> | partial body and stop requesting the missing payloads.</t> | |||
<t>The server <bcp14>SHOULD</bcp14> recognize the 'Continue' Q-Block2 re | ||||
<t>The server SHOULD recognize the 'Continue' Q-Block2 request as a | quest | |||
continue request and just continue the transmission of the body | per the definition in <xref target="qblock2" format="default"/> and just | |||
(including Observe Option, if appropriate for an unsolicited response) | continue the transmission of the body | |||
rather than as a request for the remaining missing blocks.</t> | (including the Observe option, if appropriate for an unsolicited respons | |||
e) | ||||
rather than treat 'Continue' as a request for the remaining missing bloc | ||||
ks.</t> | ||||
<t>It is likely that the server will start transmitting the next | <t>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 blo ck | |||
of the previous MAX_PAYLOADS_SET. Upon receipt of a payload from the | of the previous MAX_PAYLOADS_SET. Upon receipt of a payload from the | |||
new MAX_PAYLOADS_SET, the client SHOULD send a request indicating any | new MAX_PAYLOADS_SET, the client <bcp14>SHOULD</bcp14> send a request in dicating any | |||
missing payloads from any previous MAX_PAYLOADS_SET. Upon receipt of | missing payloads from any previous MAX_PAYLOADS_SET. Upon receipt of | |||
such request, the server SHOULD send the missing payloads before | such a request, the server <bcp14>SHOULD</bcp14> send the missing payloa ds before | |||
continuing to send the remainder of the MAX_PAYLOADS_SET and then go | continuing to send the remainder of the MAX_PAYLOADS_SET and then go | |||
into another NON_TIMEOUT_RANDOM delay prior to sending the next | into another NON_TIMEOUT_RANDOM delay prior to sending the next | |||
MAX_PAYLOADS_SET.</t> | MAX_PAYLOADS_SET.</t> | |||
<t>The client does not need to acknowledge the receipt of the entire | <t>The client does not need to acknowledge the receipt of the entire | |||
body.</t> | body.</t> | |||
<t indent="3">Note: If there is asymmetric traffic loss causing response | ||||
<t><list style="empty"> | s to | |||
<t>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.</t> | |||
receiving the body is still likely to receive the entire body.</t> | ||||
</list></t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Caching Considerations"> | <name>Caching Considerations</name> | |||
<t>Caching block based information is not straight forward in a proxy. | <t>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 that | |||
the proxy will reassemble the body (using any appropriate recovery | the proxy will reassemble the body (using any appropriate recovery | |||
options for packet loss) before passing on the body to the appropriate | options for packet loss) before passing the body onward to the appropriate | |||
CoAP endpoint. This does not preclude an implementation doing a more | CoAP endpoint. This does not preclude an implementation doing a more | |||
complex per payload caching, but how to do this is out of the scope of | complex per-payload caching, but how to do this is out of the scope of | |||
this document. The onward transmission of the body does not require the | this document. The onward transmission of the body does not require the | |||
use of the Q-Block1 or Q-Block2 Options as these options may not be | use of the Q-Block1 or Q-Block2 options, as these options may not be | |||
supported in that link. This means that the proxy must fully support the | supported in that link. This means that the proxy must fully support the | |||
Q-Block1 and Q-Block2 Options.</t> | Q-Block1 and Q-Block2 options.</t> | |||
<t>How the body is cached in the CoAP client (for Q-Block1 | <t>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.</t> | implementation specific.</t> | |||
<t>As the entire body is being cached in the proxy, the Q-Block1 and | <t>As the entire body is being cached in the proxy, the Q-Block1 and | |||
Q-Block2 Options are removed as part of the block assembly and thus do | Q-Block2 options are removed as part of the block assembly and thus do | |||
not reach the cache.</t> | not reach the cache.</t> | |||
<t>For Q-Block2 responses, the ETag option value is associated with the | ||||
<t>For Q-Block2 responses, the ETag Option value is associated with the | data (and transmitted onward to the CoAP client) but is not part of the | |||
data (and onward transmitted to the CoAP client), but is not part of the | ||||
cache key.</t> | cache key.</t> | |||
<t>For requests with the Q-Block1 option, the Request-Tag option is | ||||
<t>For requests with Q-Block1 Option, the Request-Tag Option is | associated with building the body from successive payloads but | |||
associated with the build up of the body from successive payloads, but | ||||
is not part of the cache key. For the onward transmission of the body | is not part of the cache key. For the onward transmission of the body | |||
using CoAP, a new Request-Tag SHOULD be generated and used. Ideally this | using CoAP, a new Request-Tag <bcp14>SHOULD</bcp14> be generated and used. | |||
new Request-Tag should replace the client's request Request-Tag.</t> | Ideally, | |||
this new Request-Tag should replace the Request-Tag used by the client.</t | ||||
> | ||||
<t>It is possible that two or more CoAP clients are concurrently | <t>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 first | server using the Q-Block1 (or Block1) option. If this is the case, the fir st | |||
client to complete building the body causes that body to start | client to complete building the body causes that body to start | |||
transmitting to the CoAP server with an appropriate Request-Tag value. | transmitting to the CoAP server with an appropriate Request-Tag value. | |||
When the next client completes building the body, any existing partial | When the next client completes building the body, any existing partial | |||
body transmission to the CoAP server is terminated and the new body | body transmission to the CoAP server is terminated, and the transmission o | |||
representation transmission starts with a new Request-Tag value. Note | f the | |||
new body representation starts with a new Request-Tag value. Note | ||||
that it cannot be assumed that the proxy will always receive a complete | that it cannot be assumed that the proxy will always receive a complete | |||
body from a client.</t> | body from a client.</t> | |||
<t>A proxy that supports the Q-Block2 option <bcp14>MUST</bcp14> be prepar | ||||
<t>A proxy that supports Q-Block2 Option MUST be prepared to receive a | ed to | |||
GET or similar request indicating one or more missing blocks. The proxy | receive a GET or similar request indicating one or more missing blocks. Fr | |||
will serve from its cache the missing blocks that are available in its | om its | |||
cache, the proxy will serve the missing blocks that are available in its | ||||
cache in the same way a server would send all the appropriate Q-Block2 | cache in the same way a server would send all the appropriate Q-Block2 | |||
responses. If a body matching the cache key is not available in the | responses. If a body matching the cache key is not available in the | |||
cache, the proxy MUST request the entire body from the CoAP server using | cache, the proxy <bcp14>MUST</bcp14> request the entire body from the CoAP server using | |||
the information in the cache key.</t> | the information in the cache key.</t> | |||
<t>How long a CoAP endpoint (or proxy) keeps the body in its cache is | <t>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).</t> | implementation specific (e.g., it may be based on Max-Age).</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="HTTP-Mapping Considerations"> | <name>HTTP Mapping Considerations</name> | |||
<t>As a reminder, the basic normative requirements on HTTP/CoAP mappings | <t>As a reminder, the basic normative requirements on HTTP/CoAP mappings | |||
are defined in Section 10 of <xref target="RFC7252"></xref>. The | are defined in <xref target="RFC7252" section="10" sectionFormat="of" form | |||
implementation guidelines for HTTP/CoAP mappings are elaborated in <xref | at="default"/>. The | |||
target="RFC8075"></xref>.</t> | implementation guidelines for HTTP/CoAP mappings are elaborated in <xref t | |||
arget="RFC8075" format="default"/>.</t> | ||||
<t>The rules defined in Section 5 of <xref target="RFC7959"></xref> are | <t>The rules defined in <xref target="RFC7959" section="5" sectionFormat=" | |||
of" format="default"/> are | ||||
to be followed.</t> | to be followed.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default" anchor="non-confirm"> | ||||
<section title="Examples with Non-confirmable Messages"> | <name>Examples with Non-confirmable Messages</name> | |||
<t>This section provides some sample flows to illustrate the use of | <t>This section provides some sample flows to illustrate the use of the | |||
Q-Block1 and Q-Block2 Options with NON. Examples with CON are provided | Q-Block1 and Q-Block2 options with NON. Examples with CON are provided | |||
in <xref target="CON"></xref>.</t> | in <xref target="CON" format="default"/>.</t> | |||
<t>The examples in the following subsections assume MAX_PAYLOADS is set | <t>The examples in the following subsections assume MAX_PAYLOADS is set | |||
to 10 and NON_MAX_RETRANSMIT is set to 4.</t> | to 10 and NON_MAX_RETRANSMIT is set to 4.</t> | |||
<t>The list below contains the conventions that are | ||||
<t><xref target="legend"></xref> lists the conventions that are used in | used in the figures in the following subsections.</t> | |||
the following subsections.</t> | <dl newline="false" spacing="normal" indent="7"> | |||
<dt>T:</dt> | ||||
<t><figure align="center" anchor="legend" | <dd>Token value</dd> | |||
title="Notations Used in the Figures"> | <dt>O:</dt> | |||
<artwork align="center"><![CDATA[ T: Token value | <dd>Observe option value</dd> | |||
O: Observe Option value | <dt>M:</dt> | |||
M: Message ID | <dd>Message ID</dd> | |||
RT: Request-Tag | <dt>RT:</dt> | |||
ET: ETag | <dd>Request-Tag</dd> | |||
QB1: Q-Block1 Option values NUM/More/Size | <dt>ET:</dt> | |||
QB2: Q-Block2 Option values NUM/More/Size | <dd>ETag</dd> | |||
Size: Actual block size encoded in SZX | <dt>QB1:</dt> | |||
\: Trimming long lines | <dd>Q-Block1 option values NUM/More/Size</dd> | |||
[[]]: Comments | <dt>QB2:</dt> | |||
-->X: Message loss (request) | <dd>Q-Block2 option values NUM/More/Size</dd> | |||
X<--: Message loss (response) | <dt>Size:</dt> | |||
...: Passage of time | <dd>Actual block size encoded in SZX</dd> | |||
Payload N: Corresponds to the CoAP message that conveys | <dt>\:</dt> | |||
a block number (N-1) of a given block-wise exchange. | <dd>Trimming long lines</dd> | |||
]]></artwork> | <dt>[[]]:</dt> | |||
</figure></t> | <dd>Comments</dd> | |||
<dt>-->X:</dt> | ||||
<section title="Q-Block1 Option "> | <dd>Message loss (request)</dd> | |||
<section title="A Simple Example"> | <dt>X<--:</dt> | |||
<t><xref target="B3non"></xref> depicts an example of a NON PUT | <dd>Message loss (response)</dd> | |||
request conveying Q-Block1 Option. All the blocks are received by | <dt>...:</dt> | |||
<dd>Passage of time</dd> | ||||
<dt>Payload N:</dt> | ||||
<dd>Corresponds to the CoAP message that conveys | ||||
a block number (N-1) of a given block-wise exchange.</dd> | ||||
</dl> | ||||
<section numbered="true" toc="default"> | ||||
<name>Q-Block1 Option</name> | ||||
<section numbered="true" toc="default"> | ||||
<name>A Simple Example</name> | ||||
<t><xref target="B3non" format="default"/> depicts an example of a NON | ||||
PUT | ||||
request conveying the Q-Block1 option. All the blocks are received by | ||||
the server.</t> | the server.</t> | |||
<figure anchor="B3non"> | ||||
<t><figure anchor="B3non" | <name>Example of a NON Request with the Q-Block1 option (without Los | |||
title="Example of NON Request with Q-Block1 Option (Without Loss)" | s)</name> | |||
> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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 | |||
| ... | | | ... | | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Handling MAX_PAYLOADS Limits"> | <name>Handling MAX_PAYLOADS Limits</name> | |||
<t><xref target="B3non0"></xref> depicts an example of a NON PUT | <t><xref target="B3non0" format="default"/> depicts an example of a NO | |||
request conveying Q-Block1 Option. The number of payloads exceeds | N PUT | |||
request conveying the Q-Block1 option. The number of payloads exceeds | ||||
MAX_PAYLOADS. All the blocks are received by the server.</t> | MAX_PAYLOADS. All the blocks are received by the server.</t> | |||
<figure anchor="B3non0"> | ||||
<t><figure anchor="B3non0" | <name>Example of a MAX_PAYLOADS NON Request with the Q-Block1 Option | |||
title="Example of MAX_PAYLOADS NON Request with Q-Block1 Option (W | (without | |||
ithout Loss)"> | Loss)</name> | |||
<artwork><![CDATA[ CoAP CoAP | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
Client Server | CoAP CoAP | |||
| | | Client Server | |||
+--------->| NON PUT /path M:0x01 T:0xf1 RT=10 QB1:0/1/1024 | | | | |||
+--------->| NON PUT /path M:0x02 T:0xf2 RT=10 QB1:1/1/1024 | +--------->| NON PUT /path M:0x01 T:0xf1 RT=10 QB1:0/1/1024 | |||
+--------->| [[Payloads 3 - 9 not detailed]] | +--------->| NON PUT /path M:0x02 T:0xf2 RT=10 QB1:1/1/1024 | |||
+--------->| NON PUT /path M:0x0a T:0xfa RT=10 QB1:9/1/1024 | +--------->| [[Payloads 3 - 9 not detailed]] | |||
[[MAX_PAYLOADS_SET has been received]] | +--------->| NON PUT /path M:0x0a T:0xfa RT=10 QB1:9/1/1024 | |||
| [[MAX_PAYLOADS_SET receipt acknowledged by server]] | [[MAX_PAYLOADS_SET has been received]] | |||
|<---------+ NON 2.31 M:0x81 T:0xfa | | [[MAX_PAYLOADS_SET receipt acknowledged by server]] | |||
+--------->| NON PUT /path M:0x0b T:0xfb RT=10 QB1:10/0/1024 | |<---------+ NON 2.31 M:0x81 T:0xfa | |||
|<---------+ NON 2.04 M:0x82 T:0xfb | +--------->| NON PUT /path M:0x0b T:0xfb RT=10 QB1:10/0/1024 | |||
| ... | | |<---------+ NON 2.04 M:0x82 T:0xfb | |||
| ... | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Handling MAX_PAYLOADS with Recovery"> | <name>Handling MAX_PAYLOADS with Recovery</name> | |||
<t>Consider now a scenario where a new body of data is to be sent by | <t>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 | the client, but some blocks are dropped in transmission, as | |||
illustrated in <xref target="B3non1"></xref>.</t> | illustrated in <xref target="B3non1" format="default"/>.</t> | |||
<figure anchor="B3non1"> | ||||
<t><figure anchor="B3non1" | <name>Example of a MAX_PAYLOADS NON Request with the Q-Block1 Option | |||
title="Example of MAX_PAYLOADS NON Request with Q-Block1 Option (W | (with | |||
ith Loss)"> | Loss)</name> | |||
<artwork><![CDATA[ CoAP CoAP | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
Client Server | CoAP CoAP | |||
| | | Client Server | |||
+--------->| NON PUT /path M:0x11 T:0xe1 RT=11 QB1:0/1/1024 | | | | |||
+--->X | NON PUT /path M:0x12 T:0xe2 RT=11 QB1:1/1/1024 | +--------->| NON PUT /path M:0x11 T:0xe1 RT=11 QB1:0/1/1024 | |||
+--------->| [[Payloads 3 - 8 not detailed]] | +--->X | NON PUT /path M:0x12 T:0xe2 RT=11 QB1:1/1/1024 | |||
+--------->| NON PUT /path M:0x19 T:0xe9 RT=11 QB1:8/1/1024 | +--------->| [[Payloads 3 - 8 not detailed]] | |||
+--->X | NON PUT /path M:0x1a T:0xea RT=11 QB1:9/1/1024 | +--------->| NON PUT /path M:0x19 T:0xe9 RT=11 QB1:8/1/1024 | |||
[[Some of MAX_PAYLOADS_SET have been received]] | +--->X | NON PUT /path M:0x1a T:0xea RT=11 QB1:9/1/1024 | |||
| ... | | [[Some of the MAX_PAYLOADS_SET has been received]] | |||
[[NON_TIMEOUT_RANDOM (client) delay expires]] | | ... | | |||
| [[Client starts sending next MAX_PAYLOAD_SET]] | [[NON_TIMEOUT_RANDOM (client) delay expires]] | |||
+--->X | NON PUT /path M:0x1b T:0xeb RT=11 QB1:10/1/1024 | | [[Client starts sending next MAX_PAYLOADS_SET]] | |||
+--------->| NON PUT /path M:0x1c T:0xec RT=11 QB1:11/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 | |||
| | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>On seeing a payload from the next MAX_PAYLOADS_SET, the server | ||||
<t>On seeing a payload from the next MAX_PAYLOAD_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 (<xref | MAX_PAYLOADS_SET and asks for the missing blocks in one go (<xref targ | |||
target="B3non2"></xref>). It does so by indicating which blocks from | et="B3non2" format="default"/>). It does so by indicating which blocks from | |||
the previous MAX_PAYLOADS_SET have not been received in the data | the previous MAX_PAYLOADS_SET have not been received in the data | |||
portion of the response (<xref target="code"></xref>). The token | portion of the response (<xref target="code" format="default"/>). The | |||
used in the response should be the token that was used in the last | token | |||
received payload. The client can then derive the Request-Tag by | used in the response should be the token that was used in the last rec | |||
eived | ||||
payload. The client can then derive the Request-Tag by | ||||
matching the token with the sent request.</t> | matching the token with the sent request.</t> | |||
<figure anchor="B3non2"> | ||||
<t><figure anchor="B3non2" | <name>Example of a NON Request with the Q-Block1 Option (Block Recov | |||
title="Example of NON Request with Q-Block1 Option (Blocks Recover | ery)</name> | |||
y)"> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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 | |||
| ... | | | ... | | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Handling Recovery with Failure"> | <name>Handling Recovery if Failure Occurs</name> | |||
<t><xref target="B3non3"></xref> depicts an example of a NON PUT | <t><xref target="B3non3" format="default"/> depicts an example of a NO | |||
request conveying Q-Block1 Option where recovery takes place, but | N PUT | |||
request conveying the Q-Block1 option where recovery takes place but | ||||
eventually fails.</t> | eventually fails.</t> | |||
<figure anchor="B3non3"> | ||||
<t><figure anchor="B3non3" | <name>Example of a NON Request with the Q-Block1 Option (with Eventu | |||
title="Example of NON Request with Q-Block1 Option (With Eventual | al | |||
Failure)"> | Failure)</name> | |||
<artwork><![CDATA[ CoAP CoAP | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
Client Server | CoAP CoAP | |||
| | | Client Server | |||
+--------->| NON PUT /path M:0x91 T:0xd0 RT=12 QB1:0/1/1024 | | | | |||
+--->X | NON PUT /path M:0x92 T:0xd1 RT=12 QB1:1/1/1024 | +--------->| NON PUT /path M:0x91 T:0xd0 RT=12 QB1:0/1/1024 | |||
+--------->| NON PUT /path M:0x93 T:0xd2 RT=12 QB1:2/0/1024 | +--->X | NON PUT /path M:0x92 T:0xd1 RT=12 QB1:1/1/1024 | |||
| ... | | +--------->| NON PUT /path M:0x93 T:0xd2 RT=12 QB1:2/0/1024 | |||
[[NON_RECEIVE_TIMEOUT (server) delay expires]] | | ... | | |||
| [[The server realizes a block is missing and asks | [[NON_RECEIVE_TIMEOUT (server) delay expires]] | |||
| for the missing one. Retry #1]] | | [[The server realizes a block is missing and asks | |||
|<---------+ NON 4.08 M:0x01 T:0xd2 [Missing 1] | | for the missing one. Retry #1]] | |||
| ... | | |<---------+ NON 4.08 M:0x01 T:0xd2 [Missing 1] | |||
[[2 * NON_RECEIVE_TIMEOUT (server) delay expires]] | | ... | | |||
| [[The server realizes a block is still missing and asks | [[2 * NON_RECEIVE_TIMEOUT (server) delay expires]] | |||
| for the missing one. Retry #2]] | | [[The server realizes a block is still missing and asks | |||
|<---------+ NON 4.08 M:0x02 T:0xd2 [Missing 1] | | for the missing one. Retry #2]] | |||
| ... | | |<---------+ NON 4.08 M:0x02 T:0xd2 [Missing 1] | |||
[[4 * NON_RECEIVE_TIMEOUT (server) delay expires]] | | ... | | |||
| [[The server realizes a block is still missing and asks | [[4 * NON_RECEIVE_TIMEOUT (server) delay expires]] | |||
| for the missing one. Retry #3]] | | [[The server realizes a block is still missing and asks | |||
|<---------+ NON 4.08 M:0x03 T:0xd2 [Missing 1] | | for the missing one. Retry #3]] | |||
| ... | | |<---------+ NON 4.08 M:0x03 T:0xd2 [Missing 1] | |||
[[8 * NON_RECEIVE_TIMEOUT (server) delay expires]] | | ... | | |||
| [[The server realizes a block is still missing and asks | [[8 * NON_RECEIVE_TIMEOUT (server) delay expires]] | |||
| for the missing one. Retry #4]] | | [[The server realizes a block is still missing and asks | |||
|<---------+ NON 4.08 M:0x04 T:0xd2 [Missing 1] | | for the missing one. Retry #4]] | |||
| ... | | |<---------+ NON 4.08 M:0x04 T:0xd2 [Missing 1] | |||
[[16 * NON_RECEIVE_TIMEOUT (server) delay expires]] | | ... | | |||
| [[NON_MAX_RETRANSMIT exceeded. Server stops requesting | [[16 * NON_RECEIVE_TIMEOUT (server) delay expires]] | |||
| for missing blocks and releases partial body]] | | [[NON_MAX_RETRANSMIT exceeded. Server stops requesting | |||
| ... | | | the missing blocks and releases partial body]] | |||
| ... | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Q-Block2 Option"> | <name>Q-Block2 Option</name> | |||
<t>These examples include the Observe Option to demonstrate how that | <t>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.</t> | Q-Block2.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="A Simple Example"> | <name>A Simple Example</name> | |||
<t><xref target="nonb4"></xref> illustrates the example of Q-Block2 | <t><xref target="nonb4" format="default"/> illustrates an example of t | |||
Option. The client sends a NON GET carrying Observe and Q-Block2 | he Q-Block2 | |||
Options. The Q-Block2 Option indicates a block size hint (1024 | option. The client sends a NON GET carrying the Observe and Q-Block2 | |||
bytes). This request is replied to by the server using four (4) | options. The Q-Block2 option indicates a block size hint (1024 | |||
bytes). The server replies to this request using four (4) | ||||
blocks that are transmitted to the client without any loss. Each of | blocks that are transmitted to the client without any loss. Each of | |||
these blocks carries a Q-Block2 Option. The same process is repeated | these blocks carries a Q-Block2 option. The same process is repeated | |||
when an Observe is triggered, but no loss is experienced by any of | when an Observe is triggered, but no loss is experienced by any of | |||
the notification blocks.</t> | the notification blocks.</t> | |||
<figure anchor="nonb4"> | ||||
<t><figure anchor="nonb4" | <name>Example of NON Notifications with the Q-Block2 Option (without | |||
title="Example of NON Notifications with Q-Block2 Option (Without | Loss)</name> | |||
Loss)"> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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 | |||
| ... | | | ... | | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Handling MAX_PAYLOADS Limits"> | <name>Handling MAX_PAYLOADS Limits</name> | |||
<t><xref target="nonb40"></xref> illustrates the same as <xref | <t><xref target="nonb40" format="default"/> illustrates the same scena | |||
target="nonb4"></xref> but this time has eleven (11) payloads which | rio as <xref target="nonb4" format="default"/>, but this time with eleven (11) p | |||
ayloads, which | ||||
exceeds MAX_PAYLOADS. There is no loss experienced.</t> | exceeds MAX_PAYLOADS. There is no loss experienced.</t> | |||
<figure anchor="nonb40"> | ||||
<t><figure anchor="nonb40" | <name>Example of NON Notifications with the Q-Block2 Option (without | |||
title="Example of NON Notifications with Q-Block2 Option (Without | Loss)</name> | |||
Loss)"> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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]] | |||
| ... | | | ... | | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Handling MAX_PAYLOADS with Recovery"> | <name>Handling MAX_PAYLOADS with Recovery</name> | |||
<t><xref target="nonb41"></xref> shows the example of an Observe | <t><xref target="nonb41" format="default"/> shows an example of an Obs | |||
erve | ||||
that is triggered but for which some notification blocks are lost. | that is triggered but for which some notification blocks are lost. | |||
The client detects the missing blocks and requests their | The client detects the missing blocks and requests their | |||
retransmission. It does so by indicating the blocks that are missing | retransmission. It does so by indicating the blocks that are missing | |||
as one or more Q-Block2 Options.</t> | as one or more Q-Block2 options.</t> | |||
<figure anchor="nonb41"> | ||||
<t><figure anchor="nonb41" | <name>Example of NON Notifications with the Q-Block2 Option (Block | |||
title="Example of NON Notifications with Q-Block2 Option (Blocks R | Recovery)</name> | |||
ecovery)"> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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]] | |||
| ... | | | ... | | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
<section anchor="sec-nonb411" numbered="true" toc="default"> | ||||
<section anchor="sec-nonb411" | <name>Handling Recovery by Setting the M Bit</name> | |||
title="Handling Recovery using M-bit Set"> | <t><xref target="nonb411" format="default"/> shows an example where an | |||
<t><xref target="nonb411"></xref> shows the example of an Observe | Observe | |||
that is triggered but only the first two notification blocks reach | is triggered but only the first two notification blocks reach | |||
the client. In order to retrieve the missing blocks, the client | the client. In order to retrieve the missing blocks, the client | |||
sends a request with a single Q-Block2 Option with the M bit | sends a request with a single Q-Block2 option with the M bit | |||
set.</t> | set.</t> | |||
<figure anchor="nonb411"> | ||||
<t><figure anchor="nonb411" | <name>Example of NON Notifications with the Q-Block2 Option (Block R | |||
title="Example of NON Notifications with Q-Block2 Option (Blocks R | ecovery | |||
ecovery with M bit Set)"> | with the M Bit Set)</name> | |||
<artwork><![CDATA[ CoAP CoAP | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
Client Server | CoAP CoAP | |||
| ... | | Client Server | |||
| [[Observe triggered]] | | ... | | |||
|<---------+ NON 2.05 M:0xb1 T:0xf0 O:1237 ET=24 QB2:0/1/1024 | | [[Observe triggered]] | |||
|<---------+ NON 2.05 M:0xb2 T:0xf0 O:1237 ET=24 QB2:1/1/1024 | |<---------+ NON 2.05 M:0xb1 T:0xf0 O:1237 ET=24 QB2:0/1/1024 | |||
| X<---+ NON 2.05 M:0xb3 T:0xf0 O:1237 ET=24 QB2:2/1/1024 | |<---------+ NON 2.05 M:0xb2 T:0xf0 O:1237 ET=24 QB2:1/1/1024 | |||
| X<---+ [[Payloads 4 - 9 not detailed]] | | X<---+ NON 2.05 M:0xb3 T:0xf0 O:1237 ET=24 QB2:2/1/1024 | |||
| X<---+ NON 2.05 M:0xb9 T:0xf0 O:1237 ET=24 QB2:9/1/1024 | | X<---+ [[Payloads 4 - 9 not detailed]] | |||
[[Some of MAX_PAYLOADS_SET have been received]] | | X<---+ NON 2.05 M:0xb9 T:0xf0 O:1237 ET=24 QB2:9/1/1024 | |||
| ... | | [[Some of the MAX_PAYLOADS_SET has been received]] | |||
[[NON_TIMEOUT_RANDOM (server) delay expires]] | | ... | | |||
| [[Server sends next MAX_PAYLOAD_SET]] | [[NON_TIMEOUT_RANDOM (server) delay expires]] | |||
| X<---+ NON 2.05 M:0xba T:0xf0 O:1237 ET=24 QB2:10/0/1024 | | [[Server sends next MAX_PAYLOADS_SET]] | |||
| ... | | | X<---+ NON 2.05 M:0xba T:0xf0 O:1237 ET=24 QB2:10/0/1024 | |||
[[NON_RECEIVE_TIMEOUT (client) delay expires]] | | ... | | |||
| [[Client realizes blocks are missing and asks for the | [[NON_RECEIVE_TIMEOUT (client) delay expires]] | |||
| missing ones in one go by setting the M bit]] | | [[Client realizes blocks are missing and asks for the | |||
+--------->| NON GET /path M:0x06 T:0xf5 QB2:2/1/1024 | | missing ones in one go by setting the M bit]] | |||
|<---------+ NON 2.05 M:0xbb T:0xf5 ET=24 QB2:2/1/1024 | +--------->| NON GET /path M:0x06 T:0xf5 QB2:2/1/1024 | |||
|<---------+ [[Payloads 3 - 9 not detailed]] | |<---------+ NON 2.05 M:0xbb T:0xf5 ET=24 QB2:2/1/1024 | |||
|<---------+ NON 2.05 M:0xc2 T:0xf5 ET=24 QB2:9/1/1024 | |<---------+ [[Payloads 3 - 9 not detailed]] | |||
[[MAX_PAYLOADS_SET has been received]] | |<---------+ NON 2.05 M:0xc2 T:0xf5 ET=24 QB2:9/1/1024 | |||
| [[MAX_PAYLOADS_SET acknowledged by client using 'Continue' | [[MAX_PAYLOADS_SET has been received]] | |||
| Q-Block2]] | | [[MAX_PAYLOADS_SET acknowledged by client using 'Continue' | |||
+--------->| NON GET /path M:0x87 T:0xf6 QB2:10/1/1024 | | Q-Block2]] | |||
|<---------+ NON 2.05 M:0xc3 T:0xf0 O:1237 ET=24 QB2:10/0/1024 | +--------->| NON GET /path M:0x87 T:0xf6 QB2:10/1/1024 | |||
[[Body has been received]] | |<---------+ NON 2.05 M:0xc3 T:0xf0 O:1237 ET=24 QB2:10/0/1024 | |||
| ... | | [[Body has been received]] | |||
| ... | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Q-Block1 and Q-Block2 Options"> | <name>Q-Block1 and Q-Block2 Options</name> | |||
<section title="A Simple Example"> | <section numbered="true" toc="default"> | |||
<t><xref target="b12non"></xref> illustrates the example of a FETCH | <name>A Simple Example</name> | |||
using both Q-Block1 and Q-Block2 Options along with an Observe | <t><xref target="b12non" format="default"/> illustrates an example of | |||
Option. No loss is experienced.</t> | a FETCH | |||
using both the Q-Block1 and Q-Block2 options along with an Observe | ||||
<t><figure anchor="b12non" | option. No loss is experienced.</t> | |||
title="Example of NON FETCH with Q-Block1 and Q-Block2 Options (Wi | <figure anchor="b12non"> | |||
thout Loss)"> | <name>Example of a NON FETCH with the Q-Block1 and Q-Block2 Options | |||
<artwork><![CDATA[ CoAP CoAP | (without | |||
Client Server | Loss)</name> | |||
| | | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
+--------->| NON FETCH /path M:0x10 T:0x90 O:0 RT=30 QB1:0/1/1024 | CoAP CoAP | |||
+--------->| NON FETCH /path M:0x11 T:0x91 O:0 RT=30 QB1:1/1/1024 | Client Server | |||
+--------->| 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 FETCH /path M:0x10 T:0x90 O:0 RT=30 QB1:0/1/1024 | |||
|<---------+ NON 2.05 M:0x61 T:0x93 O:1320 ET=90 QB2:1/1/1024 | +--------->| NON FETCH /path M:0x11 T:0x91 O:0 RT=30 QB1:1/1/1024 | |||
|<---------+ NON 2.05 M:0x62 T:0x93 O:1320 ET=90 QB2:2/1/1024 | +--------->| NON FETCH /path M:0x12 T:0x93 O:0 RT=30 QB1:2/0/1024 | |||
|<---------+ NON 2.05 M:0x63 T:0x93 O:1320 ET=90 QB2:3/0/1024 | |<---------+ NON 2.05 M:0x60 T:0x93 O:1320 ET=90 QB2:0/1/1024 | |||
| ... | | |<---------+ NON 2.05 M:0x61 T:0x93 O:1320 ET=90 QB2:1/1/1024 | |||
| [[Observe triggered]] | |<---------+ NON 2.05 M:0x62 T:0x93 O:1320 ET=90 QB2:2/1/1024 | |||
|<---------+ NON 2.05 M:0x64 T:0x93 O:1321 ET=91 QB2:0/1/1024 | |<---------+ NON 2.05 M:0x63 T:0x93 O:1320 ET=90 QB2:3/0/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 | | [[Observe triggered]] | |||
|<---------+ NON 2.05 M:0x67 T:0x93 O:1321 ET=91 QB2:3/0/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: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 | ||||
| ... | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Handling MAX_PAYLOADS Limits"> | <name>Handling MAX_PAYLOADS Limits</name> | |||
<t><xref target="b12non0"></xref> illustrates the same as <xref | <t><xref target="b12non0" format="default"/> illustrates the same scen | |||
target="b12non"></xref> but this time has eleven (11) payloads in | ario as <xref target="b12non" format="default"/>, but this time with eleven (11) | |||
both directions which exceeds MAX_PAYLOADS. There is no loss | payloads in | |||
both directions, which exceeds MAX_PAYLOADS. There is no loss | ||||
experienced.</t> | experienced.</t> | |||
<figure anchor="b12non0"> | ||||
<t><figure anchor="b12non0" | <name>Example of a NON FETCH with the Q-Block1 and Q-Block2 Options | |||
title="Example of NON FETCH with Q-Block1 and Q-Block2 Options (Wi | (without | |||
thout Loss)"> | Loss)</name> | |||
<artwork><![CDATA[ CoAP CoAP | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
Client Server | CoAP CoAP | |||
| | | Client Server | |||
+--------->| NON FETCH /path M:0x30 T:0xa0 O:0 RT=10 QB1:0/1/1024 | | | | |||
+--------->| NON FETCH /path M:0x31 T:0xa1 O:0 RT=10 QB1:1/1/1024 | +--------->| NON FETCH /path M:0x30 T:0xa0 O:0 RT=10 QB1:0/1/1024 | |||
+--------->| [[Payloads 3 - 9 not detailed]] | +--------->| NON FETCH /path M:0x31 T:0xa1 O:0 RT=10 QB1:1/1/1024 | |||
+--------->| NON FETCH /path M:0x39 T:0xa9 O:0 RT=10 QB1:9/1/1024 | +--------->| [[Payloads 3 - 9 not detailed]] | |||
[[MAX_PAYLOADS_SET has been received]] | +--------->| NON FETCH /path M:0x39 T:0xa9 O:0 RT=10 QB1:9/1/1024 | |||
| [[MAX_PAYLOADS_SET acknowledged by server]] | [[MAX_PAYLOADS_SET has been received]] | |||
|<---------+ NON 2.31 M:0x80 T:0xa9 | | [[MAX_PAYLOADS_SET acknowledged by server]] | |||
+--------->| NON FETCH /path M:0x3a T:0xaa O:0 RT=10 QB1:10/0/1024 | |<---------+ NON 2.31 M:0x80 T:0xa9 | |||
|<---------+ NON 2.05 M:0x81 T:0xaa O:1334 ET=21 QB2:0/1/1024 | +--------->| NON FETCH /path M:0x3a T:0xaa O:0 RT=10 QB1:10/0/1024 | |||
|<---------+ NON 2.05 M:0x82 T:0xaa O:1334 ET=21 QB2:1/1/1024 | |<---------+ NON 2.05 M:0x81 T:0xaa O:1334 ET=21 QB2:0/1/1024 | |||
|<---------+ [[Payloads 3 - 9 not detailed]] | |<---------+ NON 2.05 M:0x82 T:0xaa O:1334 ET=21 QB2:1/1/1024 | |||
|<---------+ NON 2.05 M:0x8a T:0xaa O:1334 ET=21 QB2:9/1/1024 | |<---------+ [[Payloads 3 - 9 not detailed]] | |||
[[MAX_PAYLOADS_SET has been received]] | |<---------+ NON 2.05 M:0x8a T:0xaa O:1334 ET=21 QB2:9/1/1024 | |||
| [[MAX_PAYLOADS_SET acknowledged by client using | [[MAX_PAYLOADS_SET has been received]] | |||
| 'Continue' Q-Block2]] | | [[MAX_PAYLOADS_SET acknowledged by client using | |||
+--------->| NON FETCH /path M:0x3b T:0xab QB2:10/1/1024 | | 'Continue' Q-Block2]] | |||
|<---------+ NON 2.05 M:0x8b T:0xaa O:1334 ET=21 QB2:10/0/1024 | +--------->| NON FETCH /path M:0x3b T:0xab QB2:10/1/1024 | |||
| ... | | |<---------+ NON 2.05 M:0x8b T:0xaa O:1334 ET=21 QB2:10/0/1024 | |||
| [[Observe triggered]] | | ... | | |||
|<---------+ NON 2.05 M:0x8c T:0xaa O:1335 ET=22 QB2:0/1/1024 | | [[Observe triggered]] | |||
|<---------+ NON 2.05 M:0x8d T:0xaa O:1335 ET=22 QB2:1/1/1024 | |<---------+ NON 2.05 M:0x8c T:0xaa O:1335 ET=22 QB2:0/1/1024 | |||
|<---------+ [[Payloads 3 - 9 not detailed]] | |<---------+ NON 2.05 M:0x8d T:0xaa O:1335 ET=22 QB2:1/1/1024 | |||
|<---------+ NON 2.05 M:0x95 T:0xaa O:1335 ET=22 QB2:9/1/1024 | |<---------+ [[Payloads 3 - 9 not detailed]] | |||
[[MAX_PAYLOADS_SET has been received]] | |<---------+ NON 2.05 M:0x95 T:0xaa O:1335 ET=22 QB2:9/1/1024 | |||
| [[MAX_PAYLOADS_SET acknowledged by client using | [[MAX_PAYLOADS_SET has been received]] | |||
| 'Continue' Q-Block2]] | | [[MAX_PAYLOADS_SET acknowledged by client using | |||
+--------->| NON FETCH /path M:0x3c T:0xac QB2:10/1/1024 | | 'Continue' Q-Block2]] | |||
|<---------+ NON 2.05 M:0x96 T:0xaa O:1335 ET=22 QB2:10/0/1024 | +--------->| NON FETCH /path M:0x3c T:0xac QB2:10/1/1024 | |||
[[Body has been received]] | |<---------+ NON 2.05 M:0x96 T:0xaa O:1335 ET=22 QB2:10/0/1024 | |||
| ... | | [[Body has been received]] | |||
| ... | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>Note that, as 'Continue' was used, the server continues to use the | ||||
<t>Note that as 'Continue' was used, the server continues to use the | same token (0xaa), since the 'Continue' is not being used as a | |||
same token (0xaa) since the 'Continue' is not being used as a | request for a new set of packets but rather is being used to | |||
request for a new set of packets, but rather is being used to | instruct the server to continue its transmission (<xref target="cc-non | |||
instruct the server to continue its transmission (<xref | " format="default"/>).</t> | |||
target="cc-non"></xref>).</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Handling Recovery"> | <name>Handling Recovery</name> | |||
<t>Consider now a scenario where some blocks are lost in | <t>Consider now a scenario where some blocks are lost in | |||
transmission as illustrated in <xref target="b12non1"></xref>.</t> | transmission, as illustrated in <xref target="b12non1" format="default | |||
"/>.</t> | ||||
<t><figure anchor="b12non1" | <figure anchor="b12non1"> | |||
title="Example of NON FETCH with Q-Block1 and Q-Block2 Options (Wi | <name>Example of a NON FETCH with the Q-Block1 and Q-Block2 Options | |||
th Loss)"> | (with | |||
<artwork><![CDATA[ CoAP CoAP | Loss)</name> | |||
Client Server | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
| | | CoAP CoAP | |||
+--------->| NON FETCH /path M:0x50 T:0xc0 O:0 RT=31 QB1:0/1/1024 | Client Server | |||
+--->X | NON FETCH /path M:0x51 T:0xc1 O:0 RT=31 QB1:1/1/1024 | | | | |||
+--->X | NON FETCH /path M:0x52 T:0xc2 O:0 RT=31 QB1:2/1/1024 | +--------->| NON FETCH /path M:0x50 T:0xc0 O:0 RT=31 QB1:0/1/1024 | |||
+--------->| NON FETCH /path M:0x53 T:0xc3 O:0 RT=31 QB1:3/0/1024 | +--->X | NON FETCH /path M:0x51 T:0xc1 O:0 RT=31 QB1:1/1/1024 | |||
| ... | | +--->X | NON FETCH /path M:0x52 T:0xc2 O:0 RT=31 QB1:2/1/1024 | |||
[[NON_RECEIVE_TIMEOUT (server) delay expires]] | +--------->| NON FETCH /path M:0x53 T:0xc3 O:0 RT=31 QB1:3/0/1024 | |||
| ... | | ||||
[[NON_RECEIVE_TIMEOUT (server) delay expires]] | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>The server realizes that some blocks are missing and asks for the | <t>The server realizes that some blocks are missing and asks for the | |||
missing blocks in one go (<xref target="b12non2"></xref>). It does | missing blocks in one go (<xref target="b12non2" format="default"/>). It does | |||
so by indicating which blocks have not been received in the data | so by indicating which blocks have not been received in the data | |||
portion of the response. The token used in the response is the token | portion of the response. The token used in the response is the token | |||
that was used in the last received payload. The client can then | that was used in the last received payload. The client can then | |||
derive the Request-Tag by matching the token with the sent | derive the Request-Tag by matching the token with the sent | |||
request.</t> | request.</t> | |||
<figure anchor="b12non2"> | ||||
<t><figure anchor="b12non2" | <name>Example of a NON Request with the Q-Block1 Option (Server Reco | |||
title="Example of NON Request with Q-Block1 Option (Server Recover | very)</name> | |||
y)"> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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]] | |||
| | | | | | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>The client realizes that not all the payloads of the response | <t>The client realizes that not all the payloads of the response | |||
have been returned. The client then asks for the missing blocks in | have been returned. The client then asks for the missing blocks in | |||
one go (<xref target="b12non3"></xref>). Note that, following | one go (<xref target="b12non3" format="default"/>). Note that, followi | |||
Section 2.7 of <xref target="RFC7959"></xref>, the FETCH request | ng | |||
does not include the Q-Block1 or any payload.</t> | <xref target="RFC7959" section="2.7" sectionFormat="of" format="defaul | |||
t"/>, the | ||||
<t><figure anchor="b12non3" | FETCH request does not include the Q-Block1 or any payload.</t> | |||
title="Example of NON Request with Q-Block1 Option (Client Recover | <figure anchor="b12non3"> | |||
y)"> | <name>Example of a NON Request with the Q-Block1 Option (Client Reco | |||
<artwork><![CDATA[ CoAP CoAP | very)</name> | |||
Client Server | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
| | | CoAP CoAP | |||
+--------->| NON FETCH /path M:0x56 T:0xc6 RT=31 QB2:1/0/1024\ | Client Server | |||
| | QB2:3/0/1024 | | | | |||
| [[Server receives FETCH request for missing payloads, | +--------->| NON FETCH /path M:0x56 T:0xc6 RT=31 QB2:1/0/1024\ | |||
| starts transmitting missing blocks]] | | | QB2:3/0/1024 | |||
| X<---+ NON 2.05 M:0xa5 T:0xc6 ET=23 QB2:1/1/1024 | | [[Server receives FETCH request for missing payloads, | |||
|<---------+ NON 2.05 M:0xa6 T:0xc6 ET=23 QB2:3/0/1024 | | starts transmitting missing blocks]] | |||
| ... | | | X<---+ NON 2.05 M:0xa5 T:0xc6 ET=23 QB2:1/1/1024 | |||
[[NON_RECEIVE_TIMEOUT (client) delay expires]] | |<---------+ NON 2.05 M:0xa6 T:0xc6 ET=23 QB2:3/0/1024 | |||
| [[Client realizes block is still missing and asks for | | ... | | |||
| missing block]] | [[NON_RECEIVE_TIMEOUT (client) delay expires]] | |||
+--------->| NON FETCH /path M:0x57 T:0xc7 RT=31 QB2:1/0/1024 | | [[Client realizes block is still missing and asks for | |||
| [[Server receives FETCH request for missing payload, | | missing block]] | |||
| starts transmitting missing block]] | +--------->| NON FETCH /path M:0x57 T:0xc7 RT=31 QB2:1/0/1024 | |||
|<---------+ NON 2.05 M:0xa7 T:0xc7 ET=23 QB2:1/1/1024 | | [[Server receives FETCH request for missing payload, | |||
[[Body has been received]] | | starts transmitting missing block]] | |||
| ... | | |<---------+ NON 2.05 M:0xa7 T:0xc7 ET=23 QB2:1/1/1024 | |||
| [[Observe triggered]] | [[Body has been received]] | |||
|<---------+ 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 | | [[Observe triggered]] | |||
|<---------+ NON 2.05 M:0xaa T:0xc3 O:1337 ET=24 QB2:2/0/1024 | |<---------+ NON 2.05 M:0xa8 T:0xc3 O:1337 ET=24 QB2:0/1/1024 | |||
[[NON_RECEIVE_TIMEOUT (client) delay expires]] | | X<---+ NON 2.05 M:0xa9 T:0xc3 O:1337 ET=24 QB2:1/1/1024 | |||
| [[Client realizes block is still missing and asks for | |<---------+ NON 2.05 M:0xaa T:0xc3 O:1337 ET=24 QB2:2/0/1024 | |||
| missing block]] | [[NON_RECEIVE_TIMEOUT (client) delay expires]] | |||
+--------->| NON FETCH /path M:0x58 T:0xc8 RT=31 QB2:1/0/1024 | | [[Client realizes block is still missing and asks for | |||
| [[Server receives FETCH request for missing payload, | | missing block]] | |||
| starts transmitting missing block]] | +--------->| NON FETCH /path M:0x58 T:0xc8 RT=31 QB2:1/0/1024 | |||
|<---------+ NON 2.05 M:0xa7 T:0xc8 ET=24 QB2:1/1/1024 | | [[Server receives FETCH request for missing payload, | |||
[[Body has been received]] | | starts transmitting missing block]] | |||
| ... | | |<---------+ NON 2.05 M:0xa7 T:0xc8 ET=24 QB2:1/1/1024 | |||
[[Body has been received]] | ||||
| ... | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="security" numbered="true" toc="default"> | ||||
<section anchor="security" title="Security Considerations"> | <name>Security Considerations</name> | |||
<t>Security considerations discussed in Section 7 of <xref | <t>Security considerations discussed in <xref target="RFC7959" section="7" | |||
target="RFC7959"></xref> should be taken into account.</t> | sectionFormat="of" format="default"/> should be taken into account.</t> | |||
<t>Security considerations discussed in Sections <xref target="RFC7252" | ||||
<t>Security considerations discussed in Sections 11.3 and 11.4 of <xref | section="11.3" sectionFormat="bare"/> and <xref target="RFC7252" section=" | |||
target="RFC7252"></xref> should be taken into account.</t> | 11.4" | |||
sectionFormat="bare"/> of <xref target="RFC7252" format="default"/> should | ||||
also be | ||||
taken into account.</t> | ||||
<t>OSCORE provides end-to-end protection of all information that is not | <t>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 <xref target="RFC8613"></xref>). It can be | set up (<xref target="RFC8613" section="3.1" sectionFormat="of" | |||
trusted that the source endpoint is legitimate even if NoSec security | format="default"/>). It can be | |||
trusted that the source endpoint is legitimate even if the NoSec | ||||
mode is used. However, an intermediary node can modify the unprotected | mode is used. However, an intermediary node can modify the unprotected | |||
outer Q-Block1 and/or Q-Block2 Options to cause a Q-Block transfer to | Outer Q-Block1 and/or Q-Block2 options to cause a Q-Block transfer to | |||
fail or keep requesting all the blocks by setting the M bit and, thus, | fail or keep requesting all the blocks by setting the M bit and thus | |||
causing attack amplification. As discussed in Section 12.1 of <xref | causing attack amplification. As discussed in <xref target="RFC8613" secti | |||
target="RFC8613"></xref>, applications need to consider that certain | on="12.1" sectionFormat="of" format="default"/>, applications need to consider t | |||
message fields and messages types are not protected end-to-end and may | hat certain | |||
be spoofed or manipulated. Therefore, it is NOT RECOMMENDED to use the | message fields and message types are not protected end to end and may | |||
NoSec security mode if either the Q-Block1 or Q-Block2 Options is | be spoofed or manipulated. Therefore, it is <bcp14>NOT RECOMMENDED</bcp14> | |||
to use the | ||||
NoSec mode if either the Q-Block1 or Q-Block2 option is | ||||
used.</t> | used.</t> | |||
<t>If OSCORE is not used, it is also <bcp14>NOT RECOMMENDED</bcp14> to use | ||||
<t>If OSCORE is not used, it is also NOT RECOMMENDED to use the NoSec | the NoSec | |||
security mode if either the Q-Block1 or Q-Block2 Options is used.</t> | mode if either the Q-Block1 or Q-Block2 option is used.</t> | |||
<t>If NoSec is being used, <xref target="RFC8613" section="D.5" sectionFor | ||||
<t>If NoSec is being used, Section D.5 of <xref target="RFC8613"></xref> | mat="of" | |||
format="default"/> | ||||
discusses the security analysis and considerations for unprotected | discusses the security analysis and considerations for unprotected | |||
message fields even if OSCORE is not being used.</t> | message fields even if OSCORE is not being used.</t> | |||
<t>Security considerations related to the use of Request-Tag are | <t>Security considerations related to the use of Request-Tag are | |||
discussed in Section 5 of <xref | discussed in <xref target="RFC9175" section="5" sectionFormat="of" format= | |||
target="I-D.ietf-core-echo-request-tag"></xref>.</t> | "default"/>.</t> | |||
</section> | </section> | |||
<section anchor="IANA" numbered="true" toc="default"> | ||||
<section anchor="IANA" title="IANA Considerations"> | <name>IANA Considerations</name> | |||
<t><list style="hanging"> | <section numbered="true" toc="default"> | |||
<t hangText="RFC Editor Note:">Please replace [RFCXXXX] with the RFC | <name>CoAP Option Numbers Registry</name> | |||
number to be assigned to this document.</t> | <t>IANA has added the following entries to the "CoAP Option Numbers" | |||
</list></t> | subregistry <xref target="IANA-Options" format="default"/> defined in <x | |||
ref | ||||
<section title="CoAP Option Numbers Registry"> | target="RFC7252" format="default"/> within the "Constrained RESTful | |||
<t>IANA is requested to add the following entries to the "CoAP Option | Environments (CoRE) Parameters" registry:</t> | |||
Numbers" sub-registry <xref target="Options"></xref> defined in <xref | <table align="center"> | |||
target="RFC7252"></xref> within the "Constrained RESTful Environments | <name>Additions to CoAP Option Numbers Registry</name> | |||
(CoRE) Parameters" registry:</t> | <thead> | |||
<tr> | ||||
<t><figure align="center"> | <th>Number</th> | |||
<artwork align="center"><![CDATA[+--------+------------------+------ | <th>Name</th> | |||
-----+ | <th>Reference</th> | |||
| Number | Name | Reference | | </tr> | |||
+========+==================+===========+ | </thead> | |||
| TBA1 | Q-Block1 | [RFCXXXX] | | <tbody> | |||
| TBA2 | Q-Block2 | [RFCXXXX] | | <tr> | |||
+--------+------------------+-----------+ | <td>19</td> | |||
<td>Q-Block1</td> | ||||
Table 4: CoAP Q-Block1 and Q-Block2 Option Numbers]]></artwork> | <td>RFC 9177</td> | |||
</figure></t> | </tr> | |||
<tr> | ||||
<t>This document suggests 19 (TBA1) and 31 (TBA2) as values to be | <td>31</td> | |||
assigned for the new option numbers.</t> | <td>Q-Block2</td> | |||
<td>RFC 9177</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Media Type Registration"> | <name>Media Type Registration</name> | |||
<t>This document requests IANA to register the | <t>IANA has registered the | |||
"application/missing-blocks+cbor-seq" media type in the "Media Types" | "application/missing-blocks+cbor-seq" media type in the "Media Types" | |||
registry <xref target="IANA-MediaTypes"></xref>. This registration | registry <xref target="IANA-MediaTypes" format="default"/>. This registr | |||
follows the procedures specified in <xref target="RFC6838"></xref>: | ation | |||
<figure> | follows the procedures specified in <xref target="RFC6838" format="defau | |||
<artwork><![CDATA[ Type name: application | lt"/>. | |||
</t> | ||||
Subtype name: missing-blocks+cbor-seq | ||||
Required parameters: N/A | ||||
Optional parameters: N/A | ||||
Encoding considerations: Must be encoded as a CBOR | ||||
sequence [RFC8742], as defined in Section 4 of [RFCXXXX]. | ||||
Security considerations: See Section 10 of [RFCXXXX]. | ||||
Interoperability considerations: N/A | ||||
Published specification: [RFCXXXX] | ||||
Applications that use this media type: Data serialization and | ||||
deserialization. In particular, the type is used by applications | ||||
relying upon block-wise transfers, allowing a server to specify | ||||
non-received blocks and request for their retransmission, as | ||||
defined in Section 4 of [RFCXXXX]. | ||||
Fragment identifier considerations: N/A | ||||
Additional information: N/A | ||||
Person & email address to contact for further information: IETF, | ||||
iesg@ietf.org | ||||
Intended usage: COMMON | ||||
Restrictions on usage: none | ||||
Author: See Authors' Addresses section. | ||||
Change controller: IESG | ||||
Provisional registration? No]]></artwork> | <dl newline="false" spacing="normal"> | |||
</figure></t> | <dt>Type name:</dt> | |||
<dd>application</dd> | ||||
<dt>Subtype name:</dt> | ||||
<dd>missing-blocks+cbor-seq</dd> | ||||
<dt>Required parameters:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Optional parameters:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Encoding considerations:</dt> | ||||
<dd>Must be encoded as a CBOR Sequence <xref target="RFC8742" format="d | ||||
efault"/>, | ||||
as defined in <xref target="code" format="default"/> of RFC 9177.</dd> | ||||
<dt>Security considerations:</dt> | ||||
<dd>See <xref target="security" format="default"/> of RFC 9177.</dd> | ||||
<dt>Interoperability considerations:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Published specification:</dt> | ||||
<dd>RFC 9177</dd> | ||||
<dt>Applications that use this media type:</dt> | ||||
<dd>Data serialization and | ||||
deserialization. In particular, the type is used by applications | ||||
relying upon block-wise transfers, allowing a server to specify | ||||
non-received blocks and request their retransmission, as | ||||
defined in <xref target="spec" format="default"/> of RFC 9177.</dd> | ||||
<dt>Fragment identifier considerations:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Additional information:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Person & email address to contact for further information:</dt> | ||||
<dd>IETF, iesg&zwsp;@&zwsp;ietf.org</dd> | ||||
<dt>Intended usage:</dt> | ||||
<dd>COMMON</dd> | ||||
<dt>Restrictions on usage:</dt> | ||||
<dd>none</dd> | ||||
<dt>Author:</dt> | ||||
<dd>See Authors' Addresses section of RFC 9177.</dd> | ||||
<dt>Change controller:</dt> | ||||
<dd>IESG</dd> | ||||
<dt>Provisional registration?</dt> | ||||
<dd>No</dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section anchor="new-format" numbered="true" toc="default"> | ||||
<section anchor="new-format" title="CoAP Content-Formats Registry"> | <name>CoAP Content-Formats Registry</name> | |||
<t>This document requests IANA to register the following CoAP | <t>IANA has registered the following CoAP | |||
Content-Format for the "application/missing-blocks+cbor-seq" media | Content-Format for the "application/missing-blocks+cbor-seq" media | |||
type in the "CoAP Content-Formats" registry <xref | type in the "CoAP Content-Formats" registry <xref target="IANA-Format" f | |||
target="Format"></xref>, defined in <xref target="RFC7252"></xref>, | ormat="default"/> defined in <xref target="RFC7252" format="default"/> | |||
within the "Constrained RESTful Environments (CoRE) Parameters" | within the "Constrained RESTful Environments (CoRE) Parameters" | |||
registry:</t> | registry:</t> | |||
<table align="center"> | ||||
<figure> | <name>Addition to CoAP Content-Format Registry</name> | |||
<artwork><![CDATA[o Media Type: application/missing-blocks+cbor-seq | <thead> | |||
o Encoding: - | <tr> | |||
o Id: TBA3 | <th>Media Type</th> | |||
o Reference: [RFCXXXX]]]></artwork> | <th>Encoding</th> | |||
</figure> | <th>ID</th> | |||
<th>Reference</th> | ||||
<t>This document suggests 272 (TBA3) as a value to be assigned for the | </tr> | |||
new content format number.</t> | </thead> | |||
<tbody> | ||||
<tr> | ||||
<td>application/missing-blocks+cbor-seq</td> | ||||
<td>-</td> | ||||
<td>272</td> | ||||
<td>RFC 9177</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | </section> | |||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | ||||
<?rfc include='reference.RFC.2119'?> | ||||
<?rfc include='reference.RFC.6838'?> | ||||
<?rfc include='reference.RFC.7252'?> | ||||
<?rfc include='reference.RFC.8174'?> | ||||
<?rfc include='reference.RFC.8075'?> | <displayreference target="I-D.bosh-dots-quick-blocks" to="DOTS-QUICK-BLOCKS"/> | |||
<?rfc include='reference.RFC.7959'?> | ||||
<?rfc include='reference.RFC.7641'?> | ||||
<?rfc include='reference.RFC.8132'?> | ||||
<?rfc include='reference.RFC.8323'?> | ||||
<?rfc include='reference.RFC.8610'?> | ||||
<?rfc include='reference.RFC.8613'?> | ||||
<?rfc include='reference.RFC.8742'?> | ||||
<?rfc include='reference.RFC.8949'?> | ||||
<?rfc include='reference.I-D.ietf-core-echo-request-tag'?> | ||||
</references> | ||||
<references title="Informative References"> | ||||
<?rfc include="reference.I-D.ietf-dots-telemetry"?> | ||||
<?rfc include='reference.RFC.8974'?> | ||||
<?rfc include='reference.I-D.bosh-dots-quick-blocks'?> | ||||
<?rfc include='reference.RFC.6928'?> | ||||
<?rfc include='reference.RFC.8782'?> | ||||
<?rfc include='reference.RFC.7967'?> | <references> | |||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.2119.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6838.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7252.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8174.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8075.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7959.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7641.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8132.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8323.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8610.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8613.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8742.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8949.xml"/> | ||||
<reference anchor="Format" | <!-- draft-ietf-core-echo-request-tag (RFC 9175) --> | |||
target="https://www.iana.org/assignments/core-parameters/core-p | <reference anchor='RFC9175' target="https://www.rfc-editor.org/info/rfc9175"> | |||
arameters.xhtml#content-formats"> | <front> | |||
<front> | <title>Constrained Application Protocol (CoAP): Echo, Request-Tag, and Token Pro | |||
<title>CoAP Content-Formats</title> | cessing</title> | |||
<author initials='C' surname='Amsüss' fullname='Christian Amsüss'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='J' surname='Preuß Mattsson' fullname='John Preuß Mattsson'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='G' surname='Selander' fullname='Goeran Selander'> | ||||
<organization /> | ||||
</author> | ||||
<date year='2022' month='February' /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9175"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9175"/> | ||||
</reference> | ||||
<author> | </references> | |||
<organization></organization> | <references> | |||
</author> | <name>Informative References</name> | |||
<date /> | <!-- draft-ietf-dots-telemetry (IESG state Publication Requested) | |||
</front> | LB: Two editors, so had to do "long way" --> | |||
</reference> | <reference anchor="DOTS-TELEMETRY"> | |||
<front> | ||||
<title>Distributed Denial-of-Service Open Threat Signaling (DOTS) Telemetr | ||||
y</title> | ||||
<author fullname="Mohamed Boucadair" role="editor"> | ||||
<organization>Orange</organization> | ||||
</author> | ||||
<author fullname="Tirumaleswar Reddy" role="editor"> | ||||
<organization>Akamai</organization> | ||||
</author> | ||||
<author fullname="Ehud Doron"> | ||||
<organization>Radware Ltd.</organization> | ||||
</author> | ||||
<author fullname="Meiling Chen"> | ||||
<organization>CMCC</organization> | ||||
</author> | ||||
<author fullname="Jon Shallow"> | ||||
</author> | ||||
<date month="January" day="4" year="2022" /> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-dots-telemetry-19" /> | ||||
</reference> | ||||
<reference anchor="Options" | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
target="https://www.iana.org/assignments/core-parameters/core-p | FC.8974.xml"/> | |||
arameters.xhtml#option-numbers"> | ||||
<front> | ||||
<title>CoAP Option Numbers</title> | ||||
<author> | <!-- [I-D.bosh-dots-quick-blocks] IESG state I-D Exists --> | |||
<organization></organization> | ||||
</author> | ||||
<date /> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D | |||
</front> | .bosh-dots-quick-blocks.xml"/> | |||
</reference> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.6928.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.9132.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7967.xml"/> | ||||
<reference anchor="IANA-MediaTypes" | <reference anchor="IANA-Format" target="https://www.iana.org/assignments | |||
target="https://www.iana.org/assignments/media-types"> | /core-parameters/"> | |||
<front> | <front> | |||
<title>Media Types</title> | <title>CoAP Content-Formats</title> | |||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
</front> | ||||
</reference> | ||||
<author fullname="IANA"> | <reference anchor="IANA-Options" target="https://www.iana.org/assignment | |||
<organization></organization> | s/core-parameters/"> | |||
</author> | <front> | |||
<title>CoAP Option Numbers</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
</front> | ||||
</reference> | ||||
<date /> | <reference anchor="IANA-MediaTypes" target="https://www.iana.org/assignm | |||
</front> | ents/media-types/"> | |||
</reference> | <front> | |||
<title>Media Types</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<section anchor="CON" numbered="true" toc="default"> | ||||
<section anchor="CON" title="Examples with Confirmable Messages"> | <name>Examples with Confirmable Messages</name> | |||
<t>The following examples assume NSTART has been increased to 3.</t> | <t>The following examples assume NSTART has been increased to 3.</t> | |||
<t>The conventions provided in <xref target="non-confirm" format="default" | ||||
<t>The notations provided in <xref target="legend"></xref> are used in | /> are used | |||
the following subsections.</t> | in the following subsections.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Q-Block1 Option"> | <name>Q-Block1 Option</name> | |||
<t>Let's now consider the use of Q-Block1 Option with a CON request as | <t>Let's now consider the use of the Q-Block1 option with a CON request, | |||
shown in <xref target="con3"></xref>. All the blocks are acknowledged | as | |||
(ACK).</t> | shown in <xref target="con3" format="default"/>. All the blocks are ackn | |||
owledged | ||||
<t><figure anchor="con3" | (as noted with "ACK").</t> | |||
title="Example of CON Request with Q-Block1 Option (Without Loss)"> | <figure anchor="con3"> | |||
<artwork><![CDATA[ CoAP CoAP | <name>Example of a CON Request with the Q-Block1 Option (without Loss) | |||
Client Server | </name> | |||
| | | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
+--------->| CON PUT /path M:0x01 T:0xf0 RT=10 QB1:0/1/1024 | CoAP CoAP | |||
+--------->| CON PUT /path M:0x02 T:0xf1 RT=10 QB1:1/1/1024 | Client Server | |||
+--------->| CON PUT /path M:0x03 T:0xf2 RT=10 QB1:2/1/1024 | | | | |||
[[NSTART(3) limit reached]] | +--------->| CON PUT /path M:0x01 T:0xf0 RT=10 QB1:0/1/1024 | |||
|<---------+ ACK 0.00 M:0x01 | +--------->| CON PUT /path M:0x02 T:0xf1 RT=10 QB1:1/1/1024 | |||
+--------->| CON PUT /path M:0x04 T:0xf3 RT=10 QB1:3/0/1024 | +--------->| CON PUT /path M:0x03 T:0xf2 RT=10 QB1:2/1/1024 | |||
|<---------+ ACK 0.00 M:0x02 | [[NSTART(3) limit reached]] | |||
|<---------+ ACK 0.00 M:0x03 | |<---------+ ACK 0.00 M:0x01 | |||
|<---------+ ACK 2.04 M:0x04 | +--------->| CON PUT /path M:0x04 T:0xf3 RT=10 QB1:3/0/1024 | |||
| | | |<---------+ ACK 0.00 M:0x02 | |||
|<---------+ ACK 0.00 M:0x03 | ||||
|<---------+ ACK 2.04 M:0x04 | ||||
| | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>Now, suppose that a new body of data is to be sent but with some | <t>Now, suppose that a new body of data is to be sent but with some | |||
blocks dropped in transmission as illustrated in <xref | blocks dropped in transmission, as illustrated in <xref target="con32" | |||
target="con32"></xref>. The client will retry sending blocks for which | format="default"/>. The client will retry sending blocks for which | |||
no ACK was received.</t> | no ACK was received.</t> | |||
<figure anchor="con32"> | ||||
<t><figure anchor="con32" | <name>Example of a CON Request with the Q-Block1 Option (Block Recover | |||
title="Example of CON Request with Q-Block1 Option (Blocks Recovery) | y)</name> | |||
"> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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]] | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>It is up to the implementation as to whether the application | <t>It is up to the implementation as to whether the application | |||
process stops trying to send this particular body of data on reaching | process 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 under | new transmission of the payloads that have not been acknowledged under | |||
these adverse traffic conditions.</t> | these adverse traffic conditions.</t> | |||
<t>If transient network losses are possible, then the use of NON should | ||||
<t>If there is likely to be the possibility of transient network | be considered.</t> | |||
losses, then the use of NON should be considered.</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Q-Block2 Option"> | <name>Q-Block2 Option</name> | |||
<t>An example of the use of Q-Block2 Option with Confirmable messages | <t>An example of the use of the Q-Block2 option with Confirmable message | |||
is shown in <xref target="b4con"></xref>.</t> | s | |||
is shown in <xref target="b4con" format="default"/>.</t> | ||||
<t><figure align="center" anchor="b4con" | <figure anchor="b4con"> | |||
title="Example of CON Notifications with Q-Block2 Option"> | <name>Example of CON Notifications with the Q-Block2 Option</name> | |||
<artwork align="center"><![CDATA[ Client Server | <artwork align="left" name="" type="ascii-art" alt=""><![CDATA[ | |||
| | | Client Server | |||
+--------->| CON GET /path M:0x01 T:0xf0 O:0 QB2:0/1/1024 | | | | |||
|<---------+ ACK 2.05 M:0x01 T:0xf0 O:1234 ET=21 QB2:0/1/1024 | +--------->| CON GET /path M:0x01 T:0xf0 O:0 QB2:0/1/1024 | |||
|<---------+ CON 2.05 M:0xe1 T:0xf0 O:1234 ET=21 QB2:1/1/1024 | |<---------+ ACK 2.05 M:0x01 T:0xf0 O:1234 ET=21 QB2:0/1/1024 | |||
|<---------+ CON 2.05 M:0xe2 T:0xf0 O:1234 ET=21 QB2:2/1/1024 | |<---------+ CON 2.05 M:0xe1 T:0xf0 O:1234 ET=21 QB2:1/1/1024 | |||
|<---------+ CON 2.05 M:0xe3 T:0xf0 O:1234 ET=21 QB2:3/0/1024 | |<---------+ CON 2.05 M:0xe2 T:0xf0 O:1234 ET=21 QB2:2/1/1024 | |||
|--------->+ ACK 0.00 M:0xe1 | |<---------+ CON 2.05 M:0xe3 T:0xf0 O:1234 ET=21 QB2:3/0/1024 | |||
|--------->+ ACK 0.00 M:0xe2 | |--------->+ ACK 0.00 M:0xe1 | |||
|--------->+ ACK 0.00 M:0xe3 | |--------->+ ACK 0.00 M:0xe2 | |||
| ... | | |--------->+ ACK 0.00 M:0xe3 | |||
| [[Observe triggered]] | | ... | | |||
|<---------+ CON 2.05 M:0xe4 T:0xf0 O:1235 ET=22 QB2:0/1/1024 | | [[Observe triggered]] | |||
|<---------+ CON 2.05 M:0xe5 T:0xf0 O:1235 ET=22 QB2:1/1/1024 | |<---------+ CON 2.05 M:0xe4 T:0xf0 O:1235 ET=22 QB2:0/1/1024 | |||
|<---------+ CON 2.05 M:0xe6 T:0xf0 O:1235 ET=22 QB2:2/1/1024 | |<---------+ CON 2.05 M:0xe5 T:0xf0 O:1235 ET=22 QB2:1/1/1024 | |||
[[NSTART(3) limit reached]] | |<---------+ CON 2.05 M:0xe6 T:0xf0 O:1235 ET=22 QB2:2/1/1024 | |||
|--------->+ ACK 0.00 M:0xe4 | [[NSTART(3) limit reached]] | |||
|<---------+ CON 2.05 M:0xe7 T:0xf0 O:1235 ET=22 QB2:3/0/1024 | |--------->+ ACK 0.00 M:0xe4 | |||
|--------->+ ACK 0.00 M:0xe5 | |<---------+ CON 2.05 M:0xe7 T:0xf0 O:1235 ET=22 QB2:3/0/1024 | |||
|--------->+ ACK 0.00 M:0xe6 | |--------->+ ACK 0.00 M:0xe5 | |||
|--------->+ ACK 0.00 M:0xe7 | |--------->+ ACK 0.00 M:0xe6 | |||
| ... | | |--------->+ ACK 0.00 M:0xe7 | |||
| [[Observe triggered]] | | ... | | |||
|<---------+ CON 2.05 M:0xe8 T:0xf0 O:1236 ET=23 QB2:0/1/1024 | | [[Observe triggered]] | |||
| X<---+ CON 2.05 M:0xe9 T:0xf0 O:1236 ET=23 QB2:1/1/1024 | |<---------+ CON 2.05 M:0xe8 T:0xf0 O:1236 ET=23 QB2:0/1/1024 | |||
| X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 | | X<---+ CON 2.05 M:0xe9 T:0xf0 O:1236 ET=23 QB2:1/1/1024 | |||
[[NSTART(3) limit reached]] | | X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 | |||
|--------->+ ACK 0.00 M:0xe8 | [[NSTART(3) limit reached]] | |||
|<---------+ CON 2.05 M:0xeb T:0xf0 O:1236 ET=23 QB2:3/0/1024 | |--------->+ ACK 0.00 M:0xe8 | |||
|--------->+ ACK 0.00 M:0xeb | |<---------+ CON 2.05 M:0xeb T:0xf0 O:1236 ET=23 QB2:3/0/1024 | |||
| ... | | |--------->+ ACK 0.00 M:0xeb | |||
[[ACK TIMEOUT (server) for M:0xe9 delay expires]] | | ... | | |||
| [[Server retransmits packet]] | [[ACK TIMEOUT (server) for M:0xe9 delay expires]] | |||
|<---------+ CON 2.05 M:0xe9 T:0xf0 O:1236 ET=23 QB2:1/1/1024 | | [[Server retransmits packet]] | |||
[[ACK TIMEOUT (server) for M:0xea delay expires]] | |<---------+ CON 2.05 M:0xe9 T:0xf0 O:1236 ET=23 QB2:1/1/1024 | |||
| [[Server retransmits packet]] | [[ACK TIMEOUT (server) for M:0xea delay expires]] | |||
| X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 | | [[Server retransmits packet]] | |||
|--------->+ ACK 0.00 M:0xe9 | | X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 | |||
| ... | | |--------->+ ACK 0.00 M:0xe9 | |||
[[ACK TIMEOUT exponential backoff (server) delay expires]] | | ... | | |||
| [[Server retransmits packet]] | [[ACK TIMEOUT exponential backoff (server) delay expires]] | |||
| X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 | | [[Server retransmits packet]] | |||
| ... | | | X<---+ CON 2.05 M:0xea T:0xf0 O:1236 ET=23 QB2:2/1/1024 | |||
[[Either body transmission failure (acknowledge retry timeout) | | ... | | |||
or successfully transmitted.]] | [[Either body transmission failure (acknowledge retry timeout) | |||
or successfully transmitted]] | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>It is up to the implementation as to whether the application | <t>It is up to the implementation as to whether the application | |||
process stops trying to send this particular body of data on reaching | process 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 under | new transmission of the payloads that have not been acknowledged under | |||
these adverse traffic conditions.</t> | these adverse traffic conditions.</t> | |||
<t>If transient network losses are possible, then the use of NON should | ||||
<t>If there is likely to be the possibility of transient network | be considered.</t> | |||
losses, then the use of NON should be considered.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="REL" numbered="true" toc="default"> | ||||
<section anchor="REL" title="Examples with Reliable Transports"> | <name>Examples with Reliable Transports</name> | |||
<t>The notations provided in <xref target="legend"></xref> are used in | <t>The conventions provided in <xref target="non-confirm" format="default" | |||
the following subsections.</t> | /> are used | |||
in the following subsections.</t> | ||||
<section title="Q-Block1 Option"> | <section numbered="true" toc="default"> | |||
<t>Let's now consider the use of Q-Block1 Option with a reliable | <name>Q-Block1 Option</name> | |||
transport as shown in <xref target="rel3"></xref>. There is no | <t>Let's now consider the use of the Q-Block1 option with a reliable | |||
transport, as shown in <xref target="rel3" format="default"/>. There is | ||||
no | ||||
acknowledgment of packets at the CoAP layer, just the final | acknowledgment of packets at the CoAP layer, just the final | |||
result.</t> | result.</t> | |||
<figure anchor="rel3"> | ||||
<t><figure anchor="rel3" | <name>Example of a Reliable Request with the Q-Block1 Option</name> | |||
title="Example of Reliable Request with Q-Block1 Option"> | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ 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 | |||
| | | | | | |||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>If transient network losses are possible, then the use of unreliable | ||||
<t>If there is likely to be the possibility of transient network | transport with NON should be | |||
losses, then the use of unreliable transport with NON should be | ||||
considered.</t> | considered.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Q-Block2 Option"> | <name>Q-Block2 Option</name> | |||
<t>An example of the use of Q-Block2 Option with a reliable transport | <t>An example of the use of the Q-Block2 option with a reliable transpor | |||
is shown in <xref target="b4rel"></xref>.</t> | t | |||
is shown in <xref target="b4rel" format="default"/>.</t> | ||||
<t><figure align="center" anchor="b4rel" | <figure anchor="b4rel"> | |||
title="Example of Notifications with Q-Block2 Option"> | <name>Example of Notifications with the Q-Block2 Option</name> | |||
<artwork align="center"><![CDATA[ Client Server | <artwork align="left" name="" type="ascii-art" alt=""><![CDATA[ | |||
| | | Client Server | |||
+--------->| GET /path T:0xf0 O:0 QB2:0/1/1024 | | | | |||
|<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:0/1/1024 | +--------->| GET /path T:0xf0 O:0 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:0/1/1024 | |||
|<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:2/1/1024 | |<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:1/1/1024 | |||
|<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:3/0/1024 | |<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:2/1/1024 | |||
| ... | | |<---------+ 2.05 T:0xf0 O:1234 ET=21 QB2:3/0/1024 | |||
| [[Observe triggered]] | | ... | | |||
|<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:0/1/1024 | | [[Observe triggered]] | |||
|<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:1/1/1024 | |<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:0/1/1024 | |||
|<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:2/1/1024 | |<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:1/1/1024 | |||
|<---------+ 2.05 T:0xf0 O:1235 ET=22 QB2:3/0/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 | |||
| ... | | ||||
]]></artwork> | ]]></artwork> | |||
</figure></t> | </figure> | |||
<t>If transient network losses are possible, then the use of unreliable | ||||
<t>If there is likely to be the possibility of network transient | transport with NON should be | |||
losses, then the use of unreliable transport with NON should be | ||||
considered.</t> | considered.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="false" toc="default"> | ||||
<section numbered="false" title="Acknowledgements" toc="default"> | <name>Acknowledgments</name> | |||
<t>Thanks to Achim Kraus, Jim Schaad, and Michael Richardson for their | <t>Thanks to <contact fullname="Achim Kraus"/>, <contact fullname="Jim Sch | |||
aad"/>, | ||||
and <contact fullname="Michael Richardson"/> for their | ||||
comments.</t> | comments.</t> | |||
<t>Special thanks to <contact fullname="Christian Amsüss"/>, <contact | ||||
<t>Special thanks to Christian Amsüss, Carsten Bormann, and Marco | fullname="Carsten Bormann"/>, and <contact fullname="Marco | |||
Tiloca for their suggestions and several reviews, which improved this | Tiloca"/> for their suggestions and several reviews, which improved this | |||
specification significantly. Thanks to Francesca Palombini for the AD | specification significantly. Thanks to <contact fullname="Francesca Palomb | |||
review. <vspace blankLines="1" />Thanks to Pete Resnick for the Gen-ART | ini"/> | |||
review, Colin Perkins for the Tsvart review, and Emmanuel Baccelli for | for the AD review. Thanks to <contact fullname="Pete Resnick"/> for the Ge | |||
the Iotdir review. Thanks to Martin Duke, Eric Vyncke, Benjamin Kaduk, | n-ART | |||
Roman Danyliw, John Scudder, and Lars Eggert for the IESG review.</t> | review, <contact fullname="Colin Perkins"/> for the TSVART review, and | |||
<contact fullname="Emmanuel Baccelli"/> for | ||||
<t>Some text from <xref target="RFC7959" /> is reused for readers | the IOT-DIR review. Thanks to <contact fullname="Martin Duke"/>, <contact | |||
fullname="Éric Vyncke"/>, <contact fullname="Benjamin Kaduk"/>, | ||||
<contact fullname="Roman Danyliw"/>, <contact fullname="John Scudder"/>, a | ||||
nd | ||||
<contact fullname="Lars Eggert"/> for the IESG review.</t> | ||||
<t>Some text from <xref target="RFC7959" format="default"/> is reused for | ||||
the readers' | ||||
convenience.</t> | convenience.</t> | |||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 310 change blocks. | ||||
1732 lines changed or deleted | 1880 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/ |