<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 2.6.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-core-coap-pubsub-11" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.2 -->
  <front>
    <title abbrev="Publish-Subscribe Broker for CoAP">Publish-Subscribe Broker for the Constrained Application Protocol (CoAP)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-core-coap-pubsub-11"/>
    <author initials="M." surname="Koster" fullname="Michael Koster">
      <organization>SmartThings</organization>
      <address>
        <email>Michael.Koster@smartthings.com</email>
      </address>
    </author>
    <author initials="A." surname="Keranen" fullname="Ari Keranen">
      <organization>Ericsson</organization>
      <address>
        <email>ari.keranen@ericsson.com</email>
      </address>
    </author>
    <author initials="J." surname="Jimenez" fullname="Jaime Jimenez">
      <organization>Ericsson</organization>
      <address>
        <email>jaime@iki.fi</email>
      </address>
    </author>
    <date year="2022" month="November" day="04"/>
    <area>Applications and Real-Time</area>
    <workgroup>Constrained RESTful Environments</workgroup>
    <keyword>coap</keyword>
    <keyword>pubsub</keyword>
    <abstract>
      <t>The Constrained Application Protocol (CoAP), and related extensions are intended
to support machine-to-machine communication in systems where one or more
nodes are resource constrained, in particular for low power wireless sensor
networks. This document defines a publish-subscribe Broker for CoAP that
extends the capabilities of CoAP for supporting nodes with long breaks in
connectivity and/or up-time.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Constrained RESTful Environments Working Group mailing list (core@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/core/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/jaimejim/draft-ietf-core-coap-pubsub"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The Constrained Application Protocol (CoAP) <xref target="RFC7252"/> supports
machine-to-machine communication across networks of constrained
devices. CoAP uses a request/response model where clients make requests to
servers in order to request actions on resources. Depending on the situation
the same device may act either as a server, a client, or both.</t>
      <t>One important class of constrained devices includes devices that are intended
to run for years from a small battery, or by scavenging energy from their
environment. These devices have limited reachability because they spend most
of their time in a sleeping state with no network connectivity. Devices may
also have limited reachability due to certain middle-boxes, such as Network
Address Translators (NATs) or firewalls. Such middle-boxes often prevent
connecting to a device from the Internet unless the connection was initiated
by the device.</t>
      <t>For some applications the client/server and request/response communication model
is not optimal but publish-subscribe communication with potentially many senders
and/or receivers and communication via topics rather than directly with
endpoints may fit better.</t>
      <t>This document specifies simple extensions to CoAP for enabling publish-subscribe
communication using a Broker node that enables store-and-forward messaging
between two or more nodes. This model facilitates communication of nodes with
limited reachability, enables simple many-to-many communication, and eases
integration with other publish-subscribe systems.</t>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>This specification requires readers to be familiar with all the terms and
concepts that are discussed in <xref target="RFC5988"/> and <xref target="RFC6690"/>. Readers
should also be familiar with the terms and concepts discussed in
<xref target="RFC7252"/> and <xref target="RFC9167"/>. The URI template
format <xref target="RFC6570"/> is used to describe the REST API defined in
this specification.</t>
        <t>This specification makes use of the following additional terminology:</t>
        <dl>
          <dt>Publish-Subscribe (pub/sub):</dt>
          <dd>
            <t>A messaging paradigm where messages are published to a Broker and potential
receivers can subscribe to the Broker to receive messages. The publishers
do not (need to) know where the message will be eventually sent: the publications
and subscriptions are matched by a Broker and publications are delivered
by the Broker to subscribed receivers.</t>
          </dd>
          <dt>CoAP pub/sub service:</dt>
          <dd>
            <t>A group of REST resources, as defined in this document, which together
implement the required features of this specification.</t>
          </dd>
          <dt>CoAP pub/sub Broker:</dt>
          <dd>
            <t>A server node capable of receiving messages (publications) from and sending
messages to other nodes, and able to match subscriptions and publications
in order to route messages to the right destinations. The Broker can also
temporarily store publications to satisfy future subscriptions and pending notifications.</t>
          </dd>
          <dt>CoAP pub/sub Client:</dt>
          <dd>
            <t>A CoAP client which is capable of publish or subscribe operations as defined
in this specification.</t>
          </dd>
          <dt>Topic:</dt>
          <dd>
            <t>A unique identifier for a particular item being published and/or subscribed
to. A Broker uses the topics to match subscriptions to publications. A reference to a Topic on a Broker
is a valid CoAP URI as defined in <xref target="RFC7252"/></t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <section anchor="coap-pubsub-architecture">
        <name>CoAP Pub/sub Architecture</name>
        <t><xref target="arch-fig"/> shows the architecture of a CoAP pub/sub service. CoAP pub/sub Clients interact
with a CoAP pub/sub Broker through the CoAP pub/sub REST API which is hosted by
the Broker. State information is updated between the Clients and the Broker.
The CoAP pub/sub Broker performs a store-and-forward of state update representations
between certain CoAP pub/sub Clients. Clients Subscribe to topics upon which
representations are Published by other Clients, which are forwarded by the
Broker to the subscribing clients. A CoAP pub/sub Broker may be used as a
REST resource proxy, retaining the last published representation to supply
in response to Read requests from Clients.</t>
        <figure anchor="arch-fig">
          <name>CoAP pub/sub Architecture</name>
          <artwork align="center"><![CDATA[
Clients        pub/sub         Broker
+-------+         |
| CoAP  |         |
|pub/sub|---------|------+
|Client |         |      |    +-------+
+-------+         |      +----| CoAP  |
                  |           |pub/sub|
+-------+         |      +----|Broker |
| CoAP  |         |      |    +-------+
|pub/sub|---------|------+
|Client |         |
+-------+         |

]]></artwork>
        </figure>
      </section>
      <section anchor="coap-pubsub-broker">
        <name>CoAP Pub/sub Broker</name>
        <t>A CoAP pub/sub Broker is a CoAP Server that exposes a REST API for clients
to use to initiate publish-subscribe interactions. Avoiding the need
for direct reachability between clients, the Broker only needs to be
reachable from all clients. The Broker also needs to have sufficient
resources (storage, bandwidth, etc.) to host CoAP resource services,
and potentially buffer messages, on behalf of the clients.</t>
      </section>
      <section anchor="coap-pubsub-client">
        <name>CoAP Pub/sub Client</name>
        <t>A CoAP pub/sub Client interacts with a CoAP pub/sub Broker using the CoAP pub/sub
REST API defined in this document. Clients initiate interactions with a CoAP pub/sub Broker. A data source
(e.g., sensor clients) can publish state updates to the Broker and data sinks
(e.g., actuator clients) can read from or subscribe to state updates from
the Broker. Application clients can make use of both publish and subscribe
in order to exchange state updates with data sources and data sinks.</t>
      </section>
      <section anchor="coap-pubsub-topic">
        <name>CoAP Pub/sub Topic</name>
        <t>The clients and Broker use topics to identify a particular resource or
object in a publish-subscribe system. Topics are conventionally formed
as a hierarchy, e.g. "/sensors/weather/barometer/pressure" or
"/EP-33543/sen/3303/0/5700".  The topics are hosted by a Broker and
all the clients using the Broker share the same namespace for
topics.</t>
        <t>Every CoAP pub/sub topic has an associated link, consisting of a reference
path on the Broker using URI path <xref target="RFC3986"/> construction and link
attributes <xref target="RFC6690"/>. Every topic is associated with zero or more
stored representations and a content-format specified in the link. A
CoAP pub/sub topic value may alternatively consist of a collection of one or
more sub-topics, consisting of links to the sub-topic URIs and
indicated by a link-format content-format. Sub-topics are also topics and
may have their own sub-topics, forming a tree structure of unique paths that
is implemented using URIs. The full URI of a topic includes a scheme and
authority for the Broker, for example
"coaps://192.0.2.13:5684/EP-33543/sen/3303/0/5700".</t>
        <t>A Topic may have a lifetime defined by using the CoAP Max-Age option on topic
creation, or on publish operations to the topic. The lifetime is refreshed each
time a representation is published to the topic. If the lifetime expires, the
topic is removed from discovery responses, returns errors on subscription, and
any outstanding subscriptions are cancelled.</t>
      </section>
      <section anchor="brokerless-pubsub">
        <name>Brokerless Pub/sub</name>
        <t>In some use cases, it is desireable to use pub/sub semantics for peer-to-peer
communication, but it is not feasible or desireable to include a separate node
on the network to serve as a Broker. In other use cases, it is desireable to enable one-way-only communication, such as sensors pushing updates to a service.</t>
        <t><xref target="brokerless"/> shows an arrangement for using CoAP pub/sub in a
"Brokerless" configuration between peer nodes. Nodes in a Brokerless
system may act as both Broker and client. A node that supports Broker
functionality may be pre-configured with topics that expose services
and resources. Brokerless peer nodes can be mixed with client and
Broker nodes in a system with full interoperability.</t>
        <figure anchor="brokerless">
          <name>Brokerless pub/sub</name>
          <artwork align="center"><![CDATA[
  Peer         pub/sub          Peer
+-------+         |         +-------+
| CoAP  |         |         | CoAP  |
|pub/sub|---------|---------|pub/sub|
|Client |         |         |Broker |
+-------+         |         +-------+
| CoAP  |         |         | CoAP  |
|pub/sub|---------|---------|pub/sub|
|Broker |         |         |Client |
+-------+         |         +-------+

]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="sec-rest-api">
      <name>CoAP Pub/sub REST API</name>
      <t>This section defines the REST API exposed by a CoAP pub/sub Broker to pub/sub
Clients.  The examples throughout this section assume the use of CoAP
<xref target="RFC7252"/>. A CoAP pub/sub Broker implementing this specification SHOULD
support the DISCOVERY, CREATE, PUBLISH, SUBSCRIBE, UNSUBSCRIBE, READ,
and REMOVE operations defined in this section. Optimized implementations
MAY support a subset of the operations as required by particular constrained
use cases.</t>
      <section anchor="discover">
        <name>DISCOVERY</name>
        <t>CoAP pub/sub Clients discover CoAP pub/sub Brokers by using CoAP Simple
Discovery or through a Resource Directory (RD)
<xref target="RFC9167"/>. A CoAP pub/sub Broker SHOULD
indicate its presence and availability on a network by exposing a link
to the entry point of its pub/sub API at its .well-known/core location <xref target="RFC6690"/>. A CoAP
pub/sub Broker MAY register its pub/sub REST API entry point with a Resource
Directory. <xref target="discover-fig"/> shows an example of a client discovering a
local pub/sub API using CoAP Simple Discovery. A Broker wishing to
advertise the CoAP pub/sub API for Simple Discovery or through a
Resource Directory MUST use the link relation rt=core.ps. A Broker MAY
advertise its supported content formats and other attributes in the
link to its pub/sub API.</t>
        <t>A CoAP pub/sub Broker MAY offer a topic discovery entry point to enable Clients
to find topics of interest, either by topic name or by link attributes
which may be registered when the topic is
created. <xref target="discover-topic-fig"/> shows an example of a client looking
for a topic with a resource type (rt) of "temperature" using
Discover. The client then receives the URI of the resource and its
content-format. A pub/sub Broker wishing to advertise topic discovery
MUST use the relation rt=core.ps.discover in the link.</t>
        <t>A CoAP pub/sub Broker MAY provide topic discovery functionality through the
.well-known/core resource. Links to topics may be exposed at
.well-known/core in addition to links to the pub/sub
API. <xref target="discover-topic-wk-fig"/> shows an example of topic discovery
through .well-known/core.</t>
        <t>Topics in the broker may be created in hierarchies (see <xref target="sec-create"/>) with
parent topics having sub-topics. For a discovery the broker may choose
to not expose the sub-topics in order to limit amount of topic links
sent in a discovery response. The client can then perform discovery
for the parent topics it wants to discover the sub-topics.</t>
        <t>The DISCOVER interface is specified as follows:</t>
        <dl>
          <dt>Interaction:</dt>
          <dd>
            <t>Client -&gt; Broker</t>
          </dd>
          <dt>Method:</dt>
          <dd>
            <t>GET</t>
          </dd>
          <dt>URI Template:</dt>
          <dd>
            <t>{+ps}/{+topic}{?q*}</t>
          </dd>
          <dt>URI Template Variables:</dt>
          <dd>
            <t>ps := Pub/sub REST API entry point (optional). The entry point of the pub/sub REST API, as obtained from discovery, used to discover topics.</t>
          </dd>
          <dt/>
          <dd>
            <t>topic := The desired topic to return links for (optional).</t>
          </dd>
          <dt/>
          <dd>
            <t>q := Query Filter (optional). MAY contain a query filter list as per
 <xref target="RFC6690"/> Section 4.1.</t>
          </dd>
          <dt>Content-Format:</dt>
          <dd>
            <t>application/link-format</t>
          </dd>
        </dl>
        <t>The following response codes are defined for the DISCOVER operation:</t>
        <dl>
          <dt>Success:</dt>
          <dd>
            <t>2.05 "Content" with an application/link-format payload containing
one or more matching entries for the Broker resource. A pub/sub
Broker SHOULD use the value "/ps/" for the base URI of the pub/sub
API wherever possible.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.04 "Not Found" is returned in case no matching entry is found for
a unicast request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.00 "Bad Request" is returned in case of a malformed request for a unicast
request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>No error response to a multicast request.</t>
          </dd>
        </dl>
        <figure anchor="discover-fig">
          <name>Example of DISCOVER pub/sub function</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | ------ GET /.well-known/core?rt=core.ps ---->>|
  | -- Content-Format: application/link-format ---|
  |                                               |
  | <<--- 2.05 Content                            |
  | </ps/>;rt=core.ps;rt=core.ps.discover;ct=40 --|
  |                                               |

]]></artwork>
        </figure>
        <figure anchor="discover-topic-fig">
          <name>Example of DISCOVER topic</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | ---------- GET /ps/?rt="temperature" ------->>|
  |    Content-Format: application/link-format    |
  |                                               |
  | <<-- 2.05 Content                             |
  |   </ps/currentTemp>;rt="temperature";ct=50 ---|
  |                                               |

]]></artwork>
        </figure>
        <figure anchor="discover-topic-wk-fig">
          <name>Example of DISCOVER topic</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | -------- GET /.well-known/core?ct=50 ------->>|
  |    Content-Format: application/link-format    |
  |                                               |
  | <<-- 2.05 Content                             |
  |   </ps/currentTemp>;rt="temperature";ct=50 ---|
  |                                               |

]]></artwork>
        </figure>
      </section>
      <section anchor="sec-create">
        <name>CREATE</name>
        <t>A CoAP pub/sub broker SHOULD allow Clients to create new topics on the
