rfc8974xml2.original.xml | rfc8974.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="us-ascii"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
<!ENTITY RFC2119 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.2 | ||||
119.xml"> | ||||
<!ENTITY RFC3610 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.3 | ||||
610.xml"> | ||||
<!ENTITY RFC4107 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.4 | ||||
107.xml"> | ||||
<!ENTITY RFC6234 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.6 | ||||
234.xml"> | ||||
<!ENTITY RFC7228 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.7 | ||||
228.xml"> | ||||
<!ENTITY RFC7252 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.7 | ||||
252.xml"> | ||||
<!ENTITY RFC7641 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.7 | ||||
641.xml"> | ||||
<!ENTITY RFC7959 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.7 | ||||
959.xml"> | ||||
<!ENTITY RFC8174 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.8 | ||||
174.xml"> | ||||
<!ENTITY RFC8323 SYSTEM "http://www.rfc-editor.org/refs/bibxml/reference.RFC.8 | ||||
323.xml"> | ||||
<!ENTITY I-D.ietf-6tisch-minimal-security SYSTEM "http://www.rfc-editor.org/re | ||||
fs/bibxml3/reference.I-D.ietf-6tisch-minimal-security.xml"> | ||||
<!ENTITY I-D.ietf-core-echo-request-tag SYSTEM "http://www.rfc-editor.org/refs | ||||
/bibxml3/reference.I-D.ietf-core-echo-request-tag.xml"> | ||||
]> | ||||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?> | ||||
<?rfc compact="yes"?> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?rfc sortrefs="yes"?> | ||||
<?rfc subcompact="no"?> | ||||
<?rfc symrefs="yes"?> | ||||
<?rfc toc="yes"?> | ||||
<?rfc tocdepth="3"?> | ||||
<rfc category="std" docName="draft-ietf-core-stateless-08" ipr="trust200902" upd | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" docName="draft-ietf-core-statele | |||
ates="7252, 8323"> | ss-08" number="8974" ipr="trust200902" updates="7252, 8323" obsoletes="" submis | |||
sionType="IETF" | ||||
category="std" consensus="true" xml:lang="en" sortRefs="true" symRefs="true" toc | ||||
Include="true" tocDepth="3" version="3"> | ||||
<!-- xml2rfc v2v3 conversion 3.5.0 --> | ||||
<front> | <front> | |||
<title abbrev="Extended Tokens in CoAP"> | <title abbrev="Extended Tokens in CoAP"> | |||
Extended Tokens and Stateless Clients | Extended Tokens and Stateless Clients | |||
in the Constrained Application Protocol (CoAP) | in the Constrained Application Protocol (CoAP) | |||
</title> | </title> | |||
<seriesInfo name="RFC" value="8974"/> | ||||
<author initials="K." surname="Hartke" fullname="Klaus Hartke"> | <author initials="K." surname="Hartke" fullname="Klaus Hartke"> | |||
<organization>Ericsson</organization> | <organization>Ericsson</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Torshamnsgatan 23</street> | <street>Torshamnsgatan 23</street> | |||
<city>Stockholm</city> | <city>Stockholm</city> | |||
<code>SE-16483</code> | <code>16483</code> | |||
<country>Sweden</country> | <country>Sweden</country> | |||
</postal> | </postal> | |||
<email>klaus.hartke@ericsson.com</email> | <email>klaus.hartke@ericsson.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Michael C. Richardson" initials="M." surname="Richardson"> | ||||
<author fullname="Michael C. Richardson" initials="M." | ||||
surname="Richardson"> | ||||
<organization abbrev="Sandelman">Sandelman Software Works</organization> | <organization abbrev="Sandelman">Sandelman Software Works</organization> | |||
<address> | <address> | |||
<email>mcr+ietf@sandelman.ca</email> | <email>mcr+ietf@sandelman.ca</email> | |||
<uri>http://www.sandelman.ca/</uri> | <uri>http://www.sandelman.ca/</uri> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2021" month="January" /> | ||||
<date/> | ||||
<workgroup>CoRE Working Group</workgroup> | <workgroup>CoRE Working Group</workgroup> | |||
<abstract> | <abstract> | |||
<t> | <t> | |||
This document provides considerations for alleviating CoAP clients and | This document provides considerations for alleviating Constrained Applic ation Protocol (CoAP) clients and | |||
intermediaries of keeping per-request state. To facilitate this, this | intermediaries of keeping per-request state. To facilitate this, this | |||
document additionally introduces a new, optional CoAP protocol extension | document additionally introduces a new, optional CoAP protocol extension | |||
for extended token lengths. | for extended token lengths. | |||
</t> | </t> | |||
<t> | <t> | |||
This document updates RFCs 7252 and 8323 with an extended definition of the | This document updates RFCs 7252 and 8323 with an extended definition of the | |||
TKL field in the CoAP message header. | "TKL" field in the CoAP message header. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<!-- **************************************************************** --> | <section anchor="introduction" numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>Introduction</name> | |||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<section title="Introduction" anchor="introduction"> | ||||
<t> | <t> | |||
The Constrained Application Protocol (CoAP) <xref target="RFC7252"/> is | The Constrained Application Protocol (CoAP) <xref target="RFC7252" forma | |||
a RESTful application-layer protocol for <xref | t="default"/> is | |||
target="RFC7228">constrained environments</xref>. In CoAP, clients (or | a RESTful application-layer protocol for <xref target="RFC7228" format=" | |||
default">constrained environments</xref>. In CoAP, clients (or | ||||
intermediaries in the client role) make requests to servers (or | intermediaries in the client role) make requests to servers (or | |||
intermediaries in the server role), which satisfy the requests by | intermediaries in the server role), which satisfy the requests by | |||
returning responses. | returning responses. | |||
</t> | </t> | |||
<t> | <t> | |||
While a request is ongoing, a client typically needs to keep some state that | While a request is ongoing, a client typically needs to keep some state that | |||
it requires for processing the response when that arrives. Identificatio n | it requires for processing the response when that arrives. Identificatio n | |||
of this state is done in CoAP by means of a token, an | of this state is done in CoAP by means of a token: an | |||
opaque sequence of bytes chosen by the client and included in the CoAP | opaque sequence of bytes that is chosen by the client and included in th | |||
request, and that is returned by the server verbatim in any resulting Co | e CoAP | |||
AP | request and that is returned by the server verbatim in any resulting CoA | |||
response (<xref target="stateful-exchange"/>). | P | |||
response (<xref target="stateful-exchange" format="default"/>). | ||||
</t> | </t> | |||
<figure anchor="stateful-exchange"> | ||||
<figure anchor="stateful-exchange" title="Token as an Identifier for Request Sta | <name>Token as an Identifier for Request State</name> | |||
te"><artwork align="center"><![CDATA[ | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
+-----------------+ request with +------------+ | +-----------------+ request with +------------+ | |||
| | | state identifier | | | | | | state identifier | | | |||
| | | as token | | | | | | as token | | | |||
| .-<-+->------|--------------------->|------. | | | .-<-+->------|--------------------->|------. | | |||
| _|_ | | | | | | _|_ | | | | | |||
| / \ stored | | | | | | / \ stored | | | | | |||
| \___/ state | | | | | | \___/ state | | | | | |||
| | | | | | | | | | | | | | |||
| '->-+-<------|<---------------------|------' | | | '->-+-<------|<---------------------|------' | | |||
| | | response with | | | | | | response with | | | |||
| v | token echoed back | | | | v | token echoed back | | | |||
+-----------------+ +------------+ | +-----------------+ +------------+ | |||
Client Server | Client Server | |||
]]></artwork></figure> | ]]></artwork> | |||
</figure> | ||||
<t> | <t> | |||
In some scenarios, it can be beneficial to reduce the amount of state | In some scenarios, it can be beneficial to reduce the amount of state | |||
that is stored at the client at the cost of increased message sizes. A c lient can | that is stored at the client at the cost of increased message sizes. A c lient can | |||
opt into this by serializing (parts of) its state into the token itself and then | opt into this by serializing (parts of) its state into the token itself and then | |||
recovering this state from the token in the response (<xref | recovering this state from the token in the response (<xref target="stat | |||
target="stateless-exchange"/>). | eless-exchange" format="default"/>). | |||
</t> | </t> | |||
<figure anchor="stateless-exchange"> | ||||
<figure anchor="stateless-exchange" title="Token as Serialization of Request Sta | <name>Token as Serialization of Request State</name> | |||
te"><artwork align="center"><![CDATA[ | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
+-----------------+ request with +------------+ | +-----------------+ request with +------------+ | |||
| | | serialized state | | | | | | serialized state | | | |||
| | | as token | | | | | | as token | | | |||
| +--------|=====================>|------. | | | +--------|=====================>|------. | | |||
| | | | | | | | | | | | |||
| look ma, | | | | | | look ma, | | | | | |||
| no state! | | | | | | no state! | | | | | |||
| | | | | | | | | | | | |||
| +--------|<=====================|------' | | | +--------|<=====================|------' | | |||
| | | response with | | | | | | response with | | | |||
| v | token echoed back | | | | v | token echoed back | | | |||
+-----------------+ +------------+ | +-----------------+ +------------+ | |||
Client Server | Client Server | |||
]]></artwork></figure> | ]]></artwork> | |||
</figure> | ||||
<t> | <t> | |||
<xref target="stateless-clients"/> of this document provides | <xref target="stateless-clients" format="default"/> of this document pro vides | |||
considerations for clients becoming "stateless" in this way. | considerations for clients becoming "stateless" in this way. | |||
(The term "stateless" is in quotes here, because it's a bit | (The term "stateless" is in quotes here, because it's a bit | |||
oversimplified. Such clients still need to maintain per-server state and other | oversimplified. Such clients still need to maintain per-server state and other | |||
kinds of state. So it would be more accurate to | kinds of state. So it would be more accurate to | |||
just say that the clients are avoiding per-request state.) | just say that the clients are avoiding per-request state.) | |||
</t> | </t> | |||
<t> | <t> | |||
<xref target="stateless-intermediaries"/> of this document | <xref target="stateless-intermediaries" format="default"/> of this docum ent | |||
extends the considerations for clients to intermediaries, which | extends the considerations for clients to intermediaries, which | |||
may not only want to avoid keeping state for the requests they | may want to avoid keeping state for not only the requests they | |||
send to servers but also for the requests they receive from | send to servers but also the requests they receive from | |||
clients. | clients. | |||
</t> | </t> | |||
<t> | <t> | |||
The serialization of state into tokens is limited by the fact | The serialization of state into tokens is limited by the fact | |||
that both <xref target="RFC7252">CoAP over UDP</xref> and <xref | that both <xref target="RFC7252" format="default">CoAP over UDP</xref> a | |||
target="RFC8323">CoAP over reliable transports</xref> restrict | nd <xref target="RFC8323" format="default">CoAP over reliable transports</xref> | |||
restrict | ||||
the maximum token length to 8 bytes. To overcome this | the maximum token length to 8 bytes. To overcome this | |||
limitation, <xref target="extended-tokens"/> of this document | limitation, <xref target="extended-tokens" format="default"/> of this do | |||
first introduces a CoAP protocol extension for extended token | cument | |||
introduces a CoAP protocol extension for extended token | ||||
lengths. | lengths. | |||
</t> | </t> | |||
<t> | <t> | |||
While the use case (avoiding per-request state) and the mechanism | While the use case (avoiding per-request state) and the mechanism | |||
(extended token lengths) presented in this document are closely | (extended token lengths) presented in this document are closely | |||
related, both can be used independently of each other: Some | related, each can be used independently of the other. Some | |||
implementations may be able to fit their state in just 8 bytes; some | implementations may be able to fit their state in just 8 bytes; some | |||
implementations may have other use cases for extended token lengths. | implementations may have other use cases for extended token lengths. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Terminology"> | <name>Terminology</name> | |||
<t> | <t> | |||
In this document, the term "stateless" refers to an implementation | In this document, the term "stateless" refers to an implementation | |||
strategy for a client (or intermediary in the client role) that does | strategy for a client (or intermediary in the client role) that does | |||
not require it to keep state for the individual requests it sends to a | not require it to keep state for the individual requests it sends to a | |||
server (or intermediary in the server role). The client still needs to | server (or intermediary in the server role). The client still needs to | |||
keep state for each server it communicates with (e.g., for token | keep state for each server it communicates with (e.g., for token | |||
generation, message retransmission, and congestion control). | generation, message retransmission, and congestion control). | |||
</t> | </t> | |||
<t> | <t> | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14 | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | >REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
"OPTIONAL" in this document are to be interpreted as described in | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<b | |||
<xref target="RFC2119">BCP 14</xref> <xref target="RFC8174"/> when, | cp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
and only when, they appear in all capitals, as shown here. | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document ar | |||
e 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> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- **************************************************************** --> | <section anchor="extended-tokens" numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>Extended Tokens</name> | |||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<section title="Extended Tokens" anchor="extended-tokens"> | ||||
<t> | <t> | |||
This document updates the message formats defined for <xref | This document updates the message formats defined for <xref target="RFC7 | |||
target="RFC7252">CoAP over UDP</xref> and <xref target="RFC8323">CoAP | 252" format="default">CoAP over UDP</xref> and <xref target="RFC8323" format="de | |||
over TCP, TLS, and WebSockets</xref> with a new definition of the TKL | fault">CoAP | |||
over TCP, TLS, and WebSockets</xref> with a new definition of the "TKL" | ||||
field. | field. | |||
</t> | </t> | |||
<section anchor="tkl-field" numbered="true" toc="default"> | ||||
<section title="Extended Token Length (TKL) Field" anchor="tkl-field"> | <name>Extended Token Length (TKL) Field</name> | |||
<t> | <t> | |||
The definition of the TKL field is updated as follows: | The definition of the "TKL" field is updated as follows: | |||
<list style="hanging"> | </t> | |||
<t hangText="Token Length (TKL):"> | <dl newline="false" spacing="normal"> | |||
4-bit unsigned integer. A value between 0 and 12 inclusive | <dt>Token Length (TKL):</dt> | |||
indicates the length of the variable-length Token field in bytes. | <dd> | |||
<t> | ||||
4-bit unsigned integer. A value between 0 and 12, inclusive, | ||||
indicates the length of the variable-length "Token" field in bytes | ||||
. | ||||
The other three values are reserved for special constructs: | The other three values are reserved for special constructs: | |||
<list style="hanging"> | </t> | |||
<t hangText="13:"> | <dl newline="false" spacing="normal" indent="6"> | |||
An 8-bit unsigned integer directly precedes the Token field an | <dt>13:</dt> | |||
d | <dd> | |||
indicates the length of the Token field minus 13. | An 8-bit unsigned integer directly precedes the "Token" field | |||
</t> | and | |||
<t hangText="14:"> | indicates the length of the "Token" field minus 13. | |||
</dd> | ||||
<dt>14:</dt> | ||||
<dd> | ||||
A 16-bit unsigned integer in network byte order directly prece des the | A 16-bit unsigned integer in network byte order directly prece des the | |||
Token field and indicates the length of the Token field minus | "Token" field and indicates the length of the "Token" field mi nus | |||
269. | 269. | |||
</t> | </dd> | |||
<t hangText="15:"> | <dt>15:</dt> | |||
Reserved. This value MUST NOT be sent and MUST be processed as | <dd> | |||
a message format error. | Reserved. This value <bcp14>MUST NOT</bcp14> be sent and <bcp1 | |||
</t> | 4>MUST</bcp14> be processed as | |||
</list> | a message-format error. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | </dd> | |||
</dl> | ||||
<t> | <t> | |||
All other fields retain their definitions. | All other fields retain their definitions. | |||
</t> | </t> | |||
<t> | <t> | |||
The updated message formats are illustrated in <xref | The updated message formats are illustrated in <xref target="message-f | |||
target="message-formats"/>. | ormats" format="default"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
The new definition of the TKL field increases the maximum token length that can be represented in a | The new definition of the "TKL" field increases the maximum token leng th that can be represented in a | |||
message to 65804 bytes. However, the maximum token length that sender and | message to 65804 bytes. However, the maximum token length that sender and | |||
recipient implementations support may be shorter. For example, a | recipient implementations support may be shorter. For example, a | |||
constrained node of <xref target="RFC7228">Class 1</xref> might | constrained node of <xref target="RFC7228" format="default">Class 1</x ref> might | |||
support extended token lengths only up to 32 bytes. | support extended token lengths only up to 32 bytes. | |||
</t> | </t> | |||
<t> | <t> | |||
In CoAP over UDP, it is often beneficial to keep CoAP messages small | In CoAP over UDP, it is often beneficial to keep CoAP messages small | |||
enough to avoid IP fragmentation. The maximum practical token length | enough to avoid IP fragmentation. The maximum practical token length | |||
may therefore also be influenced by the Path MTU. See Section 4.6 of | may therefore also be influenced by the Path MTU (PMTU). See <xref tar | |||
RFC 7252 for details. | get="RFC7252" | |||
sectionFormat="of" section="4.6" /> for details. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="discovery" numbered="true" toc="default"> | ||||
<section title="Discovering Support" anchor="discovery"> | <name>Discovering Support</name> | |||
<t> | <t> | |||
Extended token lengths require support from server implementations. | Extended token lengths require support from server implementations. | |||
Support can be discovered by a client implementation in one of two | Support can be discovered by a client implementation in one of two | |||
ways: | ways: | |||
<list style="symbols"> | </t> | |||
<t> | <ul spacing="normal"> | |||
<li> | ||||
Where Capabilities and Settings Messages (CSMs) are available, | Where Capabilities and Settings Messages (CSMs) are available, | |||
such as in CoAP over TCP, support can be discovered using the | such as in CoAP over TCP, support can be discovered using the | |||
Extended-Token-Length Capability Option defined in <xref | Extended-Token-Length Capability Option defined in <xref target="c | |||
target="capability-option"/>. | apability-option" format="default"/>. | |||
</t> | </li> | |||
<t> | <li> | |||
Otherwise, such as in CoAP over UDP, support can only be | Otherwise, such as in CoAP over UDP, support can only be | |||
discovered by trial-and-error, as described in <xref | discovered by trial and error, as described in <xref target="trial | |||
target="trial-and-error"/>. | -and-error" format="default"/>. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <section anchor="capability-option" numbered="true" toc="default"> | |||
<name>Extended-Token-Length Capability Option</name> | ||||
<section title="Extended-Token-Length Capability Option" anchor="capabil | ||||
ity-option"> | ||||
<t> | <t> | |||
A server can use the elective Extended-Token-Length Capability | A server can use the elective Extended-Token-Length Capability | |||
Option to indicate the maximum token length it can accept in | Option to indicate the maximum token length it can accept in | |||
requests. | requests. | |||
</t> | </t> | |||
<table anchor="capability-option-definition" align="center"> | ||||
<texttable title="The Extended-Token-Length Capability Option" anchor= | <name>The Extended-Token-Length Capability Option</name> | |||
"capability-option-definition"> | <thead> | |||
<ttcol align="right">#</ttcol> | <tr> | |||
<ttcol align="left">C</ttcol> | <th align="right">#</th> | |||
<ttcol align="left">R</ttcol> | <th align="left">C</th> | |||
<ttcol align="left">Applies to</ttcol> | <th align="left">R</th> | |||
<ttcol align="left">Name</ttcol> | <th align="left">Applies to</th> | |||
<ttcol align="left">Format</ttcol> | <th align="left">Name</th> | |||
<ttcol align="left">Length</ttcol> | <th align="left">Format</th> | |||
<ttcol align="left">Base Value</ttcol> | <th align="left">Length</th> | |||
<th align="left">Base Value</th> | ||||
<c>TBD</c> | </tr> | |||
<c></c> | </thead> | |||
<c></c> | <tbody> | |||
<c>CSM</c> | <tr> | |||
<c>Extended-Token-Length</c> | <td align="right">6</td> | |||
<c>uint</c> | <td align="left"/> | |||
<c>0-3</c> | <td align="left"/> | |||
<c>8</c> | <td align="left">CSM</td> | |||
<td align="left">Extended-Token-Length</td> | ||||
<postamble>C=Critical, R=Repeatable</postamble> | <td align="left">uint</td> | |||
</texttable> | <td align="left">0-3</td> | |||
<td align="left">8</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t keepWithPrevious="true">C=Critical, R=Repeatable</t> | ||||
<t> | <t> | |||
As per Section 3 of RFC 7252, the base value (and the value used | As per <xref target="RFC7252" sectionFormat="of" section="3" />, the base value (and the value used | |||
when this option is not implemented) is 8. | when this option is not implemented) is 8. | |||
</t> | </t> | |||
<t> | <t> | |||
The active value of the Extended-Token-Length Option is replaced | The active value of the Extended-Token-Length Option is replaced | |||
each time the option is sent with a modified value. Its starting | each time the option is sent with a modified value. Its starting | |||
value is its base value. | value is its base value. | |||
</t> | </t> | |||
<t> | <t> | |||
The option value MUST NOT be less than 8 or greater than 65804. If | The option value <bcp14>MUST NOT</bcp14> be less than 8 or greater t | |||
an option value less than 8 is received, the option MUST be ignored. | han 65804. If | |||
an option value less than 8 is received, the option <bcp14>MUST</bcp | ||||
14> be ignored. | ||||
If an option value greater than 65804 is received, the option value | If an option value greater than 65804 is received, the option value | |||
MUST be set to 65804. | <bcp14>MUST</bcp14> be set to 65804. | |||
</t> | </t> | |||
<t> | <t> | |||
Any option value greater than 8 implies support for the new | Any option value greater than 8 implies support for the new | |||
definition of the TKL field specified in <xref target="tkl-field"/>. | definition of the "TKL" field specified in <xref target="tkl-field" format="default"/>. | |||
Indication of support by a server does not oblige a client to | Indication of support by a server does not oblige a client to | |||
actually make use of token lengths greater than 8. | actually make use of token lengths greater than 8. | |||
</t> | </t> | |||
<t> | <t> | |||
If a server receives a request with a token of a length greater than what | If a server receives a request with a token of a length greater than what | |||
it indicated in its Extended-Token-Length Option, it MUST handle the | it indicated in its Extended-Token-Length Option, it <bcp14>MUST</bc | |||
request as a message format error. | p14> handle the | |||
request as a message-format error. | ||||
</t> | </t> | |||
<t> | <t> | |||
If a server receives a request with a token of a length less than or | If a server receives a request with a token of a length less than, o | |||
equal to what it indicated in its Extended-Token-Length Option but | r | |||
is unwilling or unable to handle the token at that time, it MUST NOT | equal to, what it indicated in its Extended-Token-Length Option but | |||
handle the request as a message format error. Instead, it SHOULD | is unwilling or unable to handle the token at that time, it <bcp14>M | |||
UST NOT</bcp14> | ||||
handle the request as a message-format error. Instead, it <bcp14>SHO | ||||
ULD</bcp14> | ||||
return a 5.03 (Service Unavailable) response. | return a 5.03 (Service Unavailable) response. | |||
</t> | </t> | |||
<t> | <t> | |||
The Extended-Token-Length Capability Option does not apply to | The Extended-Token-Length Capability Option does not apply to | |||
responses. The sender of a request is simply expected not to use a | responses. The sender of a request is simply expected not to use a | |||
token of a length greater than it is willing to accept in a | token of a length greater than it is willing to accept in a | |||
response. | response. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="trial-and-error" numbered="true" toc="default"> | ||||
<section title="Trial-and-Error" anchor="trial-and-error"> | <name>Trial and Error</name> | |||
<t> | <t> | |||
A server implementation that does not support the updated definition | A server implementation that does not support the updated definition | |||
of the TKL | of the "TKL" | |||
field specified in <xref target="tkl-field"/> will consider a | field specified in <xref target="tkl-field" format="default"/> will | |||
request with a TKL field value outside the range 0 to 8 a message | consider a | |||
format error and reject it (Section 3 of RFC 7252). A client can | request with a "TKL" field value outside the range 0 to 8 to be a me | |||
ssage-format error and reject it (<xref target="RFC7252" sectionFormat="of" sect | ||||
ion="3" />). A client can | ||||
therefore determine support by sending a request with an extended | therefore determine support by sending a request with an extended | |||
token length and checking whether it is rejected by the server or | token length and checking whether or not it is rejected by the serve | |||
not. | r. | |||
</t> | </t> | |||
<t> | <t> | |||
In CoAP over UDP, the way a request message is rejected depends on t he message type. | In CoAP over UDP, the way a request message is rejected depends on t he message type. | |||
A Confirmable message with a message format error | A Confirmable message with a message-format error | |||
is rejected with a Reset message (Section 4.2 of RFC 7252). A | is rejected with a Reset message (<xref target="RFC7252" sectionForm | |||
Non-confirmable message with a message format error is either reject | at="of" section="4.2" />). A | |||
ed | Non-confirmable message with a message-format error is either reject | |||
with a Reset message or just silently ignored (Section 4.3 of RFC | ed | |||
7252). To reliably get a Reset message, it is therefore REQUIRED tha | with a Reset message or just silently ignored (<xref target="RFC7252 | |||
t clients use a Confirmable | " sectionFormat="of" section="4.3" />). To reliably get a Reset message, it is t | |||
herefore <bcp14>REQUIRED</bcp14> that clients use a Confirmable | ||||
message for determining support. | message for determining support. | |||
</t> | </t> | |||
<t> | <t> | |||
As per RFC 7252, Reset messages are empty and do not contain a | As per RFC 7252, Reset messages are empty and do not contain a | |||
token; they only return the Message ID (<xref | token; they only return the Message ID (<xref target="trial-and-erro | |||
target="trial-and-error-illustration"/>). They also do not contain | r-illustration" format="default"/>). They also do not contain | |||
any indication of what caused a message format error. To avoid any | any indication of what caused a message-format error. To avoid any | |||
ambiguity, it is therefore RECOMMENDED that clients use a request | ambiguity, it is therefore <bcp14>RECOMMENDED</bcp14> that clients u | |||
that has no potential message format error other than the extended | se a request | |||
that has no potential message-format error other than the extended | ||||
token length. | token length. | |||
</t> | </t> | |||
<figure anchor="trial-and-error-illustration"> | ||||
<figure anchor="trial-and-error-illustration" title="A Confirmable Request With | <name>A Confirmable Request with an Extended Token Is Rejected with | |||
an Extended Token is Rejected With a Reset Message if the Server Does Not Have S | a Reset Message If the Server Does Not Have Support</name> | |||
upport"><artwork align="center"><![CDATA[ | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
+-----------------+ request message +------------+ | +-----------------+ request message +------------+ | |||
| | | with extended | | | | | | with extended | | | |||
| | | token length | | | | | | token length | | | |||
| .-<-+->------|--------------------->|------. | | | .-<-+->------|--------------------->|------. | | |||
| _|_ | | | | | | _|_ | | | | | |||
| / \ stored | | | | | | / \ stored | | | | | |||
| \___/ state | | | | | | \___/ state | | | | | |||
| | | | | | | | | | | | | | |||
| '->-+-<------|<---------------------|------' | | | '->-+-<------|<---------------------|------' | | |||
| | | reset message | | | | | | Reset message | | | |||
| v | with only message | | | | v | with only message | | | |||
+-----------------+ ID echoed back +------------+ | +-----------------+ ID echoed back +------------+ | |||
Client Server | Client Server | |||
]]></artwork></figure> | ]]></artwork> | |||
</figure> | ||||
<t> | <t> | |||
An example of a suitable request is a GET request in a Confirmable message that | An example of a suitable request is a GET request in a Confirmable message that | |||
includes only an If-None-Match option and a token of the greatest le ngth | includes only an If-None-Match option and a token of the greatest le ngth | |||
that the client intends to use. Any response with the same token | that the client intends to use. Any response with the same token | |||
echoed back indicates that tokens up to that length are supported by | echoed back indicates that tokens up to that length are supported by | |||
the server. | the server. | |||
</t> | </t> | |||
<t> | <t> | |||
Since network addresses may change, a client SHOULD NOT assume that extended token | Since network addresses may change, a client <bcp14>SHOULD NOT</bcp1 4> assume that extended token | |||
lengths are supported by a server for an unlimited duration. | lengths are supported by a server for an unlimited duration. | |||
Unless additional information is available, the client should assume that addresses (and therefore extended token lengths) are valid for a minimum o f 1800 s, and for a maximum of 86400 s (1 day). | Unless additional information is available, the client should assume that addresses (and therefore extended token lengths) are valid for a minimum o f 1800 s and a maximum of 86400 s (1 day). | |||
A client may use additional forms of input into this determination. | A client may use additional forms of input into this determination. | |||
For instance a client may assume a server which is in the same subne t as the client has a similar address lifetime as the client. | For instance, a client may assume a server that is in the same subne t as the client has a similar address lifetime as the client. | |||
The client may use DHCP lease times or Router Advertisements to set the limits. | The client may use DHCP lease times or Router Advertisements to set the limits. | |||
For servers that are not local, if the server was looked up using DN S, then the DNS resource record will have a Time To Live, and the extended token length should be kept for only that amount of time. | For servers that are not local, if the server was looked up using DN S, then the DNS resource record will have a Time To Live (TTL), and the extended token length should be kept for only that amount of time. | |||
</t> | </t> | |||
<t> | <t> | |||
If a server supports extended token lengths but receives a request | If a server supports extended token lengths but receives a request | |||
with a token of a length it is unwilling or unable to handle, it | with a token of a length it is unwilling or unable to handle, it | |||
MUST NOT reject the message, as that would imply that extended token | <bcp14>MUST NOT</bcp14> reject the message, as that would imply that extended token | |||
lengths are not supported at all. Instead, if the server cannot | lengths are not supported at all. Instead, if the server cannot | |||
handle the request at the time, it SHOULD return a 5.03 (Service | handle the request at the time, it <bcp14>SHOULD</bcp14> return a 5. 03 (Service | |||
Unavailable) response; if the server will never be able to handle th e request | Unavailable) response; if the server will never be able to handle th e request | |||
(e.g., because the token is too large), it SHOULD return a 4.00 (Bad | (e.g., because the token is too large), it <bcp14>SHOULD</bcp14> ret urn a 4.00 (Bad | |||
Request) response. | Request) response. | |||
</t> | </t> | |||
<aside> | ||||
<t> | <t>Design Note: The requirement to return an error response when a | |||
<list style="hanging"> | ||||
<t hangText="Design Note:"> | ||||
The requirement to return an error response when a | ||||
token cannot be handled might seem somewhat contradictory, as | token cannot be handled might seem somewhat contradictory, as | |||
returning the error response requires the server also to return the | returning the error response requires the server also to return the | |||
token it cannot handle. However, | token it cannot handle. However, | |||
processing a request usually involves a number of steps from | processing a request usually involves a number of steps from | |||
receiving the message to passing it to application logic. | receiving the message to passing it to application logic. | |||
The idea is that a server implementing this extension | The idea is that a server implementing this extension | |||
supports large tokens at least in its first few processing steps , enough to | supports large tokens at least in its first few processing steps , enough to | |||
return an error response rather than a Reset message. | return an error response rather than a Reset message. | |||
</t> | </t> | |||
</list> | </aside> | |||
</t> | <aside> | |||
<t>Design Note: To prevent the trial-and-error-based discovery from b | ||||
<t> | ecoming too complicated, no effort is made to indicate the maximum supported | |||
<list style="hanging"> | ||||
<t hangText="Design Note:"> | ||||
To make the trial-and-error-based discovery not too complicated, | ||||
no effort is made to indicate the maximum supported | ||||
token length. A client implementation would probably | token length. A client implementation would probably | |||
already choose the shortest token possible for the task (like | already choose the shortest token possible for the task (such as | |||
being stateless as described in <xref | being stateless, as described in <xref target="stateless-clients | |||
target="stateless-clients"/>), so it would probably not be able | " format="default"/>), so it would probably not be able | |||
to reduce the length any further anyway should a server | to reduce the length any further anyway should a server | |||
indicate a lower limit. | indicate a lower limit. | |||
</t> | </t> | |||
</list> | </aside> | |||
</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="hop-by-hop" numbered="true" toc="default"> | ||||
<section title="Intermediaries" anchor="hop-by-hop"> | <name>Intermediaries</name> | |||
<t> | <t> | |||
Tokens are a hop-by-hop feature: If there are one or more | Tokens are a hop-by-hop feature: if there are one or more | |||
intermediaries between a client and a server, every token is scoped to | intermediaries between a client and a server, every token is scoped to | |||
the exchange between a node in the client role and the node in the | the exchange between a node in the client role and the node in the | |||
server role that it is immediately interacting with. | server role that it is immediately interacting with. | |||
</t> | </t> | |||
<t> | <t> | |||
When an intermediary receives a request, the only requirement is that | When an intermediary receives a request, the only requirement is that | |||
it echoes the token back in any resulting response. There is no | it echoes the token back in any resulting response. There is no | |||
requirement or expectation that an intermediary passes a client's | requirement or expectation that an intermediary passes a client's | |||
token on to a server or that an intermediary uses extended token | token on to a server or that an intermediary uses extended token | |||
lengths itself in its request to satisfy a request with an extended | lengths itself in its request to satisfy a request with an extended | |||
token length. Discovery needs to be performed for each hop where exten ded token lengths are to be used. | token length. Discovery needs to be performed for each hop where exten ded token lengths are to be used. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- **************************************************************** --> | <section anchor="stateless-clients" numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>Stateless Clients</name> | |||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<section title="Stateless Clients" anchor="stateless-clients"> | ||||
<t> | <t> | |||
A client can be alleviated of keeping per-request state as follows: | A client can be alleviated of keeping per-request state as follows: | |||
<list style="numbers"> | </t> | |||
<t> | <ol spacing="normal" type="1"><li> | |||
The client serializes (parts of) its per-request state into | The client serializes (parts of) its per-request state into | |||
a sequence of bytes and sends those bytes as the token of | a sequence of bytes and sends those bytes as the token of | |||
its request to the server. | its request to the server. | |||
</t> | </li> | |||
<t> | <li> | |||
The server returns the token verbatim in the response to the | The server returns the token verbatim in the response to the | |||
client, which allows the client to recover the state and | client, which allows the client to recover the state and | |||
process the response as if it had kept the state locally. | process the response as if it had kept the state locally. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | ||||
<t> | <t> | |||
As servers are just expected to return any token verbatim to the | As servers are just expected to return any token verbatim to the | |||
client, this implementation strategy for clients does not impact the | client, this implementation strategy for clients does not impact the | |||
interoperability of client and server implementations. However, | interoperability of client and server implementations. However, | |||
there are a number of significant, non-obvious implications | there are a number of significant, nonobvious implications | |||
(e.g., related to security and other CoAP protocol features) | (e.g., related to security and other CoAP protocol features) | |||
that client implementations need take into consideration. | that client implementations need take into consideration. | |||
</t> | </t> | |||
<t> | <t> | |||
The following subsections discuss some of these considerations. | The following subsections discuss some of these considerations. | |||
</t> | </t> | |||
<section anchor="serialized-state" numbered="true" toc="default"> | ||||
<section title="Serializing Client State" anchor="serialized-state"> | <name>Serializing Client State</name> | |||
<t> | <t> | |||
The format of the serialized state is generally an | The format of the serialized state is generally an | |||
implementation detail of the client and opaque to the server. | implementation detail of the client and opaque to the server. | |||
However, serialized state information is an attractive target | However, serialized state information is an attractive target | |||
for both unwanted nodes (e.g., on-path attackers) and wanted | for both unwanted nodes (e.g., on-path attackers) and wanted | |||
nodes (e.g., any configured forward proxy) on the path. | nodes (e.g., any configured forward proxy) on the path. | |||
The serialization format therefore needs to include security | The serialization format therefore needs to include security | |||
measures such as the following: | measures such as the following: | |||
<list style="symbols"> | </t> | |||
<t> | <ul spacing="normal"> | |||
A client SHOULD protect the integrity of the state information | <li> | |||
A client <bcp14>SHOULD</bcp14> protect the integrity of the state | ||||
information | ||||
serialized in a token. | serialized in a token. | |||
</t> | </li> | |||
<t> | <li> | |||
Even when the integrity of the serialized state is protected, an | Even when the integrity of the serialized state is protected, an | |||
attacker may still replay a response, making the client | attacker may still replay a response, making the client | |||
believe it sent the same request twice. | believe it sent the same request twice. | |||
For this reason, the client SHOULD implement replay | For this reason, the client <bcp14>SHOULD</bcp14> implement replay | |||
protection (e.g., by using sequence numbers and a replay | protection (e.g., by using sequence numbers and a replay | |||
window). | window). | |||
For replay protection, integrity protection is REQUIRED. | For replay protection, integrity protection is <bcp14>REQUIRED</bc | |||
</t> | p14>. | |||
<t> | </li> | |||
<li> | ||||
If processing a response without keeping request state is | If processing a response without keeping request state is | |||
sensitive to the time elapsed since sending the request, then the | sensitive to the time elapsed since sending the request, then the | |||
client SHOULD include freshness information (e.g., a timestamp) in | client <bcp14>SHOULD</bcp14> include freshness information (e.g., a timestamp) in | |||
the serialized state and reject any response where the freshness | the serialized state and reject any response where the freshness | |||
information is insufficiently fresh. | information is insufficiently fresh. | |||
</t> | </li> | |||
<t> | <li> | |||
Information in the serialized state may be privacy | Information in the serialized state may be privacy | |||
sensitive. | sensitive. | |||
A client SHOULD encrypt the serialized state if it | A client <bcp14>SHOULD</bcp14> encrypt the serialized state if it | |||
contains privacy sensitive information that an attacker | contains privacy-sensitive information that an attacker | |||
would not get otherwise. | would not get otherwise. | |||
</t> | </li> | |||
<t> | <li> | |||
When a client changes the format of the serialized state, | When a client changes the format of the serialized state, | |||
it SHOULD prevent false interoperability with the previous | it <bcp14>SHOULD</bcp14> prevent false interoperability with the p revious | |||
format (e.g., by changing the key used for integrity | format (e.g., by changing the key used for integrity | |||
protection or changing a field in the serialized state). | protection or changing a field in the serialized state). | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Using Extended Tokens"> | <name>Using Extended Tokens</name> | |||
<t> | <t> | |||
A client that depends on | A client that depends on | |||
support for extended token lengths (<xref target="extended-tokens"/>) | support for extended token lengths (<xref target="extended-tokens" for mat="default"/>) | |||
from the server to avoid keeping request state needs to perform a | from the server to avoid keeping request state needs to perform a | |||
discovery of support (<xref target="discovery"/>) before it can be | discovery of support (<xref target="discovery" format="default"/>) bef ore it can be | |||
stateless. | stateless. | |||
</t> | </t> | |||
<t> | <t> | |||
This discovery MUST be performed in a stateful way, i.e., | This discovery <bcp14>MUST</bcp14> be performed in a stateful way, i.e | |||
keeping state for the request (<xref target="stateful-discovery"/>): | ., | |||
If the client was stateless from the start and the server does not | keeping state for the request (<xref target="stateful-discovery" forma | |||
support extended tokens, then any error message could not be processed | t="default"/>). | |||
If the client was stateless from the start, and the server does not | ||||
support extended tokens, then no error message could be processed, | ||||
since the state would neither be present at the client nor returned in | since the state would neither be present at the client nor returned in | |||
the Reset message (<xref target="stateless-discovery"/>). | the Reset message (<xref target="stateless-discovery" format="default" />). | |||
</t> | </t> | |||
<figure anchor="stateful-discovery"> | ||||
<figure anchor="stateful-discovery" title="Depending on Extended Tokens for Bein | <name>Depending on Extended Tokens for Being Stateless First Requires | |||
g Stateless First Requires a Successful Stateful Discovery of Support"><artwork | a Successful Stateful Discovery of Support</name> | |||
align="center"><![CDATA[ | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
+-----------------+ dummy request +------------+ | +-----------------+ dummy request +------------+ | |||
| | | with extended | | | | | | with extended | | | |||
| | | token | | | | | | token | | | |||
| .-<-+->------|=====================>|------. | | | .-<-+->------|=====================>|------. | | |||
| _|_ | | | | | | _|_ | | | | | |||
| / \ stored | | | | | | / \ stored | | | | | |||
| \___/ state | | | | | | \___/ state | | | | | |||
| | | | | | | | | | | | | | |||
| '->-+-<------|<=====================|------' | | | '->-+-<------|<=====================|------' | | |||
| | | response with | | | | | | response with | | | |||
skipping to change at line 644 ¶ | skipping to change at line 553 ¶ | |||
| +--------|=====================>|------. | | | +--------|=====================>|------. | | |||
| | | | | | | | | | | | |||
| look ma, | | | | | | look ma, | | | | | |||
| no state! | | | | | | no state! | | | | | |||
| | | | | | | | | | | | |||
| +--------|<=====================|------' | | | +--------|<=====================|------' | | |||
| | | response with | | | | | | response with | | | |||
| v | token echoed back | | | | v | token echoed back | | | |||
+-----------------+ +------------+ | +-----------------+ +------------+ | |||
Client Server | Client Server | |||
]]></artwork></figure> | ]]></artwork> | |||
</figure> | ||||
<figure anchor="stateless-discovery" title="Stateless Discovery of Support Does | <figure anchor="stateless-discovery"> | |||
Not Work"><artwork align="center"><![CDATA[ | <name>Stateless Discovery of Support Does Not Work</name> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
+-----------------+ dummy request +------------+ | +-----------------+ dummy request +------------+ | |||
| | | with extended | | | | | | with extended | | | |||
| | | token | | | | | | token | | | |||
| +--------|=====================>|------. | | | +--------|=====================>|------. | | |||
| | | | | | | | | | | | |||
| | | | | | | | | | | | |||
| | | | | | | | | | | | |||
| | | | | | | | | | | | |||
| ???|<---------------------|------' | | | ???|<---------------------|------' | | |||
| | reset message | | | | | Reset message | | | |||
| | with only message | | | | | with only message | | | |||
+-----------------+ ID echoed back +------------+ | +-----------------+ ID echoed back +------------+ | |||
Client Server | Client Server | |||
]]></artwork></figure> | ]]></artwork> | |||
</figure> | ||||
<t> | <t> | |||
In environments where support can be reliably discovered through some | In environments where support can be reliably discovered through some | |||
other means, the discovery of support is OPTIONAL. An example for this | other means, the discovery of support is <bcp14>OPTIONAL</bcp14>. An e | |||
is the <xref target="I-D.ietf-6tisch-minimal-security">Constrained | xample for this | |||
is the <xref target="I-D.ietf-6tisch-minimal-security" format="default | ||||
">Constrained | ||||
Join Protocol (CoJP) in a 6TiSCH network</xref>, where support for | Join Protocol (CoJP) in a 6TiSCH network</xref>, where support for | |||
extended tokens is required from all relevant parties. | extended tokens is required from all relevant parties. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Transmitting Messages"> | <name>Transmitting Messages</name> | |||
<t> | <t> | |||
In <xref target="RFC7252">CoAP over UDP</xref>, a client has the choic e between | In <xref target="RFC7252" format="default">CoAP over UDP</xref>, a cli ent has the choice between | |||
Confirmable and Non-confirmable messages for requests. When using | Confirmable and Non-confirmable messages for requests. When using | |||
Non-confirmable messages, a client does not have to keep any message | Non-confirmable messages, a client does not have to keep any message-e | |||
exchange state, which can help in the goal of avoiding state. When usi | xchange state, which can help in the goal of avoiding state. When using | |||
ng | Confirmable messages, a client needs to keep message-exchange | |||
Confirmable messages, a client needs to keep message exchange | ||||
state for performing retransmissions and handling Acknowledgement and | state for performing retransmissions and handling Acknowledgement and | |||
Reset messages, however. Non-confirmable messages are therefore better suited for avoiding state. | Reset messages, however. Non-confirmable messages are therefore better suited for avoiding state. | |||
In any case, a client still needs to keep congestion control state, i. | ||||
e., | In any case, a client still needs to keep congestion-control state, i. | |||
e., | ||||
maintain state for each node it communicates with and enforce limits | maintain state for each node it communicates with and enforce limits | |||
like NSTART. | like NSTART. | |||
</t> | </t> | |||
<t> | <t> | |||
As per Section 5.2 of RFC 7252, a client must be prepared to receive a | As per <xref target="RFC7252" sectionFormat="of" section="5.2" />, a c | |||
response as a | lient must be prepared to receive a response as a | |||
piggybacked response, a separate response, or Non-confirmable response | piggybacked response, a separate response, or a Non-confirmable respon | |||
, | se, | |||
regardless of the message type used for the | regardless of the message type used for the | |||
request. A stateless client MUST handle these response types as | request. A stateless client <bcp14>MUST</bcp14> handle these response types as | |||
follows: | follows: | |||
<list style="symbols"> | </t> | |||
<t> | <ul spacing="normal"> | |||
<li> | ||||
If a piggybacked response passes the checks for token integrity | If a piggybacked response passes the checks for token integrity | |||
and freshness (<xref target="serialized-state"/>), the client proc esses the message as | and freshness (<xref target="serialized-state" format="default"/>) , the client processes the message as | |||
specified in RFC 7252; otherwise, it processes the acknowledgement | specified in RFC 7252; otherwise, it processes the acknowledgement | |||
portion of the message as specified in RFC 7252 and silently | portion of the message as specified in RFC 7252 and silently | |||
discards the response portion. | discards the response portion. | |||
</t> | </li> | |||
<t> | <li> | |||
If a separate response passes the checks for token integrity and | If a separate response passes the checks for token integrity and | |||
freshness, the client processes the message as specified in | freshness, the client processes the message as specified in | |||
RFC 7252; otherwise, it rejects the message as specified in | RFC 7252; otherwise, it rejects the message as specified in <xref | |||
Section 4.2 of RFC 7252. | target="RFC7252" sectionFormat="of" section="4.2" />. | |||
</t> | </li> | |||
<t> | <li> | |||
If a Non-confirmable response passes the checks for token | If a Non-confirmable response passes the checks for token | |||
integrity and freshness, the client processes the message | integrity and freshness, the client processes the message | |||
as specified in RFC 7252; otherwise, it rejects the message as | as specified in RFC 7252; otherwise, it rejects the message as | |||
specified in Section 4.3 of RFC 7252. | specified in <xref target="RFC7252" sectionFormat="of" section="4. | |||
</t> | 3" />. | |||
</list> | </li> | |||
</t> | </ul> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="stateless-intermediaries" numbered="true" toc="default"> | ||||
<section title="Stateless Intermediaries" anchor="stateless-intermediaries"> | <name>Stateless Intermediaries</name> | |||
<t> | <t> | |||
Tokens are a hop-by-hop feature: If a client makes a request to an | Tokens are a hop-by-hop feature. If a client makes a request to an | |||
intermediary, that intermediary needs to store the client's token | intermediary, that intermediary needs to store the client's token | |||
(along with the client's transport address) while it makes its own | (along with the client's transport address) while it makes its own | |||
request towards the origin server and waits for the | request towards the origin server and waits for the | |||
response. When the intermediary receives the response, it looks up | response. When the intermediary receives the response, it looks up | |||
the client's token and transport address for the received request and | the client's token and transport address for the received request and | |||
sends an appropriate response to the client. | sends an appropriate response to the client. | |||
</t> | </t> | |||
<t> | <t> | |||
An intermediary might want to be "stateless" not only in its role as | An intermediary might want to be "stateless" not only in its role as | |||
a client but also in its role as a server, i.e., be | a client but also in its role as a server, i.e., be | |||
alleviated of storing the client information for | alleviated of storing the client information for | |||
the requests it receives. | the requests it receives. | |||
</t> | </t> | |||
<t> | <t> | |||
Such an intermediary can be implemented by serializing the | Such an intermediary can be implemented by serializing the | |||
client information along with the request state into the token towards t he origin server. | client information along with the request state into the token towards t he origin server. | |||
When the intermediary receives the response, it can recover | When the intermediary receives the response, it can recover | |||
the client information from the token and use it to satisfy the client's | the client information from the token and use it to satisfy the client's | |||
request and therefore doesn't need to store it itself. | request; therefore, the intermediary doesn't need to store the informati on itself. | |||
</t> | </t> | |||
<t> | <t> | |||
The following subsections discuss some considerations for this approach. | The following subsections discuss some considerations for this approach. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Observing Resources"> | <name>Observing Resources</name> | |||
<t> | <t> | |||
One drawback of the approach is that an intermediary, without keeping | One drawback of the approach is that an intermediary, without keeping | |||
request state, is unable to aggregate multiple requests for the same | request state, is unable to aggregate multiple requests for the same | |||
target resource, which can significantly reduce efficiency. In | target resource, which can significantly reduce efficiency. In | |||
particular, when clients <xref target="RFC7641">observe</xref> the | particular, when clients observe <xref target="RFC7641" format="defaul | |||
same resource, aggregating requests is REQUIRED (Section 3.1 of RFC | t"></xref> the | |||
7641). This requirement cannot be satisfied without keeping request | same resource, aggregating requests is <bcp14>REQUIRED</bcp14> (<xref | |||
target="RFC7641" sectionFormat="of" section="3.1" />). This requirement cannot b | ||||
e satisfied without keeping request | ||||
state. | state. | |||
</t> | </t> | |||
<t> | <t> | |||
Furthermore, an intermediary that does not keep track of the clients | Furthermore, an intermediary that does not keep track of the clients | |||
observing a resource is not able to determine whether these | observing a resource is not able to determine whether these | |||
clients are still interested in receiving further notifications | clients are still interested in receiving further notifications | |||
(Section 3.5 of RFC 7641) or want to cancel an observation (Section 3. | (<xref target="RFC7641" sectionFormat="of" section="3.5" />) or want t | |||
6 of | o cancel an observation (<xref target="RFC7641" sectionFormat="of" section="3.6" | |||
RFC 7641). | />). | |||
</t> | </t> | |||
<t> | <t> | |||
Therefore, an intermediary MUST NOT include an Observe Option in | Therefore, an intermediary <bcp14>MUST NOT</bcp14> include an Observe Option in | |||
requests it sends without keeping both the request state for the reque sts it sends and the | requests it sends without keeping both the request state for the reque sts it sends and the | |||
client information for the requests it receives. | client information for the requests it receives. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Block-Wise Transfers"> | <name>Block-Wise Transfers</name> | |||
<t> | <t> | |||
When using <xref target="RFC7959">block-wise transfers</xref>, a | When using <xref target="RFC7959" format="default">block-wise transfer s</xref>, a | |||
server might not be able to distinguish blocks originating from | server might not be able to distinguish blocks originating from | |||
different clients once they have been forwarded by an intermediary. | different clients once they have been forwarded by an intermediary. | |||
Intermediaries need to ensure that this does not lead to inconsistent | Intermediaries need to ensure that this does not lead to inconsistent | |||
resource state by keeping distinct block-wise request operations on | resource state by keeping distinct block-wise request operations on | |||
the same resource apart, e.g., utilizing the <xref | the same resource apart, e.g., utilizing the <xref target="I-D.ietf-co | |||
target="I-D.ietf-core-echo-request-tag">Request-Tag Option</xref>. | re-echo-request-tag" format="default">Request-Tag Option</xref>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Gateway Timeouts"> | <name>Gateway Timeouts</name> | |||
<t> | <t> | |||
As per Section 5.7.1 of RFC 7252, an intermediary is REQUIRED to | As per <xref target="RFC7252" sectionFormat="of" section="5.7.1" />, a n intermediary is <bcp14>REQUIRED</bcp14> to | |||
return a 5.04 (Gateway Timeout) response if it cannot obtain a | return a 5.04 (Gateway Timeout) response if it cannot obtain a | |||
response within a timeout. However, if an intermediary does not keep | response within a timeout. However, if an intermediary does not keep | |||
the client information for the requests it receives, it cannot return | the client information for the requests it receives, it cannot return | |||
such a response. Therefore, in this case, the gateway cannot return | such a response. Therefore, in this case, the gateway cannot return | |||
such a response and as such cannot implement such a timeout. | such a response and as such cannot implement such a timeout. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Extended Tokens"> | <name>Extended Tokens</name> | |||
<t> | <t> | |||
A client may make use of extended token lengths in a request to an | A client may make use of extended token lengths in a request to an | |||
intermediary that wants to be "stateless". This means that such an int ermediary | intermediary that wants to be "stateless". This means that such an int ermediary | |||
may have to serialize potentially very large client information into | may have to serialize potentially very large client information into | |||
its token towards the origin server. The tokens can grow even further | its token towards the origin server. The tokens can grow even further | |||
when it progresses along a chain of intermediaries that all want to be | when it progresses along a chain of intermediaries that all want to be | |||
"stateless". | "stateless". | |||
</t> | </t> | |||
<t> | <t> | |||
Intermediaries SHOULD limit the size of client information they are | Intermediaries <bcp14>SHOULD</bcp14> limit the size of client informat ion they are | |||
serializing into their own tokens. An intermediary can do this, for | serializing into their own tokens. An intermediary can do this, for | |||
example, by limiting the extended token lengths it accepts from its | example, by limiting the extended token lengths it accepts from its | |||
clients (see <xref target="discovery"/>) or by keeping the client | clients (see <xref target="discovery" format="default"/>) or by keepin g the client | |||
information locally when the client information exceeds the limit | information locally when the client information exceeds the limit | |||
(i.e., not being "stateless"). | (i.e., not being "stateless"). | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- **************************************************************** --> | <section anchor="security" numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>Security Considerations</name> | |||
<!-- **************************************************************** --> | <section numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>Extended Tokens</name> | |||
<section title="Security Considerations" anchor="security"> | ||||
<section title="Extended Tokens"> | ||||
<t> | <t> | |||
Tokens significantly larger than the 8 bytes specified in RFC 7252 | Tokens significantly larger than the 8 bytes specified in RFC 7252 | |||
have implications in particular for nodes with constrained memory size | have implications -- in particular, for nodes with constrained memory size -- | |||
that need to be mitigated. A node in the server role supporting | that need to be mitigated. A node in the server role supporting | |||
extended token lengths may be vulnerable to a denial-of-service when | extended token lengths may be vulnerable to a denial of service when | |||
an attacker (either on-path or a malicious client) sends large tokens | an attacker (either on-path or a malicious client) sends large tokens | |||
to fill up the memory of the node. Implementations need to be prepared | to fill up the memory of the node. Implementations need to be prepared | |||
to handle such messages. | to handle such messages. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Stateless Clients and Intermediaries"> | <name>Stateless Clients and Intermediaries</name> | |||
<t> | <t> | |||
Transporting the state needed by a client to process a response as | Transporting the state needed by a client to process a response as | |||
serialized state information in the token has several significant and | serialized state information in the token has several significant and | |||
non-obvious security and privacy implications that need to be | nonobvious security and privacy implications that need to be | |||
mitigated; see <xref target="serialized-state"/> for recommendations. | mitigated; see <xref target="serialized-state" format="default"/> for | |||
recommendations. | ||||
</t> | </t> | |||
<t> | <t> | |||
In addition to the format requirements outlined there, implementations | In addition to the format requirements outlined there, implementations | |||
need to ensure that they are not vulnerable to maliciously crafted, | need to ensure that they are not vulnerable to maliciously crafted, | |||
delayed, or replayed tokens. | delayed, or replayed tokens. | |||
</t> | </t> | |||
<t> | <t> | |||
It is generally expected that the use of encryption, integrity | It is generally expected that the use of encryption, integrity | |||
protection, and replay protection for serialized state is | protection, and replay protection for serialized state is | |||
appropriate. | appropriate. | |||
</t> | </t> | |||
<t> | <t> | |||
In the absence of integrity and replay protection, an on-path attacker | In the absence of integrity and replay protection, an on-path attacker | |||
or rogue server/intermediary could return a state (either one modified | or rogue server/intermediary could return a state (either one modified | |||
in a reply, or an unsolicited one) that could alter the internal state | in a reply, or an unsolicited one) that could alter the internal state | |||
of the client. | of the client. | |||
</t> | </t> | |||
<t> | <t> | |||
It is for this reason that at least the use of integrity protection on | It is for this reason that at least the use of integrity protection on | |||
the token is always recommended. | the token is always recommended. | |||
</t> | </t> | |||
<t> | <t> | |||
It maybe that in some very specific case, as a result of a careful | It may be that in some very specific cases, as a result of a careful | |||
and detailed analysis of any potential attacks, that there may be cas | and detailed analysis of any potential attacks, it is decided that suc | |||
es | h cryptographic protections do not add value. | |||
where such cryptographic protections do not add value. | ||||
The authors of this document have not found such a use case as yet, bu t this | The authors of this document have not found such a use case as yet, bu t this | |||
is a local decision. | is a local decision. | |||
</t> | </t> | |||
<t> | <t> | |||
It should further be emphasized that the encrypted state is created by the | It should further be emphasized that the encrypted state is created by the | |||
sending node, and decrypted by the same node when receiving a | sending node and decrypted by the same node when receiving a | |||
response. | response. | |||
The key is not shared with any other system. | The key is not shared with any other system. | |||
Therefore the choice of encryption scheme and the generation of the ke y for | Therefore, the choice of encryption scheme and the generation of the k ey for | |||
this system is purely a local matter. | this system is purely a local matter. | |||
</t> | </t> | |||
<t> | <t> | |||
When encryption is used, the use of <xref | When encryption is used, the use of <xref target="RFC3610" format="def | |||
target="RFC3610">AES-CCM</xref> with a 64-bit tag is recommended, | ault">AES-CCM</xref> with a 64-bit tag is recommended, | |||
combined with a sequence number and a replay window. | combined with a sequence number and a replay window. | |||
This choice is informed by available hardware acceleration of on | This choice is informed by available hardware acceleration of on | |||
many constrained systems. | many constrained systems. | |||
If a different algorithm is available accelerated on the sender, | If a different algorithm is available accelerated on the sender, | |||
with similar or stronger strength, then it SHOULD be preferred. | with similar or stronger strength, then it <bcp14>SHOULD</bcp14> be pr eferred. | |||
Where privacy of the state is not required, and encryption is not need | Where privacy of the state is not required, and encryption is not need | |||
ed, <xref | ed, <xref target="RFC6234" format="default">HMAC-SHA-256</xref>, combined with a | |||
target="RFC6234">HMAC-SHA-256</xref>, combined with a sequence number | sequence number | |||
and a replay window, may be used. | and a replay window, may be used. | |||
</t> | </t> | |||
<t> | <t> | |||
This size of the replay window depends upon the number of | This size of the replay window depends upon the number of | |||
requests that need to be outstanding. This can be | requests that need to be outstanding. This can be | |||
determined from the rate at which new ones are made, and the | determined from the rate at which new ones are made and the | |||
expected duration in which responses are expected. | expected time period during which responses are expected. | |||
</t> | </t> | |||
<t> | <t> | |||
For instance, given a CoAP MAX_TRANSMIT_WAIT of 93 s (Section 4.8.2 of <xref target="RFC7252"/>, any request that is not answered within 93 s will | For instance, given a CoAP MAX_TRANSMIT_WAIT of 93 s (<xref target="RF C7252" sectionFormat="of" section="4.8.2"/>), any request that is not answered w ithin 93 s will | |||
be considered to have failed. At a request rate of | be considered to have failed. At a request rate of | |||
one request per 10 s, at most 10 (ceil(9.3)) requests can be | one request per 10 s, at most 10 (ceil(9.3)) requests can be | |||
outstanding at a time, and any convenient replay window larger than | outstanding at a time, and any convenient replay window larger than | |||
20 will work. As replay windows are often implemented with a | 20 will work. As replay windows are often implemented with a | |||
sliding window and a bit, the use of a 32-bit window would be | sliding window and a bit, the use of a 32-bit window would be | |||
sufficient. | sufficient. | |||
</t> | </t> | |||
<t> | <t> | |||
For use cases where requests are being relayed from another node, | For use cases where requests are being relayed from another node, | |||
the request rate may be estimated by the total link capacity | the request rate may be estimated by the total link capacity | |||
allocated for that kind of traffic. An alternate view would | allocated for that kind of traffic. An alternate view would | |||
consider how many IPv6 Neighbor Cache Entries (NCEs) the system can | consider how many IPv6 Neighbor Cache Entries (NCEs) the system can | |||
afford to allocate for this use. | afford to allocate for this use. | |||
</t> | </t> | |||
<t> | <t> | |||
When using an encryption mode that depends on a nonce, such as | When using an encryption mode that depends on a nonce, such as | |||
AES-CCM, repeated use of the same nonce under the same key | AES-CCM, repeated use of the same nonce under the same key | |||
causes the cipher to fail catastrophically. | causes the cipher to fail catastrophically. | |||
</t> | </t> | |||
<t> | <t> | |||
If a nonce is ever used for more than one encryption operation with | If a nonce is ever used for more than one encryption operation with | |||
the same key, then the same key stream gets used to encrypt both plain texts and the | the same key, then the same key stream gets used to encrypt both plain texts, and the | |||
confidentiality guarantees are voided. Devices with low-quality entrop y | confidentiality guarantees are voided. Devices with low-quality entrop y | |||
sources -- as is typical with constrained devices, which incidentally | sources -- as is typical with constrained devices, which incidentally | |||
happen to be a natural candidate for the stateless mechanism described | happen to be a natural candidate for the stateless mechanism described | |||
in this document -- need to carefully pick a nonce generation | in this document -- need to carefully pick a nonce-generation | |||
mechanism that provides the above uniqueness guarantee. | mechanism that provides the above uniqueness guarantee. | |||
</t> | </t> | |||
<t> | <t> | |||
<xref target="RFC8613" /> appendix B.1.1 ("Sender Sequence Number") | <xref target="RFC8613"/>, Appendix B.1.1 ("Sender Sequence Number") | |||
provides a model for how to maintain non-repeating nonces without | provides a model for how to maintain nonrepeating nonces without | |||
causing excessive wear of flash memory. | causing excessive wear of flash memory. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- **************************************************************** --> | <section numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>IANA Considerations</name> | |||
<!-- **************************************************************** --> | <section numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>CoAP Signaling Option Number</name> | |||
<section title="IANA Considerations"> | ||||
<section title="CoAP Signaling Option Number"> | ||||
<t> | <t> | |||
The following entries are added to the "CoAP Signaling Option Numbers" | The following entry has been added to the "CoAP Signaling Option Numbe rs" | |||
registry within the "CoRE Parameters" registry. | registry within the "CoRE Parameters" registry. | |||
</t> | </t> | |||
<table align="center"> | ||||
<texttable> | <name>CoAP Signalling Option Number</name> | |||
<ttcol align="left">Applies to</ttcol> | <thead> | |||
<ttcol align="right">Number</ttcol> | <tr> | |||
<ttcol align="left">Name</ttcol> | <th align="left">Applies to</th> | |||
<ttcol align="left">Reference</ttcol> | <th align="right">Number</th> | |||
<th align="left">Name</th> | ||||
<c>7.01</c> | <th align="left">Reference</th> | |||
<c>TBD</c> | </tr> | |||
<c>Extended-Token-Length</c> | </thead> | |||
<c>[[this document]]</c> | <tbody> | |||
</texttable> | <tr> | |||
<td align="left">7.01</td> | ||||
<td align="right">6</td> | ||||
<td align="left">Extended-Token-Length</td> | ||||
<td align="left">RFC 8974</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
[[NOTE TO RFC EDITOR: Please replace "TBD" in this section and in | ||||
<xref target="capability-option-definition"/> with the code point | ||||
assigned by IANA.]] | ||||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<!-- **************************************************************** --> | <displayreference target="I-D.ietf-core-echo-request-tag" to="ECHO-REQUEST-TAG"/ | |||
<!-- **************************************************************** --> | > | |||
<!-- **************************************************************** --> | <displayreference target="I-D.ietf-6tisch-minimal-security" to="6TISCH-MIN-SEC"/ | |||
<!-- **************************************************************** --> | > | |||
<references title="Normative References"> | ||||
&RFC2119; | ||||
&RFC7252; | ||||
&RFC7641; | ||||
&RFC7959; | ||||
&RFC8174; | ||||
&RFC8323; | ||||
</references> | ||||
<references title="Informative References"> | <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.7252.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.7959.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.8323.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.3610.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6234.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7228.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8613.xml"/> | ||||
&RFC3610; | <!-- [I-D.ietf-core-echo-request-tag] IESG state - Waiting for AD Go-Ahead::AD F | |||
&RFC6234; | ollowup --> | |||
&RFC7228; | ||||
<?rfc include="reference.RFC.8613" ?> | ||||
&I-D.ietf-core-echo-request-tag; | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D .ietf-core-echo-request-tag.xml"/> | |||
&I-D.ietf-6tisch-minimal-security; | <!-- [I-D.ietf-6tisch-minimal-security] in MISSREF state as of 12/5/20 --> | |||
<xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D | ||||
.ietf-6tisch-minimal-security.xml"/> | ||||
</references> | ||||
</references> | </references> | |||
<!-- **************************************************************** --> | <section anchor="message-formats" numbered="true" toc="default"> | |||
<!-- **************************************************************** --> | <name>Updated Message Formats</name> | |||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<section title="Updated Message Formats" anchor="message-formats"> | ||||
<t> | <t> | |||
In <xref target="extended-tokens"/>, this document updates the | In <xref target="extended-tokens" format="default"/>, this document upda | |||
CoAP message formats by specifying a new definition of the TKL | tes the | |||
CoAP message formats by specifying a new definition of the "TKL" | ||||
field in the message header. As an alternative presentation of | field in the message header. As an alternative presentation of | |||
this update, this appendix shows the CoAP message formats for | this update, this appendix shows the CoAP message formats for | |||
<xref target="RFC7252">CoAP over UDP</xref> and <xref | <xref target="RFC7252" format="default">CoAP over UDP</xref> and <xref t | |||
target="RFC8323">CoAP over TCP, TLS, and WebSockets</xref> with | arget="RFC8323" format="default">CoAP over TCP, TLS, and WebSockets</xref> with | |||
the new definition applied. | the new definition applied. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | ||||
<section title="CoAP over UDP"> | <name>CoAP over UDP</name> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
<figure><artwork align="center"><![CDATA[ | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+-------+-------+---------------+ | +-------+-------+---------------+ | |||
| | | | | | | | | | |||
| Ver | T | TKL | 1 byte | | Ver | T | TKL | 1 byte | |||
| | | | | | | | | | |||
+-------+-------+---------------+ | +-------+-------+---------------+ | |||
| | | | | | |||
| Code | 1 byte | | Code | 1 byte | |||
| | | | | | |||
+-------------------------------+ | +-------------------------------+ | |||
skipping to change at line 1102 ¶ | skipping to change at line 953 ¶ | |||
| | | | | | | | |||
+---------------+---------------+ | +---------------+---------------+ | |||
\ \ | \ \ | |||
/ / | / / | |||
\ \ | \ \ | |||
/ Payload / 0 or more bytes | / Payload / 0 or more bytes | |||
\ \ | \ \ | |||
/ / | / / | |||
\ \ | \ \ | |||
+-------------------------------+ | +-------------------------------+ | |||
]]></artwork></figure> | ]]></artwork> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="CoAP over TCP/TLS"> | <name>CoAP over TCP/TLS</name> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
<figure><artwork align="center"><![CDATA[ | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---------------+---------------+ | +---------------+---------------+ | |||
| | | | | | | | |||
| Len | TKL | 1 byte | | Len | TKL | 1 byte | |||
| | | | | | | | |||
+---------------+---------------+ | +---------------+---------------+ | |||
\ \ | \ \ | |||
/ Len / 0-4 bytes | / Len / 0-4 bytes | |||
\ (extended) \ | \ (extended) \ | |||
+-------------------------------+ | +-------------------------------+ | |||
skipping to change at line 1151 ¶ | skipping to change at line 1000 ¶ | |||
| | | | | | | | |||
+---------------+---------------+ | +---------------+---------------+ | |||
\ \ | \ \ | |||
/ / | / / | |||
\ \ | \ \ | |||
/ Payload / 0 or more bytes | / Payload / 0 or more bytes | |||
\ \ | \ \ | |||
/ / | / / | |||
\ \ | \ \ | |||
+-------------------------------+ | +-------------------------------+ | |||
]]></artwork></figure> | ]]></artwork> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="CoAP over WebSockets"> | <name>CoAP over WebSockets</name> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
<figure><artwork align="center"><![CDATA[ | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---------------+---------------+ | +---------------+---------------+ | |||
| | | | | | | | |||
| 0 | TKL | 1 byte | | 0 | TKL | 1 byte | |||
| | | | | | | | |||
+---------------+---------------+ | +---------------+---------------+ | |||
| | | | | | |||
| Code | 1 byte | | Code | 1 byte | |||
| | | | | | |||
+-------------------------------+ | +-------------------------------+ | |||
skipping to change at line 1196 ¶ | skipping to change at line 1043 ¶ | |||
| | | | | | | | |||
+---------------+---------------+ | +---------------+---------------+ | |||
\ \ | \ \ | |||
/ / | / / | |||
\ \ | \ \ | |||
/ Payload / 0 or more bytes | / Payload / 0 or more bytes | |||
\ \ | \ \ | |||
/ / | / / | |||
\ \ | \ \ | |||
+-------------------------------+ | +-------------------------------+ | |||
]]></artwork></figure> | ]]></artwork> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- **************************************************************** --> | <section numbered="false" toc="default"> | |||
<!-- **************************************************************** --> | <name>Acknowledgements</name> | |||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<section title="Acknowledgements" numbered="no"> | ||||
<t> | <t> | |||
This document is based on the requirements of and work on the <xref | This document is based on the requirements of, and work on, "Constrained | |||
target="I-D.ietf-6tisch-minimal-security">Minimal Security Framework for | Join Protocol (CoJP) for 6TiSCH" (January 2020) by <contact fullname="Mališa Vu | |||
6TiSCH</xref> by Malisa Vucinic, Jonathan Simon, Kris Pister, and | činić"/>, <contact fullname="Jonathan Simon"/>, <contact fullname="Kris Pister"/ | |||
Michael Richardson. | >, and | |||
<contact fullname="Michael Richardson"/>. | ||||
</t> | </t> | |||
<!-- sorted by last name --> | ||||
<t> | <t> | |||
Thanks to | Thanks to | |||
Christian Amsuss, | <contact fullname="Christian Amsüss"/>, | |||
Carsten Bormann, | <contact fullname="Carsten Bormann"/>, | |||
Roman Danyliw, | <contact fullname="Roman Danyliw"/>, | |||
Christer Holmberg, | <contact fullname="Christer Holmberg"/>, | |||
Benjamin Kaduk, | <contact fullname="Benjamin Kaduk"/>, | |||
Ari Keranen, | <contact fullname="Ari Keränen"/>, | |||
Erik Kline, | <contact fullname="Erik Kline"/>, | |||
Murray Kucherawy, | <contact fullname="Murray Kucherawy"/>, | |||
Warren Kumari, | <contact fullname="Warren Kumari"/>, | |||
Barry Leiba, | <contact fullname="Barry Leiba"/>, | |||
David Mandelberg, | <contact fullname="David Mandelberg"/>, | |||
Dan Romascanu, | <contact fullname="Dan Romascanu"/>, | |||
Jim Schaad, | <contact fullname="Jim Schaad"/>, | |||
Goran Selander, | <contact fullname="Göran Selander"/>, | |||
Malisa Vucinic, | <contact fullname="Mališa Vučinić"/>, | |||
Eric Vyncke, and | <contact fullname="Éric Vyncke"/>, and | |||
Robert Wilton | <contact fullname="Robert Wilton"/> | |||
for helpful comments and discussions that have shaped the document. | for helpful comments and discussions that have shaped the document. | |||
</t> | </t> | |||
<t> | <t> | |||
Special thanks to John Mattsson for his contributions to the security | Special thanks to <contact fullname="John Mattsson"/> for his contributi | |||
considerations of the document, and to Thomas Fossati for his in-depth | ons to the security considerations of the document, and to <contact fullname="Th | |||
review, copious comments, and suggested text. | omas Fossati"/> for his in-depth review, copious comments, and suggested text. | |||
</t> | </t> | |||
</section> | </section> | |||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
<!-- **************************************************************** --> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 234 change blocks. | ||||
593 lines changed or deleted | 474 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/ |