summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9176.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9176.txt')
-rw-r--r--doc/rfc/rfc9176.txt3313
1 files changed, 3313 insertions, 0 deletions
diff --git a/doc/rfc/rfc9176.txt b/doc/rfc/rfc9176.txt
new file mode 100644
index 0000000..48a7b63
--- /dev/null
+++ b/doc/rfc/rfc9176.txt
@@ -0,0 +1,3313 @@
+
+
+
+
+Internet Engineering Task Force (IETF) C. Amsüss, Ed.
+Request for Comments: 9176
+Category: Standards Track Z. Shelby
+ISSN: 2070-1721 Edge Impulse
+ M. Koster
+ PassiveLogic
+ C. Bormann
+ Universität Bremen TZI
+ P. van der Stok
+ vanderstok consultancy
+ April 2022
+
+
+ Constrained RESTful Environments (CoRE) Resource Directory
+
+Abstract
+
+ In many Internet of Things (IoT) applications, direct discovery of
+ resources is not practical due to sleeping nodes or networks where
+ multicast traffic is inefficient. These problems can be solved by
+ employing an entity called a Resource Directory (RD), which contains
+ information about resources held on other servers, allowing lookups
+ to be performed for those resources. The input to an RD is composed
+ of links, and the output is composed of links constructed from the
+ information stored in the RD. This document specifies the web
+ interfaces that an RD supports for web servers to discover the RD and
+ to register, maintain, look up, and remove information on resources.
+ Furthermore, new target attributes useful in conjunction with an RD
+ are defined.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9176.
+
+Copyright Notice
+
+ Copyright (c) 2022 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Revised BSD License text as described in Section 4.e of the
+ Trust Legal Provisions and are provided without warranty as described
+ in the Revised BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 2. Terminology
+ 3. Architecture and Use Cases
+ 3.1. Principles
+ 3.2. Architecture
+ 3.3. RD Content Model
+ 3.4. Link-Local Addresses and Zone Identifiers
+ 3.5. Use Case: Cellular M2M
+ 3.6. Use Case: Home and Building Automation
+ 3.7. Use Case: Link Catalogues
+ 4. RD Discovery and Other Interface-Independent Components
+ 4.1. Finding a Resource Directory
+ 4.1.1. Resource Directory Address Option (RDAO)
+ 4.1.2. Using DNS-SD to Discover a Resource Directory
+ 4.2. Payload Content Formats
+ 4.3. URI Discovery
+ 5. Registration
+ 5.1. Simple Registration
+ 5.2. Third-Party Registration
+ 5.3. Operations on the Registration Resource
+ 5.3.1. Registration Update
+ 5.3.2. Registration Removal
+ 5.3.3. Further Operations
+ 5.3.4. Request Freshness
+ 6. RD Lookup
+ 6.1. Resource Lookup
+ 6.2. Lookup Filtering
+ 6.3. Resource Lookup Examples
+ 6.4. Endpoint Lookup
+ 7. Security Policies
+ 7.1. Endpoint Name
+ 7.1.1. Random Endpoint Names
+ 7.2. Entered Links
+ 7.3. Link Confidentiality
+ 7.4. Segmentation
+ 7.5. "First Come First Remembered": A Default Policy
+ 8. Security Considerations
+ 8.1. Discovery
+ 8.2. Endpoint Identification and Authentication
+ 8.3. Access Control
+ 8.4. Denial-of-Service Attacks
+ 8.5. Skipping Freshness Checks
+ 9. IANA Considerations
+ 9.1. Resource Types
+ 9.2. IPv6 ND Resource Directory Address Option
+ 9.3. RD Parameters Registry
+ 9.3.1. Full Description of the "Endpoint Type" RD Parameter
+ 9.4. Endpoint Type (et=) RD Parameter Values
+ 9.5. Multicast Address Registration
+ 9.6. Well-Known URIs
+ 9.7. Service Name and Transport Protocol Port Number Registry
+ 10. Examples
+ 10.1. Lighting Installation
+ 10.1.1. Installation Characteristics
+ 10.1.2. RD Entries
+ 10.2. OMA Lightweight M2M (LwM2M)
+ 11. References
+ 11.1. Normative References
+ 11.2. Informative References
+ Appendix A. Groups Registration and Lookup
+ Appendix B. Web Links and the Resource Directory
+ B.1. A Simple Example
+ B.1.1. Resolving the URIs
+ B.1.2. Interpreting Attributes and Relations
+ B.2. A Slightly More Complex Example
+ B.3. Enter the Resource Directory
+ B.4. A Note on Differences between Link-Format and Link Header
+ Fields
+ Appendix C. Limited Link Format
+ Acknowledgments
+ Authors' Addresses
+
+1. Introduction
+
+ In the work on Constrained RESTful Environments (CoRE), a
+ Representational State Transfer (REST) architecture suitable for
+ constrained nodes (e.g., with limited RAM and ROM [RFC7228]) and
+ networks (e.g., IPv6 over Low-Power Wireless Personal Area Network
+ (6LoWPAN) [RFC4944]) has been established and is used in Internet of
+ Things (IoT) or machine-to-machine (M2M) applications, such as smart
+ energy and building automation.
+
+ The discovery of resources offered by a constrained server is very
+ important in machine-to-machine applications where there are no
+ humans in the loop and static interfaces result in fragility. The
+ discovery of resources provided by an HTTP web server is typically
+ called web linking [RFC8288]. The use of web linking for the
+ description and discovery of resources hosted by constrained web
+ servers is specified by the CoRE Link Format [RFC6690]. However,
+ [RFC6690] only describes how to discover resources from the web
+ server that hosts them by querying /.well-known/core. In many
+ constrained scenarios, direct discovery of resources is not practical
+ due to sleeping nodes or networks where multicast traffic is
+ inefficient. These problems can be solved by employing an entity
+ called a Resource Directory (RD), which contains information about
+ resources held on other servers, allowing lookups to be performed for
+ those resources.
+
+ This document specifies the web interfaces that an RD supports for
+ web servers to discover the RD and to register, maintain, look up,
+ and remove information on resources. Furthermore, new target
+ attributes useful in conjunction with an RD are defined. Although
+ the examples in this document show the use of these interfaces with
+ the Constrained Application Protocol (CoAP) [RFC7252], they can be
+ applied in an equivalent manner to HTTP [RFC7230].
+
+2. Terminology
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in BCP
+ 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ The term "byte" is used in its now customary sense as a synonym for
+ "octet".
+
+ This specification requires readers to be familiar with all the terms
+ and concepts that are discussed in [RFC3986], [RFC8288], and
+ [RFC6690]. Readers should also be familiar with the terms and
+ concepts discussed in [RFC7252]. To describe the REST interfaces
+ defined in this specification, the URI Template format is used
+ [RFC6570].
+
+ This specification makes use of the following additional terminology:
+
+ Resolve Against
+ The expression "a URI reference is _resolved against_ a base URI"
+ is used to describe the process of [RFC3986], Section 5.2.
+ Noteworthy corner cases include the following: (1) if the URI
+ reference is a (full) URI, resolving against any base URI gives
+ the original full URI and (2) resolving an empty URI reference
+ gives the base URI without any fragment identifier.
+
+ Resource Directory (RD)
+ A web entity that stores information about web resources and
+ implements the REST interfaces defined in this specification for
+ discovery, for the creation, maintenance, and removal of
+ registrations, and for lookup of the registered resources.
+
+ Sector
+ In the context of an RD, a sector is a logical grouping of
+ endpoints.
+
+ The abbreviation "d=" is used for the sector in query parameters
+ for compatibility with deployed implementations.
+
+ Endpoint (EP)
+ Endpoint (EP) is a term used to describe a web server or client in
+ [RFC7252]. In the context of this specification, an endpoint is
+ used to describe a web server that registers resources to the RD.
+ An endpoint is identified by its endpoint name, which is included
+ during registration, and has a unique name within the associated
+ sector of the registration.
+
+ Registration Base URI
+ The base URI of a registration is a URI that typically gives
+ scheme and authority information about an endpoint. The
+ registration base URI is provided at registration time and is used
+ by the RD to resolve relative references of the registration into
+ URIs.
+
+ Target
+ The target of a link is the destination address (URI) of the link.
+ It is sometimes identified with "href=" or displayed as <target>.
+ Relative targets need resolving with respect to the base URI
+ (Section 5.2 of [RFC3986]).
+
+ This use of the term "target" is consistent with the use in
+ [RFC8288].
+
+ Context
+ The context of a link is the source address (URI) of the link and
+ describes which resource is linked to the target. A link's
+ context is made explicit in serialized links as the "anchor="
+ attribute.
+
+ This use of the term "context" is consistent with the use in
+ [RFC8288].
+
+ Directory Resource
+ A directory resource is a resource in the RD containing
+ registration resources.
+
+ Registration Resource
+ A registration resource is a resource in the RD that contains
+ information about an endpoint and its links.
+
+ Commissioning Tool (CT)
+ A Commissioning Tool (CT) is a device that assists during
+ installation events by assigning values to parameters, naming
+ endpoints and groups, or adapting the installation to the needs of
+ the applications.
+
+ Registrant-EP
+ A registrant-EP is the endpoint that is registered into the RD.
+ The registrant-EP can register itself, or a CT registers the
+ registrant-EP.
+
+ Resource Directory Address Option (RDAO)
+ A Resource Directory Address Option (RDAO) is a new IPv6 Neighbor
+ Discovery option defined for announcing an RD's address.
+
+3. Architecture and Use Cases
+
+3.1. Principles
+
+ The RD is primarily a tool to make discovery operations more
+ efficient than querying /.well-known/core on all connected devices or
+ across boundaries that would limit those operations.
+
+ It provides information about resources hosted by other devices that
+ could otherwise only be obtained by directly querying the /.well-
+ known/core resource on these other devices, either by a unicast
+ request or a multicast request.
+
+ Information SHOULD only be stored in the RD if it can be obtained by
+ querying the described device's /.well-known/core resource directly.
+
+ Data in the RD can only be provided by the device that hosts the data
+ or a dedicated Commissioning Tool (CT). These CTs act on behalf of
+ endpoints too constrained, or generally unable, to present that
+ information themselves. No other client can modify data in the RD.
+ Changes to the information in the RD do not propagate automatically
+ back to the web servers from where the information originated.
+
+3.2. Architecture
+
+ The RD architecture is illustrated in Figure 1. An RD is used as a
+ repository of registrations describing resources hosted on other web
+ servers, also called endpoints (EPs). An endpoint is a web server
+ associated with a scheme, IP address, and port. A physical node may
+ host one or more endpoints. The RD implements a set of REST
+ interfaces for endpoints to register and maintain RD registrations
+ and for endpoints to look up resources from the RD. An RD can be
+ logically segmented by the use of sectors.
+
+ A mechanism to discover an RD using CoRE Link Format [RFC6690] is
+ defined.
+
+ Registrations in the RD are soft state and need to be periodically
+ refreshed.
+
+ An endpoint uses specific interfaces to register, update, and remove
+ a registration. It is also possible for an RD to fetch web links
+ from endpoints and add their contents to its registrations.
+
+ At the first registration of an endpoint, a "registration resource"
+ is created, the location of which is returned to the registering
+ endpoint. The registering endpoint uses this registration resource
+ to manage the contents of registrations.
+
+ A lookup interface for discovering any of the web links stored in the
+ RD is provided using the CoRE Link Format.
+
+ Registration Lookup
+ Interface Interface
+ +----+ | |
+ | EP |---- | |
+ +----+ ---- | |
+ --|- +------+ |
+ +----+ | ----| | | +--------+
+ | EP | ---------|-----| RD |----|-----| Client |
+ +----+ | ----| | | +--------+
+ --|- +------+ |
+ +----+ ---- | |
+ | CT |---- | |
+ +----+
+
+ Figure 1: The RD Architecture
+
+ A registrant-EP MAY keep concurrent registrations to more than one RD
+ at the same time if explicitly configured to do so, but that is not
+ expected to be supported by typical EP implementations. Any such
+ registrations are independent of each other. The usual expectation
+ when multiple discovery mechanisms or addresses are configured is
+ that they constitute a fall-back path for a single registration.
+
+3.3. RD Content Model
+
+ The Entity-Relationship (ER) models shown in Figures 2 and 3 model
+ the contents of /.well-known/core and the RD respectively, with
+ entity-relationship diagrams [ER]. Entities (rectangles) are used
+ for concepts that exist independently. Attributes (ovals) are used
+ for concepts that exist only in connection with a related entity.
+ Relations (diamonds) give a semantic meaning to the relation between
+ entities. Numbers specify the cardinality of the relations.
+
+ Some of the attribute values are URIs. Those values are always full
+ URIs and never relative references in the information model.
+ However, they can be expressed as relative references in
+ serializations, and they often are.
+
+ These models provide an abstract view of the information expressed in
+ link-format documents and an RD. They cover the concepts but not
+ necessarily all details of an RD's operation; they are meant to give
+ an overview and not be a template for implementations.
+
+ +----------------------+
+ | /.well-known/core |
+ +----------------------+
+ |
+ | 1
+ ////////\\\\\\\
+ < contains >
+ \\\\\\\\///////
+ |
+ | 0+
+ +--------------------+
+ | link |
+ +--------------------+
+ |
+ | 1 oooooooo
+ +-----o target o
+ | oooooooo
+ oooooooooooo 0+ |
+ o target o--------+
+ o attribute o | 0+ oooooo
+ oooooooooooo +-----o rel o
+ | oooooo
+ |
+ | 1 ooooooooo
+ +-----o context o
+ ooooooooo
+
+ Figure 2: ER Model of the Content of /.well-known/core
+
+ Figure 2 models the contents of /.well-known/core, which contains a
+ set of links belonging to the hosting web server.
+
+ The web server is free to choose links it deems appropriate to be
+ exposed in its /.well-known/core. Typically, the links describe
+ resources that are served by the host, but the set can also contain
+ links to resources on other servers (see examples in Section 5 of
+ [RFC6690]). The set does not necessarily contain links to all
+ resources served by the host.
+
+ A link has the following attributes (see Section 5 of [RFC8288]):
+
+ * Zero or more link relations: They describe relations between the
+ link context and the link target.
+
+ In link-format serialization, they are expressed as space-
+ separated values in the "rel" attribute and default to "hosts".
+
+ * A link context URI: It defines the source of the relation, e.g.,
+ _who_ "hosts" something.
+
+ In link-format serialization, it is expressed in the "anchor"
+ attribute and defaults to the Origin of the target (practically,
+ the target with its path and later components removed).
+
+ * A link target URI: It defines the destination of the relation
+ (e.g., _what_ is hosted) and is the topic of all target
+ attributes.
+
+ In link-format serialization, it is expressed between angular
+ brackets and sometimes called the "href".
+
+ * Other target attributes (e.g., resource type (rt), interface (if),
+ or content format (ct)): These provide additional information
+ about the target URI.
+
+ +--------------+
+ + RD +
+ +--------------+
+ | 1
+ |
+ |
+ |
+ |
+ //////\\\\
+ < contains >
+ \\\\\/////
+ |
+ 0+ |
+ ooooooo 1 +---------------+
+ o base o-------| registration |
+ ooooooo +---------------+
+ | | 1
+ | +--------------+
+ oooooooo 1 | |
+ o href o----+ /////\\\\
+ oooooooo | < contains >
+ | \\\\\/////
+ oooooooo 1 | |
+ o ep o----+ | 0+
+ oooooooo | +------------------+
+ | | link |
+ oooooooo 0-1 | +------------------+
+ o d o----+ |
+ oooooooo | | 1 oooooooo
+ | +-----o target o
+ oooooooo 1 | | oooooooo
+ o lt o----+ ooooooooooo 0+ |
+ oooooooo | o target o-----+
+ | o attribute o | 0+ oooooo
+ ooooooooooo 0+ | ooooooooooo +-----o rel o
+ o endpoint o----+ | oooooo
+ o attribute o |
+ ooooooooooo | 1 ooooooooo
+ +----o context o
+ ooooooooo
+
+ Figure 3: ER Model of the Content of the RD
+
+ Figure 3 models the contents of the RD, which contains, in addition
+ to /.well-known/core, 0 to n registrations of endpoints.
+
+ A registration is associated with one endpoint. A registration
+ defines a set of links, as defined for /.well-known/core. A
+ registration has six types of attributes:
+
+ * an endpoint name ("ep", a Unicode string) unique within a sector
+
+ * a registration base URI ("base", a URI typically describing the
+ scheme://authority part)
+
+ * a lifetime ("lt")
+
+ * a registration resource location inside the RD ("href")
+
+ * optionally, a sector ("d", a Unicode string)
+
+ * optional additional endpoint attributes (from Section 9.3)
+
+ The cardinality of "base" is currently 1; future documents are
+ invited to extend the RD specification to support multiple values
+ (e.g., [COAP-PROT-NEG]). Its value is used as a base URI when
+ resolving URIs in the links contained in the endpoint.
+
+ Links are modeled as they are in Figure 2.
+
+3.4. Link-Local Addresses and Zone Identifiers
+
+ Registration base URIs can contain link-local IP addresses. To be
+ usable across hosts, those cannot be serialized to contain zone
+ identifiers (see [RFC6874], Section 1).
+
+ Link-local addresses can only be used on a single link (therefore, RD
+ servers cannot announce them when queried on a different link), and
+ lookup clients using them need to keep track of which interface they
+ got them from.
+
+ Therefore, it is advisable in many scenarios to use addresses with
+ larger scopes, if available.
+
+3.5. Use Case: Cellular M2M
+
+ Over the last few years, mobile operators around the world have
+ focused on development of M2M solutions in order to expand the
+ business to the new type of users: machines. The machines are
+ connected directly to a mobile network using an appropriate embedded
+ wireless interface (GSM/General Packet Radio Service (GPRS), Wideband
+ Code Division Multiple Access (W-CDMA), LTE, etc.) or via a gateway
+ providing short- and wide-range wireless interfaces. The ambition in
+ such systems is to build them from reusable components. These speed
+ up development and deployment and enable shared use of machines
+ across different applications. One crucial component of such systems
+ is the discovery of resources (and thus the endpoints they are hosted
+ on) capable of providing required information at a given time or
+ acting on instructions from the end users.
+
+ Imagine a scenario where endpoints installed on vehicles enable
+ tracking of the position of these vehicles for fleet management
+ purposes and allow monitoring of environment parameters. During the
+ boot-up process, endpoints register with an RD, which is hosted by
+ the mobile operator or somewhere in the cloud. Periodically, these
+ endpoints update their registration and may modify resources they
+ offer.
+
+ When endpoints are not always connected, for example, because they
+ enter a sleep mode, a remote server is usually used to provide proxy
+ access to the endpoints. Mobile apps or web applications for
+ environment monitoring contact the RD, look up the endpoints capable
+ of providing information about the environment using an appropriate
+ set of link parameters, obtain information on how to contact them
+ (URLs of the proxy server), and then initiate interaction to obtain
+ information that is finally processed, displayed on the screen, and
+ usually stored in a database. Similarly, fleet management systems
+ provide the appropriate link parameters to the RD to look up for EPs
+ deployed on the vehicles the application is responsible for.
+
+3.6. Use Case: Home and Building Automation
+
+ Home and commercial building automation systems can benefit from the
+ use of IoT web services. The discovery requirements of these
+ applications are demanding. Home automation usually relies on run-
+ time discovery to commission the system, whereas, in building
+ automation, a combination of professional commissioning and run-time
+ discovery is used. Both home and building automation involve peer-
+ to-peer interactions between endpoints and involve battery-powered
+ sleeping devices. Both can use the common RD infrastructure to
+ establish device interactions efficiently but can pick security
+ policies suitable for their needs.
+
+ Two phases can be discerned for a network servicing the system: (1)
+ installation and (2) operation. During the operational phase, the
+ network is connected to the Internet with a border router (e.g., a
+ 6LoWPAN Border Router (6LBR) [RFC6775]), and the nodes connected to
+ the network can use the Internet services that are provided by the IP
+ or network administrator. During the installation phase, the network
+ is completely stand-alone, no border router is connected, and the
+ network only supports the IP communication between the connected
+ nodes. The installation phase is usually followed by the operational
+ phase. As an RD's operations work without hard dependencies on names
+ or addresses, it can be used for discovery across both phases.
+
+3.7. Use Case: Link Catalogues
+
+ Resources may be shared through data brokers that have no knowledge
+ beforehand of who is going to consume the data. An RD can be used to
+ hold links about resources and services hosted anywhere to make them
+ discoverable by a general class of applications.
+
+ For example, environmental and weather sensors that generate data for
+ public consumption may provide data to an intermediary server or
+ broker. Sensor data are published to the intermediary upon changes
+ or at regular intervals. Descriptions of the sensors that resolve to
+ links to sensor data may be published to an RD. Applications wishing
+ to consume the data can use RD lookup to discover and resolve links
+ to the desired resources and endpoints. The RD service need not be
+ coupled with the data intermediary service. Mapping of RDs to data
+ intermediaries may be many-to-many.
+
+ Metadata in web link formats, such as the one defined in [RFC6690],
+ which may be internally stored as triples or relation/attribute pairs
+ providing metadata about resource links, need to be supported by RDs.
+ External catalogues that are represented in other formats may be
+ converted to common web linking formats for storage and access by
+ RDs. Since it is common practice for these to be encoded in URNs
+ [RFC8141], simple and lossless structural transforms should generally
+ be sufficient to store external metadata in RDs.
+
+ The additional features of an RD allow sectors to be defined to
+ enable access to a particular set of resources from particular
+ applications. This provides isolation and protection of sensitive
+ data when needed. Application groups with multicast addresses may be
+ defined to support efficient data transport.
+
+4. RD Discovery and Other Interface-Independent Components
+
+ This and the following sections define the required set of REST
+ interfaces between an RD, endpoints, and lookup clients. Although
+ the examples throughout these sections assume the use of CoAP
+ [RFC7252], these REST interfaces can also be realized using HTTP
+ [RFC7230]. The multicast discovery and simple registration
+ operations are exceptions to that, as they rely on mechanisms
+ unavailable in HTTP. In all definitions in these sections, both CoAP
+ response codes (with dot notation) and HTTP response codes (without
+ dot notation) are shown. An RD implementing this specification MUST
+ support the discovery, registration, update, lookup, and removal
+ interfaces.
+
+ All operations on the contents of the RD MUST be atomic and
+ idempotent.
+
+ For several operations, interface templates are given in list form;
+ those describe the operation participants, request codes, URIs,
+ content formats, and outcomes. Sections of those templates contain
+ normative content about Interaction, Method, URI Template, and URI
+ Template Variables, as well as the details of the Success condition.
+ The additional sections for options (such as Content-Format) and for
+ Failure codes give typical cases that an implementation of the RD
+ should deal with. Those serve to illustrate the typical responses to
+ readers who are not yet familiar with all the details of CoAP-based
+ interfaces; they do not limit how a server may respond under atypical
+ circumstances.
+
+ REST clients (registrant-EPs and CTs during registration and
+ maintenance, lookup clients, and RD servers during simple
+ registrations) must be prepared to receive any unsuccessful code and
+ act upon it according to its definition, options, and/or payload to
+ the best of their capabilities, falling back to failing the operation
+ if recovery is not possible. In particular, they SHOULD retry the
+ request upon 5.03 (Service Unavailable; 503 in HTTP) according to the
+ Max-Age (Retry-After in HTTP) option and SHOULD fall back to link
+ format when receiving 4.15 (Unsupported Content-Format; 415 in HTTP).
+
+ An RD MAY make the information submitted to it available to further
+ directories (subject to security policies on link confidentiality) if
+ it can ensure that a loop does not form. The protocol used between
+ directories to ensure loop-free operation is outside the scope of
+ this document.
+
+4.1. Finding a Resource Directory
+
+ A (re)starting device may want to find one or more RDs before it can
+ discover their URIs. Dependent on the operational conditions, one or
+ more of the techniques below apply.
+
+ The device may be preconfigured to exercise specific mechanisms for
+ finding the RD:
+
+ 1. It may be configured with a specific IP address for the RD. That
+ IP address may also be an anycast address, allowing the network
+ to forward RD requests to an RD that is topologically close; each
+ target network environment in which some of these preconfigured
+ nodes are to be brought up is then configured with a route for
+ this anycast address that leads to an appropriate RD. (Instead
+ of using an anycast address, a multicast address can also be
+ preconfigured. The RD servers then need to configure one of
+ their interfaces with this multicast address.)
+
+ 2. It may be configured with a DNS name for the RD and use DNS to
+ return the IP address of the RD; it can find a DNS server to
+ perform the lookup using the usual mechanisms for finding DNS
+ servers.
+
+ 3. It may be configured to use a service discovery mechanism, such
+ as DNS-based Service Discovery (DNS-SD), as outlined in
+ Section 4.1.2.
+
+ For cases where the device is not specifically configured with a way
+ to find an RD, the network may want to provide a suitable default.
+
+ 1. The IPv6 Neighbor Discovery option RDAO (Section 4.1.1) can do
+ that.
+
+ 2. When DHCP is in use, this could be provided via a DHCP option (no
+ such option is defined at the time of writing).
+
+ Finally, if neither the device nor the network offers any specific
+ configuration, the device may want to employ heuristics to find a
+ suitable RD.
+
+ The present specification does not fully define these heuristics but
+ suggests a number of candidates:
+
+ 1. In a 6LoWPAN, just assume the 6LBR can act as an RD (using the
+ Authoritative Border Router Option (ABRO) to find that
+ [RFC6775]). Confirmation can be obtained by sending a unicast
+ GET to coap://[6LBR]/.well-known/core?rt=core.rd*.
+
+ 2. In a network that supports multicast well, discover the RD using
+ a multicast query for /.well-known/core, as specified in CoRE
+ Link Format [RFC6690], and send a Multicast GET to
+ coap://[ff0x::fe]/.well-known/core?rt=core.rd*. RDs within the
+ multicast scope will answer the query.
+
+ When answering a multicast request directed at a link-local group,
+ the RD may want to respond from a routable address; this makes it
+ easier for registrants to use one of their own routable addresses for
+ registration. When source addresses are selected using the mechanism
+ described in [RFC6724], this can be achieved by applying the changes
+ of its Section 10.4, picking public addresses in Rule 7 of its
+ Section 5, and superseding Rule 8 with preferring the source
+ address's precedence.
+
+ As some of the RD addresses obtained by the methods listed here are
+ just (more or less educated) guesses, endpoints MUST make use of any
+ error messages to very strictly rate-limit requests to candidate IP
+ addresses that don't work out. For example, an ICMP Destination
+ Unreachable message (and, in particular, the port unreachable code
+ for this message) may indicate the lack of a CoAP server on the
+ candidate host, or a CoAP error response code, such as 4.05 (Method
+ Not Allowed), may indicate unwillingness of a CoAP server to act as a
+ directory server.
+
+ The following RD discovery mechanisms are recommended:
+
+ * In managed networks with border routers that need stand-alone
+ operation, the RDAO is recommended (e.g., the operational phase
+ described in Section 3.6).
+
+ * In managed networks without border routers (no Internet services
+ available), the use of a preconfigured anycast address is
+ recommended (e.g., the installation phase described in
+ Section 3.6).
+
+ * In networks managed using DNS-SD, the use of DNS-SD for discovery,
+ as described in Section 4.1.2, is recommended.
+
+ The use of multicast discovery in mesh networks is NOT RECOMMENDED.
+
+4.1.1. Resource Directory Address Option (RDAO)
+
+ The Resource Directory Address Option (RDAO) carries information
+ about the address of the RD in RAs (Router Advertisements) of IPv6
+ Neighbor Discovery (ND), similar to how Recursive DNS Server (RDNSS)
+ options [RFC8106] are sent. This information is needed when
+ endpoints cannot discover the RD with a link-local or realm-local
+ scope multicast address, for instance, because the endpoint and the
+ RD are separated by a 6LBR. In many circumstances, the availability
+ of DHCP cannot be guaranteed during commissioning of the network
+ either. The presence and the use of the RD is essential during
+ commissioning.
+
+ It is possible to send multiple RDAOs in one message, indicating as
+ many RD addresses.
+
+ The RDAO format is:
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Type | Length = 3 | Reserved |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Valid Lifetime |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | |
+ + +
+ | |
+ + RD Address +
+ | |
+ + +
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ Figure 4: Resource Directory Address Option
+
+ Fields:
+
+ Type: 41
+
+ Length: 8-bit unsigned integer. The length of the option
+ in units of 8 bytes. Always 3.
+
+ Reserved: This field is unused. It MUST be initialized to
+ zero by the sender and MUST be ignored by the
+ receiver.
+
+ Valid Lifetime: 32-bit unsigned integer. The length of time in
+ seconds (relative to the time the packet is
+ received) that this RD address is valid. A value
+ of all zero bits (0x0) indicates that this RD
+ address is not valid anymore.
+
+ RD Address: IPv6 address of the RD.
+
+4.1.2. Using DNS-SD to Discover a Resource Directory
+
+ An RD can advertise its presence in DNS-SD [RFC6763] using the
+ service names defined in this document: _core-rd._udp (for CoAP),
+ _core-rd-dtls._udp (for CoAP over DTLS), _core-rd._tcp (for CoAP over
+ TCP), or _core-rd-tls._tcp (for CoAP over TLS). (For the WebSocket
+ transports of CoAP, no service is defined, as DNS-SD is typically
+ unavailable in environments where CoAP over WebSockets is used.)
+
+ The selection of the service indicates the protocol used, and the SRV
+ record points the client to a host name and port to use as a starting
+ point for the "URI discovery" steps of Section 4.3.
+
+ This section is a simplified, concrete application of the more
+ generic mechanism specified in [CORE-RD-DNS-SD].
+
+4.2. Payload Content Formats
+
+ RDs implementing this specification MUST support the application/
+ link-format content format (ct=40).
+
+ RDs implementing this specification MAY support additional content
+ formats.
+
+ Any additional content format supported by an RD implementing this
+ specification SHOULD be able to express all the information
+ expressible in link format. It MAY be able to express information
+ that is inexpressible in link format, but those expressions SHOULD be
+ avoided where possible.
+
+4.3. URI Discovery
+
+ Before an endpoint can make use of an RD, it must first know the RD's
+ address and port and the URI path information for its REST APIs.
+ This section defines discovery of the RD and its URIs using the well-
+ known interface of the CoRE Link Format [RFC6690] after having
+ discovered a host, as described in Section 4.1.
+
+ Discovery of the RD registration URI is performed by sending either a
+ multicast or unicast GET request to /.well-known/core and including a
+ resource type (rt) parameter [RFC6690] with the value "core.rd" in
+ the query string. Likewise, a resource type parameter value of
+ "core.rd-lookup*" is used to discover the URIs for RD lookup
+ operations, and "core.rd*" is used to discover all URIs for RD
+ operations. Upon success, the response will contain a payload with a
+ link format entry for each RD function discovered, indicating the URI
+ of the RD function returned and the corresponding resource type.
+ When performing multicast discovery, the multicast IP address used
+ will depend on the scope required and the multicast capabilities of
+ the network (see Section 9.5).
+
+ An RD MAY provide hints about the content formats it supports in the
+ links it exposes or registers, using the "ct" target attribute, as
+ shown in the example below. Clients MAY use these hints to select
+ alternate content formats for interaction with the RD.
+
+ HTTP does not support multicast, and, consequently, only unicast
+ discovery can be supported using the HTTP /.well-known/core resource.
+
+ RDs implementing this specification MUST support query filtering for
+ the rt parameter, as defined in [RFC6690].
+
+ While the link targets in this discovery step are often expressed in
+ path-absolute form, this is not a requirement. Clients of the RD
+ SHOULD therefore accept URIs of all schemes they support, both as
+ URIs and relative references, and not limit the set of discovered
+ URIs to those hosted at the address used for URI discovery.
+
+ With security policies where the client requires the RD to be
+ authorized to act as an RD, that authorization may be limited to
+ resources on which the authorized RD advertises the adequate resource
+ types. Clients that have obtained links they cannot rely on yet can
+ repeat the "URI discovery" step at the /.well-known/core resource of
+ the indicated host to obtain the resource type information from an
+ authorized source.
+
+ The URI discovery operation can yield multiple URIs of a given
+ resource type. The client of the RD can try out any of the
+ discovered addresses.
+
+ The discovery request interface is specified as follows (this is
+ exactly the well-known interface of [RFC6690], Section 4, with the
+ additional requirement that the server MUST support query filtering):
+
+ Interaction: EP, CT, or Client -> RD
+
+ Method: GET
+
+ URI Template: /.well-known/core{?rt}
+
+ URI Template Variables:
+
+ rt := Resource Type. SHOULD contain one of the values "core.rd",
+ "core.rd-lookup*", "core.rd-lookup-res", "core.rd-lookup-ep",
+ or "core.rd*"
+
+ Accept: absent, application/link-format, or any other media type
+ representing web links
+
+ The following response is expected on this interface:
+
+ Success: 2.05 (Content) or 200 (OK) with an application/link-format
+ or other web link payload containing one or more matching entries
+ for the RD resource.
+
+ The following example shows an endpoint discovering an RD using this
+ interface, thus learning that the directory resource location in this
+ example is /rd and that the content format delivered by the server
+ hosting the resource is application/link-format (ct=40). Note that
+ it is up to the RD to choose its RD locations.
+
+ Req: GET coap://[ff02::fe]/.well-known/core?rt=core.rd*
+
+ Res: 2.05 Content
+ Payload:
+ </rd>;rt=core.rd;ct=40,
+ </rd-lookup/ep>;rt=core.rd-lookup-ep;ct=40,
+ </rd-lookup/res>;rt=core.rd-lookup-res;ct=40
+
+ Figure 5: Example Discovery Exchange
+
+ The following example shows the way of indicating that a client may
+ request alternate content formats. The Content-Format code attribute
+ "ct" MAY include a space-separated sequence of Content-Format codes,
+ as specified in Section 7.2.1 of [RFC7252], indicating that multiple
+ content formats are available. The example below shows the required
+ Content-Format 40 (application/link-format) indicated, as well as
+ Concise Binary Object Representation (CBOR) and JSON representations
+ in the style of [CORE-LINKS-JSON] (for which the experimental values
+ 65060 and 65050 are used in this example). The RD resource locations
+ /rd and /rd-lookup are example values. The server in this example
+ also indicates that it is capable of providing observation on
+ resource lookups.
+
+ Req: GET coap://[ff02::fe]/.well-known/core?rt=core.rd*
+
+ Res: 2.05 Content
+ Payload:
+ </rd>;rt=core.rd;ct=40,
+ </rd-lookup/res>;rt=core.rd-lookup-res;ct="40 65060 65050";obs,
+ </rd-lookup/ep>;rt=core.rd-lookup-ep;ct="40 65060 65050"
+
+ Figure 6: Example Discovery Exchange Indicating Additional
+ Content-Formats
+
+ For maintenance, management, and debugging, it can be useful to
+ identify the components that constitute the RD server. The
+ identification can be used to find client-server incompatibilities,
+ supported features, required updates, and other aspects. The well-
+ known interface described in Section 4 of [RFC6690] can be used to
+ find such data.
+
+ It would typically be stored in an implementation information link
+ (as described in [T2TRG-REL-IMPL]).
+
+ Req: GET /.well-known/core?rel=impl-info
+
+ Res: 2.05 Content
+ Payload:
+ <http://software.example.com/shiny-resource-directory/1.0beta1>;
+ rel=impl-info
+
+ Figure 7: Example Exchange of Obtaining Implementation
+ Information Using the Relation Type Currently Proposed in
+ [T2TRG-REL-IMPL]
+
+ Note that, depending on the particular server's architecture, such a
+ link could be anchored at the RD server's root (as in this example)
+ or at individual RD components. The latter is to be expected when
+ different applications are run on the same server.
+
+5. Registration
+
+ After discovering the location of an RD, a registrant-EP or CT MAY
+ register the resources of the registrant-EP using the registration
+ interface. This interface accepts a POST from an endpoint containing
+ the list of resources to be added to the directory as the message
+ payload in the CoRE Link Format [RFC6690] or other representations of
+ web links, along with query parameters indicating the name of the
+ endpoint and, optionally, the sector, lifetime, and base URI of the
+ registration. It is expected that other specifications will define
+ further parameters (see Section 9.3). The RD then creates a new
+ registration resource in the RD and returns its location. The
+ receiving endpoint MUST use that location when refreshing
+ registrations using this interface. Registration resources in the RD
+ are kept active for the period indicated by the lifetime parameter.
+ The creating endpoint is responsible for refreshing the registration
+ resource within this period, using either the registration or update
+ interface. The registration interface MUST be implemented to be
+ idempotent, so that registering twice with the same endpoint
+ parameters ep and d (sector) does not create multiple registration
+ resources.
+
+ The following rules apply for a registration request targeting a
+ given (ep, d) value pair:
+
+ * When the (ep, d) value pair of the registration request is
+ different from any existing registration, a new registration is
+ generated.
+
+ * When the (ep, d) value pair of the registration request is equal
+ to an existing registration, the content and parameters of the
+ existing registration are replaced with the content of the
+ registration request. As with changes to registration resources,
+ security policies (Section 7) usually require such requests to
+ come from the same device.
+
+ The posted link-format document can (and typically does) contain
+ relative references both in its link targets and in its anchors; it
+ can also contain empty anchors. The RD server needs to resolve these
+ references in order to faithfully represent them in lookups. They
+ are resolved against the base URI of the registration, which is
+ provided either explicitly in the base parameter or constructed
+ implicitly from the requester's URI, as constructed from its network
+ address and scheme.
+
+ For media types to which Appendix C applies (i.e., documents in
+ application/link-format), request bodies MUST be expressed in Limited
+ Link Format.
+
+ The registration request interface is specified as follows:
+
+ Interaction: EP or CT -> RD
+
+ Method: POST
+
+ URI Template: {+rd}{?ep,d,lt,base,extra-attrs*}
+
+ URI Template Variables:
+
+ rd := RD registration URI (mandatory). This is the location of
+ the RD, as obtained from discovery.
+
+ ep := Endpoint name (mostly mandatory). The endpoint name is an
+ identifier that MUST be unique within a sector.
+
+ As the endpoint name is a Unicode string, it is encoded in
+ UTF-8 (and possibly percent encoded) during variable expansion
+ (see [RFC6570], Section 3.2.1). The endpoint name MUST NOT
+ contain any character in the inclusive ranges 0-31 or 127-159.
+
+ The maximum length of this parameter is 63 bytes encoded in
+ UTF-8.
+
+ If the RD is configured to recognize the endpoint that is to be
+ authorized to use exactly one endpoint name, the RD assigns
+ that name. In that case, giving the endpoint name becomes
+ optional for the client; if the client gives any other endpoint
+ name, it is not authorized to perform the registration.
+
+ d := Sector (optional). This is the sector to which this
+ endpoint belongs. When this parameter is not present, the RD
+ MAY associate the endpoint with a configured default sector
+ (possibly based on the endpoint's authorization) or leave it
+ empty.
+
+ The sector is encoded like the ep parameter and is limited to
+ 63 bytes encoded in UTF-8 as well.
+
+ lt := Lifetime (optional). This is the lifetime of the
+ registration in seconds, with a range of 1-4294967295. If no
+ lifetime is included in the initial registration, a default
+ value of 90000 (25 hours) SHOULD be assumed.
+
+ base := Base URI (optional). This parameter sets the base URI of
+ the registration, under which the relative links in the payload
+ are to be interpreted. The specified URI typically does not
+ have a path component of its own and MUST be suitable as a base
+ URI to resolve any relative references given in the
+ registration. The parameter is therefore usually of the shape
+ "scheme://authority" for HTTP and CoAP URIs. The URI SHOULD
+ NOT have a query or fragment component, as any non-empty
+ relative part in a reference would remove those parts from the
+ resulting URI.
+
+ In the absence of this parameter, the scheme of the protocol,
+ the source address, and the source port of the registration
+ request are assumed. The base URI is consecutively constructed
+ by concatenating the used protocol's scheme with the characters
+ "://", the requester's source address as an address literal,
+ and ":" followed by its port (if it was not the protocol's
+ default one). This is analogous to the process described in
+ [RFC7252], Section 6.5.
+
+ This parameter is mandatory when the directory is filled by a
+ third party, such as a commissioning tool.
+
+ If the registrant-EP uses an ephemeral port to register with,
+ it MUST include the base parameter in the registration to
+ provide a valid network path.
+
+ A registrant that cannot be reached by potential lookup clients
+ at the address it registers from (e.g., because it is behind
+ some form of Network Address Translation (NAT)) MUST provide a
+ reachable base address with its registration.
+
+ If the base URI contains a link-local IP literal, it MUST NOT
+ contain a Zone Identifier and MUST be local to the link on
+ which the registration request is received.
+
+ Endpoints that register with a base that contains a path
+ component cannot efficiently express their registrations in
+ Limited Link Format (Appendix C). Those applications should
+ use different representations of links to which Appendix C is
+ not applicable (e.g., [CORE-CORAL]).
+
+ extra-attrs := Additional registration attributes (optional).
+ The endpoint can pass any parameter registered in Section 9.3
+ to the directory. If the RD is aware of the parameter's
+ specified semantics, it processes the parameter accordingly.
+ Otherwise, it MUST store the unknown key and its value(s) as an
+ endpoint attribute for further lookup.
+
+ Content-Format: application/link-format or any other indicated media
+ type representing web links
+
+ The following response is expected on this interface:
+
+ Success: 2.01 (Created) or 201 (Created). The Location-Path option
+ or Location header field MUST be included in the response. This
+ location MUST be a stable identifier generated by the RD, as it is
+ used for all subsequent operations on this registration resource.
+ The registration resource location thus returned is for the
+ purpose of updating the lifetime of the registration and for
+ maintaining the content of the registered links, including
+ updating and deleting links.
+
+ A registration with an already-registered ep and d value pair
+ responds with the same success code and location as the original
+ registration; the set of links registered with the endpoint is
+ replaced with the links from the payload.
+
+ The location MUST NOT have a query or fragment component, as that
+ could conflict with query parameters during the registration
+ update operation. Therefore, the Location-Query option MUST NOT
+ be present in a successful response.
+
+ If the registration fails, including request timeouts, or if delays
+ from Service Unavailable responses with Max-Age or Retry-After
+ accumulate to exceed the registrant's configured timeouts, it SHOULD
+ pick another registration URI from the "URI discovery" step of
+ Section 4.3, and, if there is only one or the list is exhausted, pick
+ other choices from the "finding a resource directory" step of
+ Section 4.1. Care has to be taken to consider the freshness of
+ results obtained earlier, e.g., the result of a /.well-known/core
+ response, the lifetime of an RDAO, and DNS responses. Any rate
+ limits and persistent errors from the "finding a resource directory"
+ step must be considered for the whole registration time, not only for
+ a single operation.
+
+ The following example shows a registrant-EP with the name "node1"
+ registering two resources to an RD using this interface. The
+ location "/rd" is an example RD location discovered in a request
+ similar to Figure 5.
+
+ Req: POST coap://rd.example.com/rd?ep=node1
+ Content-Format: 40
+ Payload:
+ </sensors/temp>;rt=temperature-c;if=sensor,
+ <http://www.example.com/sensors/temp>;
+ anchor="/sensors/temp";rel=describedby
+
+ Res: 2.01 Created
+ Location-Path: /rd/4521
+
+ Figure 8: Example Registration Payload
+
+ An RD may optionally support HTTP. Here is an example of almost the
+ same registration operation above when done using HTTP.
+
+ Req:
+ POST /rd?ep=node1&base=http://[2001:db8:1::1] HTTP/1.1
+ Host: rd.example.com
+ Content-Type: application/link-format
+
+ </sensors/temp>;rt=temperature-c;if=sensor,
+ <http://www.example.com/sensors/temp>;
+ anchor="/sensors/temp";rel=describedby
+
+ Res:
+ HTTP/1.1 201 Created
+ Location: /rd/4521
+
+ Figure 9: Example Registration Payload as Expressed Using HTTP
+
+5.1. Simple Registration
+
+ Not all endpoints hosting resources are expected to know how to
+ upload links to an RD, as described in Section 5. Instead, simple
+ endpoints can implement the simple registration approach described in
+ this section. An RD implementing this specification MUST implement
+ simple registration. However, there may be security reasons why this
+ form of directory discovery would be disabled.
+
+ This approach requires that the registrant-EP makes available the
+ hosted resources that it wants to be discovered as links on its
+ /.well-known/core interface, as specified in [RFC6690]. The links in
+ that document are subject to the same limitations as the payload of a
+ registration (with respect to Appendix C).
+
+ * The registrant-EP finds one or more addresses of the directory
+ server, as described in Section 4.1.
+
+ * The registrant-EP sends (and regularly refreshes with) a POST
+ request to the /.well-known/rd URI of the directory server of
+ choice. The body of the POST request is empty and triggers the
+ resource directory server to perform GET requests (redone before
+ lifetime expiry) at the requesting registrant-EP's /.well-known/
+ core to obtain the link-format payload to register.
+
+ The registrant-EP includes the same registration parameters in the
+ POST request as it would with a regular registration, per
+ Section 5. The registration base URI of the registration is taken
+ from the registrant-EP's network address (as is default with
+ regular registrations).
+
+ The following is an example request from the registrant-EP to the
+ RD (unanswered until the next step):
+
+ Req: POST /.well-known/rd?lt=6000&ep=node1
+ (No payload)
+
+ Figure 10: First-Half Example Exchange of a Simple Registration
+
+ * The RD queries the registrant-EP's discovery resource to determine
+ the success of the operation. It SHOULD keep a cache of the
+ discovery resource and not query it again as long as it is fresh.
+
+ The following is an example request from the RD to the registrant-
+ EP:
+
+ Req: GET /.well-known/core
+ Accept: 40
+
+ Res: 2.05 Content
+ Content-Format: 40
+ Payload:
+ </sen/temp>
+
+ Figure 11: Example Exchange of the RD Querying the Simple Endpoint
+
+ With this response, the RD would answer the previous step's request:
+
+ Res: 2.04 Changed
+
+ Figure 12: Second-Half Example Exchange of a Simple Registration
+
+ The sequence of fetching the registration content before sending a
+ successful response was chosen to make responses reliable, and the
+ point about caching was chosen to still allow very constrained
+ registrants. Registrants MUST be able to serve a GET request to
+ /.well-known/core after having requested registration. Constrained
+ devices MAY regard the initial request as temporarily failed when
+ they need RAM occupied by their own request to serve the RD's GET and
+ retry later when the RD already has a cached representation of their
+ discovery resources. Then, the RD can reply immediately, and the
+ registrant can receive the response.
+
+ The simple registration request interface is specified as follows:
+
+ Interaction: EP -> RD
+
+ Method: POST
+
+ URI Template: /.well-known/rd{?ep,d,lt,extra-attrs*}
+
+ URI Template Variables are the same as for registration in Section 5.
+ The base attribute is not accepted to keep the registration interface
+ simple; that rules out registration over CoAP-over-TCP or HTTP that
+ would need to specify one. For some time during this document's
+ development, the URI Template /.well-known/core{?ep,...} was in use
+ instead.
+
+ The following response is expected on this interface:
+
+ Success: 2.04 (Changed)
+
+ For the second interaction triggered by the above, the registrant-EP
+ takes the role of server and the RD takes the role of client. (Note
+ that this is exactly the well-known interface of [RFC6690],
+ Section 4):
+
+ Interaction: RD -> EP
+
+ Method: GET
+
+ URI Template: /.well-known/core
+
+ The following response is expected on this interface:
+
+ Success: 2.05 (Content)
+
+ When the RD uses any authorization credentials to access the
+ endpoint's discovery resource or when it is deployed in a location
+ where third parties might reach it but not the endpoint, it SHOULD
+ verify that the apparent registrant-EP intends to register with the
+ given registration parameters before revealing the obtained discovery
+ information to lookup clients. An easy way to do that is to verify
+ the simple registration request's sender address using the Echo
+ option, as described in [RFC9175], Section 2.4.
+
+ The RD MUST delete registrations created by simple registration after
+ the expiration of their lifetime. Additional operations on the
+ registration resource cannot be executed because no registration
+ location is returned.
+
+5.2. Third-Party Registration
+
+ For some applications, even simple registration may be too taxing for
+ some very constrained devices, in particular, if the security
+ requirements become too onerous.
+
+ In a controlled environment (e.g., building control), the RD can be
+ filled by a third-party device, called a Commissioning Tool (CT).
+ The CT can fill the RD from a database or other means. For that
+ purpose scheme, the IP address and port of the URI of the registered
+ device is the value of the "base" parameter of the registration
+ described in Section 5.
+
+ It should be noted that the value of the "base" parameter applies to
+ all the links of the registration and has consequences for the anchor
+ value of the individual links, as exemplified in Appendix B. A
+ potential (currently nonexistent) "base" attribute of the link is not
+ affected by the value of "base" parameter in the registration.
+
+5.3. Operations on the Registration Resource
+
+ This section describes how the registering endpoint can maintain the
+ registrations that it created. The registering endpoint can be the
+ registrant-EP or the CT. The registrations are resources of the RD.
+
+ An endpoint should not use this interface for registrations that it
+ did not create. This is usually enforced by security policies,
+ which, in general, require equivalent credentials for creation of and
+ operations on a registration.
+
+ After the initial registration, the registering endpoint retains the
+ returned location of the registration resource for further
+ operations, including refreshing the registration in order to extend
+ the lifetime and "keep-alive" the registration. When the lifetime of
+ the registration has expired, the RD SHOULD NOT respond to discovery
+ queries concerning this endpoint. The RD SHOULD continue to provide
+ access to the registration resource after a registration timeout
+ occurs in order to enable the registering endpoint to eventually
+ refresh the registration. The RD MAY eventually remove the
+ registration resource for the purpose of garbage collection. If the
+ registration resource is removed, the corresponding endpoint will
+ need to be reregistered.
+
+ The registration resource may also be used to cancel the registration
+ using DELETE and to perform further operations beyond the scope of
+ this specification.
+
+ Operations on the registration resource are sensitive to reordering;
+ Section 5.3.4 describes how order is restored.
+
+ The operations on the registration resource are described below.
+
+5.3.1. Registration Update
+
+ The update interface is used by the registering endpoint to refresh
+ or update its registration with an RD. To use the interface, the
+ registering endpoint sends a POST request to the registration
+ resource returned by the initial registration operation.
+
+ An update MAY update registration parameters, such as lifetime, base
+ URI, or others. Parameters that are not being changed should not be
+ included in an update. Adding parameters that have not changed
+ increases the size of the message but does not have any other
+ implications. Parameters are included as query parameters in an
+ update operation, as in Section 5.
+
+ A registration update resets the timeout of the registration to the
+ (possibly updated) lifetime of the registration, independent of
+ whether an lt parameter was given.
+
+ If the base URI of the registration is changed in an update, relative
+ references submitted in the original registration or later updates
+ are resolved anew against the new base.
+
+ The registration update operation only describes the use of POST with
+ an empty payload. Future standards might describe the semantics of
+ using content formats and payloads with the POST method to update the
+ links of a registration (see Section 5.3.3).
+
+ The update registration request interface is specified as follows:
+
+ Interaction: EP or CT -> RD
+
+ Method: POST
+
+ URI Template: {+location}{?lt,base,extra-attrs*}
+
+ URI Template Variables:
+
+ location := This is the location returned by the RD as a result
+ of a successful earlier registration.
+
+ lt := Lifetime (optional). This is the lifetime of the
+ registration in seconds, with a range of 1-4294967295. If no
+ lifetime is included, the previous last lifetime set on a
+ previous update or the original registration (falling back to
+ 90000) SHOULD be used.
+
+ base := Base URI (optional). This parameter updates the base URI
+ established in the original registration to a new value and is
+ subject to the same restrictions as in the registration.
+
+ If the parameter is set in an update, it is stored by the RD as
+ the new base URI under which to interpret the relative links
+ present in the payload of the original registration.
+
+ If the parameter is not set in the request but was set before,
+ the previous base URI value is kept unmodified.
+
+ If the parameter is not set in the request and was not set
+ before either, the source address and source port of the update
+ request are stored as the base URI.
+
+ extra-attrs := Additional registration attributes (optional). As
+ with the registration, the RD processes them if it knows their
+ semantics. Otherwise, unknown attributes are stored as
+ endpoint attributes, overriding any previously stored endpoint
+ attributes of the same key.
+
+ Note that this default behavior does not allow removing an
+ endpoint attribute in an update. For attributes whose
+ functionality depends on the endpoints' ability to remove them
+ in an update, it can make sense to define a value whose
+ presence is equivalent to the absence of a value. As an
+ alternative, an extension can define different updating rules
+ for their attributes. That necessitates either discovering
+ whether the RD is aware of that extension or tolerating the
+ default behavior.
+
+ Content-Format: none (no payload)
+
+ The following responses are expected on this interface:
+
+ Success: 2.04 (Changed) or 204 (No Content) if the update was
+ successfully processed.
+
+ Failure: 4.04 (Not Found) or 404 (Not Found). Registration does not
+ exist (e.g., may have been removed).
+
+ If the registration update fails in any way, including "Not Found"
+ and request timeouts, or if the time indicated in a Service
+ Unavailable Max-Age/Retry-After exceeds the remaining lifetime, the
+ registering endpoint SHOULD attempt registration again.
+
+ The following example shows how the registering endpoint resets the
+ timeout on its registration resource at an RD using this interface
+ with the example location value /rd/4521:
+
+ Req: POST /rd/4521
+
+ Res: 2.04 Changed
+
+ Figure 13: Example Update of a Registration
+
+ The following example shows the registering endpoint updating its
+ registration resource at an RD using this interface with the example
+ location value /rd/4521. The initial registration by the registering
+ endpoint set the following values:
+
+ * endpoint name (ep)=endpoint1
+
+ * lifetime (lt)=500
+
+ * base URI (base)=coap://local-proxy-old.example.com
+
+ * payload of Figure 8
+
+ The initial state of the RD is reflected in the following request:
+
+ Req: GET /rd-lookup/res?ep=endpoint1
+
+ Res: 2.05 Content
+ Payload:
+ <coap://local-proxy-old.example.com/sensors/temp>;
+ rt=temperature-c;if=sensor,
+ <http://www.example.com/sensors/temp>;
+ anchor="coap://local-proxy-old.example.com/sensors/temp";
+ rel=describedby
+
+ Figure 14: Example Lookup Before a Change to the Base Address
+
+ The following example shows the registering endpoint changing the
+ base URI to coaps://new.example.com:5684:
+
+ Req: POST /rd/4521?base=coaps://new.example.com
+
+ Res: 2.04 Changed
+
+ Figure 15: Example Registration Update that Changes the Base Address
+
+ The consecutive query returns:
+
+ Req: GET /rd-lookup/res?ep=endpoint1
+
+ Res: 2.05 Content
+ Payload:
+ <coaps://new.example.com/sensors/temp>;
+ rt=temperature-c;if=sensor,
+ <http://www.example.com/sensors/temp>;
+ anchor="coaps://new.example.com/sensors/temp";
+ rel=describedby
+
+ Figure 16: Example Lookup After a Change to the Base Address
+
+5.3.2. Registration Removal
+
+ Although RD registrations have soft state and will eventually time
+ out after their lifetime, the registering endpoint SHOULD explicitly
+ remove an entry from the RD if it knows it will no longer be
+ available (for example, on shutdown). This is accomplished using a
+ removal interface on the RD by performing a DELETE on the endpoint
+ resource.
+
+ The removal request interface is specified as follows:
+
+ Interaction: EP or CT -> RD
+
+ Method: DELETE
+
+ URI Template: {+location}
+
+ URI Template Variables:
+
+ location := This is the location returned by the RD as a result
+ of a successful earlier registration.
+
+ The following responses are expected on this interface:
+
+ Success: 2.02 (Deleted) or 204 (No Content) upon successful
+ deletion.
+
+ Failure: 4.04 (Not Found) or 404 (Not Found). Registration does not
+ exist (e.g., may already have been removed).
+
+ The following example shows successful removal of the endpoint from
+ the RD with example location value /rd/4521:
+
+ Req: DELETE /rd/4521
+
+ Res: 2.02 Deleted
+
+ Figure 17: Example of a Registration Removal
+
+5.3.3. Further Operations
+
+ Additional operations on the registration can be specified in future
+ documents, for example:
+
+ * Send iPATCH (or PATCH) updates [RFC8132] to add, remove, or change
+ the links of a registration.
+
+ * Use GET to read the currently stored set of links in a
+ registration resource.
+
+ Those operations are out of scope of this document and will require
+ media types suitable for modifying sets of links.
+
+5.3.4. Request Freshness
+
+ Some security mechanisms usable with an RD allow out-of-order request
+ processing or do not even mandate replay protection at all. The RD
+ needs to ensure that operations on the registration resource are
+ executed in an order that does not distort the client's intentions.
+
+ This ordering of operations is expressed in terms of freshness, as
+ defined in [RFC9175]. Requests that alter a resource's state need to
+ be fresh relative to the latest request that altered that state in a
+ conflicting way.
+
+ An RD SHOULD determine a request's freshness and MUST use the Echo
+ option if it requires request freshness and cannot determine it in
+ any other way. An endpoint MUST support the use of the Echo option.
+ (One reason why an RD would not require freshness is when no relevant
+ registration properties are covered by its security policies.)
+
+5.3.4.1. Efficient Use of Echo by an RD
+
+ To keep latency and traffic added by the freshness requirements to a
+ minimum, RDs should avoid naive (sufficient but inefficient)
+ freshness criteria.
+
+ Some simple mechanisms the RD can employ are:
+
+ * State counter. The RD can keep a monotonous counter that
+ increments whenever a registration changes. For every
+ registration resource, it stores the post-increment value of that
+ resource's last change. Requests altering them need to have at
+ least that value encoded in their Echo option and are otherwise
+ rejected with a 4.01 (Unauthorized) and the current counter value
+ as the Echo value. If other applications on the same server use
+ Echo as well, that encoding may include a prefix indicating that
+ it pertains to the RD's counter.
+
+ The value associated with a resource needs to be kept across the
+ removal of registrations if the same registration resource is to
+ be reused.
+
+ The counter can be reset (and the values of removed resources
+ forgotten) when all previous security associations are reset.
+
+ This is the "Persistent Counter" method of [RFC9175], Appendix A.
+
+ * Preemptive Echo values. The current state counter can be sent in
+ an Echo option not only when requests are rejected with 4.01
+ (Unauthorized) but also with successful responses. Thus, clients
+ can be provided with Echo values sufficient for their next request
+ on a regular basis. This is also described in Section 2.3 of
+ [RFC9175]
+
+ While endpoints may discard received Echo values at leisure
+ between requests, they are encouraged to retain these values for
+ the next request to avoid additional round trips.
+
+ * If the RD can ensure that only one security association has
+ modifying access to any registration at any given time and that
+ security association provides order on the requests, that order is
+ sufficient to show request freshness.
+
+5.3.4.2. Examples of Echo Usage
+
+ Figure 18 shows the interactions of an endpoint that has forgotten
+ the server's latest Echo value and temporarily reduces its
+ registration lifetime:
+
+ Req: POST /rd/4521?lt=7200
+
+ Res: 4.01 Unauthorized
+ Echo: 0x0123
+
+ (EP tries again immediately.)
+
+ Req: POST /rd/4521?lt=7200
+ Echo: 0x0123
+
+ Res: 2.04 Changed
+ Echo: 0x0124
+
+ (Later, the EP regains its confidence in its long-term reachability.)
+
+ Req: POST /rd/4521?lt=90000
+ Echo: 0x0124
+
+ Res: 2.04 Changed
+ Echo: 0x0247
+
+ Figure 18: Example Update of a Registration
+
+ The other examples do not show Echo options for two reasons: (1) for
+ simplicity and (2) because they lack the context for any example
+ values to have meaning.
+
+6. RD Lookup
+
+ To discover the resources registered with the RD, a lookup interface
+ must be provided. This lookup interface is defined as a default, and
+ it is assumed that RDs may also support lookups to return resource
+ descriptions in alternative formats (e.g., JSON or CBOR link format
+ [CORE-LINKS-JSON]) or use more advanced interfaces (e.g., supporting
+ context- or semantic-based lookup) on different resources that are
+ discovered independently.
+
+ RD lookup allows lookups for endpoints and resources using attributes
+ defined in this document and for use with the CoRE Link Format. The
+ result of a lookup request is the list of links (if any)
+ corresponding to the type of lookup. Thus, an endpoint lookup MUST
+ return a list of endpoints, and a resource lookup MUST return a list
+ of links to resources.
+
+ The lookup type implemented by a lookup resource is indicated by a
+ resource type, as per Table 1:
+
+ +=============+====================+===========+
+ | Lookup Type | Resource Type | Mandatory |
+ +=============+====================+===========+
+ | Resource | core.rd-lookup-res | Mandatory |
+ +-------------+--------------------+-----------+
+ | Endpoint | core.rd-lookup-ep | Mandatory |
+ +-------------+--------------------+-----------+
+
+ Table 1: Lookup Types
+
+6.1. Resource Lookup
+
+ Resource lookup results in links that are semantically equivalent to
+ the links submitted to the RD by the registrant. The links and link
+ parameters returned by the lookup are equal to the originally
+ submitted ones, except that the target reference is fully resolved
+ and that the anchor reference is fully resolved if it is present in
+ the lookup result at all.
+
+ Links that did not have an anchor attribute in the registration are
+ returned without an anchor attribute. Links of which href or anchor
+ was submitted as a (full) URI are returned with the respective
+ attribute unmodified.
+
+ The above rules allow the client to interpret the response as links
+ without any further knowledge of the storage conventions of the RD.
+ The RD MAY replace the registration base URIs with a configured
+ intermediate proxy, e.g., in the case of an HTTP lookup interface for
+ CoAP endpoints.
+
+ If the base URI of a registration contains a link-local address, the
+ RD MUST NOT show its links unless the lookup was made from the link
+ on which the registered endpoint can be reached. The RD MUST NOT
+ include zone identifiers in the resolved URIs.
+
+6.2. Lookup Filtering
+
+ Using the Accept option, the requester can control whether the
+ returned list is returned in CoRE Link Format (application/link-
+ format, default) or in alternate content formats (e.g., from
+ [CORE-LINKS-JSON]).
+
+ Multiple search criteria MAY be included in a lookup. All included
+ criteria MUST match for a link to be returned. The RD MUST support
+ matching with multiple search criteria.
+
+ A link matches a search criterion if it has an attribute of the same
+ name and the same value, allowing for a trailing "*" wildcard
+ operator, as in Section 4.1 of [RFC6690]. Attributes that are
+ defined as relation-types (in the link-format ABNF) match if the
+ search value matches any of their values (see Section 4.1 of
+ [RFC6690]; for example, ?if=tag:example.net,2020:sensor matches
+ ;if="example.regname tag:example.net,2020:sensor";. A resource link
+ also matches a search criterion if its endpoint would match the
+ criterion, and vice versa, an endpoint link matches a search
+ criterion if any of its resource links matches it.
+
+ Note that href is a valid search criterion and matches target
+ references. Like all search criteria, on a resource lookup, it can
+ match the target reference of the resource link itself but also the
+ registration resource of the endpoint that registered it. Queries
+ for resource link targets MUST be in URI form (i.e., not relative
+ references) and are matched against a resolved link target. Queries
+ for endpoints SHOULD be expressed in path-absolute form if possible
+ and MUST be expressed in URI form otherwise; the RD SHOULD recognize
+ either. The anchor attribute is usable for resource lookups and, if
+ queried, MUST be in URI form as well.
+
+ Additional query parameters "page" and "count" are used to obtain
+ lookup results in specified increments using pagination, where count
+ specifies how many links to return and page specifies which subset of
+ links organized in sequential pages, each containing 'count' links,
+ starting with link zero and page zero. Thus, specifying a count of
+ 10 and page of 0 will return the first 10 links in the result set
+ (links 0-9). Specifying a count of 10 and page of 1 will return the
+ next 'page' containing links 10-19, and so on. Unlike block-wise
+ transfer of a complete result set, these parameters ensure that each
+ chunk of results can be interpreted on its own. This simplifies the
+ processing but can result in duplicate or missed items when
+ coinciding with changes from the registration interface.
+
+ Endpoints that are interested in a lookup result repeatedly or
+ continuously can use mechanisms such as ETag caching, resource
+ observation [RFC7641], or any future mechanism that might allow more
+ efficient observations of collections. These are advertised,
+ detected, and used according to their own specifications and can be
+ used with the lookup interface as with any other resource.
+
+ When resource observation is used, every time the set of matching
+ links changes or the content of a matching link changes, the RD sends
+ a notification with the matching link set. The notification contains
+ the successful current response to the given request, especially with
+ respect to representing zero matching links (see "Success" item
+ below).
+
+ The lookup interface is specified as follows:
+
+ Interaction: Client -> RD
+
+ Method: GET
+
+ URI Template: {+type-lookup-location}{?page,count,search*}
+
+ URI Template Variables:
+
+ type-lookup-location := RD lookup URI for a given lookup type
+ (mandatory). The address is discovered as described in
+ Section 4.3.
+
+ search := Search criteria for limiting the number of results
+ (optional). The search criteria are an associative array,
+ expressed in a form-style query, as per the URI Template (see
+ [RFC6570], Sections 2.4.2 and 3.2.8).
+
+ page := Page (optional). This parameter cannot be used without
+ the count parameter. Results are returned from result set in
+ pages that contain 'count' links starting from index (page *
+ count). Page numbering starts with zero.
+
+ count := Count (optional). The number of results is limited to
+ this parameter value. If the page parameter is also present,
+ the response MUST only include 'count' links starting with the
+ (page * count) link in the result set from the query. If the
+ count parameter is not present, then the response MUST return
+ all matching links in the result set. Link numbering starts
+ with zero.
+
+ Accept: absent, application/link-format, or any other indicated
+ media type representing web links
+
+ The following responses codes are defined for this interface:
+
+ Success: 2.05 (Content) or 200 (OK) with an application/link-format
+ or other web link payload containing matching entries for the
+ lookup.
+
+ The payload can contain zero links (which is an empty payload in
+ the link format described in [RFC6690] but could also be [] in
+ JSON-based formats), indicating that no entities matched the
+ request.
+
+6.3. Resource Lookup Examples
+
+ The examples in this section assume the existence of CoAP hosts with
+ a default CoAP port 61616. HTTP hosts are possible and do not change
+ the nature of the examples.
+
+ The following example shows a client performing a resource lookup
+ with the example resource lookup locations discovered in Figure 5:
+
+ Req: GET /rd-lookup/res?rt=tag:example.org,2020:temperature
+
+ Res: 2.05 Content
+ Payload:
+ <coap://[2001:db8:3::123]:61616/temp>;
+ rt="tag:example.org,2020:temperature"
+
+ Figure 19: Example of a Resource Lookup
+
+ A client that wants to be notified of new resources as they show up
+ can use this observation:
+
+ Req: GET /rd-lookup/res?rt=tag:example.org,2020:light
+ Observe: 0
+
+ Res: 2.05 Content
+ Observe: 23
+ Payload: empty
+
+ (at a later point in time)
+
+ Res: 2.05 Content
+ Observe: 24
+ Payload:
+ <coap://[2001:db8:3::124]/west>;rt="tag:example.org,2020:light",
+ <coap://[2001:db8:3::124]/south>;rt="tag:example.org,2020:light",
+ <coap://[2001:db8:3::124]/east>;rt="tag:example.org,2020:light"
+
+ Figure 20: Example of an Observing Resource Lookup
+
+ The following example shows a client performing a paginated resource
+ lookup:
+
+ Req: GET /rd-lookup/res?page=0&count=5
+
+ Res: 2.05 Content
+ Payload:
+ <coap://[2001:db8:3::123]:61616/res/0>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/1>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/2>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/3>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/4>;ct=60
+
+ Req: GET /rd-lookup/res?page=1&count=5
+
+ Res: 2.05 Content
+ Payload:
+ <coap://[2001:db8:3::123]:61616/res/5>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/6>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/7>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/8>;ct=60,
+ <coap://[2001:db8:3::123]:61616/res/9>;ct=60
+
+ Figure 21: Example of Paginated Resource Lookup
+
+ The following example shows a client performing a lookup of all
+ resources of all endpoints of a given endpoint type. It assumes that
+ two endpoints (with endpoint names sensor1 and sensor2) have
+ previously registered with their respective addresses
+ (coap://sensor1.example.com and coap://sensor2.example.com) and
+ posted the very payload of the 6th response of Section 5 of
+ [RFC6690].
+
+ It demonstrates how absolute link targets stay unmodified, while
+ relative ones are resolved:
+
+ Req: GET /rd-lookup/res?et=tag:example.com,2020:platform
+
+ Res: 2.05 Content
+ Payload:
+ <coap://sensor1.example.com/sensors>;ct=40;title="Sensor Index",
+ <coap://sensor1.example.com/sensors/temp>;rt=temperature-c;if=sensor,
+ <coap://sensor1.example.com/sensors/light>;rt=light-lux;if=sensor,
+ <http://www.example.com/sensors/t123>;rel=describedby;
+ anchor="coap://sensor1.example.com/sensors/temp",
+ <coap://sensor1.example.com/t>;rel=alternate;
+ anchor="coap://sensor1.example.com/sensors/temp",
+ <coap://sensor2.example.com/sensors>;ct=40;title="Sensor Index",
+ <coap://sensor2.example.com/sensors/temp>;rt=temperature-c;if=sensor,
+ <coap://sensor2.example.com/sensors/light>;rt=light-lux;if=sensor,
+ <http://www.example.com/sensors/t123>;rel=describedby;
+ anchor="coap://sensor2.example.com/sensors/temp",
+ <coap://sensor2.example.com/t>;rel=alternate;
+ anchor="coap://sensor2.example.com/sensors/temp"
+
+ Figure 22: Example of a Resource Lookup from Multiple Endpoints
+
+6.4. Endpoint Lookup
+
+ The endpoint lookup returns links to and information about
+ registration resources, which themselves can only be manipulated by
+ the registering endpoint.
+
+ Endpoint registration resources are annotated with their endpoint
+ names (ep), sectors (d, if present), and registration base URI (base;
+ reports the registrant-EP's address if no explicit base was given),
+ as well as a constant resource type (rt="core.rd-ep"); the lifetime
+ (lt) is not reported. Additional endpoint attributes are added as
+ target attributes to their endpoint link unless their specification
+ says otherwise.
+
+ Links to endpoints SHOULD be presented in path-absolute form or, if
+ required, as (full) URIs. (This ensures that the output conforms to
+ Limited Link Format, as described in Appendix C.)
+
+ Base addresses that contain link-local addresses MUST NOT include
+ zone identifiers, and such registrations MUST NOT be shown unless the
+ lookup was made from the same link from which the registration was
+ made.
+
+ While the endpoint lookup does expose the registration resources, the
+ RD does not need to make them accessible to clients. Clients SHOULD
+ NOT attempt to dereference or manipulate them.
+
+ An RD can report registrations in lookup whose URI scheme and
+ authority differ from that of the lookup resource. Lookup clients
+ MUST be prepared to see arbitrary URIs as registration resources in
+ the results and treat them as opaque identifiers; the precise
+ semantics of such links are left to future specifications.
+
+ The following example shows a client performing an endpoint lookup
+ that is limited to endpoints of endpoint type
+ tag:example.com,2020:platform:
+
+ Req: GET /rd-lookup/ep?et=tag:example.com,2020:platform
+
+ Res: 2.05 Content
+ Payload:
+ </rd/1234>;base="coap://[2001:db8:3::127]:61616";ep=node5;
+ et="tag:example.com,2020:platform";ct=40;rt=core.rd-ep,
+ </rd/4521>;base="coap://[2001:db8:3::129]:61616";ep=node7;
+ et="tag:example.com,2020:platform";ct=40;d=floor-3;
+ rt=core.rd-ep
+
+ Figure 23: Example of Endpoint Lookup
+
+7. Security Policies
+
+ The security policies that are applicable to an RD strongly depend on
+ the application and are not set out normatively here.
+
+ This section provides a list of aspects that applications should
+ consider when describing their use of the RD, without claiming to
+ cover all cases. It uses terminology of [ACE-OAUTH-AUTHZ], in which
+ the RD acts as the Resource Server (RS), and both registrant-EPs and
+ lookup clients act as Clients (C) with support from an Authorization
+ Server (AS), without the intention of ruling out other schemes (e.g.,
+ those based on certificates/Public Key Infrastructures (PKIs)).
+
+ Any, all, or none of the below can apply to an application. Which
+ are relevant depends on its protection objectives.
+
+ Security policies are set by configuration of the RD or by choice of
+ the implementation. Lookup clients (and, where relevant, endpoints)
+ can only trust an RD to uphold them if it is authenticated and
+ authorized to serve as an RD according to the application's
+ requirements.
+
+7.1. Endpoint Name
+
+ Whenever an RD needs to provide trustworthy results to clients doing
+ endpoint lookup or resource lookup with filtering on the endpoint
+ name, the RD must ensure that the registrant is authorized to use the
+ given endpoint name. This applies both to registration and later to
+ operations on the registration resource. It is immaterial whether
+ the client is the registrant-EP itself or a CT is doing the
+ registration. The RD cannot tell the difference, and CTs may use
+ authorization credentials authorizing only operations on that
+ particular endpoint name or a wider range of endpoint names.
+
+ It is up to the concrete security policy to describe how the endpoint
+ name and sector are transported when certificates are used. For
+ example, it may describe how SubjectAltName dNSName entries are
+ mapped to endpoint and domain names.
+
+7.1.1. Random Endpoint Names
+
+ Conversely, in applications where the RD does not check the endpoint
+ name, the authorized registering endpoint can generate a random
+ number (or string) that identifies the endpoint. The RD should then
+ remember unique properties of the registrant, associate them with the
+ registration for as long as its registration resource is active
+ (which may be longer than the registration's lifetime), and require
+ the same properties for operations on the registration resource.
+
+ Registrants that are prepared to pick a different identifier when
+ their initial attempt (or attempts, in the unlikely case of two
+ subsequent collisions) at registration is unauthorized should pick an
+ identifier at least twice as long as would be needed to enumerate the
+ expected number of registrants; registrants without any such recovery
+ options should pick significantly longer endpoint names (e.g., using
+ Universally Unique Identifier (UUID) URNs [RFC4122]).
+
+7.2. Entered Links
+
+ When lookup clients expect that certain types of links can only
+ originate from certain endpoints, then the RD needs to apply
+ filtering to the links an endpoint may register.
+
+ For example, if clients use an RD to find a server that provides
+ firmware updates, then any registrant that wants to register (or
+ update) links to firmware sources will need to provide suitable
+ credentials to do so, independently of its endpoint name.
+
+ Note that the impact of having undesirable links in the RD depends on
+ the application. If the client requires the firmware server to
+ present credentials as a firmware server, a fraudulent link's impact
+ is limited to the client revealing its intention to obtain updates
+ and slowing down the client until it finds a legitimate firmware
+ server; if the client accepts any credentials from the server as long
+ as they fit the provided URI, the impact is larger.
+
+ An RD may also require that links are only registered if the
+ registrant is authorized to publish information about the anchor (or
+ even target) of the link. One way to do this is to demand that the
+ registrant present the same credentials in its role as a registering
+ client that it would need to present in its role as a server when
+ contacted at the resources' URI. These credentials may include using
+ the address and port that are part of the URI. Such a restriction
+ places severe practical limitations on the links that can be
+ registered.
+
+ As above, the impact of undesirable links depends on the extent to
+ which the lookup client relies on the RD. To avoid the limitations,
+ RD applications should consider prescribing that lookup clients only
+ use the discovered information as hints and describe which pieces of
+ information need to be verified because they impact the application's
+ security. A straightforward way to verify such information is to
+ request it again from an authorized server, typically the one that
+ hosts the target resource. That is similar to what happens in
+ Section 4.3 when the "URI discovery" step is repeated.
+
+7.3. Link Confidentiality
+
+ When registrants publish information in the RD that is not available
+ to any client that would query the registrant's /.well-known/core
+ interface, or when lookups to that interface are subject to stricter
+ firewalling than lookups to the RD, the RD may need to limit which
+ lookup clients may access the information.
+
+ In this case, the endpoint (and not the lookup clients) needs to be
+ careful to check the RD's authorization. The RD needs to check any
+ lookup client's authorization before revealing information directly
+ (in resource lookup) or indirectly (when using it to satisfy a
+ resource lookup search criterion).
+
+7.4. Segmentation
+
+ Within a single RD, different security policies can apply.
+
+ One example of this are multi-tenant deployments separated by the
+ sector (d) parameter. Some sectors might apply limitations on the
+ endpoint names available, while others use a random identifier
+ approach to endpoint names and place limits on the entered links
+ based on their attributes instead.
+
+ Care must be taken in such setups to determine the applicable access
+ control measures to each operation. One easy way to do that is to
+ mandate the use of the sector parameter on all operations, as no
+ credentials are suitable for operations across sector borders anyway.
+
+7.5. "First Come First Remembered": A Default Policy
+
+ The "First Come First Remembered" policy is provided both as a
+ reference example for a security policy definition and as a policy
+ that implementations may choose to use as default policy in the
+ absence of any other configuration. It is designed to enable
+ efficient discovery operations even in ad hoc settings.
+
+ Under this policy, the RD accepts registrations for any endpoint name
+ that is not assigned to an active registration resource and only
+ accepts registration updates from the same endpoint. The policy is
+ minimal in that it does not make any promises to lookup clients about
+ the claims of Sections 7.2 and 7.3, and promises about the claims in
+ Section 7.1 are limited to the lifetime of that endpoint's
+ registration. It does however promise the endpoint that, for the
+ duration of its registration, its links will be discoverable on the
+ RD.
+
+ When a registration or operation is attempted, the RD MUST determine
+ the client's subject name or public key:
+
+ * If the client's credentials indicate any subject name that is
+ certified by any authority that the RD recognizes (which may be
+ the system's trust anchor store), all such subject names are
+ stored. With credentials based on CWT or JWT (as common with
+ Authentication and Authorization for Constrained Environments
+ (ACE)), the Subject (sub) claim is stored as a single name, if it
+ exists. With X.509 certificates, the Common Name (CN) and the
+ complete list of SubjectAltName entries are stored. In both
+ cases, the authority that certified the claim is stored along with
+ the subject, as the latter may only be locally unique.
+
+ * Otherwise, if the client proves possession of a private key, the
+ matching public key is stored. This applies both to raw public
+ keys and to the public keys indicated in certificates that failed
+ the above authority check.
+
+ * If neither is present, a reference to the security session itself
+ is stored. With (D)TLS, that is the connection itself or the
+ session resumption information, if available. With OSCORE, that
+ is the security context.
+
+ As part of the registration operation, that information is stored
+ along with the registration resource.
+
+ The RD MUST accept all registrations whose registration resource is
+ not already active, as long as they are made using a security layer
+ supported by the RD.
+
+ Any operation on a registration resource, including registrations
+ that lead to an existing registration resource, MUST be rejected by
+ the RD unless all the stored information is found in the new
+ request's credentials.
+
+ Note that, even though subject names are compared in this policy,
+ they are never directly compared to endpoint names, and an endpoint
+ cannot expect to "own" any particular endpoint name outside of an
+ active registration -- even if a certificate says so. It is an
+ accepted shortcoming of this approach that the endpoint has no
+ indication of whether the RD remembers it by its subject name or
+ public key; recognition by subject happens on a best-effort basis
+ (given the RD may not recognize any authority). Clients MUST be
+ prepared to pick a different endpoint name when rejected by the RD
+ initially or after a change in their credentials; picking an endpoint
+ name, as per Section 7.1.1, is an easy option for that.
+
+ For this policy to be usable without configuration, clients should
+ not set a sector name in their registrations. An RD can set a
+ default sector name for registrations accepted under this policy,
+ which is especially useful in a segmented setup where different
+ policies apply to different sectors. The configuration of such a
+ behavior, as well as any other configuration applicable to such an RD
+ (i.e., the set of recognized authorities), is out of scope for this
+ document.
+
+8. Security Considerations
+
+ The security considerations as described in Section 5 of [RFC8288]
+ and Section 6 of [RFC6690] apply. The /.well-known/core resource may
+ be protected, e.g., using DTLS when hosted on a CoAP server, as
+ described in [RFC7252].
+
+ Access that is limited or affects sensitive data SHOULD be protected,
+ e.g., using (D)TLS or OSCORE [RFC8613]; which aspects of the RD this
+ affects depends on the security policies of the application (see
+ Section 7).
+
+8.1. Discovery
+
+ Most steps in discovery of the RD, and possibly its resources, are
+ not covered by CoAP's security mechanisms. This will not endanger
+ the security properties of the registrations and lookup itself (where
+ the client requires authorization of the RD if it expects any
+ security properties of the operation) but may leak the client's
+ intention to third parties and allow them to slow down the process.
+
+ To mitigate that, clients can retain the RD's address, use secure
+ discovery options (such as configured addresses), and send queries
+ for RDs in a very general form (e.g., ?rt=core.rd* rather than
+ ?rt=core.rd-lookup-ep).
+
+8.2. Endpoint Identification and Authentication
+
+ An endpoint (name, sector) pair is unique within the set of endpoints
+ registered by the RD. An endpoint MUST NOT be identified by its
+ protocol, port, or IP address, as these may change over the lifetime
+ of an endpoint.
+
+ Every operation performed by an endpoint on an RD SHOULD be mutually
+ authenticated using a pre-shared key, a raw public key, or
+ certificate-based security.
+
+ Consider the following threat: two devices, A and B, are registered
+ at a single server. Both devices have unique, per-device credentials
+ for use with DTLS to make sure that only parties with authorization
+ to access A or B can do so.
+
+ Now, imagine that a malicious device A wants to sabotage the device
+ B. It uses its credentials during the DTLS exchange. Then, it
+ specifies the endpoint name of device B as the name of its own
+ endpoint in device A. If the server does not check whether the
+ identifier provided in the DTLS handshake matches the identifier used
+ at the CoAP layer, then it may be inclined to use the endpoint name
+ for looking up what information to provision to the malicious device.
+
+ Endpoint authorization needs to be checked on registration and
+ registration resource operations independently of whether there are
+ configured requirements on the credentials for a given endpoint name
+ and sector (Section 7.1) or whether arbitrary names are accepted
+ (Section 7.1.1).
+
+ Simple registration could be used to circumvent address-based access
+ control. An attacker would send a simple registration request with
+ the victim's address as the source address and later look up the
+ victim's /.well-known/core content in the RD. Mitigation for this is
+ recommended in Section 5.1.
+
+ The registration resource path is visible to any client that is
+ allowed endpoint lookup and can be extracted by resource lookup
+ clients as well. The same goes for registration attributes that are
+ shown as target attributes or lookup attributes. The RD needs to
+ consider this in the choice of registration resource paths, as do
+ administrators or endpoints in their choice of attributes.
+
+8.3. Access Control
+
+ Access control SHOULD be performed separately for the RD registration
+ and lookup API paths, as different endpoints may be authorized to
+ register with an RD from those authorized to look up endpoints from
+ the RD. Such access control SHOULD be performed in as fine-grained a
+ level as possible. For example, access control for lookups could be
+ performed either at the sector, endpoint, or resource level.
+
+ The precise access controls necessary (and the consequences of
+ failure to enforce them) depend on the protection objectives of the
+ application and the security policies (Section 7) derived from them.
+
+8.4. Denial-of-Service Attacks
+
+ Services that run over UDP unprotected are vulnerable to unknowingly
+ amplify and distribute a DoS attack, as UDP does not require a return
+ routability check. Since RD lookup responses can be significantly
+ larger than requests, RDs are prone to this.
+
+ [RFC7252] describes this at length in its Section 11.3, including
+ some mitigation by using small block sizes in responses. [RFC9175]
+ updates that by describing a source address verification mechanism
+ using the Echo option.
+
+8.5. Skipping Freshness Checks
+
+ When RD-based applications are built in which request freshness
+ checks are not performed, these concerns need to be balanced:
+
+ * When alterations to registration attributes are reordered, an
+ attacker may create any combination of attributes ever set, with
+ the attack difficulty determined by the security layer's replay
+ properties.
+
+ For example, if Figure 18 were conducted without freshness
+ assurances, an attacker could later reset the lifetime back to
+ 7200. Thus, the device is made unreachable to lookup clients.
+
+ * When registration updates without query parameters (which just
+ serve to restart the lifetime) can be reordered, an attacker can
+ use intercepted messages to give the appearance of the device
+ being alive to the RD.
+
+ This is unacceptable when the RD's security policy promises
+ reachability of endpoints (e.g., when disappearing devices would
+ trigger further investigation) but may be acceptable with other
+ policies.
+
+9. IANA Considerations
+
+9.1. Resource Types
+
+ IANA has added the following values to the "Resource Type (rt=) Link
+ Target Attribute Values" subregistry of the "Constrained RESTful
+ Environments (CoRE) Parameters" registry defined in [RFC6690]:
+
+ +====================+=============================+=============+
+ | Value | Description | Reference |
+ +====================+=============================+=============+
+ | core.rd | Directory resource of an RD | RFC 9176, |
+ | | | Section 4.3 |
+ +--------------------+-----------------------------+-------------+
+ | core.rd-lookup-res | Resource lookup of an RD | RFC 9176, |
+ | | | Section 4.3 |
+ +--------------------+-----------------------------+-------------+
+ | core.rd-lookup-ep | Endpoint lookup of an RD | RFC 9176, |
+ | | | Section 4.3 |
+ +--------------------+-----------------------------+-------------+
+ | core.rd-ep | Endpoint resource of an RD | RFC 9176, |
+ | | | Section 6 |
+ +--------------------+-----------------------------+-------------+
+
+ Table 2: Additions to Resource Type (rt=) Link Target
+ Attribute Values Subregistry
+
+9.2. IPv6 ND Resource Directory Address Option
+
+ IANA has registered one new ND option type in the "IPv6 Neighbor
+ Discovery Option Formats" subregistry of the "Internet Control
+ Message Protocol version 6 (ICMPv6) Parameters" registry:
+
+ +======+===================================+===========+
+ | Type | Description | Reference |
+ +======+===================================+===========+
+ | 41 | Resource Directory Address Option | RFC 9176 |
+ +------+-----------------------------------+-----------+
+
+ Table 3: Addition to IPv6 Neighbor Discovery Option
+ Formats Subregistry
+
+9.3. RD Parameters Registry
+
+ This specification defines a new subregistry for registration and
+ lookup parameters called "RD Parameters" within the "Constrained
+ RESTful Environments (CoRE) Parameters" registry. Although this
+ specification defines a basic set of parameters, it is expected that
+ other standards that make use of this interface will define new ones.
+
+ Each entry in the registry must include:
+
+ * the human-readable name of the parameter,
+
+ * the short name, as used in query parameters or target attributes,
+
+ * syntax and validity requirements (if any),
+
+ * indication of whether it can be passed as a query parameter at
+ registration of endpoints, passed as a query parameter in lookups,
+ or expressed as a target attribute,
+
+ * a description, and
+
+ * a link to reference documentation.
+
+ The query parameter MUST be both a valid URI query key [RFC3986] and
+ a token as used in [RFC8288].
+
+ The reference documentation must give details on whether the
+ parameter can be updated and how it is to be processed in lookups.
+
+ The mechanisms around new RD parameters should be designed in such a
+ way that they tolerate RD implementations that are unaware of the
+ parameter and expose any parameter passed at registration or updates
+ in endpoint lookups. (For example, if a parameter used at
+ registration were to be confidential, the registering endpoint should
+ be instructed to only set that parameter if the RD advertises support
+ for keeping it confidential at the discovery step.)
+
+ Initial entries in this subregistry are as follows:
+
+ +==============+=======+==============+=====+=====================+
+ | Name | Short | Validity | Use | Description |
+ +==============+=======+==============+=====+=====================+
+ | Endpoint | ep | Unicode* | RLA | Name of the |
+ | Name | | | | endpoint |
+ +--------------+-------+--------------+-----+---------------------+
+ | Lifetime | lt | 1-4294967295 | R | Lifetime of the |
+ | | | | | registration in |
+ | | | | | seconds |
+ +--------------+-------+--------------+-----+---------------------+
+ | Sector | d | Unicode* | RLA | Sector to which |
+ | | | | | this endpoint |
+ | | | | | belongs |
+ +--------------+-------+--------------+-----+---------------------+
+ | Registration | base | URI | RLA | The scheme, |
+ | Base URI | | | | address, port, and |
+ | | | | | path at which this |
+ | | | | | server is available |
+ +--------------+-------+--------------+-----+---------------------+
+ | Page | page | Integer | L | Used for pagination |
+ +--------------+-------+--------------+-----+---------------------+
+ | Count | count | Integer | L | Used for pagination |
+ +--------------+-------+--------------+-----+---------------------+
+ | Endpoint | et | RFC 9176, | RLA | Semantic type of |
+ | Type | | Section | | the endpoint (see |
+ | | | 9.3.1 | | RFC 9176, |
+ | | | | | Section 9.4) |
+ +--------------+-------+--------------+-----+---------------------+
+
+ Table 4: New RD Parameters Registry
+
+ Where:
+
+ Short: Short name used in query parameters or target attributes
+
+ Validity:
+
+ Unicode* = up to 63 bytes of UTF-8-encoded Unicode, with no
+ control characters as per Section 5
+
+ Use:
+
+ R = used at registration
+ L = used at lookup
+ A = expressed in the target attribute
+
+ The descriptions for the options defined in this document are only
+ summarized here. To which registrations they apply and when they are
+ to be shown are described in the respective sections of this
+ document. All their reference documentation entries point to this
+ document.
+
+ The IANA policy for future additions to the subregistry is Expert
+ Review, as described in [RFC8126]. The evaluation should consider
+ formal criteria, duplication of functionality (i.e., is the new entry
+ redundant with an existing one?), topical suitability (e.g., is the
+ described property actually a property of the endpoint and not a
+ property of a particular resource, in which case it should go into
+ the payload of the registration and need not be registered?), and the
+ potential for conflict with commonly used target attributes (e.g., if
+ could be used as a parameter for conditional registration if it were
+ not to be used in lookup or attributes but would make a bad parameter
+ for lookup because a resource lookup with an if query parameter could
+ ambiguously filter by the registered endpoint property or the target
+ attribute [RFC6690]).
+
+9.3.1. Full Description of the "Endpoint Type" RD Parameter
+
+ An endpoint registering at an RD can describe itself with endpoint
+ types, similar to how resources are described with resource types in
+ [RFC6690]. An endpoint type is expressed as a string, which can be
+ either a URI or one of the values defined in the "Endpoint Type (et=)
+ RD Parameter Values" subregistry. Endpoint types can be passed in
+ the et query parameter as part of extra-attrs at the "registration"
+ step of Section 5, are shown on endpoint lookups using the et target
+ attribute, and can be filtered for using et as a search criterion in
+ resource and endpoint lookup. Multiple endpoint types are given as
+ separate query parameters or link attributes.
+
+ Note that the endpoint type differs from the resource type in that it
+ uses multiple attributes rather than space-separated values. As a
+ result, RDs implementing this specification automatically support
+ correct filtering in the lookup interfaces from the rules for unknown
+ endpoint attributes.
+
+9.4. Endpoint Type (et=) RD Parameter Values
+
+ This specification establishes a new subregistry called "Endpoint
+ Type (et=) RD Parameter Values" within the "Constrained RESTful
+ Environments (CoRE) Parameters" registry. The registry properties
+ (required policy, requirements, and template) are identical to those
+ of the "Resource Type (rt=) Link Target Attribute Values" subregistry
+ defined in [RFC6690]; in short, the review policy is IETF Review for
+ values starting with "core" and Specification Required for others.
+
+ The requirements to be enforced are:
+
+ * The values MUST be related to the purpose described in
+ Section 9.3.1.
+
+ * The registered values MUST conform to the ABNF reg-rel-type
+ definition of [RFC6690] and MUST NOT be a URI.
+
+ * It is recommended to use the period "." character for
+ segmentation.
+
+ The initial contents of the registry are as follows:
+
+ +===============+====================================+===========+
+ | Value | Description | Reference |
+ +===============+====================================+===========+
+ | core.rd-group | An application group, as described | RFC 9176 |
+ | | in RFC 9176, Appendix A. | |
+ +---------------+------------------------------------+-----------+
+
+ Table 5: New Endpoint Type (et=) RD Parameter Values Registry
+
+9.5. Multicast Address Registration
+
+ IANA has assigned the following multicast addresses for use by CoAP
+ nodes:
+
+ IPv4 -- "All CoRE Resource Directories" address 224.0.1.190, in the
+ "Internetwork Control Block (224.0.1.0 - 224.0.1.255
+ (224.0.1/24))" subregistry within the "IPv4 Multicast Address
+ Space Registry". As the address is used for discovery that may
+ span beyond a single network, it has come from the Internetwork
+ Control Block (224.0.1.x) [RFC5771].
+
+ IPv6 -- "All CoRE Resource Directories" address ff0x::fe, in the
+ "Variable Scope Multicast Addresses" subregistry within the "IPv6
+ Multicast Address Space Registry" [RFC3307]. Note that there is a
+ distinct multicast address for each scope that interested CoAP
+ nodes should listen to; CoAP needs the link-local and site-local
+ scopes only.
+
+9.6. Well-Known URIs
+
+ IANA has registered the URI suffix "rd" in the "Well-Known URIs"
+ registry as follows:
+
+ +============+===================+===========+===========+
+ | URI Suffix | Change Controller | Reference | Status |
+ +============+===================+===========+===========+
+ | rd | IETF | RFC 9176 | permanent |
+ +------------+-------------------+-----------+-----------+
+
+ Table 6: Addition to Well-Known URIs Registry
+
+9.7. Service Name and Transport Protocol Port Number Registry
+
+ IANA has added four new items to the "Service Name and Transport
+ Protocol Port Number Registry" as follows:
+
+ +==============+===========+=====================+===========+
+ | Service Name | Transport | Description | Reference |
+ | | Protocol | | |
+ +==============+===========+=====================+===========+
+ | core-rd | udp | Resource Directory | RFC 9176 |
+ | | | accessed using CoAP | |
+ +--------------+-----------+---------------------+-----------+
+ | core-rd-dtls | udp | Resource Directory | RFC 9176 |
+ | | | accessed using CoAP | |
+ | | | over DTLS | |
+ +--------------+-----------+---------------------+-----------+
+ | core-rd | tcp | Resource Directory | RFC 9176 |
+ | | | accessed using CoAP | |
+ | | | over TCP | |
+ +--------------+-----------+---------------------+-----------+
+ | core-rd-tls | tcp | Resource Directory | RFC 9176 |
+ | | | accessed using CoAP | |
+ | | | over TLS | |
+ +--------------+-----------+---------------------+-----------+
+
+ Table 7: Additions to Service Name and Transport Protocol
+ Port Number Registry
+
+10. Examples
+
+ Two examples are presented: a lighting installation example in
+ Section 10.1 and a Lightweight M2M (LwM2M) example in Section 10.2.
+
+10.1. Lighting Installation
+
+ This example shows a simplified lighting installation that makes use
+ of the RD with a CoAP interface to facilitate the installation and
+ startup of the application code in the lights and sensors. In
+ particular, the example leads to the definition of a group and the
+ enabling of the corresponding multicast address, as described in
+ Appendix A. No conclusions must be drawn on the realization of
+ actual installation or naming procedures, because the example only
+ emphasizes some of the issues that may influence the use of the RD
+ and does not pretend to be normative.
+
+10.1.1. Installation Characteristics
+
+ The example assumes that the installation is managed. That means
+ that a Commissioning Tool (CT) is used to authorize the addition of
+ nodes, name them, and name their services. The CT can be connected
+ to the installation in many ways: the CT can be part of the
+ installation network, connected by Wi-Fi to the installation network,
+ connected via GPRS link, or connected by another method.
+
+ It is assumed that there are two naming authorities for the
+ installation: (1) the network manager that is responsible for the
+ correct operation of the network and the connected interfaces and (2)
+ the lighting manager that is responsible for the correct functioning
+ of networked lights and sensors. The result is the existence of two
+ naming schemes coming from the two managing entities.
+
+ The example installation consists of one presence sensor and two
+ luminaries, luminary1 and luminary2, each with their own wireless
+ interface. Each luminary contains three lamps: left, right, and
+ middle. Each luminary is accessible through one endpoint. For each
+ lamp, a resource exists to modify the settings of a lamp in a
+ luminary. The purpose of the installation is that the presence
+ sensor notifies the presence of persons to a group of lamps. The
+ group of lamps consists of the middle and left lamps of luminary1 and
+ the right lamp of luminary2.
+
+ Before commissioning by the lighting manager, the network is
+ installed, and access to the interfaces is proven to work by the
+ network manager.
+
+ At the moment of installation, the network under installation is not
+ necessarily connected to the DNS infrastructure. Therefore,
+ Stateless Address Autoconfiguration (SLAAC) IPv6 addresses are
+ assigned to CT, RD, luminaries, and the sensor. The addresses shown
+ in Table 8 below stand in for these in the following examples.
+
+ +=================+================+
+ | Name | IPv6 address |
+ +=================+================+
+ | luminary1 | 2001:db8:4::1 |
+ +-----------------+----------------+
+ | luminary2 | 2001:db8:4::2 |
+ +-----------------+----------------+
+ | Presence sensor | 2001:db8:4::3 |
+ +-----------------+----------------+
+ | RD | 2001:db8:4::ff |
+ +-----------------+----------------+
+
+ Table 8: Addresses Used in the
+ Examples
+
+ In Section 10.1.2, the use of RD during installation is presented.
+
+10.1.2. RD Entries
+
+ It is assumed that access to the DNS infrastructure is not always
+ possible during installation. Therefore, the SLAAC addresses are
+ used in this section.
+
+ For discovery, the resource types (rt) of the devices are important.
+ The lamps in the luminaries have rt=tag:example.com,2020:light, and
+ the presence sensor has rt=tag:example.com,2020:p-sensor. The
+ endpoints have names that are relevant to the light installation
+ manager. In this case, luminary1, luminary2, and the presence sensor
+ are located in room 2-4-015, where luminary1 is located at the window
+ and luminary2 and the presence sensor are located at the door. The
+ endpoint names reflect this physical location. The middle, left, and
+ right lamps are accessed via path /light/middle, /light/left, and
+ /light/right, respectively. The identifiers relevant to the RD are
+ shown in Table 9.
+
+ +=========+================+========+===============================+
+ |Name |Endpoint |Resource| Resource Type |
+ | | |Path | |
+ +=========+================+========+===============================+
+ |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light |
+ | | |left | |
+ +---------+----------------+--------+-------------------------------+
+ |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light |
+ | | |middle | |
+ +---------+----------------+--------+-------------------------------+
+ |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light |
+ | | |right | |
+ +---------+----------------+--------+-------------------------------+
+ |luminary2|lm_R2-4-015_door|/light/ | tag:example.com,2020:light |
+ | | |left | |
+ +---------+----------------+--------+-------------------------------+
+ |luminary2|lm_R2-4-015_door|/light/ | tag:example.com,2020:light |
+ | | |middle | |
+ +---------+----------------+--------+-------------------------------+
+ |luminary2|lm_R2-4-015_door|/light/ | tag:example.com,2020:light |
+ | | |right | |
+ +---------+----------------+--------+-------------------------------+
+ |Presence |ps_R2-4-015_door|/ps | tag:example.com,2020:p-sensor |
+ |sensor | | | |
+ +---------+----------------+--------+-------------------------------+
+
+ Table 9: RD Identifiers
+
+ It is assumed that the CT has performed RD discovery and has received
+ a response like the one in the example in Section 4.3.
+
+ The CT inserts the endpoints of the luminaries and the sensor in the
+ RD using the registration base URI parameter (base) to specify the
+ interface address:
+
+ Req: POST coap://[2001:db8:4::ff]/rd
+ ?ep=lm_R2-4-015_wndw&base=coap://[2001:db8:4::1]&d=R2-4-015
+ Payload:
+ </light/left>;rt="tag:example.com,2020:light",
+ </light/middle>;rt="tag:example.com,2020:light",
+ </light/right>;rt="tag:example.com,2020:light"
+
+ Res: 2.01 Created
+ Location-Path: /rd/4521
+
+ Req: POST coap://[2001:db8:4::ff]/rd
+ ?ep=lm_R2-4-015_door&base=coap://[2001:db8:4::2]&d=R2-4-015
+ Payload:
+ </light/left>;rt="tag:example.com,2020:light",
+ </light/middle>;rt="tag:example.com,2020:light",
+ </light/right>;rt="tag:example.com,2020:light"
+
+ Res: 2.01 Created
+ Location-Path: /rd/4522
+
+ Req: POST coap://[2001:db8:4::ff]/rd
+ ?ep=ps_R2-4-015_door&base=coap://[2001:db8:4::3]&d=R2-4-015
+ Payload:
+ </ps>;rt="tag:example.com,2020:p-sensor"
+
+ Res: 2.01 Created
+ Location-Path: /rd/4523
+
+ Figure 24: Example of Registrations a CT Enters into an RD
+
+ The sector name d=R2-4-015 has been added for an efficient lookup
+ because filtering on the "ep" name is more awkward. The same sector
+ name is communicated to the two luminaries and the presence sensor by
+ the CT.
+
+ The group is specified in the RD. The base parameter is set to the
+ site-local multicast address allocated to the group. In the POST in
+ the example below, the resources supported by all group members are
+ published.
+
+ Req: POST coap://[2001:db8:4::ff]/rd
+ ?ep=grp_R2-4-015&et=core.rd-group&base=coap://[ff05::1]
+ Payload:
+ </light/left>;rt="tag:example.com,2020:light",
+ </light/middle>;rt="tag:example.com,2020:light",
+ </light/right>;rt="tag:example.com,2020:light"
+
+ Res: 2.01 Created
+ Location-Path: /rd/501
+
+ Figure 25: Example of a Multicast Group a CT Enters into an RD
+
+ After the filling of the RD by the CT, the application in the
+ luminaries can learn to which groups they belong and enable their
+ interface for the multicast address.
+
+ The luminary, knowing its sector and being configured to join any
+ group containing lights, searches for candidate groups and joins
+ them:
+
+ Req: GET coap://[2001:db8:4::ff]/rd-lookup/ep
+ ?d=R2-4-015&et=core.rd-group&rt=light
+
+ Res: 2.05 Content
+ Payload:
+ </rd/501>;ep=grp_R2-4-015;et=core.rd-group;
+ base="coap://[ff05::1]";rt=core.rd-ep
+
+ Figure 26: Example of a Lookup Exchange to Find Suitable
+ Multicast Addresses
+
+ From the returned base parameter value, the luminary learns the
+ multicast address of the multicast group.
+
+ The presence sensor can learn the presence of groups that support
+ resources with rt=tag:example.com,2020:light in its own sector by
+ sending the same request, as used by the luminary. The presence
+ sensor learns the multicast address to use for sending messages to
+ the luminaries.
+
+10.2. OMA Lightweight M2M (LwM2M)
+
+ OMA LwM2M is a profile for device services based on CoAP, providing
+ interfaces and operations for device management and device service
+ enablement.
+
+ An LwM2M server is an instance of an LwM2M middleware service layer,
+ containing an RD ([LwM2M], starting at page 36).
+
+ That RD only implements the registration interface, and no lookup is
+ implemented. Instead, the LwM2M server provides access to the
+ registered resources in a similar way to a reverse proxy.
+
+ The location of the LwM2M server and RD URI path is provided by the
+ LwM2M bootstrap process, so no dynamic discovery of the RD is used.
+ LwM2M servers and endpoints are not required to implement the /.well-
+ known/core resource.
+
+11. References
+
+11.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, DOI 10.17487/RFC3986, January 2005,
+ <https://www.rfc-editor.org/info/rfc3986>.
+
+ [RFC6570] Gregorio, J., Fielding, R., Hadley, M., Nottingham, M.,
+ and D. Orchard, "URI Template", RFC 6570,
+ DOI 10.17487/RFC6570, March 2012,
+ <https://www.rfc-editor.org/info/rfc6570>.
+
+ [RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link
+ Format", RFC 6690, DOI 10.17487/RFC6690, August 2012,
+ <https://www.rfc-editor.org/info/rfc6690>.
+
+ [RFC6763] Cheshire, S. and M. Krochmal, "DNS-Based Service
+ Discovery", RFC 6763, DOI 10.17487/RFC6763, February 2013,
+ <https://www.rfc-editor.org/info/rfc6763>.
+
+ [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
+ Protocol (HTTP/1.1): Message Syntax and Routing",
+ RFC 7230, DOI 10.17487/RFC7230, June 2014,
+ <https://www.rfc-editor.org/info/rfc7230>.
+
+ [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained
+ Application Protocol (CoAP)", RFC 7252,
+ DOI 10.17487/RFC7252, June 2014,
+ <https://www.rfc-editor.org/info/rfc7252>.
+
+ [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
+ Writing an IANA Considerations Section in RFCs", BCP 26,
+ RFC 8126, DOI 10.17487/RFC8126, June 2017,
+ <https://www.rfc-editor.org/info/rfc8126>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC8288] Nottingham, M., "Web Linking", RFC 8288,
+ DOI 10.17487/RFC8288, October 2017,
+ <https://www.rfc-editor.org/info/rfc8288>.
+
+ [RFC9175] Amsüss, C., Preuß Mattsson, J., and G. Selander,
+ "Constrained Application Protocol (CoAP): Echo, Request-
+ Tag, and Token Processing", RFC 9175,
+ DOI 10.17487/RFC9175, February 2022,
+ <https://www.rfc-editor.org/info/rfc9175>.
+
+11.2. Informative References
+
+ [ACE-OAUTH-AUTHZ]
+ Seitz, L., Selander, G., Wahlstroem, E., Erdtman, S., and
+ H. Tschofenig, "Authentication and Authorization for
+ Constrained Environments (ACE) using the OAuth 2.0
+ Framework (ACE-OAuth)", Work in Progress, Internet-Draft,
+ draft-ietf-ace-oauth-authz-46, 8 November 2021,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-ace-
+ oauth-authz-46>.
+
+ [COAP-PROT-NEG]
+ Silverajan, B. and M. Ocak, "CoAP Protocol Negotiation",
+ Work in Progress, Internet-Draft, draft-silverajan-core-
+ coap-protocol-negotiation-09, 2 July 2018,
+ <https://datatracker.ietf.org/doc/html/draft-silverajan-
+ core-coap-protocol-negotiation-09>.
+
+ [CORE-CORAL]
+ Amsüss, C. and T. Fossati, "The Constrained RESTful
+ Application Language (CoRAL)", Work in Progress, Internet-
+ Draft, draft-ietf-core-coral-05, 7 March 2022,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-core-
+ coral-05>.
+
+ [CORE-LINKS-JSON]
+ Li, K., Rahman, A., and C. Bormann, Ed., "Representing
+ Constrained RESTful Environments (CoRE) Link Format in
+ JSON and CBOR", Work in Progress, Internet-Draft, draft-
+ ietf-core-links-json-10, 26 February 2018,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-core-
+ links-json-10>.
+
+ [CORE-RD-DNS-SD]
+ van der Stok, P., Koster, M., and C. Amsuess, "CoRE
+ Resource Directory: DNS-SD mapping", Work in Progress,
+ Internet-Draft, draft-ietf-core-rd-dns-sd-05, 7 July 2019,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-core-rd-
+ dns-sd-05>.
+
+ [ER] Chen, P., "The entity-relationship model--toward a unified
+ view of data", ACM Transactions on Database Systems, Vol.
+ 1, pp. 9-36, DOI 10.1145/320434.320440, March 1976,
+ <https://doi.org/10.1145/320434.320440>.
+
+ [LwM2M] Open Mobile Alliance, "Lightweight Machine to Machine
+ Technical Specification: Transport Bindings (Candidate
+ Version 1.1)", June 2018,
+ <https://openmobilealliance.org/RELEASE/LightweightM2M/
+ V1_1-20180612-C/OMA-TS-LightweightM2M_Transport-
+ V1_1-20180612-C.pdf>.
+
+ [RFC3306] Haberman, B. and D. Thaler, "Unicast-Prefix-based IPv6
+ Multicast Addresses", RFC 3306, DOI 10.17487/RFC3306,
+ August 2002, <https://www.rfc-editor.org/info/rfc3306>.
+
+ [RFC3307] Haberman, B., "Allocation Guidelines for IPv6 Multicast
+ Addresses", RFC 3307, DOI 10.17487/RFC3307, August 2002,
+ <https://www.rfc-editor.org/info/rfc3307>.
+
+ [RFC3849] Huston, G., Lord, A., and P. Smith, "IPv6 Address Prefix
+ Reserved for Documentation", RFC 3849,
+ DOI 10.17487/RFC3849, July 2004,
+ <https://www.rfc-editor.org/info/rfc3849>.
+
+ [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally
+ Unique IDentifier (UUID) URN Namespace", RFC 4122,
+ DOI 10.17487/RFC4122, July 2005,
+ <https://www.rfc-editor.org/info/rfc4122>.
+
+ [RFC4944] Montenegro, G., Kushalnagar, N., Hui, J., and D. Culler,
+ "Transmission of IPv6 Packets over IEEE 802.15.4
+ Networks", RFC 4944, DOI 10.17487/RFC4944, September 2007,
+ <https://www.rfc-editor.org/info/rfc4944>.
+
+ [RFC5771] Cotton, M., Vegoda, L., and D. Meyer, "IANA Guidelines for
+ IPv4 Multicast Address Assignments", BCP 51, RFC 5771,
+ DOI 10.17487/RFC5771, March 2010,
+ <https://www.rfc-editor.org/info/rfc5771>.
+
+ [RFC6724] Thaler, D., Ed., Draves, R., Matsumoto, A., and T. Chown,
+ "Default Address Selection for Internet Protocol Version 6
+ (IPv6)", RFC 6724, DOI 10.17487/RFC6724, September 2012,
+ <https://www.rfc-editor.org/info/rfc6724>.
+
+ [RFC6775] Shelby, Z., Ed., Chakrabarti, S., Nordmark, E., and C.
+ Bormann, "Neighbor Discovery Optimization for IPv6 over
+ Low-Power Wireless Personal Area Networks (6LoWPANs)",
+ RFC 6775, DOI 10.17487/RFC6775, November 2012,
+ <https://www.rfc-editor.org/info/rfc6775>.
+
+ [RFC6874] Carpenter, B., Cheshire, S., and R. Hinden, "Representing
+ IPv6 Zone Identifiers in Address Literals and Uniform
+ Resource Identifiers", RFC 6874, DOI 10.17487/RFC6874,
+ February 2013, <https://www.rfc-editor.org/info/rfc6874>.
+
+ [RFC7228] Bormann, C., Ersue, M., and A. Keranen, "Terminology for
+ Constrained-Node Networks", RFC 7228,
+ DOI 10.17487/RFC7228, May 2014,
+ <https://www.rfc-editor.org/info/rfc7228>.
+
+ [RFC7641] Hartke, K., "Observing Resources in the Constrained
+ Application Protocol (CoAP)", RFC 7641,
+ DOI 10.17487/RFC7641, September 2015,
+ <https://www.rfc-editor.org/info/rfc7641>.
+
+ [RFC8106] Jeong, J., Park, S., Beloeil, L., and S. Madanapalli,
+ "IPv6 Router Advertisement Options for DNS Configuration",
+ RFC 8106, DOI 10.17487/RFC8106, March 2017,
+ <https://www.rfc-editor.org/info/rfc8106>.
+
+ [RFC8132] van der Stok, P., Bormann, C., and A. Sehgal, "PATCH and
+ FETCH Methods for the Constrained Application Protocol
+ (CoAP)", RFC 8132, DOI 10.17487/RFC8132, April 2017,
+ <https://www.rfc-editor.org/info/rfc8132>.
+
+ [RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names
+ (URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017,
+ <https://www.rfc-editor.org/info/rfc8141>.
+
+ [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz,
+ "Object Security for Constrained RESTful Environments
+ (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019,
+ <https://www.rfc-editor.org/info/rfc8613>.
+
+ [T2TRG-REL-IMPL]
+ Bormann, C., "impl-info: A link relation type for
+ disclosing implementation information", Work in Progress,
+ Internet-Draft, draft-bormann-t2trg-rel-impl-02, 27
+ September 2020, <https://datatracker.ietf.org/doc/html/
+ draft-bormann-t2trg-rel-impl-02>.
+
+Appendix A. Groups Registration and Lookup
+
+ The RD-Group's usage pattern allows announcing application groups
+ inside an RD.
+
+ Groups are represented by endpoint registrations. Their base address
+ is a multicast address, and they SHOULD be entered with the endpoint
+ type core.rd-group. The endpoint name can also be referred to as a
+ group name in this context.
+
+ The registration is inserted into the RD by a Commissioning Tool,
+ which might also be known as a group manager here. It performs
+ third-party registration and registration updates.
+
+ The links it registers SHOULD be available on all members that join
+ the group. Depending on the application, members that lack some
+ resources MAY be permissible if requests to them fail gracefully.
+
+ The following example shows a CT registering a group with the name
+ "lights", which provides two resources. The directory resource path
+ /rd is an example RD location discovered in a request similar to
+ Figure 5. The group address in the example is constructed from the
+ reserved 2001:db8:: prefix in [RFC3849] as a unicast-prefix-based
+ site-local address (see [RFC3306]).
+
+ Req: POST coap://rd.example.com/rd?ep=lights&et=core.rd-group
+ &base=coap://[ff35:30:2001:db8:f1::8000:1]
+ Content-Format: 40
+ Payload:
+ </light>;rt="tag:example.com,2020:light";
+ if="tag:example.net,2020:actuator",
+ </color-temperature>;if="tag:example.net,2020:parameter";u=K
+
+ Res: 2.01 Created
+ Location-Path: /rd/12
+
+ Figure 27: Example Registration of a Group
+
+ In this example, the group manager can easily permit devices that
+ have no writable color-temperature to join, as they would still
+ respond to brightness-changing commands. Had the group instead
+ contained a single resource that sets brightness and color-
+ temperature atomically, endpoints would need to support both
+ properties.
+
+ The resources of a group can be looked up like any other resource,
+ and the group registrations (along with any additional registration
+ parameters) can be looked up using the endpoint lookup interface.
+
+ The following example shows a client performing an endpoint lookup
+ for all groups:
+
+ Req: GET /rd-lookup/ep?et=core.rd-group
+
+ Res: 2.05 Content
+ Payload:
+ </rd/12>;ep=lights&et=core.rd-group;
+ base="coap://[ff35:30:2001:f1:db8::8000:1]";rt=core.rd-ep
+
+ Figure 28: Example Lookup of Groups
+
+ The following example shows a client performing a lookup of all
+ resources of all endpoints (groups) with et=core.rd-group:
+
+ Req: GET /rd-lookup/res?et=core.rd-group
+
+ Res: 2.05 Content
+ Payload:
+ <coap://[ff35:30:2001:db8:f1::8000:1]/light>;
+ rt="tag:example.com,2020:light";
+ if="tag:example.net,2020:actuator",
+ <coap://[ff35:30:2001:db8:f1::8000:1]/color-temperature>;
+ if="tag:example.net,2020:parameter";u=K,
+
+ Figure 29: Example Lookup of Resources Inside Groups
+
+Appendix B. Web Links and the Resource Directory
+
+ Understanding the semantics of a link-format document and its URI
+ references is a journey through different documents ([RFC3986]
+ defining URIs, [RFC6690] defining link-format documents based on
+ [RFC8288], which defines Link header fields, and [RFC7252] providing
+ the transport). This appendix summarizes the mechanisms and
+ semantics at play from an entry in /.well-known/core to a resource
+ lookup.
+
+ This text is primarily aimed at people entering the field of
+ Constrained Restful Environments from applications that previously
+ did not use web mechanisms.
+
+B.1. A Simple Example
+
+ Let's start this example with a very simple host, 2001:db8:f0::1. A
+ client that follows classical CoAP discovery ([RFC7252], Section 7)
+ sends the following multicast request to learn about neighbors
+ supporting resources with resource-type "temperature".
+
+ The client sends a link-local multicast:
+
+ Req: GET coap://[ff02::fd]:5683/.well-known/core?rt=temperature
+
+ Res: 2.05 Content
+ Payload:
+ </sensors/temp>;rt=temperature;ct=0
+
+ Figure 30: Example of Direct Resource Discovery
+
+ where the response is sent by the server, [2001:db8:f0::1]:5683.
+
+ While a practical client side implementation might just go ahead and
+ create a new request to [2001:db8:f0::1]:5683 with Uri-Path sensors
+ and temp, the full resolution steps for insertion into and retrieval
+ from the RD without any shortcuts are as follows.
+
+B.1.1. Resolving the URIs
+
+ The client parses the single returned link. Its target (sometimes
+ called "href") is /sensors/temp, which is a relative URI that needs
+ resolving. The base URI coap://[ff02::fd]:5683/.well-known/core is
+ used to resolve the reference against /sensors/temp.
+
+ The base URI of the requested resource can be composed from the
+ options of the CoAP GET request by following the steps of [RFC7252],
+ Section 6.5 (with an addition at the end of Section 8.2) into
+ coap://[2001:db8:f0::1]/.well-known/core.
+
+ Because /sensors/temp starts with a single slash, the link's target
+ is resolved by replacing the path /.well-known/core from the base URI
+ ([RFC3986], Section 5.2) with the relative target URI /sensors/temp
+ into coap://[2001:db8:f0::1]/sensors/temp.
+
+B.1.2. Interpreting Attributes and Relations
+
+ Some more information about the link's target can be obtained from
+ the payload: the resource type of the target is "temperature", and
+ its content format is text/plain (ct=0).
+
+ A relation in a web link is a three-part statement that specifies a
+ named relation between the so-called "context resource" and the
+ target resource, like "_This page_ has _its table of contents_ at _/
+ toc.html_". In link-format documents, there is an implicit "host
+ relation" specified with default parameter rel="hosts".
+
+ In our example, the context resource of the link is implied to be
+ coap:://[2001:db8:f0::1] by the default value of the anchor (see
+ Appendix B.4). A full English expression of the "host relation" is:
+
+ coap://[2001:db8:f0::1] is hosting the resource
+ coap://[2001:db8:f0::1]/sensors/temp, which is of the resource
+ type "temperature" and can be read in the text/plain content
+ format.
+
+B.2. A Slightly More Complex Example
+
+ Omitting the rt=temperature filter, the discovery query would have
+ given some more links in the payload:
+
+ Req: GET coap://[ff02::fd]:5683/.well-known/core
+
+ Res: 2.05 Content
+ Payload:
+ </sensors/temp>;rt=temperature;ct=0,
+ </sensors/light>;rt=light-lux;ct=0,
+ </t>;anchor="/sensors/temp";rel=alternate,
+ <http://www.example.com/sensors/t123>;anchor="/sensors/temp";
+ rel=describedby
+
+ Figure 31: Extended Example of Direct Resource Discovery
+
+ Parsing the third link, the client encounters the "anchor" parameter.
+ It is a URI relative to the base URI of the request and is thus
+ resolved to coap://[2001:db8:f0::1]/sensors/temp. That is the
+ context resource of the link, so the "rel" statement is not about the
+ target and the base URI any more but about the target and the
+ resolved URI. Thus, the third link could be read as:
+
+ coap://[2001:db8:f0::1]/sensors/temp has an alternate
+ representation at coap://[2001:db8:f0::1]/t.
+
+ Following the same resolution steps, the fourth link can be read as
+ coap://[2001:db8:f0::1]/sensors/temp is described by
+ http://www.example.com/sensors/t123.
+
+B.3. Enter the Resource Directory
+
+ The RD tries to carry the semantics obtainable by classical CoAP
+ discovery over to the resource lookup interface as faithfully as
+ possible.
+
+ For the following queries, we will assume that the simple host has
+ used simple registration to register at the RD that was announced to
+ it, sending this request from its UDP port [2001:db8:f0::1]:6553:
+
+ Req: POST coap://[2001:db8:f0::ff]/.well-known/rd?ep=simple-host1
+
+ Res: 2.04 Changed
+
+ Figure 32: Example of a Simple Registration
+
+ The RD would have accepted the registration and queried the simple
+ host's /.well-known/core by itself. As a result, the host is
+ registered as an endpoint in the RD with the name "simple-host1".
+ The registration is active for 90000 seconds, and the endpoint
+ registration base URI is coap://[2001:db8:f0::1], following the
+ resolution steps described in Appendix B.1.1. It should be remarked
+ that the base URI constructed that way always yields a URI of the
+ form scheme://authority without path suffix.
+
+ If the client now queries the RD as it would previously have issued a
+ multicast request, it would go through the RD discovery steps by
+ fetching coap://[2001:db8:f0::ff]/.well-known/core?rt=core.rd-lookup-
+ res, obtain coap://[2001:db8:f0::ff]/rd-lookup/res as the resource
+ lookup endpoint, and ask it for all temperature resources:
+
+ Req: GET coap://[2001:db8:f0::ff]/rd-lookup/res?rt=temperature
+
+ Res: 2.05 Content
+ Payload:
+ <coap://[2001:db8:f0::1]/sensors/temp>;rt=temperature;ct=0
+
+ Figure 33: Example Exchange Performing Resource Lookup
+
+ This is not _literally_ the same response that it would have received
+ from a multicast request, but it contains the equivalent statement:
+
+ coap://[2001:db8:f0::1] is hosting the resource
+ coap://[2001:db8:f0::1]/sensors/temp, which is of the resource
+ type "temperature" and can be accessed using the text/plain
+ content format.
+
+ To complete the examples, the client could also query all resources
+ hosted at the endpoint with the known endpoint name "simple-host1":
+
+ Req: GET coap://[2001:db8:f0::ff]/rd-lookup/res?ep=simple-host1
+
+ Res: 2.05 Content
+ Payload:
+ <coap://[2001:db8:f0::1]/sensors/temp>;rt=temperature;ct=0,
+ <coap://[2001:db8:f0::1]/sensors/light>;rt=light-lux;ct=0,
+ <coap://[2001:db8:f0::1]/t>;
+ anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=alternate,
+ <http://www.example.com/sensors/t123>;
+ anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=describedby
+
+ Figure 34: Extended Example Exchange Performing Resource Lookup
+
+ All the target and anchor references are already in absolute form
+ there, which don't need to be resolved any further.
+
+ Had the simple host done an equivalent full registration with a base=
+ parameter (e.g., ?ep=simple-host1&base=coap+tcp://sh1.example.com),
+ that context would have been used to resolve the relative anchor
+ values instead, giving the following and analogous links:
+
+ <coap+tcp://sh1.example.com/sensors/temp>;rt=temperature;ct=0
+
+ Figure 35: Example Payload of a Response to a Resource Lookup
+ with a Dedicated Base URI
+
+B.4. A Note on Differences between Link-Format and Link Header Fields
+
+ While link-format and Link header fields look very similar and are
+ based on the same model of typed links, there are some differences
+ between [RFC6690] and [RFC8288]. When implementing an RD or
+ interacting with an RD, care must be taken to follow the behavior
+ described in [RFC6690] whenever application/link-format
+ representations are used.
+
+ * "Default value of anchor": Under both [RFC6690] and [RFC8288],
+ relative references in the term inside the angle brackets (the
+ target) and the anchor attribute are resolved against the relevant
+ base URI (which usually is the URI used to retrieve the entity)
+ and independent of each other.
+
+ When, in a Link header [RFC8288], the anchor attribute is absent,
+ the link's context is the URI of the selected representation (and
+ usually equal to the base URI).
+
+ In links per [RFC6690], if the anchor attribute is absent, the
+ default value is the Origin of (for all relevant cases, the URI
+ reference / resolved against) the link's target.
+
+ * There is no percent encoding in link-format documents.
+
+ A link-format document is a UTF-8-encoded string of Unicode
+ characters and does not have percent encoding, while Link header
+ fields are practically ASCII strings that use percent encoding for
+ non-ASCII characters, stating the encoding explicitly when
+ required.
+
+ For example, while a Link header field in a page about a Swedish
+ city might read:
+
+ Link: </temperature/Malm%C3%B6>;rel=live-environment-data
+
+ a link-format document from the same source might describe the
+ link as:
+
+ </temperature/Malmö>;rel=live-environment-data
+
+Appendix C. Limited Link Format
+
+ The CoRE Link Format, as described in [RFC6690], has been interpreted
+ differently by implementers, and a strict implementation rules out
+ some use cases of an RD (e.g., base values with path components in
+ combination with absent anchors).
+
+ This appendix describes a subset of link format documents called the
+ Limited Link Format. The one rule herein is not very limiting in
+ practice -- all examples in [RFC6690] and all deployments the authors
+ are aware of already stick to them -- but eases the implementation of
+ RD servers.
+
+ It is applicable to representations in the application/link-format
+ media type and any other media types that inherit [RFC6690],
+ Section 2.1.
+
+ A link format representation is in the Limited Link Format if, for
+ each link in it, the following applies:
+
+ All URI references either follow the URI or the path-absolute ABNF
+ rule of [RFC3986] (i.e., the target and anchor each either start with
+ a scheme or with a single slash).
+
+Acknowledgments
+
+ Oscar Novo, Srdjan Krco, Szymon Sasin, Kerry Lynn, Esko Dijk, Anders
+ Brandt, Matthieu Vial, Jim Schaad, Mohit Sethi, Hauke Petersen,
+ Hannes Tschofenig, Sampo Ukkola, Linyi Tian, Jan Newmarch, Matthias
+ Kovatsch, Jaime Jimenez, and Ted Lemon have provided helpful
+ comments, discussions, and ideas to improve and shape this document.
+ Zach would also like to thank his colleagues from the EU FP7 SENSEI
+ project, where many of the RD concepts were originally developed.
+
+Authors' Addresses
+
+ Christian Amsüss (editor)
+ Email: christian@amsuess.com
+
+
+ Zach Shelby
+ Edge Impulse
+ 3031 Tisch Way
+ San Jose, 95128
+ United States of America
+ Email: zach@edgeimpulse.com
+
+
+ Michael Koster
+ PassiveLogic
+ 524 H Street
+ Antioch, CA 94509
+ United States of America
+ Phone: +1-707-502-5136
+ Email: michaeljohnkoster@gmail.com
+
+
+ Carsten Bormann
+ Universität Bremen TZI
+ Postfach 330440
+ D-28359 Bremen
+ Germany
+ Phone: +49-421-218-63921
+ Email: cabo@tzi.org
+
+
+ Peter van der Stok
+ vanderstok consultancy
+ Email: stokcons@bbhmail.nl