broker using CREATE. Some exceptions are for fixed brokerless devices
and pre-configured brokers in dedicated installations. A client wishing
to create a topic MUST use a CoAP POST to the pub/sub API with a payload
indicating the desired topic. The topic specification sent in the
payload MUST use a supported serialization of the CoRE link format
<xref target="RFC6690"/>. The target of the link MUST be a URI formatted
string. The client MUST indicate the desired content format for
publishes to the topic by using the ct (Content Format) link attribute
in the link-format payload. Additional link target attributes and relation
values MAY be included in the topic specification link when a topic is created.</t>
        <t>The client MAY indicate the lifetime of the topic by including the Max-Age
option in the CREATE request.</t>
        <t>Topic hierarchies can be created by creating parent topics. A parent
topic is created with a POST using ct (Content Format) link attribute
value which describes a supported serialization of the CoRE link
format <xref target="RFC6690"/>, such as application/link-format (ct=40) or its
JSON or CBOR serializations.  If a topic is created which describes a
link serialization, that topic may then have sub-topics created under
it as shown in <xref target="create-sub-fig"/>.</t>
        <t>Ony one level in the topic hierarchy may be created as a result of a CREATE
operation, unless create on PUBLISH is supported (see <xref target="sec-publish"/>).
The topic string used in the link target MUST NOT contain the "/" character.</t>
        <t>A topic creator MUST include exactly one content format link attribute value (ct) in the create payload. If the content format option is not included or if the option is repeated, the Broker MUST reject the operation with an error code of "4.00 Bad Request".</t>
        <t>Only one topic may be created per request. If there is more than one link
included in a CREATE request, the Broker MUST reject the operation with an
error code of "4.00 Bad Request".</t>
        <t>A Broker MUST return a response code of "2.01 Created" if the topic is
created and MUST return the URI path of the created topic via Location-Path
options. If a new topic can not be created, the Broker MUST return the appropriate 4.xx response code indicating the reason for failure.</t>
        <t>A Broker SHOULD remove topics if the Max-Age of the topic is
exceeded without any publishes to the topic.  A Broker SHOULD retain a
topic indefinitely if the Max-Age option is elided or is set to zero
upon topic creation. The lifetime of a topic MUST be refreshed upon
create operations with a target of an existing topic.</t>
        <t>A topic creator SHOULD PUBLISH an initial value to a newly-created Topic in order to enable responses to READ and SUBSCRIBE requests that may be submitted after the topic is discoverable.</t>
        <t>The CREATE interface is specified as follows:</t>
        <dl>
          <dt>Interaction:</dt>
          <dd>
            <t>Client -&gt; Broker</t>
          </dd>
          <dt>Method:</dt>
          <dd>
            <t>POST</t>
          </dd>
          <dt>URI Template:</dt>
          <dd>
            <t>{+ps}/{+topic}</t>
          </dd>
          <dt>URI Template Variables:</dt>
          <dd>
            <t>ps := Pub/sub REST API entry point (optional). The entry point of the pub/sub REST API, as obtained from discovery, used to discover topics.</t>
          </dd>
          <dt/>
          <dd>
            <t>topic := The desired topic to return links for (optional).</t>
          </dd>
          <dt>Content-Format:</dt>
          <dd>
            <t>application/link-format</t>
          </dd>
          <dt>Payload:</dt>
          <dd>
            <t>The desired topic to CREATE</t>
          </dd>
        </dl>
        <t>The following response codes are defined for the CREATE operation:</t>
        <dl>
          <dt>Success:</dt>
          <dd>
            <t>2.01 "Created". Successful Creation of the topic</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.00 "Bad Request". Malformed request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.01 "Unauthorized". Authorization failure.</t>
          </dd>
        </dl>
        <t><xref target="create-fig"/> shows an example of a topic called "topic1" being
successfully created.</t>
        <figure anchor="create-fig">
          <name>Example of CREATE topic</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | ---------- POST /ps/ "<topic1>;ct=50" ------->|
  |                                               |
  | <---------------- 2.01 Created ---------------|
  |               Location: /ps/topic1            |
  |                                               |

]]></artwork>
        </figure>
        <figure anchor="create-sub-fig">
          <name>Example of CREATE of topic hierarchy</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | ----- POST /ps/ "<parent-topic>;ct=40" ------>|
  |                                               |
  | <---------------- 2.01 Created ---------------|
  |            Location: /ps/parent-topic/        |
  |                                               |
  |-- POST /ps/parent-topic/ "<subtopic>;ct=50" ->|
  |                                               |
  | <---------------- 2.01 Created ---------------|
  |       Location: /ps/parent-topic/subtopic     |
  |                                               |
  |                                               |

]]></artwork>
        </figure>
      </section>
      <section anchor="sec-publish">
        <name>PUBLISH</name>
        <t>A CoAP pub/sub Broker MAY allow clients to PUBLISH to topics on
the Broker. A client MAY use the PUT or the POST method to publish
state updates to the CoAP pub/sub Broker. A client MUST use the content
format specified upon creation of a given topic to publish updates to
that topic. The Broker MUST reject publish operations which do not use
the specified content format.  A CoAP client publishing on a topic MAY
indicate the maximum lifetime of the value by including the Max-Age
option in the publish request. The Broker MUST return a response code
of "2.04 Changed" if the publish is accepted.  A Broker MAY return a
"4.04 Not Found" if the topic does not exist. A Broker MAY return
"4.29 Too Many Requests" if simple flow control as described in
<xref target="sec-flow-control"/> is implemented.</t>
        <t>A Broker MUST accept PUBLISH operations using the PUT method. PUBLISH
operations using the PUT method replace any stored representation
associated with the topic, with the supplied representation. A Broker
MAY reject, or delay responses to, PUT requests to a topic while
pending resolution of notifications to subscribers from previous PUT
requests.</t>
        <t>Create on PUBLISH: A Broker MAY accept PUBLISH operations to new topics using
the PUT method. If a Broker accepts a PUBLISH using PUT to a topic that does
not exist, the Broker MUST create the topic using the information in the
PUT operation. The Broker MUST create a topic with the URI-Path of the request,
including all of the sub-topics necessary, and create a topic link with the
ct attribute set to the content-format value from the header of the PUT request.
If topic is created, the Broker MUST return the response "2.01 Created" with
the URI of the created topic, including all of the created path segments,
returned via the Location-Path option.</t>
        <t><xref target="create-publish-fig"/> shows an example of a topic being created on first
PUBLISH.</t>
        <t>A Broker MAY accept PUBLISH operations using the POST method. If a
Broker accepts PUBLISH using POST it shall respond with the 2.04 Changed
status code. If an attempt is made to PUBLISH using POST to a topic that does
not exist, the Broker SHALL return a response status indicating resource not
found, such as HTTP 404 or CoAP 4.04.</t>
        <t>A Broker MAY perform garbage collection of stored representations
which have been delivered to all subscribers or which have timed
out. A Broker MAY retain at least one most recently published
representation to return in response to SUBSCRIBE and READ requests.</t>
        <t>A Broker MUST make a best-effort attempt to notify all clients
subscribed on a particular topic each time it receives a publish on
that topic. An example is shown in <xref target="subscribe-fig"/>.</t>
        <t>If a client publishes to a Broker without the Max-Age option, the Broker MUST
refresh the topic lifetime with the most recently set Max-Age value, and the
Broker MUST include the most recently set Max-Age value in the Max-Age option of
all notifications.</t>
        <t>If a client publishes to a Broker with the Max-Age option, the Broker MUST
include the same value for the Max-Age option in all notifications.</t>
        <t>A Broker MUST use CoAP Notification as described in <xref target="RFC7641"/> to notify
subscribed clients.</t>
        <t>The PUBLISH operation is specified as follows:</t>
        <dl>
          <dt>Interaction:</dt>
          <dd>
            <t>Client -&gt; Broker</t>
          </dd>
          <dt>Method:</dt>
          <dd>
            <t>PUT, POST</t>
          </dd>
          <dt>URI Template:</dt>
          <dd>
            <t>{+ps}/{+topic}</t>
          </dd>
          <dt>URI Template Variables:</dt>
          <dd>
            <t>ps := Pub/sub REST API entry point (optional). The entry point of the pub/sub REST API, as obtained from discovery, used to discover topics.</t>
          </dd>
          <dt/>
          <dd>
            <t>topic := The desired topic to return links for (optional).</t>
          </dd>
          <dt>Content-Format:</dt>
          <dd>
            <t>Any valid CoAP content format</t>
          </dd>
          <dt>Payload:</dt>
          <dd>
            <t>Representation of the topic value (CoAP resource state representation) in
the indicated content format</t>
          </dd>
        </dl>
        <t>The following response codes are defined for the PUBLISH operation:</t>
        <dl>
          <dt>Success:</dt>
          <dd>
            <t>2.01 "Created". Successful publish, topic is created</t>
          </dd>
          <dt>Success:</dt>
          <dd>
            <t>2.04 "Changed". Successful publish, topic is updated</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.00 "Bad Request". Malformed request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.01 "Unauthorized". Authorization failure.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.04 "Not Found". Topic does not exist.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.29 "Too Many Requests". The client should slow down the rate of publish
messages for this topic (see <xref target="sec-flow-control"/>).</t>
          </dd>
        </dl>
        <t><xref target="publish-fig"/> shows an example of a new value being successfully
published to the topic "topic1". See <xref target="subscribe-fig"/> for an example
of a Broker forwarding a message from a publishing client to a
subscribed client.</t>
        <figure anchor="publish-fig">
          <name>Example of PUBLISH</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | ---------- PUT /ps/topic1 "1033.3"  --------> |
  |                                               |
  |                                               |
  | <--------------- 2.04 Changed---------------- |
  |                                               |

]]></artwork>
        </figure>
        <figure anchor="create-publish-fig">
          <name>Example of CREATE on PUBLISH</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | -------- PUT /ps/exa/mpl/e "1033.3"  -------> |
  |                                               |
  |                                               |
  | <--------------- 2.01 Created---------------- |
  |             Location: /ps/exa/mpl/e           |
  |                                               |

]]></artwork>
        </figure>
      </section>
      <section anchor="subscribe">
        <name>SUBSCRIBE</name>
        <t>A CoAP pub/sub Broker MAY allow Clients to subscribe to topics on the Broker
using CoAP Observe as described in <xref target="RFC7641"/>. A CoAP pub/sub Client wishing
to Subscribe to a topic on a Broker MUST use a CoAP GET with the Observe
option set to 0 (zero). The Broker MAY add the client to a
list of observers. The Broker MUST return a response code of "2.05 Content"
along with the most recently published value if the topic contains a valid
value and the Broker can supply the requested content format. The Broker
MUST reject Subscribe requests on a topic if the content format of the request
is not the content format the topic was created with.</t>
        <t>If the topic was published with the Max-Age option, the Broker MUST set the Max-Age option in the valid response to the amount of time remaining for the value to be valid since the last publish operation on that topic.</t>
        <t>The Broker MUST return a response code "4.04 Not Found" if the topic does not
exist or has been removed, or if Max-Age of a previously published
representation has expired.</t>
        <t>If a Topic has been created but not yet published to when a SUBSCRIBE to the
topic is received, the Broker MAY acknowledge and queue the pending SUBSCRIBE
and defer the response until an initial PUBLISH occurs.</t>
        <t>The Broker MUST return a response code "4.15 Unsupported Content Format" if it
can not return the requested content format. If a Broker is unable to accept a
new Subscription on a topic, it SHOULD return the appropriate response code
without the Observe option as per <xref target="RFC7641"/> Section 4.1.</t>
        <t>There is no explicit maximum lifetime of a Subscription, thus a Broker may
remove subscribers at any time. The Broker, upon removing a Subscriber, will
transmit the appropriate response code without the Observe option, as per
<xref target="RFC7641"/> Section 4.2, to the removed Subscriber.</t>
        <t>The SUBSCRIBE operation is specified as follows:</t>
        <dl>
          <dt>Interaction:</dt>
          <dd>
            <t>Client -&gt; Broker</t>
          </dd>
          <dt>Method:</dt>
          <dd>
            <t>GET</t>
          </dd>
          <dt>Options:</dt>
          <dd>
            <t>Observe:0</t>
          </dd>
          <dt>URI Template:</dt>
          <dd>
            <t>{+ps}/{+topic}</t>
          </dd>
          <dt>URI Template Variables:</dt>
          <dd>
            <t>ps := Pub/sub REST API entry point (optional). The entry point of the pub/sub REST API, as obtained from discovery, used to discover topics.</t>
          </dd>
          <dt/>
          <dd>
            <t>topic := The desired topic to return links for (optional).</t>
          </dd>
        </dl>
        <t>The following response codes are defined for the SUBSCRIBE operation:</t>
        <dl>
          <dt>Success:</dt>
          <dd>
            <t>2.05 "Content". Successful subscribe, current value included</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.00 "Bad Request". Malformed request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.01 "Unauthorized". Authorization failure.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.04 "Not Found". Topic does not exist.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.15 "Unsupported Content Format". Unsupported content format.</t>
          </dd>
        </dl>
        <t><xref target="subscribe-fig"/> shows an example of Client2 subscribing to "topic1"
and receiving a response from the Broker, with a subsequent
notification. The subscribe response from the Broker uses the last
stored value associated with the topic1. The notification from the
Broker is sent in response to the publish received from Client1.</t>
        <figure anchor="subscribe-fig">
          <name>Example of SUBSCRIBE</name>
          <artwork align="center"><![CDATA[
Client1   Client2                                          Broker
  |          |                   Subscribe                   |
  |          | ----- GET /ps/topic1 Observe:0 Token:XX ----> |
  |          |                                               |
  |          | <---------- 2.05 Content Observe:10---------- |
  |          |                                               |
  |          |                                               |
  |          |                    Publish                    |
  | ---------|----------- PUT /ps/topic1 "1033.3"  --------> |
  |          |                    Notify                     |
  |          | <---------- 2.05 Content Observe:11 --------- |
  |          |                                               |

]]></artwork>
        </figure>
      </section>
      <section anchor="unsubscribe">
        <name>UNSUBSCRIBE</name>
        <t>If a CoAP pub/sub Broker allows clients to SUBSCRIBE to topics on the Broker,
it MUST allow Clients to unsubscribe from topics on the Broker using the CoAP
Cancel Observation operation. A CoAP pub/sub Client wishing to unsubscribe
to a topic on a Broker MUST either use CoAP GET with Observe using an Observe
parameter of 1 or send a CoAP Reset message in response to a publish, as
per <xref target="RFC7641"/>.</t>
        <t>The UNSUBSCRIBE operation is specified as follows:</t>
        <dl>
          <dt>Interaction:</dt>
          <dd>
            <t>Client -&gt; Broker</t>
          </dd>
          <dt>Method:</dt>
          <dd>
            <t>GET</t>
          </dd>
          <dt>Options:</dt>
          <dd>
            <t>Observe:1</t>
          </dd>
          <dt>URI Template:</dt>
          <dd>
            <t>{+ps}/{+topic}{?q*}</t>
          </dd>
          <dt>URI Template Variables:</dt>
          <dd>
            <t>ps := Pub/sub REST API entry point (optional). The entry point of the pub/sub
REST API, as obtained from discovery, used to discover topics.</t>
          </dd>
          <dt/>
          <dd>
            <t>topic := The desired topic to return links for (optional).</t>
          </dd>
          <dt/>
          <dd>
            <t>q := Query Filter (optional). MAY contain a query filter list as per
 <xref target="RFC6690"/> Section 4.1.</t>
          </dd>
        </dl>
        <t>The following response codes are defined for the UNSUBSCRIBE operation:</t>
        <dl>
          <dt>Success:</dt>
          <dd>
            <t>2.05 "Content". Successful unsubscribe, current value included</t>
          </dd>
          <dt>Success:</dt>
          <dd>
            <t>2.07 "No Content". Successful unsubscribe, value not included</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.00 "Bad Request". Malformed request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.01 "Unauthorized". Authorization failure.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.04 "Not Found". Topic does not exist.</t>
          </dd>
        </dl>
        <t><xref target="unsubscribe-fig"/> shows an example of a client unsubscribe using the
Observe=1 cancellation method.</t>
        <figure anchor="unsubscribe-fig">
          <name>Example of UNSUBSCRIBE</name>
          <artwork align="center"><![CDATA[
Client                                          Broker
  |                                               |
  | ----- GET /ps/topic1 Observe:1 Token:XX ----> |
  |                                               |
  | <------------- 2.05 Content ----------------- |
  |                                               |

]]></artwork>
        </figure>
      </section>
      <section anchor="read">
        <name>READ</name>
        <t>A CoAP pub/sub Broker MAY accept Read requests on a topic using the the CoAP
GET method if the content format of the request matches the content format the
topic was created with. The Broker MUST return a response code of "2.05
Content" along with the most recently published value if the topic contains
a valid value and the Broker can supply the requested content format.</t>
        <t>If the topic was published with the Max-Age option, the Broker MUST set the
Max-Age option in the valid response to the amount of time remaining for the
value to be valid since the last publish operation on that topic.</t>
        <t>The Broker MUST return a response code "4.04 Not Found" if the topic does not
exist or has been removed, or if Max-Age of a previously published
representation has expired.</t>
        <t>If a Topic has been created but not yet published to when a READ to the topic is
received, the Broker MAY acknowledge and queue the pending READ, and defer the
response until an initial PUBLISH occurs.</t>
        <t>The Broker MUST return a response code "4.15 Unsupported Content Format" if the
Broker can not return the requested content format.</t>
        <t>The READ operation is specified as follows:</t>
        <dl>
          <dt>Interaction:</dt>
          <dd>
            <t>Client -&gt; Broker</t>
          </dd>
          <dt>Method:</dt>
          <dd>
            <t>GET</t>
          </dd>
          <dt>URI Template:</dt>
          <dd>
            <t>{+ps}/{+topic}</t>
          </dd>
          <dt>URI Template Variables:</dt>
          <dd>
            <t>ps := Pub/sub REST API entry point (optional). The entry point of the pub/sub
REST API, as obtained from discovery, used to discover topics.</t>
          </dd>
          <dt/>
          <dd>
            <t>topic := The desired topic to return links for (optional).</t>
          </dd>
        </dl>
        <t>The following response codes are defined for the READ operation:</t>
        <dl>
          <dt>Success:</dt>
          <dd>
            <t>2.05 "Content". Successful READ, current value included</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.00 "Bad Request". Malformed request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.01 "Unauthorized". Authorization failure.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.04 "Not Found". Topic does not exist.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.15 "Unsupported Content Format". Unsupported content-format.</t>
          </dd>
        </dl>
        <t><xref target="read-fig"/> shows an example of a successful READ from topic1,
followed by a Publish on the topic, followed at some time later by a
read of the updated value from the recent Publish.</t>
        <figure anchor="read-fig">
          <name>Example of READ</name>
          <artwork align="center"><![CDATA[
Client1   Client2                                          Broker
  |          |                     Read                      |
  |          | --------------- GET /ps/topic1 -------------> |
  |          |                                               |
  |          | <---------- 2.05 Content "1007.1"------------ |
  |          |                                               |
  |          |                                               |
  |          |                    Publish                    |
  | ---------|----------- PUT /ps/topic1 "1033.3"  --------> |
  |          |                                               |
  |          |                                               |
  |          |                     Read                      |
  |          | --------------- GET /ps/topic1 -------------> |
  |          |                                               |
  |          | <----------- 2.05 Content "1033.3" ---------- |
  |          |                                               |

]]></artwork>
        </figure>
      </section>
      <section anchor="remove">
        <name>REMOVE</name>
        <t>A CoAP pub/sub Broker MAY allow clients to remove topics from the Broker
using the CoAP Delete
method on the URI of the topic. The CoAP pub/sub Broker MUST return
"2.02 Deleted" if the removal is successful. The Broker MUST
return the appropriate 4.xx response code indicating the reason for
failure if the topic can not be removed.</t>
        <t>When a topic is removed for any reason, the Broker SHOULD remove all of the
observers from the list of observers and return a final 4.04 "Not Found"
response as per <xref target="RFC7641"/> Section 3.2. If a topic which has sub-topics is
removed, then all of its sub-topics MUST be recursively removed.</t>
        <t>The REMOVE operation is specified as follows:</t>
        <dl>
          <dt>Interaction:</dt>
          <dd>
            <t>Client -&gt; Broker</t>
          </dd>
          <dt>Method:</dt>
          <dd>
            <t>DELETE</t>
          </dd>
          <dt>URI Template:</dt>
          <dd>
            <t>{+ps}/{+topic}</t>
          </dd>
          <dt>URI Template Variables:</dt>
          <dd>
            <t>ps := Pub/sub REST API entry point (optional). The entry point of the pub/sub REST API, as obtained from discovery, used to discover topics.</t>
          </dd>
          <dt/>
          <dd>
            <t>topic := The desired topic to return links for (optional).</t>
          </dd>
          <dt>Content-Format:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Response Payload:</dt>
          <dd>
            <t>None</t>
          </dd>
        </dl>
        <t>The following response codes are defined for the REMOVE operation:</t>
        <dl>
          <dt>Success:</dt>
          <dd>
            <t>2.02 "Deleted". Successful remove</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.00 "Bad Request". Malformed request.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.01 "Unauthorized". Authorization failure.</t>
          </dd>
          <dt>Failure:</dt>
          <dd>
            <t>4.04 "Not Found". Topic does not exist.</t>
          </dd>
        </dl>
        <t><xref target="remove-fig"/> shows a successful remove of topic1.</t>
        <figure anchor="remove-fig">
          <name>Example of REMOVE</name>
          <artwork align="center"><![CDATA[
Client                                         Broker
 |                                               |
 | ------------- DELETE /ps/topic1 ------------> |
 |                                               |
 |                                               |
 | <-------------- 2.02 Deleted ---------------- |
 |                                               |

]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="coap-pubsub-operation-with-resource-directory">
      <name>CoAP Pub/sub Operation with Resource Directory</name>
      <t>A CoAP pub/sub Broker may register the base URI, which is the REST API entry point for a pub/sub service, with a Resource
Directory. A pub/sub Client may use an RD to discover a pub/sub Broker.</t>
      <t>A CoAP pub/sub Client may register links <xref target="RFC6690"/> with a Resource
Directory to enable discovery of created pub/sub topics. A pub/sub
Client may use an RD to discover pub/sub Topics. A client which
registers pub/sub Topics with an RD MUST use the context relation (con)
<xref target="RFC9167"/> to indicate that the context of
the registered links is the pub/sub Broker.</t>
      <t>A CoAP pub/sub Broker may alternatively register links to its topics to
a Resource Directory by triggering the RD to retrieve it's links from
.well-known/core.  In order to use this method, the links must first
be exposed in the .well-known/core of the pub/sub Broker. See
<xref target="discover"/> in this document.</t>
      <t>The pub/sub Broker triggers the RD to retrieve its links by sending a
POST with an empty payload to the .well-known/core of the Resource
Directory.  The RD server will then retrieve the links from the
.well-known/core of the pub/sub Broker and incorporate them into the
Resource Directory. See <xref target="RFC9167"/> for
further details.</t>
    </section>
    <section anchor="sleep-wake-operation">
      <name>Sleep-Wake Operation</name>
      <t>CoAP pub/sub provides a way for client nodes to sleep between operations,
conserving energy during idle periods. This is made possible by shifting
the server role to the Broker, allowing the Broker to be always-on and respond
to requests from other clients while a particular client is sleeping.</t>
      <t>For example, the Broker will retain the last state update received from a
sleeping client, in order to supply the most recent state update to other
clients in response to read and subscribe operations.</t>
      <t>Likewise, the Broker will retain the last state update received on the topic
such that a sleeping client, upon waking, can perform a read operation to
the Broker to update its own state from the most recent system state update.</t>
    </section>
    <section anchor="sec-flow-control">
      <name>Simple Flow Control</name>
      <t>Since the Broker node has to potentially send a large amount of
notification messages for each publish message and it may be serving a
large amount of subscribers and publishers simultaneously, the Broker
may become overwhelmed if it receives many publish messages to popular
topics in a short period of time.</t>
      <t>If the Broker is unable to serve a certain client that is sending publish
messages too fast, the Broker SHOULD respond with Response Code 4.29, "Too Many
Requests" <xref target="RFC8516"/> and set the Max-Age Option to indicate the number of
seconds after which the client can retry. The Broker MAY stop creating
notifications from the publish messages from this client and to this topic for
the indicated time.</t>
      <t>If a client receives the 4.29 Response Code from the Broker for a
publish message to a topic, it MUST NOT send new publish messages to
the Broker on the same topic before the time indicated in Max-Age has
passed.</t>
    </section>
    <section anchor="SecurityConsiderations">
      <name>Security Considerations</name>
      <t>CoAP pub/sub re-uses CoAP <xref target="RFC7252"/>, CoRE Resource Directory
<xref target="RFC9167"/>, and Web Linking <xref target="RFC5988"/> and
therefore the security considerations of those documents also apply to
this specification. Additionally, a CoAP pub/sub Broker and the clients
SHOULD authenticate each other and enforce access control policies. A
malicious client could subscribe to data it is not authorized to or
mount a denial of service attack against the Broker by publishing a
large number of resources.  The authentication can be performed using
the already standardized DTLS offered mechanisms, such as
certificates. DTLS also allows communication security to be
established to ensure integrity and confidentiality protection of the
data exchanged between these relevant parties. Provisioning the
necessary credentials, trust anchors and authorization policies is
non-trivial and subject of ongoing work.</t>
      <t>The use of a CoAP pub/sub Broker introduces challenges for the use of
end-to-end security between for example a client device on a sensor
network and a client application running in a cloud-based server
infrastructure since Brokers terminate the exchange. While running
separate DTLS sessions from the client device to the Broker and from
Broker to client application protects confidentially on those paths,
the client device does not know whether the commands coming from the
Broker are actually coming from the client application. Similarly, a
client application requesting data does not know whether the data
originated on the client device. For scenarios where end-to-end
security is desirable the use of application layer security is
unavoidable. Application layer security would then provide a guarantee
to the client device that any request originated at the client
application. Similarly, integrity protected sensor data from a client
device will also provide guarantee to the client application that the
data originated on the client device itself. The protected data can
also be verified by the intermediate Broker ensuring that it
stores/caches correct request/response and no malicious
messages/requests are accepted. The Broker would still be able to
perform aggregation of data/requests collected.</t>
      <t>Depending on the level of trust users and system designers place in
the CoAP pub/sub Broker, the use of end-to-end object security is
RECOMMENDED as described in <xref target="I-D.ietf-ace-pubsub-profile"/>.
An example application that uses the CoAP pub/sub Broker and relies on
end-to-end object security is described in <xref target="RFC8387"/>.
When only end-to-end encryption  is necessary and the CoAP Broker is
trusted, Payload Only Protection (Mode:PAYL) could be used.
The Publisher would wrap only the  payload before sending it to
the Broker and set the option Content-Format to application/smpayl.
Upon receival, the Broker can read the unencrypted CoAP header
to forward it to the subscribers.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document registers one attribute value in the Resource Type (rt=) registry
established with <xref target="RFC6690"/> and appends to the definition of one CoAP Response Code in the CoRE Parameters Registry.</t>
      <section anchor="resource-type-value-coreps">
        <name>Resource Type value 'core.ps'</name>
        <ul spacing="normal">
          <li>Attribute Value: core.ps</li>
          <li>Description: <xref target="sec-rest-api"/> of [[This document]]</li>
          <li>Reference: [[This document]]</li>
          <li>Notes: None</li>
        </ul>
      </section>
      <section anchor="resource-type-value-corepsdiscover">
        <name>Resource Type value 'core.ps.discover'</name>
        <ul spacing="normal">
          <li>Attribute Value: core.ps.discover</li>
          <li>Description: <xref target="sec-rest-api"/> of [[This document]]</li>
          <li>Reference: [[This document]]</li>
          <li>Notes: None</li>
        </ul>
      </section>
    </section>
    <section anchor="acks">
      <name>Acknowledgements</name>
      <t>The authors would like to thank Klaus Hartke, Hannes Tschofenig, Zach Shelby, Mohit Sethi,
Peter van der Stok, Tim Kellogg, Anders Eriksson, Goran Selander, Mikko Majanen,
and Olaf Bergmann for their contributions and reviews.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC7252">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby">
              <organization/>
            </author>
            <author fullname="K. Hartke" initials="K." surname="Hartke">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks.  The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s.  The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
              <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types.  CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7252"/>
          <seriesInfo name="DOI" value="10.17487/RFC7252"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC6690">
          <front>
            <title>Constrained RESTful Environments (CoRE) Link Format</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby">
              <organization/>
            </author>
            <date month="August" year="2012"/>
            <abstract>
              <t>This specification defines Web Linking using a link format for use by constrained web servers to describe hosted resources, their attributes, and other relationships between links.  Based on the HTTP Link Header field defined in RFC 5988, the Constrained RESTful Environments (CoRE) Link Format is carried as a payload and is assigned an Internet media type.  "RESTful" refers to the Representational State Transfer (REST) architecture.  A well-known URI is defined as a default entry point for requesting the links hosted by a server.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6690"/>
          <seriesInfo name="DOI" value="10.17487/RFC6690"/>
        </reference>
        <reference anchor="RFC9167">
          <front>
            <title>Registry Maintenance Notification for the Extensible Provisioning Protocol (EPP)</title>
            <author fullname="T. Sattler" initials="T." surname="Sattler">
              <organization/>
            </author>
            <author fullname="R. Carney" initials="R." surname="Carney">
              <organization/>
            </author>
            <author fullname="J. Kolker" initials="J." surname="Kolker">
              <organization/>
            </author>
            <date month="December" year="2021"/>
            <abstract>
              <t>This document describes an Extensible Provisioning Protocol (EPP) extension called "Registry Maintenance Notification", which is used by EPP servers to notify EPP clients and allow EPP clients to query EPP servers regarding maintenance events.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9167"/>
          <seriesInfo name="DOI" value="10.17487/RFC9167"/>
        </reference>
        <reference anchor="RFC6570">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Hadley" initials="M." surname="Hadley">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="D. Orchard" initials="D." surname="Orchard">
              <organization/>
            </author>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC7641">
          <front>
            <title>Observing Resources in the Constrained Application Protocol (CoAP)</title>
            <author fullname="K. Hartke" initials="K." surname="Hartke">
              <organization/>
            </author>
            <date month="September" year="2015"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a RESTful application protocol for constrained nodes and networks.  The state of a resource on a CoAP server can change over time.  This document specifies a simple protocol extension for CoAP that enables CoAP clients to "observe" resources, i.e., to retrieve a representation of a resource and keep this representation updated by the server over a period of time.  The protocol follows a best-effort approach for sending new representations to clients and provides eventual consistency between the state observed by each client and the actual resource state at the server.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7641"/>
          <seriesInfo name="DOI" value="10.17487/RFC7641"/>
        </reference>
        <reference anchor="RFC8516">
          <front>
            <title>"Too Many Requests" Response Code for the Constrained Application Protocol</title>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <date month="January" year="2019"/>
            <abstract>
              <t>A Constrained Application Protocol (CoAP) server can experience temporary overload because one or more clients are sending requests to the server at a higher rate than the server is capable or willing to handle.  This document defines a new CoAP response code for a server to indicate that a client should reduce the rate of requests.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8516"/>
          <seriesInfo name="DOI" value="10.17487/RFC8516"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC5988">
          <front>
            <title>Web Linking</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <date month="October" year="2010"/>
            <abstract>
              <t>This document specifies relation types for Web links, and defines a registry for them.  It also defines the use of such links in HTTP headers with the Link header field.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5988"/>
          <seriesInfo name="DOI" value="10.17487/RFC5988"/>
        </reference>
        <reference anchor="I-D.ietf-ace-pubsub-profile">
          <front>
            <title>Pub-Sub Profile for Authentication and Authorization for Constrained Environments (ACE)</title>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Cigdem Sengul" initials="C." surname="Sengul">
              <organization>Brunel University</organization>
            </author>
            <date day="29" month="December" year="2021"/>
            <abstract>
              <t>   This specification defines an application profile for authentication
   and authorization for Publishers and Subscribers in a constrained
   pub-sub scenario, using the ACE framework.  This profile relies on
   transport layer or application layer security to authorize the pub-
   sub clients to the broker.  Moreover, it describes the use of
   application layer security to protect the content of the pub-sub
   client message exchange through the broker.  The profile covers pub-
   sub scenarios using either the Constrained Application Protocol
   (CoAP) [I-D.ietf-core-coap-pubsub] or the Message Queue Telemetry
   Transport (MQTT) [MQTT-OASIS-Standard-v5] protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ace-pubsub-profile-04"/>
        </reference>
        <reference anchor="RFC8387">
          <front>
            <title>Practical Considerations and Implementation Experiences in Securing Smart Object Networks</title>
            <author fullname="M. Sethi" initials="M." surname="Sethi">
              <organization/>
            </author>
            <author fullname="J. Arkko" initials="J." surname="Arkko">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="H. Back" initials="H." surname="Back">
              <organization/>
            </author>
            <date month="May" year="2018"/>
            <abstract>
              <t>This memo describes challenges associated with securing resource- constrained smart object devices.  The memo describes a possible deployment model where resource-constrained devices sign message objects, discusses the availability of cryptographic libraries for resource-constrained devices, and presents some preliminary experiences with those libraries for message signing on resource- constrained devices.  Lastly, the memo discusses trade-offs involving different types of security approaches.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8387"/>
          <seriesInfo name="DOI" value="10.17487/RFC8387"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
JaQAAA==

-->

</rfc>
