| rfc9176.original | rfc9176.txt | |||
|---|---|---|---|---|
| CoRE C. Amsüss, Ed. | Internet Engineering Task Force (IETF) C. Amsüss, Ed. | |||
| Internet-Draft | Request for Comments: 9176 | |||
| Intended status: Standards Track Z. Shelby | Category: Standards Track Z. Shelby | |||
| Expires: 8 September 2021 ARM | ISSN: 2070-1721 Edge Impulse | |||
| M. Koster | M. Koster | |||
| SmartThings | PassiveLogic | |||
| C. Bormann | C. Bormann | |||
| Universitaet Bremen TZI | Universität Bremen TZI | |||
| P. van der Stok | P. van der Stok | |||
| consultant | vanderstok consultancy | |||
| 7 March 2021 | April 2022 | |||
| CoRE Resource Directory | Constrained RESTful Environments (CoRE) Resource Directory | |||
| draft-ietf-core-resource-directory-28 | ||||
| Abstract | Abstract | |||
| In many IoT applications, direct discovery of resources is not | In many Internet of Things (IoT) applications, direct discovery of | |||
| practical due to sleeping nodes, or networks where multicast traffic | resources is not practical due to sleeping nodes or networks where | |||
| is inefficient. These problems can be solved by employing an entity | multicast traffic is inefficient. These problems can be solved by | |||
| called a Resource Directory (RD), which contains information about | employing an entity called a Resource Directory (RD), which contains | |||
| resources held on other servers, allowing lookups to be performed for | information about resources held on other servers, allowing lookups | |||
| those resources. The input to an RD is composed of links and the | to be performed for those resources. The input to an RD is composed | |||
| output is composed of links constructed from the information stored | of links, and the output is composed of links constructed from the | |||
| in the RD. This document specifies the web interfaces that an RD | information stored in the RD. This document specifies the web | |||
| supports for web servers to discover the RD and to register, | interfaces that an RD supports for web servers to discover the RD and | |||
| maintain, lookup and remove information on resources. Furthermore, | to register, maintain, look up, and remove information on resources. | |||
| new target attributes useful in conjunction with an RD are defined. | Furthermore, new target attributes useful in conjunction with an RD | |||
| are defined. | ||||
| Note to Readers | ||||
| Discussion of this document takes place on the CORE Working Group | ||||
| mailing list (core@ietf.org), which is archived at | ||||
| https://mailarchive.ietf.org/arch/browse/core/ | ||||
| (https://mailarchive.ietf.org/arch/browse/core/). | ||||
| Source for this draft and an issue tracker can be found at | ||||
| https://github.com/core-wg/resource-directory (https://github.com/ | ||||
| core-wg/resource-directory). | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on 8 September 2021. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9176. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
| license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
| extracted from this document must include Simplified BSD License text | to this document. Code Components extracted from this document must | |||
| as described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
| provided without warranty as described in the Simplified BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
| in the Revised BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology | |||
| 3. Architecture and Use Cases . . . . . . . . . . . . . . . . . 6 | 3. Architecture and Use Cases | |||
| 3.1. Principles . . . . . . . . . . . . . . . . . . . . . . . 6 | 3.1. Principles | |||
| 3.2. Architecture . . . . . . . . . . . . . . . . . . . . . . 7 | 3.2. Architecture | |||
| 3.3. RD Content Model . . . . . . . . . . . . . . . . . . . . 8 | 3.3. RD Content Model | |||
| 3.4. Link-local addresses and zone identifiers . . . . . . . . 12 | 3.4. Link-Local Addresses and Zone Identifiers | |||
| 3.5. Use Case: Cellular M2M . . . . . . . . . . . . . . . . . 12 | 3.5. Use Case: Cellular M2M | |||
| 3.6. Use Case: Home and Building Automation . . . . . . . . . 13 | 3.6. Use Case: Home and Building Automation | |||
| 3.7. Use Case: Link Catalogues . . . . . . . . . . . . . . . . 14 | 3.7. Use Case: Link Catalogues | |||
| 4. RD discovery and other interface-independent components . . . 14 | 4. RD Discovery and Other Interface-Independent Components | |||
| 4.1. Finding a Resource Directory . . . . . . . . . . . . . . 15 | 4.1. Finding a Resource Directory | |||
| 4.1.1. Resource Directory Address Option (RDAO) . . . . . . 17 | 4.1.1. Resource Directory Address Option (RDAO) | |||
| 4.1.2. Using DNS-SD to discover a Resource Directory . . . . 19 | 4.1.2. Using DNS-SD to Discover a Resource Directory | |||
| 4.2. Payload Content Formats . . . . . . . . . . . . . . . . . 19 | 4.2. Payload Content Formats | |||
| 4.3. URI Discovery . . . . . . . . . . . . . . . . . . . . . . 19 | 4.3. URI Discovery | |||
| 5. Registration . . . . . . . . . . . . . . . . . . . . . . . . 22 | 5. Registration | |||
| 5.1. Simple Registration . . . . . . . . . . . . . . . . . . . 27 | 5.1. Simple Registration | |||
| 5.2. Third-party registration . . . . . . . . . . . . . . . . 29 | 5.2. Third-Party Registration | |||
| 5.3. Operations on the Registration Resource . . . . . . . . . 30 | 5.3. Operations on the Registration Resource | |||
| 5.3.1. Registration Update . . . . . . . . . . . . . . . . . 30 | 5.3.1. Registration Update | |||
| 5.3.2. Registration Removal . . . . . . . . . . . . . . . . 34 | 5.3.2. Registration Removal | |||
| 5.3.3. Further operations . . . . . . . . . . . . . . . . . 34 | 5.3.3. Further Operations | |||
| 5.3.4. Request freshness . . . . . . . . . . . . . . . . . . 35 | 5.3.4. Request Freshness | |||
| 6. RD Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | 6. RD Lookup | |||
| 6.1. Resource lookup . . . . . . . . . . . . . . . . . . . . . 37 | 6.1. Resource Lookup | |||
| 6.2. Lookup filtering . . . . . . . . . . . . . . . . . . . . 38 | 6.2. Lookup Filtering | |||
| 6.3. Resource lookup examples . . . . . . . . . . . . . . . . 40 | 6.3. Resource Lookup Examples | |||
| 6.4. Endpoint lookup . . . . . . . . . . . . . . . . . . . . . 42 | 6.4. Endpoint Lookup | |||
| 7. Security policies . . . . . . . . . . . . . . . . . . . . . . 43 | 7. Security Policies | |||
| 7.1. Endpoint name . . . . . . . . . . . . . . . . . . . . . . 44 | 7.1. Endpoint Name | |||
| 7.1.1. Random endpoint names . . . . . . . . . . . . . . . . 44 | 7.1.1. Random Endpoint Names | |||
| 7.2. Entered resources . . . . . . . . . . . . . . . . . . . . 44 | 7.2. Entered Links | |||
| 7.3. Link confidentiality . . . . . . . . . . . . . . . . . . 45 | 7.3. Link Confidentiality | |||
| 7.4. Segmentation . . . . . . . . . . . . . . . . . . . . . . 46 | 7.4. Segmentation | |||
| 7.5. First-Come-First-Remembered: A default policy . . . . . . 46 | 7.5. "First Come First Remembered": A Default Policy | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 48 | 8. Security Considerations | |||
| 8.1. Discovery . . . . . . . . . . . . . . . . . . . . . . . . 48 | 8.1. Discovery | |||
| 8.2. Endpoint Identification and Authentication . . . . . . . 48 | 8.2. Endpoint Identification and Authentication | |||
| 8.3. Access Control . . . . . . . . . . . . . . . . . . . . . 49 | 8.3. Access Control | |||
| 8.4. Denial of Service Attacks . . . . . . . . . . . . . . . . 49 | 8.4. Denial-of-Service Attacks | |||
| 8.5. Skipping freshness checks . . . . . . . . . . . . . . . . 50 | 8.5. Skipping Freshness Checks | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 50 | 9. IANA Considerations | |||
| 9.1. Resource Types . . . . . . . . . . . . . . . . . . . . . 50 | 9.1. Resource Types | |||
| 9.2. IPv6 ND Resource Directory Address Option . . . . . . . . 51 | 9.2. IPv6 ND Resource Directory Address Option | |||
| 9.3. RD Parameter Registry . . . . . . . . . . . . . . . . . . 51 | 9.3. RD Parameters Registry | |||
| 9.3.1. Full description of the "Endpoint Type" RD | 9.3.1. Full Description of the "Endpoint Type" RD Parameter | |||
| Parameter . . . . . . . . . . . . . . . . . . . . . . 54 | 9.4. Endpoint Type (et=) RD Parameter Values | |||
| 9.4. "Endpoint Type" (et=) RD Parameter values . . . . . . . . 54 | 9.5. Multicast Address Registration | |||
| 9.5. Multicast Address Registration . . . . . . . . . . . . . 55 | 9.6. Well-Known URIs | |||
| 9.6. Well-Known URIs . . . . . . . . . . . . . . . . . . . . . 55 | 9.7. Service Name and Transport Protocol Port Number Registry | |||
| 9.7. Service Names and Transport Protocol Port Number | 10. Examples | |||
| Registry . . . . . . . . . . . . . . . . . . . . . . . . 55 | 10.1. Lighting Installation | |||
| 10. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 56 | 10.1.1. Installation Characteristics | |||
| 10.1. Lighting Installation . . . . . . . . . . . . . . . . . 56 | 10.1.2. RD Entries | |||
| 10.1.1. Installation Characteristics . . . . . . . . . . . . 56 | 10.2. OMA Lightweight M2M (LwM2M) | |||
| 10.1.2. RD entries . . . . . . . . . . . . . . . . . . . . . 57 | 11. References | |||
| 10.2. OMA Lightweight M2M (LwM2M) . . . . . . . . . . . . . . 60 | 11.1. Normative References | |||
| 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 61 | 11.2. Informative References | |||
| 12. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 61 | Appendix A. Groups Registration and Lookup | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 76 | Appendix B. Web Links and the Resource Directory | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 76 | B.1. A Simple Example | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 77 | B.1.1. Resolving the URIs | |||
| Appendix A. Groups Registration and Lookup . . . . . . . . . . . 80 | B.1.2. Interpreting Attributes and Relations | |||
| Appendix B. Web links and the Resource Directory . . . . . . . . 82 | B.2. A Slightly More Complex Example | |||
| B.1. A simple example . . . . . . . . . . . . . . . . . . . . 82 | B.3. Enter the Resource Directory | |||
| B.1.1. Resolving the URIs . . . . . . . . . . . . . . . . . 82 | B.4. A Note on Differences between Link-Format and Link Header | |||
| B.1.2. Interpreting attributes and relations . . . . . . . . 83 | Fields | |||
| Appendix C. Limited Link Format | ||||
| B.2. A slightly more complex example . . . . . . . . . . . . . 83 | Acknowledgments | |||
| B.3. Enter the Resource Directory . . . . . . . . . . . . . . 84 | Authors' Addresses | |||
| B.4. A note on differences between link-format and Link header | ||||
| fields . . . . . . . . . . . . . . . . . . . . . . . . . 86 | ||||
| Appendix C. Limited Link Format . . . . . . . . . . . . . . . . 86 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 87 | ||||
| 1. Introduction | 1. Introduction | |||
| In the work on Constrained RESTful Environments (CoRE), a REST | In the work on Constrained RESTful Environments (CoRE), a | |||
| architecture suitable for constrained nodes (e.g. with limited RAM | Representational State Transfer (REST) architecture suitable for | |||
| and ROM [RFC7228]) and networks (e.g. 6LoWPAN [RFC4944]) has been | constrained nodes (e.g., with limited RAM and ROM [RFC7228]) and | |||
| established and is used in Internet-of-Things (IoT) or machine-to- | networks (e.g., IPv6 over Low-Power Wireless Personal Area Network | |||
| machine (M2M) applications such as smart energy and building | (6LoWPAN) [RFC4944]) has been established and is used in Internet of | |||
| automation. | 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 | The discovery of resources offered by a constrained server is very | |||
| important in machine-to-machine applications where there are no | important in machine-to-machine applications where there are no | |||
| humans in the loop and static interfaces result in fragility. The | humans in the loop and static interfaces result in fragility. The | |||
| discovery of resources provided by an HTTP Web Server is typically | discovery of resources provided by an HTTP web server is typically | |||
| called Web Linking [RFC8288]. The use of Web Linking for the | called web linking [RFC8288]. The use of web linking for the | |||
| description and discovery of resources hosted by constrained web | description and discovery of resources hosted by constrained web | |||
| servers is specified by the CoRE Link Format [RFC6690]. However, | servers is specified by the CoRE Link Format [RFC6690]. However, | |||
| [RFC6690] only describes how to discover resources from the web | [RFC6690] only describes how to discover resources from the web | |||
| server that hosts them by querying "/.well-known/core". In many | server that hosts them by querying /.well-known/core. In many | |||
| constrained scenarios, direct discovery of resources is not practical | constrained scenarios, direct discovery of resources is not practical | |||
| due to sleeping nodes, or networks where multicast traffic is | due to sleeping nodes or networks where multicast traffic is | |||
| inefficient. These problems can be solved by employing an entity | inefficient. These problems can be solved by employing an entity | |||
| called a Resource Directory (RD), which contains information about | called a Resource Directory (RD), which contains information about | |||
| resources held on other servers, allowing lookups to be performed for | resources held on other servers, allowing lookups to be performed for | |||
| those resources. | those resources. | |||
| This document specifies the web interfaces that an RD supports for | This document specifies the web interfaces that an RD supports for | |||
| web servers to discover the RD and to register, maintain, lookup and | web servers to discover the RD and to register, maintain, look up, | |||
| remove information on resources. Furthermore, new target attributes | and remove information on resources. Furthermore, new target | |||
| useful in conjunction with an RD are defined. Although the examples | attributes useful in conjunction with an RD are defined. Although | |||
| in this document show the use of these interfaces with CoAP | the examples in this document show the use of these interfaces with | |||
| [RFC7252], they can be applied in an equivalent manner to HTTP | the Constrained Application Protocol (CoAP) [RFC7252], they can be | |||
| [RFC7230]. | applied in an equivalent manner to HTTP [RFC7230]. | |||
| 2. Terminology | 2. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| The term "byte" is used in its now customary sense as a synonym for | The term "byte" is used in its now customary sense as a synonym for | |||
| "octet". | "octet". | |||
| This specification requires readers to be familiar with all the terms | This specification requires readers to be familiar with all the terms | |||
| and concepts that are discussed in [RFC3986], [RFC8288] and | and concepts that are discussed in [RFC3986], [RFC8288], and | |||
| [RFC6690]. Readers should also be familiar with the terms and | [RFC6690]. Readers should also be familiar with the terms and | |||
| concepts discussed in [RFC7252]. To describe the REST interfaces | concepts discussed in [RFC7252]. To describe the REST interfaces | |||
| defined in this specification, the URI Template format is used | defined in this specification, the URI Template format is used | |||
| [RFC6570]. | [RFC6570]. | |||
| This specification makes use of the following additional terminology: | This specification makes use of the following additional terminology: | |||
| resolve against | Resolve Against | |||
| The expression "a URI-reference is _resolved against_ a base URI" | The expression "a URI reference is _resolved against_ a base URI" | |||
| is used to describe the process of [RFC3986] Section 5.2. | is used to describe the process of [RFC3986], Section 5.2. | |||
| Noteworthy corner cases are that if the URI-reference is a (full) | Noteworthy corner cases include the following: (1) if the URI | |||
| URI and resolved against any base URI, that gives the original | reference is a (full) URI, resolving against any base URI gives | |||
| full URI, and that resolving an empty URI reference gives the base | the original full URI and (2) resolving an empty URI reference | |||
| URI without any fragment identifier. | gives the base URI without any fragment identifier. | |||
| Resource Directory (RD) | Resource Directory (RD) | |||
| A web entity that stores information about web resources and | A web entity that stores information about web resources and | |||
| implements the REST interfaces defined in this specification for | implements the REST interfaces defined in this specification for | |||
| discovery, for the creation, maintenance and removal of | discovery, for the creation, maintenance, and removal of | |||
| registrations, and for lookup of the registered resources. | registrations, and for lookup of the registered resources. | |||
| Sector | Sector | |||
| In the context of an RD, a sector is a logical grouping of | In the context of an RD, a sector is a logical grouping of | |||
| endpoints. | endpoints. | |||
| The abbreviation "d=" is used for the sector in query parameters | The abbreviation "d=" is used for the sector in query parameters | |||
| for compatibility with deployed implementations. | for compatibility with deployed implementations. | |||
| Endpoint | Endpoint (EP) | |||
| Endpoint (EP) is a term used to describe a web server or client in | Endpoint (EP) is a term used to describe a web server or client in | |||
| [RFC7252]. In the context of this specification an endpoint is | [RFC7252]. In the context of this specification, an endpoint is | |||
| used to describe a web server that registers resources to the RD. | used to describe a web server that registers resources to the RD. | |||
| An endpoint is identified by its endpoint name, which is included | An endpoint is identified by its endpoint name, which is included | |||
| during registration, and has a unique name within the associated | during registration, and has a unique name within the associated | |||
| sector of the registration. | sector of the registration. | |||
| Registration Base URI | Registration Base URI | |||
| The Base URI of a Registration is a URI that typically gives | The base URI of a registration is a URI that typically gives | |||
| scheme and authority information about an Endpoint. The | scheme and authority information about an endpoint. The | |||
| Registration Base URI is provided at registration time, and is | registration base URI is provided at registration time and is used | |||
| used by the RD to resolve relative references of the registration | by the RD to resolve relative references of the registration into | |||
| into URIs. | URIs. | |||
| Target | Target | |||
| The target of a link is the destination address (URI) of the link. | The target of a link is the destination address (URI) of the link. | |||
| It is sometimes identified with "href=", or displayed as | It is sometimes identified with "href=" or displayed as <target>. | |||
| "<target>". Relative targets need resolving with respect to the | Relative targets need resolving with respect to the base URI | |||
| Base URI (section 5.2 of [RFC3986]). | (Section 5.2 of [RFC3986]). | |||
| This use of the term Target is consistent with [RFC8288]'s use of | This use of the term "target" is consistent with the use in | |||
| the term. | [RFC8288]. | |||
| Context | Context | |||
| The context of a link is the source address (URI) of the link, and | 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 | describes which resource is linked to the target. A link's | |||
| context is made explicit in serialized links as the "anchor=" | context is made explicit in serialized links as the "anchor=" | |||
| attribute. | attribute. | |||
| This use of the term Context is consistent with [RFC8288]'s use of | This use of the term "context" is consistent with the use in | |||
| the term. | [RFC8288]. | |||
| Directory Resource | Directory Resource | |||
| A resource in the RD containing registration resources. | A directory resource is a resource in the RD containing | |||
| registration resources. | ||||
| Registration Resource | Registration Resource | |||
| A resource in the RD that contains information about an Endpoint | A registration resource is a resource in the RD that contains | |||
| and its links. | information about an endpoint and its links. | |||
| Commissioning Tool | Commissioning Tool (CT) | |||
| Commissioning Tool (CT) is a device that assists during | A Commissioning Tool (CT) is a device that assists during | |||
| installation events by assigning values to parameters, naming | installation events by assigning values to parameters, naming | |||
| endpoints and groups, or adapting the installation to the needs of | endpoints and groups, or adapting the installation to the needs of | |||
| the applications. | the applications. | |||
| Registrant-ep | Registrant-EP | |||
| Registrant-ep is the endpoint that is registered into the RD. The | A registrant-EP is the endpoint that is registered into the RD. | |||
| registrant-ep can register itself, or a CT registers the | The registrant-EP can register itself, or a CT registers the | |||
| registrant-ep. | registrant-EP. | |||
| RDAO | Resource Directory Address Option (RDAO) | |||
| Resource Directory Address Option. A new IPv6 Neighbor Discovery | A Resource Directory Address Option (RDAO) is a new IPv6 Neighbor | |||
| option defined for announcing an RD's address. | Discovery option defined for announcing an RD's address. | |||
| 3. Architecture and Use Cases | 3. Architecture and Use Cases | |||
| 3.1. Principles | 3.1. Principles | |||
| The RD is primarily a tool to make discovery operations more | The RD is primarily a tool to make discovery operations more | |||
| efficient than querying /.well-known/core on all connected devices, | efficient than querying /.well-known/core on all connected devices or | |||
| or across boundaries that would limit those operations. | across boundaries that would limit those operations. | |||
| It provides information about resources hosted by other devices that | It provides information about resources hosted by other devices that | |||
| could otherwise only be obtained by directly querying the /.well- | could otherwise only be obtained by directly querying the /.well- | |||
| known/core resource on these other devices, either by a unicast | known/core resource on these other devices, either by a unicast | |||
| request or a multicast request. | request or a multicast request. | |||
| Information SHOULD only be stored in the RD if it can be obtained by | Information SHOULD only be stored in the RD if it can be obtained by | |||
| querying the described device's /.well-known/core resource directly. | querying the described device's /.well-known/core resource directly. | |||
| Data in the RD can only be provided by the device which hosts those | Data in the RD can only be provided by the device that hosts the data | |||
| data or a dedicated Commissioning Tool (CT). These CTs act on behalf | or a dedicated Commissioning Tool (CT). These CTs act on behalf of | |||
| of endpoints too constrained, or generally unable, to present that | endpoints too constrained, or generally unable, to present that | |||
| information themselves. No other client can modify data in the RD. | information themselves. No other client can modify data in the RD. | |||
| Changes to the information in the RD do not propagate automatically | Changes to the information in the RD do not propagate automatically | |||
| back to the web servers from where the information originated. | back to the web servers from where the information originated. | |||
| 3.2. Architecture | 3.2. Architecture | |||
| The RD architecture is illustrated in Figure 1. An RD is used as a | The RD architecture is illustrated in Figure 1. An RD is used as a | |||
| repository of registrations describing resources hosted on other web | repository of registrations describing resources hosted on other web | |||
| servers, also called endpoints (EP). An endpoint is a web server | servers, also called endpoints (EPs). An endpoint is a web server | |||
| associated with a scheme, IP address and port. A physical node may | associated with a scheme, IP address, and port. A physical node may | |||
| host one or more endpoints. The RD implements a set of REST | host one or more endpoints. The RD implements a set of REST | |||
| interfaces for endpoints to register and maintain RD registrations, | interfaces for endpoints to register and maintain RD registrations | |||
| and for endpoints to lookup resources from the RD. An RD can be | and for endpoints to look up resources from the RD. An RD can be | |||
| logically segmented by the use of Sectors. | logically segmented by the use of sectors. | |||
| A mechanism to discover an RD using CoRE Link Format [RFC6690] is | A mechanism to discover an RD using CoRE Link Format [RFC6690] is | |||
| defined. | defined. | |||
| Registrations in the RD are soft state and need to be periodically | Registrations in the RD are soft state and need to be periodically | |||
| refreshed. | refreshed. | |||
| An endpoint uses specific interfaces to register, update and remove a | An endpoint uses specific interfaces to register, update, and remove | |||
| registration. It is also possible for an RD to fetch Web Links from | a registration. It is also possible for an RD to fetch web links | |||
| endpoints and add their contents to its registrations. | from endpoints and add their contents to its registrations. | |||
| At the first registration of an endpoint, a "registration resource" | At the first registration of an endpoint, a "registration resource" | |||
| is created, the location of which is returned to the registering | is created, the location of which is returned to the registering | |||
| endpoint. The registering endpoint uses this registration resource | endpoint. The registering endpoint uses this registration resource | |||
| to manage the contents of registrations. | to manage the contents of registrations. | |||
| A lookup interface for discovering any of the Web Links stored in the | A lookup interface for discovering any of the web links stored in the | |||
| RD is provided using the CoRE Link Format. | RD is provided using the CoRE Link Format. | |||
| Registration Lookup | Registration Lookup | |||
| Interface Interface | Interface Interface | |||
| +----+ | | | +----+ | | | |||
| | EP |---- | | | | EP |---- | | | |||
| +----+ ---- | | | +----+ ---- | | | |||
| --|- +------+ | | --|- +------+ | | |||
| +----+ | ----| | | +--------+ | +----+ | ----| | | +--------+ | |||
| | EP | ---------|-----| RD |----|-----| Client | | | EP | ---------|-----| RD |----|-----| Client | | |||
| +----+ | ----| | | +--------+ | +----+ | ----| | | +--------+ | |||
| --|- +------+ | | --|- +------+ | | |||
| +----+ ---- | | | +----+ ---- | | | |||
| | CT |---- | | | | CT |---- | | | |||
| +----+ | +----+ | |||
| Figure 1: The RD architecture. | Figure 1: The RD Architecture | |||
| A Registrant-EP MAY keep concurrent registrations to more than one RD | 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 | at the same time if explicitly configured to do so, but that is not | |||
| expected to be supported by typical EP implementations. Any such | expected to be supported by typical EP implementations. Any such | |||
| registrations are independent of each other. The usual expectation | registrations are independent of each other. The usual expectation | |||
| when multiple discovery mechanisms or addresses are configured is | when multiple discovery mechanisms or addresses are configured is | |||
| that they constitute a fall-back path for a single registration. | that they constitute a fall-back path for a single registration. | |||
| 3.3. RD Content Model | 3.3. RD Content Model | |||
| The Entity-Relationship (ER) models shown in Figure 2 and Figure 3 | The Entity-Relationship (ER) models shown in Figures 2 and 3 model | |||
| model the contents of /.well-known/core and the RD respectively, with | the contents of /.well-known/core and the RD respectively, with | |||
| entity-relationship diagrams [ER]. Entities (rectangles) are used | entity-relationship diagrams [ER]. Entities (rectangles) are used | |||
| for concepts that exist independently. Attributes (ovals) are used | for concepts that exist independently. Attributes (ovals) are used | |||
| for concepts that exist only in connection with a related entity. | for concepts that exist only in connection with a related entity. | |||
| Relations (diamonds) give a semantic meaning to the relation between | Relations (diamonds) give a semantic meaning to the relation between | |||
| entities. Numbers specify the cardinality of the relations. | entities. Numbers specify the cardinality of the relations. | |||
| Some of the attribute values are URIs. Those values are always full | Some of the attribute values are URIs. Those values are always full | |||
| URIs and never relative references in the information model. They | URIs and never relative references in the information model. | |||
| can, however, be expressed as relative references in serializations, | However, they can be expressed as relative references in | |||
| and often are. | serializations, and they often are. | |||
| These models provide an abstract view of the information expressed in | These models provide an abstract view of the information expressed in | |||
| link-format documents and an RD. They cover the concepts, but not | 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 | necessarily all details of an RD's operation; they are meant to give | |||
| an overview, and not be a template for implementations. | 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 | +----------------------+ | |||
| | /.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 | ||||
| The model shown in Figure 2 models the contents of /.well-known/core | Figure 2: ER Model of the Content of /.well-known/core | |||
| which contains: | ||||
| * a set of links belonging to the hosting web server | 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 | The web server is free to choose links it deems appropriate to be | |||
| exposed in its "/.well-known/core". Typically, the links describe | exposed in its /.well-known/core. Typically, the links describe | |||
| resources that are served by the host, but the set can also contain | resources that are served by the host, but the set can also contain | |||
| links to resources on other servers (see examples in [RFC6690] page | links to resources on other servers (see examples in Section 5 of | |||
| 14). The set does not necessarily contain links to all resources | [RFC6690]). The set does not necessarily contain links to all | |||
| served by the host. | resources served by the host. | |||
| A link has the following attributes (see [RFC8288]): | A link has the following attributes (see Section 5 of [RFC8288]): | |||
| * Zero or more link relations: They describe relations between the | * Zero or more link relations: They describe relations between the | |||
| link context and the link target. | link context and the link target. | |||
| In link-format serialization, they are expressed as space- | In link-format serialization, they are expressed as space- | |||
| separated values in the "rel" attribute, and default to "hosts". | separated values in the "rel" attribute and default to "hosts". | |||
| * A link context URI: It defines the source of the relation, e.g. | * A link context URI: It defines the source of the relation, e.g., | |||
| _who_ "hosts" something. | _who_ "hosts" something. | |||
| In link-format serialization, it is expressed in the "anchor" | In link-format serialization, it is expressed in the "anchor" | |||
| attribute and defaults to the Origin of the target (practically: | attribute and defaults to the Origin of the target (practically, | |||
| the target with its path and later components removed) | the target with its path and later components removed). | |||
| * A link target URI: It defines the destination of the relation | * A link target URI: It defines the destination of the relation | |||
| (e.g. _what_ is hosted), and is the topic of all target | (e.g., _what_ is hosted) and is the topic of all target | |||
| attributes. | attributes. | |||
| In link-format serialization, it is expressed between angular | In link-format serialization, it is expressed between angular | |||
| brackets, and sometimes called the "href". | brackets and sometimes called the "href". | |||
| * Other target attributes (e.g. resource type (rt), interface (if), | * Other target attributes (e.g., resource type (rt), interface (if), | |||
| or content format (ct)). These provide additional information | or content format (ct)): These provide additional information | |||
| about the target URI. | about the target URI. | |||
| +--------------+ | +--------------+ | |||
| + RD + | + RD + | |||
| +--------------+ | +--------------+ | |||
| | 1 | | 1 | |||
| | | | | |||
| | | | | |||
| | | | | |||
| | | | | |||
| skipping to change at page 11, line 46 ¶ | skipping to change at line 466 ¶ | |||
| o lt o----+ ooooooooooo 0+ | | o lt o----+ ooooooooooo 0+ | | |||
| oooooooo | o target o-----+ | oooooooo | o target o-----+ | |||
| | o attribute o | 0+ oooooo | | o attribute o | 0+ oooooo | |||
| ooooooooooo 0+ | ooooooooooo +-----o rel o | ooooooooooo 0+ | ooooooooooo +-----o rel o | |||
| o endpoint o----+ | oooooo | o endpoint o----+ | oooooo | |||
| o attribute o | | o attribute o | | |||
| ooooooooooo | 1 ooooooooo | ooooooooooo | 1 ooooooooo | |||
| +----o context o | +----o context o | |||
| ooooooooo | ooooooooo | |||
| Figure 3: ER Model of the content of the RD | Figure 3: ER Model of the Content of the RD | |||
| The model shown in Figure 3 models the contents of the RD which | Figure 3 models the contents of the RD, which contains, in addition | |||
| contains in addition to /.well-known/core: | to /.well-known/core, 0 to n registrations of endpoints. | |||
| * 0 to n Registrations of endpoints, | ||||
| A registration is associated with one endpoint. A registration | A registration is associated with one endpoint. A registration | |||
| defines a set of links as defined for /.well-known/core. A | defines a set of links, as defined for /.well-known/core. A | |||
| Registration has six types of attributes: | registration has six types of attributes: | |||
| * an endpoint name ("ep", a Unicode string) unique within a sector | * an endpoint name ("ep", a Unicode string) unique within a sector | |||
| * a Registration Base URI ("base", a URI typically describing the | * a registration base URI ("base", a URI typically describing the | |||
| scheme://authority part) | scheme://authority part) | |||
| * a lifetime ("lt"), | * a lifetime ("lt") | |||
| * a registration resource location inside the RD ("href"), | * a registration resource location inside the RD ("href") | |||
| * optionally a sector ("d", a Unicode string) | * optionally, a sector ("d", a Unicode string) | |||
| * optional additional endpoint attributes (from Section 9.3) | * optional additional endpoint attributes (from Section 9.3) | |||
| The cardinality of "base" is currently 1; future documents are | The cardinality of "base" is currently 1; future documents are | |||
| invited to extend the RD specification to support multiple values | invited to extend the RD specification to support multiple values | |||
| (e.g. [I-D.silverajan-core-coap-protocol-negotiation]). Its value | (e.g., [COAP-PROT-NEG]). Its value is used as a base URI when | |||
| is used as a Base URI when resolving URIs in the links contained in | resolving URIs in the links contained in the endpoint. | |||
| the endpoint. | ||||
| Links are modelled as they are in Figure 2. | Links are modeled as they are in Figure 2. | |||
| 3.4. Link-local addresses and zone identifiers | 3.4. Link-Local Addresses and Zone Identifiers | |||
| Registration Base URIs can contain link-local IP addresses. To be | Registration base URIs can contain link-local IP addresses. To be | |||
| usable across hosts, those cannot be serialized to contain zone | usable across hosts, those cannot be serialized to contain zone | |||
| identifiers (see [RFC6874] Section 1). | identifiers (see [RFC6874], Section 1). | |||
| Link-local addresses can only be used on a single link (therefore RD | Link-local addresses can only be used on a single link (therefore, RD | |||
| servers cannot announce them when queried on a different link), and | servers cannot announce them when queried on a different link), and | |||
| lookup clients using them need to keep track of which interface they | lookup clients using them need to keep track of which interface they | |||
| got them from. | got them from. | |||
| Therefore, it is advisable in many scenarios to use addresses with | Therefore, it is advisable in many scenarios to use addresses with | |||
| larger scope if available. | larger scopes, if available. | |||
| 3.5. Use Case: Cellular M2M | 3.5. Use Case: Cellular M2M | |||
| Over the last few years, mobile operators around the world have | Over the last few years, mobile operators around the world have | |||
| focused on development of M2M solutions in order to expand the | focused on development of M2M solutions in order to expand the | |||
| business to the new type of users: machines. The machines are | business to the new type of users: machines. The machines are | |||
| connected directly to a mobile network using an appropriate embedded | connected directly to a mobile network using an appropriate embedded | |||
| wireless interface (GSM/GPRS, WCDMA, LTE) or via a gateway providing | wireless interface (GSM/General Packet Radio Service (GPRS), Wideband | |||
| short and wide range wireless interfaces. The ambition in such | Code Division Multiple Access (W-CDMA), LTE, etc.) or via a gateway | |||
| systems is to build them from reusable components. These speed up | providing short- and wide-range wireless interfaces. The ambition in | |||
| development and deployment, and enable shared use of machines across | such systems is to build them from reusable components. These speed | |||
| different applications. One crucial component of such systems is the | up development and deployment and enable shared use of machines | |||
| discovery of resources (and thus the endpoints they are hosted on) | across different applications. One crucial component of such systems | |||
| capable of providing required information at a given time or acting | is the discovery of resources (and thus the endpoints they are hosted | |||
| on instructions from the end users. | 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 | Imagine a scenario where endpoints installed on vehicles enable | |||
| tracking of the position of these vehicles for fleet management | tracking of the position of these vehicles for fleet management | |||
| purposes and allow monitoring of environment parameters. During the | purposes and allow monitoring of environment parameters. During the | |||
| boot-up process endpoints register with an RD, which is hosted by the | boot-up process, endpoints register with an RD, which is hosted by | |||
| mobile operator or somewhere in the cloud. Periodically, these | the mobile operator or somewhere in the cloud. Periodically, these | |||
| endpoints update their registration and may modify resources they | endpoints update their registration and may modify resources they | |||
| offer. | offer. | |||
| When endpoints are not always connected, for example because they | When endpoints are not always connected, for example, because they | |||
| enter a sleep mode, a remote server is usually used to provide proxy | enter a sleep mode, a remote server is usually used to provide proxy | |||
| access to the endpoints. Mobile apps or web applications for | access to the endpoints. Mobile apps or web applications for | |||
| environment monitoring contact the RD, look up the endpoints capable | environment monitoring contact the RD, look up the endpoints capable | |||
| of providing information about the environment using an appropriate | of providing information about the environment using an appropriate | |||
| set of link parameters, obtain information on how to contact them | set of link parameters, obtain information on how to contact them | |||
| (URLs of the proxy server), and then initiate interaction to obtain | (URLs of the proxy server), and then initiate interaction to obtain | |||
| information that is finally processed, displayed on the screen and | information that is finally processed, displayed on the screen, and | |||
| usually stored in a database. Similarly, fleet management systems | usually stored in a database. Similarly, fleet management systems | |||
| provide the appropriate link parameters to the RD to look up for EPs | provide the appropriate link parameters to the RD to look up for EPs | |||
| deployed on the vehicles the application is responsible for. | deployed on the vehicles the application is responsible for. | |||
| 3.6. Use Case: Home and Building Automation | 3.6. Use Case: Home and Building Automation | |||
| Home and commercial building automation systems can benefit from the | Home and commercial building automation systems can benefit from the | |||
| use of IoT web services. The discovery requirements of these | use of IoT web services. The discovery requirements of these | |||
| applications are demanding. Home automation usually relies on run- | applications are demanding. Home automation usually relies on run- | |||
| time discovery to commission the system, whereas in building | time discovery to commission the system, whereas, in building | |||
| automation a combination of professional commissioning and run-time | automation, a combination of professional commissioning and run-time | |||
| discovery is used. Both home and building automation involve peer- | discovery is used. Both home and building automation involve peer- | |||
| to-peer interactions between endpoints, and involve battery-powered | to-peer interactions between endpoints and involve battery-powered | |||
| sleeping devices. Both can use the common RD infrastructure to | sleeping devices. Both can use the common RD infrastructure to | |||
| establish device interactions efficiently, but can pick security | establish device interactions efficiently but can pick security | |||
| policies suitable for their needs. | policies suitable for their needs. | |||
| Two phases can be discerned for a network servicing the system: (1) | Two phases can be discerned for a network servicing the system: (1) | |||
| installation and (2) operation. During the operational phase, the | installation and (2) operation. During the operational phase, the | |||
| network is connected to the Internet with a Border Router (e.g. a | network is connected to the Internet with a border router (e.g., a | |||
| 6LoWPAN Border Router (6LBR), see [RFC6775]) and the nodes connected | 6LoWPAN Border Router (6LBR) [RFC6775]), and the nodes connected to | |||
| to the network can use the Internet services that are provided by the | the network can use the Internet services that are provided by the IP | |||
| Internet Provider or the network administrator. During the | or network administrator. During the installation phase, the network | |||
| installation phase, the network is completely stand-alone, no Border | is completely stand-alone, no border router is connected, and the | |||
| Router is connected, and the network only supports the IP | network only supports the IP communication between the connected | |||
| communication between the connected nodes. The installation phase is | nodes. The installation phase is usually followed by the operational | |||
| usually followed by the operational phase. As an RD's operations | phase. As an RD's operations work without hard dependencies on names | |||
| work without hard dependencies on names or addresses, it can be used | or addresses, it can be used for discovery across both phases. | |||
| for discovery across both phases. | ||||
| 3.7. Use Case: Link Catalogues | 3.7. Use Case: Link Catalogues | |||
| Resources may be shared through data brokers that have no knowledge | 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 | 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 | hold links about resources and services hosted anywhere to make them | |||
| discoverable by a general class of applications. | discoverable by a general class of applications. | |||
| For example, environmental and weather sensors that generate data for | For example, environmental and weather sensors that generate data for | |||
| public consumption may provide data to an intermediary server, or | public consumption may provide data to an intermediary server or | |||
| broker. Sensor data are published to the intermediary upon changes | broker. Sensor data are published to the intermediary upon changes | |||
| or at regular intervals. Descriptions of the sensors that resolve to | or at regular intervals. Descriptions of the sensors that resolve to | |||
| links to sensor data may be published to an RD. Applications wishing | 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 consume the data can use RD lookup to discover and resolve links | |||
| to the desired resources and endpoints. The RD service need not be | to the desired resources and endpoints. The RD service need not be | |||
| coupled with the data intermediary service. Mapping of RDs to data | coupled with the data intermediary service. Mapping of RDs to data | |||
| intermediaries may be many-to-many. | intermediaries may be many-to-many. | |||
| Metadata in web link formats like [RFC6690] which may be internally | Metadata in web link formats, such as the one defined in [RFC6690], | |||
| stored as triples, or relation/attribute pairs providing metadata | which may be internally stored as triples or relation/attribute pairs | |||
| about resource links, need to be supported by RDs. External | providing metadata about resource links, need to be supported by RDs. | |||
| catalogues that are represented in other formats may be converted to | External catalogues that are represented in other formats may be | |||
| common web linking formats for storage and access by RDs. Since it | converted to common web linking formats for storage and access by | |||
| is common practice for these to be encoded in URNs [RFC8141], simple | RDs. Since it is common practice for these to be encoded in URNs | |||
| and lossless structural transforms should generally be sufficient to | [RFC8141], simple and lossless structural transforms should generally | |||
| store external metadata in RDs. | be sufficient to store external metadata in RDs. | |||
| The additional features of an RD allow sectors to be defined to | The additional features of an RD allow sectors to be defined to | |||
| enable access to a particular set of resources from particular | enable access to a particular set of resources from particular | |||
| applications. This provides isolation and protection of sensitive | applications. This provides isolation and protection of sensitive | |||
| data when needed. Application groups with multicast addresses may be | data when needed. Application groups with multicast addresses may be | |||
| defined to support efficient data transport. | defined to support efficient data transport. | |||
| 4. RD discovery and other interface-independent components | 4. RD Discovery and Other Interface-Independent Components | |||
| This and the following sections define the required set of REST | This and the following sections define the required set of REST | |||
| interfaces between an RD, endpoints and lookup clients. Although the | interfaces between an RD, endpoints, and lookup clients. Although | |||
| examples throughout these sections assume the use of CoAP [RFC7252], | the examples throughout these sections assume the use of CoAP | |||
| these REST interfaces can also be realized using HTTP [RFC7230]. The | [RFC7252], these REST interfaces can also be realized using HTTP | |||
| multicast discovery and simple registration operations are exceptions | [RFC7230]. The multicast discovery and simple registration | |||
| to that, as they rely on mechanisms unavailable in HTTP. In all | operations are exceptions to that, as they rely on mechanisms | |||
| definitions in these sections, both CoAP response codes (with dot | unavailable in HTTP. In all definitions in these sections, both CoAP | |||
| notation) and HTTP response codes (without dot notation) are shown. | response codes (with dot notation) and HTTP response codes (without | |||
| An RD implementing this specification MUST support the discovery, | dot notation) are shown. An RD implementing this specification MUST | |||
| registration, update, lookup, and removal interfaces. | support the discovery, registration, update, lookup, and removal | |||
| interfaces. | ||||
| All operations on the contents of the RD MUST be atomic and | All operations on the contents of the RD MUST be atomic and | |||
| idempotent. | idempotent. | |||
| For several operations, interface templates are given in list form; | For several operations, interface templates are given in list form; | |||
| those describe the operation participants, request codes, URIs, | those describe the operation participants, request codes, URIs, | |||
| content formats and outcomes. Sections of those templates contain | content formats, and outcomes. Sections of those templates contain | |||
| normative content about Interaction, Method, URI Template and URI | normative content about Interaction, Method, URI Template, and URI | |||
| Template Variables as well as the details of the Success condition. | Template Variables, as well as the details of the Success condition. | |||
| The additional sections on options like Content-Format and on Failure | The additional sections for options (such as Content-Format) and for | |||
| codes give typical cases that an implementation of the RD should deal | Failure codes give typical cases that an implementation of the RD | |||
| with. Those serve to illustrate the typical responses to readers who | should deal with. Those serve to illustrate the typical responses to | |||
| are not yet familiar with all the details of CoAP based interfaces; | readers who are not yet familiar with all the details of CoAP-based | |||
| they do not limit what a server may respond under atypical | interfaces; they do not limit how a server may respond under atypical | |||
| circumstances. | circumstances. | |||
| REST clients (registrant-EPs and CTs during registration and | REST clients (registrant-EPs and CTs during registration and | |||
| maintenance, lookup clients, RD servers during simple registrations) | maintenance, lookup clients, and RD servers during simple | |||
| must be prepared to receive any unsuccessful code and act upon it | registrations) must be prepared to receive any unsuccessful code and | |||
| according to its definition, options and/or payload to the best of | act upon it according to its definition, options, and/or payload to | |||
| their capabilities, falling back to failing the operation if recovery | the best of their capabilities, falling back to failing the operation | |||
| is not possible. In particular, they SHOULD retry the request upon | if recovery is not possible. In particular, they SHOULD retry the | |||
| 5.03 (Service Unavailable; 503 in HTTP) according to the Max-Age | request upon 5.03 (Service Unavailable; 503 in HTTP) according to the | |||
| (Retry-After in HTTP) option, and SHOULD fall back to link-format | Max-Age (Retry-After in HTTP) option and SHOULD fall back to link | |||
| when receiving 4.15 (Unsupported Content-Format; 415 in HTTP). | format when receiving 4.15 (Unsupported Content-Format; 415 in HTTP). | |||
| An RD MAY make the information submitted to it available to further | An RD MAY make the information submitted to it available to further | |||
| directories (subject to security policies on link confidentiality), | directories (subject to security policies on link confidentiality) if | |||
| if it can ensure that a loop does not form. The protocol used | it can ensure that a loop does not form. The protocol used between | |||
| between directories to ensure loop-free operation is outside the | directories to ensure loop-free operation is outside the scope of | |||
| scope of this document. | this document. | |||
| 4.1. Finding a Resource Directory | 4.1. Finding a Resource Directory | |||
| A (re-)starting device may want to find one or more RDs before it can | 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 | discover their URIs. Dependent on the operational conditions, one or | |||
| more of the techniques below apply. | more of the techniques below apply. | |||
| The device may be pre-configured to exercise specific mechanisms for | The device may be preconfigured to exercise specific mechanisms for | |||
| finding the RD: | finding the RD: | |||
| 1. It may be configured with a specific IP address for the RD. That | 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 | IP address may also be an anycast address, allowing the network | |||
| to forward RD requests to an RD that is topologically close; each | to forward RD requests to an RD that is topologically close; each | |||
| target network environment in which some of these preconfigured | target network environment in which some of these preconfigured | |||
| nodes are to be brought up is then configured with a route for | nodes are to be brought up is then configured with a route for | |||
| this anycast address that leads to an appropriate RD. (Instead | this anycast address that leads to an appropriate RD. (Instead | |||
| of using an anycast address, a multicast address can also be | of using an anycast address, a multicast address can also be | |||
| preconfigured. The RD servers then need to configure one of | preconfigured. The RD servers then need to configure one of | |||
| their interfaces with this multicast address.) | their interfaces with this multicast address.) | |||
| 2. It may be configured with a DNS name for the RD and use DNS to | 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 | return the IP address of the RD; it can find a DNS server to | |||
| perform the lookup using the usual mechanisms for finding DNS | perform the lookup using the usual mechanisms for finding DNS | |||
| servers. | servers. | |||
| 3. It may be configured to use a service discovery mechanism such as | 3. It may be configured to use a service discovery mechanism, such | |||
| DNS-SD, as outlined in Section 4.1.2. | 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 | 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. | 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 | 1. The IPv6 Neighbor Discovery option RDAO (Section 4.1.1) can do | |||
| that. | that. | |||
| 2. When DHCP is in use, this could be provided via a DHCP option (no | 2. When DHCP is in use, this could be provided via a DHCP option (no | |||
| such option is defined at the time of writing). | such option is defined at the time of writing). | |||
| Finally, if neither the device nor the network offers any specific | Finally, if neither the device nor the network offers any specific | |||
| configuration, the device may want to employ heuristics to find a | configuration, the device may want to employ heuristics to find a | |||
| suitable RD. | suitable RD. | |||
| The present specification does not fully define these heuristics, but | The present specification does not fully define these heuristics but | |||
| suggests a number of candidates: | suggests a number of candidates: | |||
| 1. In a 6LoWPAN, just assume the Border Router (6LBR) can act as an | 1. In a 6LoWPAN, just assume the 6LBR can act as an RD (using the | |||
| RD (using the ABRO option to find that [RFC6775]). Confirmation | Authoritative Border Router Option (ABRO) to find that | |||
| can be obtained by sending a unicast to "coap://[6LBR]/.well- | [RFC6775]). Confirmation can be obtained by sending a unicast to | |||
| known/core?rt=core.rd*". | coap://[6LBR]/.well-known/core?rt=core.rd*. | |||
| 2. In a network that supports multicast well, discovering the RD | 2. In a network that supports multicast well, discover the RD using | |||
| using a multicast query for /.well-known/core as specified in | a multicast query for /.well-known/core, as specified in CoRE | |||
| CoRE Link Format [RFC6690]: Sending a Multicast GET to | Link Format [RFC6690], and send a Multicast GET to | |||
| "coap://[MCD1]/.well-known/core?rt=core.rd*". RDs within the | coap://[ff0x::fe]/.well-known/core?rt=core.rd*. RDs within the | |||
| multicast scope will answer the query. | multicast scope will answer the query. | |||
| When answering a multicast request directed at a link-local group, | When answering a multicast request directed at a link-local group, | |||
| the RD may want to respond from a routable address; this makes it | 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 | easier for registrants to use one of their own routable addresses for | |||
| registration. When [RFC6724] is used for source address selection, | registration. When source addresses are selected using the mechanism | |||
| this can be achieved by applying the changes of its Section 10.4, | described in [RFC6724], this can be achieved by applying the changes | |||
| picking public addresses in its Section 5 Rule 7, and superseding | of its Section 10.4, picking public addresses in Rule 7 of its | |||
| rule 8 with preferring the source address's precedence. | 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 | 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 | just (more or less educated) guesses, endpoints MUST make use of any | |||
| error messages to very strictly rate-limit requests to candidate IP | error messages to very strictly rate-limit requests to candidate IP | |||
| addresses that don't work out. For example, an ICMP Destination | addresses that don't work out. For example, an ICMP Destination | |||
| Unreachable message (and, in particular, the port unreachable code | Unreachable message (and, in particular, the port unreachable code | |||
| for this message) may indicate the lack of a CoAP server on the | 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 | 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 | Not Allowed), may indicate unwillingness of a CoAP server to act as a | |||
| directory server. | directory server. | |||
| The following RD discovery mechanisms are recommended: | The following RD discovery mechanisms are recommended: | |||
| * In managed networks with border routers that need stand-alone | * In managed networks with border routers that need stand-alone | |||
| operation, the RDAO option is recommended (e.g. operational phase | operation, the RDAO is recommended (e.g., the operational phase | |||
| described in Section 3.6). | described in Section 3.6). | |||
| * In managed networks without border router (no Internet services | * In managed networks without border routers (no Internet services | |||
| available), the use of a preconfigured anycast address is | available), the use of a preconfigured anycast address is | |||
| recommended (e.g. installation phase described in Section 3.6). | recommended (e.g., the installation phase described in | |||
| Section 3.6). | ||||
| * In networks managed using DNS-SD, the use of DNS-SD for discovery | * In networks managed using DNS-SD, the use of DNS-SD for discovery, | |||
| as described in Section 4.1.2 is recommended. | as described in Section 4.1.2, is recommended. | |||
| The use of multicast discovery in mesh networks is NOT RECOMMENDED. | The use of multicast discovery in mesh networks is NOT RECOMMENDED. | |||
| 4.1.1. Resource Directory Address Option (RDAO) | 4.1.1. Resource Directory Address Option (RDAO) | |||
| The Resource Directory Address Option (RDAO) carries information | The Resource Directory Address Option (RDAO) carries information | |||
| about the address of the RD in RAs (Router Advertisements) of IPv6 | about the address of the RD in RAs (Router Advertisements) of IPv6 | |||
| Neighbor Discovery (ND), similar to how RDNSS options [RFC8106] are | Neighbor Discovery (ND), similar to how Recursive DNS Server (RDNSS) | |||
| sent. This information is needed when endpoints cannot discover the | options [RFC8106] are sent. This information is needed when | |||
| RD with a link-local or realm-local scope multicast address, for | endpoints cannot discover the RD with a link-local or realm-local | |||
| instance because the endpoint and the RD are separated by a Border | scope multicast address, for instance, because the endpoint and the | |||
| Router (6LBR). In many circumstances the availability of DHCP cannot | RD are separated by a 6LBR. In many circumstances, the availability | |||
| be guaranteed either during commissioning of the network. The | of DHCP cannot be guaranteed during commissioning of the network | |||
| presence and the use of the RD is essential during commissioning. | either. The presence and the use of the RD is essential during | |||
| commissioning. | ||||
| It is possible to send multiple RDAO options in one message, | It is possible to send multiple RDAOs in one message, indicating as | |||
| indicating as many RD addresses. | many RD addresses. | |||
| The RDAO format is: | The RDAO format is: | |||
| 0 1 2 3 | 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 | 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 | | | Type | Length = 3 | Reserved | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Valid Lifetime | | | Valid Lifetime | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| + RD Address + | + RD Address + | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Fields: | Figure 4: Resource Directory Address Option | |||
| Type: TBD38 | Fields: | |||
| Length: 8-bit unsigned integer. The length of | Type: 41 | |||
| the option in units of 8 bytes. | ||||
| Always 3. | ||||
| Reserved: This field is unused. It MUST be | Length: 8-bit unsigned integer. The length of the option | |||
| initialized to zero by the sender and | in units of 8 bytes. Always 3. | |||
| MUST be ignored by the receiver. | ||||
| Valid Lifetime: 32-bit unsigned integer. The length of | Reserved: This field is unused. It MUST be initialized to | |||
| time in seconds (relative to | zero by the sender and MUST be ignored by the | |||
| the time the packet is received) that | receiver. | |||
| 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. | 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. | ||||
| Figure 4: Resource Directory Address Option | RD Address: IPv6 address of the RD. | |||
| 4.1.2. Using DNS-SD to discover a Resource Directory | 4.1.2. Using DNS-SD to Discover a Resource Directory | |||
| An RD can advertise its presence in DNS-SD [RFC6763] using the | An RD can advertise its presence in DNS-SD [RFC6763] using the | |||
| service name "_core-rd._udp" (for CoAP), "_core-rd-dtls._udp" (for | service names defined in this document: _core-rd._udp (for CoAP), | |||
| CoAP over DTLS), "_core-rd._tcp" (for CoAP over TCP) or "_core-rd- | _core-rd-dtls._udp (for CoAP over DTLS), _core-rd._tcp (for CoAP over | |||
| tls._tcp" (for CoAP over TLS) defined in this document. (For the | TCP), or _core-rd-tls._tcp (for CoAP over TLS). (For the WebSocket | |||
| WebSocket transports of CoAP, no service is defined as DNS-SD is | transports of CoAP, no service is defined, as DNS-SD is typically | |||
| typically unavailable in environments where CoAP over WebSockets is | unavailable in environments where CoAP over WebSockets is used.) | |||
| used). | ||||
| The selection of the service indicates the protocol used, and the SRV | 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 | 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. | point for the "URI discovery" steps of Section 4.3. | |||
| This section is a simplified concrete application of the more generic | This section is a simplified, concrete application of the more | |||
| mechanism specified in [I-D.ietf-core-rd-dns-sd]. | generic mechanism specified in [CORE-RD-DNS-SD]. | |||
| 4.2. Payload Content Formats | 4.2. Payload Content Formats | |||
| RDs implementing this specification MUST support the application/ | RDs implementing this specification MUST support the application/ | |||
| link-format content format (ct=40). | link-format content format (ct=40). | |||
| RDs implementing this specification MAY support additional content | RDs implementing this specification MAY support additional content | |||
| formats. | formats. | |||
| Any additional content format supported by an RD implementing this | Any additional content format supported by an RD implementing this | |||
| specification SHOULD be able to express all the information | specification SHOULD be able to express all the information | |||
| expressible in link-format. It MAY be able to express information | expressible in link format. It MAY be able to express information | |||
| that is inexpressible in link-format, but those expressions SHOULD be | that is inexpressible in link format, but those expressions SHOULD be | |||
| avoided where possible. | avoided where possible. | |||
| 4.3. URI Discovery | 4.3. URI Discovery | |||
| Before an endpoint can make use of an RD, it must first know the RD's | 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. | 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- | This section defines discovery of the RD and its URIs using the well- | |||
| known interface of the CoRE Link Format [RFC6690] after having | known interface of the CoRE Link Format [RFC6690] after having | |||
| discovered a host as described in Section 4.1. | discovered a host, as described in Section 4.1. | |||
| Discovery of the RD registration URI is performed by sending either a | Discovery of the RD registration URI is performed by sending either a | |||
| multicast or unicast GET request to "/.well-known/core" and including | multicast or unicast GET request to /.well-known/core and including a | |||
| a Resource Type (rt) parameter [RFC6690] with the value "core.rd" in | resource type (rt) parameter [RFC6690] with the value "core.rd" in | |||
| the query string. Likewise, a Resource Type parameter value of | the query string. Likewise, a resource type parameter value of | |||
| "core.rd-lookup*" is used to discover the URIs for RD Lookup | "core.rd-lookup*" is used to discover the URIs for RD lookup | |||
| operations, core.rd* is used to discover all URIs for RD operations. | operations, and "core.rd*" is used to discover all URIs for RD | |||
| Upon success, the response will contain a payload with a link format | operations. Upon success, the response will contain a payload with a | |||
| entry for each RD function discovered, indicating the URI of the RD | link format entry for each RD function discovered, indicating the URI | |||
| function returned and the corresponding Resource Type. When | of the RD function returned and the corresponding resource type. | |||
| performing multicast discovery, the multicast IP address used will | When performing multicast discovery, the multicast IP address used | |||
| depend on the scope required and the multicast capabilities of the | will depend on the scope required and the multicast capabilities of | |||
| network (see Section 9.5). | the network (see Section 9.5). | |||
| An RD MAY provide hints about the content-formats it supports in the | An RD MAY provide hints about the content formats it supports in the | |||
| links it exposes or registers, using the "ct" target attribute, as | links it exposes or registers, using the "ct" target attribute, as | |||
| shown in the example below. Clients MAY use these hints to select | shown in the example below. Clients MAY use these hints to select | |||
| alternate content-formats for interaction with the RD. | alternate content formats for interaction with the RD. | |||
| HTTP does not support multicast and consequently only unicast | HTTP does not support multicast, and, consequently, only unicast | |||
| discovery can be supported at the using the HTTP "/.well-known/core" | discovery can be supported using the HTTP /.well-known/core resource. | |||
| resource. | ||||
| RDs implementing this specification MUST support query filtering for | RDs implementing this specification MUST support query filtering for | |||
| the rt parameter as defined in [RFC6690]. | the rt parameter, as defined in [RFC6690]. | |||
| While the link targets in this discovery step are often expressed in | While the link targets in this discovery step are often expressed in | |||
| path-absolute form, this is not a requirement. Clients of the RD | path-absolute form, this is not a requirement. Clients of the RD | |||
| SHOULD therefore accept URIs of all schemes they support, both as | SHOULD therefore accept URIs of all schemes they support, both as | |||
| URIs and relative references, and not limit the set of discovered | URIs and relative references, and not limit the set of discovered | |||
| URIs to those hosted at the address used for URI discovery. | URIs to those hosted at the address used for URI discovery. | |||
| With security policies where the client requires the RD to be | With security policies where the client requires the RD to be | |||
| authorized to act as an RD, that authorization may be limited to | authorized to act as an RD, that authorization may be limited to | |||
| resources on which the authorized RD advertises the adequate resource | resources on which the authorized RD advertises the adequate resource | |||
| types. Clients that have obtained links they can not rely on yet can | types. Clients that have obtained links they cannot rely on yet can | |||
| repeat the URI discovery step at the /.well-known/core resource of | repeat the "URI discovery" step at the /.well-known/core resource of | |||
| the indicated host to obtain the resource type information from an | the indicated host to obtain the resource type information from an | |||
| authorized source. | authorized source. | |||
| The URI Discovery operation can yield multiple URIs of a given | The URI discovery operation can yield multiple URIs of a given | |||
| resource type. The client of the RD can use any of the discovered | resource type. The client of the RD can try out any of the | |||
| addresses initially. | discovered addresses. | |||
| The discovery request interface is specified as follows (this is | The discovery request interface is specified as follows (this is | |||
| exactly the Well-Known Interface of [RFC6690] Section 4, with the | exactly the well-known interface of [RFC6690], Section 4, with the | |||
| additional requirement that the server MUST support query filtering): | additional requirement that the server MUST support query filtering): | |||
| Interaction: EP, CT or Client -> RD | Interaction: EP, CT, or Client -> RD | |||
| Method: GET | Method: GET | |||
| URI Template: /.well-known/core{?rt} | URI Template: /.well-known/core{?rt} | |||
| URI Template Variables: rt := Resource Type. SHOULD contain one of | URI Template Variables: | |||
| 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 | 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 | representing web links | |||
| The following response is expected on this interface: | The following response is expected on this interface: | |||
| Success: 2.05 "Content" or 200 "OK" with an application/link-format | Success: 2.05 (Content) or 200 (OK) with an application/link-format | |||
| or other web link payload containing one or more matching entries | or other web link payload containing one or more matching entries | |||
| for the RD resource. | for the RD resource. | |||
| The following example shows an endpoint discovering an RD using this | The following example shows an endpoint discovering an RD using this | |||
| interface, thus learning that the directory resource location, in | interface, thus learning that the directory resource location in this | |||
| this example, is /rd, and that the content-format delivered by the | example is /rd and that the content format delivered by the server | |||
| server hosting the resource is application/link-format (ct=40). Note | hosting the resource is application/link-format (ct=40). Note that | |||
| that it is up to the RD to choose its RD locations. | it is up to the RD to choose its RD locations. | |||
| Req: GET coap://[MCD1]/.well-known/core?rt=core.rd* | Req: GET coap://[ff02::fe]/.well-known/core?rt=core.rd* | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| </rd>;rt=core.rd;ct=40, | </rd>;rt=core.rd;ct=40, | |||
| </rd-lookup/ep>;rt=core.rd-lookup-ep;ct=40, | </rd-lookup/ep>;rt=core.rd-lookup-ep;ct=40, | |||
| </rd-lookup/res>;rt=core.rd-lookup-res;ct=40 | </rd-lookup/res>;rt=core.rd-lookup-res;ct=40 | |||
| Figure 5: Example discovery exchange | Figure 5: Example Discovery Exchange | |||
| The following example shows the way of indicating that a client may | The following example shows the way of indicating that a client may | |||
| request alternate content-formats. The Content-Format code attribute | request alternate content formats. The Content-Format code attribute | |||
| "ct" MAY include a space-separated sequence of Content-Format codes | "ct" MAY include a space-separated sequence of Content-Format codes, | |||
| as specified in Section 7.2.1 of [RFC7252], indicating that multiple | as specified in Section 7.2.1 of [RFC7252], indicating that multiple | |||
| content-formats are available. The example below shows the required | content formats are available. The example below shows the required | |||
| Content-Format 40 (application/link-format) indicated as well as a | Content-Format 40 (application/link-format) indicated, as well as | |||
| CBOR and JSON representation from [I-D.ietf-core-links-json] (which | Concise Binary Object Representation (CBOR) and JSON representations | |||
| have no numeric values assigned yet, so they are shown as TBD64 and | in the style of [CORE-LINKS-JSON] (for which the experimental values | |||
| TBD504 as in that draft). The RD resource locations /rd, and /rd- | 65060 and 65050 are used in this example). The RD resource locations | |||
| lookup are example values. The server in this example also indicates | /rd and /rd-lookup are example values. The server in this example | |||
| that it is capable of providing observation on resource lookups. | also indicates that it is capable of providing observation on | |||
| resource lookups. | ||||
| Req: GET coap://[MCD1]/.well-known/core?rt=core.rd* | Req: GET coap://[ff02::fe]/.well-known/core?rt=core.rd* | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| </rd>;rt=core.rd;ct="40 65225", | </rd>;rt=core.rd;ct=40, | |||
| </rd-lookup/res>;rt=core.rd-lookup-res;ct="40 TBD64 TBD504";obs, | </rd-lookup/res>;rt=core.rd-lookup-res;ct="40 65060 65050";obs, | |||
| </rd-lookup/ep>;rt=core.rd-lookup-ep;ct="40 TBD64 TBD504" | </rd-lookup/ep>;rt=core.rd-lookup-ep;ct="40 65060 65050" | |||
| Figure 6: Example discovery exchange indicating additional | Figure 6: Example Discovery Exchange Indicating Additional | |||
| content-formats | Content-Formats | |||
| For maintenance, management and debugging, it can be useful to | For maintenance, management, and debugging, it can be useful to | |||
| identify the components that constitute the RD server. The | identify the components that constitute the RD server. The | |||
| identification can be used to find client-server incompatibilities, | identification can be used to find client-server incompatibilities, | |||
| supported features, required updates and other aspects. The Well- | supported features, required updates, and other aspects. The well- | |||
| Known interface described in Section 4 of [RFC6690] can be used to | known interface described in Section 4 of [RFC6690] can be used to | |||
| find such data. | find such data. | |||
| It would typically be stored in an implementation information link | It would typically be stored in an implementation information link | |||
| (as described in [I-D.bormann-t2trg-rel-impl]): | (as described in [T2TRG-REL-IMPL]). | |||
| Req: GET /.well-known/core?rel=impl-info | Req: GET /.well-known/core?rel=impl-info | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <http://software.example.com/shiny-resource-directory/1.0beta1>; | <http://software.example.com/shiny-resource-directory/1.0beta1>; | |||
| rel=impl-info | rel=impl-info | |||
| Figure 7: Example exchange of obtaining implementation | Figure 7: Example Exchange of Obtaining Implementation | |||
| information, using the relation type currently proposed in the | Information Using the Relation Type Currently Proposed in | |||
| work-in-progress document | [T2TRG-REL-IMPL] | |||
| Note that depending on the particular server's architecture, such a | 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), | 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 | or at individual RD components. The latter is to be expected when | |||
| different applications are run on the same server. | different applications are run on the same server. | |||
| 5. Registration | 5. Registration | |||
| After discovering the location of an RD, a registrant-ep or CT MAY | After discovering the location of an RD, a registrant-EP or CT MAY | |||
| register the resources of the registrant-ep using the registration | register the resources of the registrant-EP using the registration | |||
| interface. This interface accepts a POST from an endpoint containing | interface. This interface accepts a POST from an endpoint containing | |||
| the list of resources to be added to the directory as the message | the list of resources to be added to the directory as the message | |||
| payload in the CoRE Link Format [RFC6690] or other representations of | payload in the CoRE Link Format [RFC6690] or other representations of | |||
| web links, along with query parameters indicating the name of the | web links, along with query parameters indicating the name of the | |||
| endpoint, and optionally the sector, lifetime and base URI of the | endpoint and, optionally, the sector, lifetime, and base URI of the | |||
| registration. It is expected that other specifications will define | registration. It is expected that other specifications will define | |||
| further parameters (see Section 9.3). The RD then creates a new | further parameters (see Section 9.3). The RD then creates a new | |||
| registration resource in the RD and returns its location. The | registration resource in the RD and returns its location. The | |||
| receiving endpoint MUST use that location when refreshing | receiving endpoint MUST use that location when refreshing | |||
| registrations using this interface. Registration resources in the RD | registrations using this interface. Registration resources in the RD | |||
| are kept active for the period indicated by the lifetime parameter. | are kept active for the period indicated by the lifetime parameter. | |||
| The creating endpoint is responsible for refreshing the registration | The creating endpoint is responsible for refreshing the registration | |||
| resource within this period using either the registration or update | resource within this period, using either the registration or update | |||
| interface. The registration interface MUST be implemented to be | interface. The registration interface MUST be implemented to be | |||
| idempotent, so that registering twice with the same endpoint | idempotent, so that registering twice with the same endpoint | |||
| parameters ep and d (sector) does not create multiple registration | parameters ep and d (sector) does not create multiple registration | |||
| resources. | resources. | |||
| The following rules apply for a registration request targeting a | The following rules apply for a registration request targeting a | |||
| given (ep, d) value pair: | given (ep, d) value pair: | |||
| * When the (ep, d) value pair of the registration-request is | * When the (ep, d) value pair of the registration request is | |||
| different from any existing registration, a new registration is | different from any existing registration, a new registration is | |||
| generated. | generated. | |||
| * When the (ep, d) value pair of the registration-request is equal | * When the (ep, d) value pair of the registration request is equal | |||
| to an existing registration, the content and parameters of the | to an existing registration, the content and parameters of the | |||
| existing registration are replaced with the content of the | existing registration are replaced with the content of the | |||
| registration request. Like the later changes to registration | registration request. As with changes to registration resources, | |||
| resources, security policies (Section 7) usually require such | security policies (Section 7) usually require such requests to | |||
| requests to come from the same device. | come from the same device. | |||
| The posted link-format document can (and typically does) contain | The posted link-format document can (and typically does) contain | |||
| relative references both in its link targets and in its anchors, or | relative references both in its link targets and in its anchors; it | |||
| contain empty anchors. The RD server needs to resolve these | can also contain empty anchors. The RD server needs to resolve these | |||
| references in order to faithfully represent them in lookups. They | references in order to faithfully represent them in lookups. They | |||
| are resolved against the base URI of the registration, which is | are resolved against the base URI of the registration, which is | |||
| provided either explicitly in the "base" parameter or constructed | provided either explicitly in the base parameter or constructed | |||
| implicitly from the requester's URI as constructed from its network | implicitly from the requester's URI, as constructed from its network | |||
| address and scheme. | address and scheme. | |||
| For media types to which Appendix C applies (i.e. documents in | For media types to which Appendix C applies (i.e., documents in | |||
| application/link-format), request bodies MUST be expressed in Limited | application/link-format), request bodies MUST be expressed in Limited | |||
| Link Format. | Link Format. | |||
| The registration request interface is specified as follows: | The registration request interface is specified as follows: | |||
| Interaction: EP or CT -> RD | Interaction: EP or CT -> RD | |||
| Method: POST | Method: POST | |||
| URI Template: {+rd}{?ep,d,lt,base,extra-attrs*} | URI Template: {+rd}{?ep,d,lt,base,extra-attrs*} | |||
| URI Template Variables: rd := RD registration URI (mandatory). | URI Template Variables: | |||
| This is the location of the RD, as obtained from discovery. | ||||
| ep := Endpoint name (mostly mandatory). | rd := RD registration URI (mandatory). This is the location of | |||
| The endpoint name is an identifier that MUST be unique within a | the RD, as obtained from discovery. | |||
| sector. | ||||
| 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 | As the endpoint name is a Unicode string, it is encoded in | |||
| UTF-8 (and possibly pct-encoded) during variable expansion (see | UTF-8 (and possibly percent encoded) during variable expansion | |||
| [RFC6570] Section 3.2.1). The endpoint name MUST NOT contain | (see [RFC6570], Section 3.2.1). The endpoint name MUST NOT | |||
| any character in the inclusive ranges 0-31 or 127-159. | contain any character in the inclusive ranges 0-31 or 127-159. | |||
| The maximum length of this parameter is 63 UTF-8 encoded bytes. | The maximum length of this parameter is 63 bytes encoded in | |||
| UTF-8. | ||||
| If the RD is configured to recognize the endpoint to be | If the RD is configured to recognize the endpoint that is to be | |||
| authorized to use exactly one endpoint name, the RD assigns | authorized to use exactly one endpoint name, the RD assigns | |||
| that name. In that case, giving the endpoint name becomes | that name. In that case, giving the endpoint name becomes | |||
| optional for the client; if the client gives any other endpoint | optional for the client; if the client gives any other endpoint | |||
| name, it is not authorized to perform the registration. | name, it is not authorized to perform the registration. | |||
| d := Sector (optional). The sector to | d := Sector (optional). This is the sector to which this | |||
| which this endpoint belongs. When this parameter is not | endpoint belongs. When this parameter is not present, the RD | |||
| present, the RD MAY associate the endpoint with a configured | MAY associate the endpoint with a configured default sector | |||
| default sector (possibly based on the endpoint's authorization) | (possibly based on the endpoint's authorization) or leave it | |||
| or leave it empty. | empty. | |||
| The sector is encoded like the ep parameter, and is limited to | The sector is encoded like the ep parameter and is limited to | |||
| 63 UTF-8 encoded bytes as well. | 63 bytes encoded in UTF-8 as well. | |||
| lt := Lifetime (optional). Lifetime of the | lt := Lifetime (optional). This is the lifetime of the | |||
| registration in seconds. Range of 1-4294967295. If no | registration in seconds, with a range of 1-4294967295. If no | |||
| lifetime is included in the initial registration, a default | lifetime is included in the initial registration, a default | |||
| value of 90000 (25 hours) SHOULD be assumed. | value of 90000 (25 hours) SHOULD be assumed. | |||
| base := Base URI (optional). This | base := Base URI (optional). This parameter sets the base URI of | |||
| parameter sets the base URI of the registration, under which | the registration, under which the relative links in the payload | |||
| the relative links in the payload are to be interpreted. The | are to be interpreted. The specified URI typically does not | |||
| specified URI typically does not have a path component of its | have a path component of its own and MUST be suitable as a base | |||
| own, and MUST be suitable as a base URI to resolve any relative | URI to resolve any relative references given in the | |||
| references given in the registration. The parameter is | registration. The parameter is therefore usually of the shape | |||
| therefore usually of the shape "scheme://authority" for HTTP | "scheme://authority" for HTTP and CoAP URIs. The URI SHOULD | |||
| and CoAP URIs. The URI SHOULD NOT have a query or fragment | NOT have a query or fragment component, as any non-empty | |||
| component as any non-empty relative part in a reference would | relative part in a reference would remove those parts from the | |||
| remove those parts from the resulting URI. | resulting URI. | |||
| In the absence of this parameter the scheme of the protocol, | In the absence of this parameter, the scheme of the protocol, | |||
| source address and source port of the registration request are | the source address, and the source port of the registration | |||
| assumed. The Base URI is consecutively constructed by | request are assumed. The base URI is consecutively constructed | |||
| concatenating the used protocol's scheme with the characters | by concatenating the used protocol's scheme with the characters | |||
| "://", the requester's source address as an address literal and | "://", the requester's source address as an address literal, | |||
| ":" followed by its port (if it was not the protocol's default | and ":" followed by its port (if it was not the protocol's | |||
| one) in analogy to [RFC7252] Section 6.5. | 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 | This parameter is mandatory when the directory is filled by a | |||
| third party such as an commissioning tool. | third party, such as a commissioning tool. | |||
| If the registrant-ep uses an ephemeral port to register with, | If the registrant-EP uses an ephemeral port to register with, | |||
| it MUST include the base parameter in the registration to | it MUST include the base parameter in the registration to | |||
| provide a valid network path. | provide a valid network path. | |||
| A registrant that cannot be reached by potential lookup clients | A registrant that cannot be reached by potential lookup clients | |||
| at the address it registers from (e.g. because it is behind | at the address it registers from (e.g., because it is behind | |||
| some form of Network Address Translation (NAT)) MUST provide a | some form of Network Address Translation (NAT)) MUST provide a | |||
| reachable base address with its registration. | reachable base address with its registration. | |||
| If the Base URI contains a link-local IP literal, it MUST NOT | 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 | contain a Zone Identifier and MUST be local to the link on | |||
| which the registration request is received. | which the registration request is received. | |||
| Endpoints that register with a base that contains a path | Endpoints that register with a base that contains a path | |||
| component cannot efficiently express their registrations in | component cannot efficiently express their registrations in | |||
| Limited Link Format (Appendix C). Those applications should | Limited Link Format (Appendix C). Those applications should | |||
| use different representations of links to which Appendix C is | use different representations of links to which Appendix C is | |||
| not applicable (e.g. [I-D.hartke-t2trg-coral]). | not applicable (e.g., [CORE-CORAL]). | |||
| extra-attrs := Additional registration | extra-attrs := Additional registration attributes (optional). | |||
| attributes (optional). The endpoint can pass any parameter | The endpoint can pass any parameter registered in Section 9.3 | |||
| registered at Section 9.3 to the directory. If the RD is aware | to the directory. If the RD is aware of the parameter's | |||
| of the parameter's specified semantics, it processes it | specified semantics, it processes the parameter accordingly. | |||
| accordingly. Otherwise, it MUST store the unknown key and its | Otherwise, it MUST store the unknown key and its value(s) as an | |||
| value(s) as an endpoint attribute for further lookup. | endpoint attribute for further lookup. | |||
| Content-Format: application/link-format or any other indicated media | Content-Format: application/link-format or any other indicated media | |||
| type representing web links | type representing web links | |||
| The following response is expected on this interface: | The following response is expected on this interface: | |||
| Success: 2.01 "Created" or 201 "Created". The Location-Path option | Success: 2.01 (Created) or 201 (Created). The Location-Path option | |||
| or Location header field MUST be included in the response. This | or Location header field MUST be included in the response. This | |||
| location MUST be a stable identifier generated by the RD as it is | location MUST be a stable identifier generated by the RD, as it is | |||
| used for all subsequent operations on this registration resource. | used for all subsequent operations on this registration resource. | |||
| The registration resource location thus returned is for the | The registration resource location thus returned is for the | |||
| purpose of updating the lifetime of the registration and for | purpose of updating the lifetime of the registration and for | |||
| maintaining the content of the registered links, including | maintaining the content of the registered links, including | |||
| updating and deleting links. | updating and deleting links. | |||
| A registration with an already registered ep and d value pair | A registration with an already-registered ep and d value pair | |||
| responds with the same success code and location as the original | responds with the same success code and location as the original | |||
| registration; the set of links registered with the endpoint is | registration; the set of links registered with the endpoint is | |||
| replaced with the links from the payload. | replaced with the links from the payload. | |||
| The location MUST NOT have a query or fragment component, as that | The location MUST NOT have a query or fragment component, as that | |||
| could conflict with query parameters during the Registration | could conflict with query parameters during the registration | |||
| Update operation. Therefore, the Location-Query option MUST NOT | update operation. Therefore, the Location-Query option MUST NOT | |||
| be present in a successful response. | be present in a successful response. | |||
| If the registration fails, including request timeouts, or if delays | If the registration fails, including request timeouts, or if delays | |||
| from Service Unavailable responses with Max-Age or Retry-After | from Service Unavailable responses with Max-Age or Retry-After | |||
| accumulate to exceed the registrant's configured timeouts, it SHOULD | accumulate to exceed the registrant's configured timeouts, it SHOULD | |||
| pick another registration URI from the "URI Discovery" step and if | pick another registration URI from the "URI discovery" step of | |||
| there is only one or the list is exhausted, pick other choices from | Section 4.3, and, if there is only one or the list is exhausted, pick | |||
| the "Finding a Resource Directory" step. Care has to be taken to | other choices from the "finding a resource directory" step of | |||
| consider the freshness of results obtained earlier, e.g. of the | Section 4.1. Care has to be taken to consider the freshness of | |||
| result of a "/.well-known/core" response, the lifetime of an RDAO | results obtained earlier, e.g., the result of a /.well-known/core | |||
| option and of DNS responses. Any rate limits and persistent errors | response, the lifetime of an RDAO, and DNS responses. Any rate | |||
| from the "Finding a Resource Directory" step must be considered for | limits and persistent errors from the "finding a resource directory" | |||
| the whole registration time, not only for a single operation. | 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" | The following example shows a registrant-EP with the name "node1" | |||
| registering two resources to an RD using this interface. The | registering two resources to an RD using this interface. The | |||
| location "/rd" is an example RD location discovered in a request | location "/rd" is an example RD location discovered in a request | |||
| similar to Figure 5. | similar to Figure 5. | |||
| Req: POST coap://rd.example.com/rd?ep=node1 | Req: POST coap://rd.example.com/rd?ep=node1 | |||
| Content-Format: 40 | Content-Format: 40 | |||
| Payload: | Payload: | |||
| </sensors/temp>;rt=temperature-c;if=sensor, | </sensors/temp>;rt=temperature-c;if=sensor, | |||
| <http://www.example.com/sensors/temp>; | <http://www.example.com/sensors/temp>; | |||
| anchor="/sensors/temp";rel=describedby | anchor="/sensors/temp";rel=describedby | |||
| Res: 2.01 Created | Res: 2.01 Created | |||
| Location-Path: /rd/4521 | Location-Path: /rd/4521 | |||
| Figure 8: Example registration payload | Figure 8: Example Registration Payload | |||
| An RD may optionally support HTTP. Here is an example of almost the | An RD may optionally support HTTP. Here is an example of almost the | |||
| same registration operation above, when done using HTTP. | same registration operation above when done using HTTP. | |||
| Req: | Req: | |||
| POST /rd?ep=node1&base=http://[2001:db8:1::1] HTTP/1.1 | POST /rd?ep=node1&base=http://[2001:db8:1::1] HTTP/1.1 | |||
| Host: rd.example.com | Host: rd.example.com | |||
| Content-Type: application/link-format | Content-Type: application/link-format | |||
| </sensors/temp>;rt=temperature-c;if=sensor, | </sensors/temp>;rt=temperature-c;if=sensor, | |||
| <http://www.example.com/sensors/temp>; | <http://www.example.com/sensors/temp>; | |||
| anchor="/sensors/temp";rel=describedby | anchor="/sensors/temp";rel=describedby | |||
| Res: | Res: | |||
| HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
| Location: /rd/4521 | Location: /rd/4521 | |||
| Figure 9: Example registration payload as expressed using HTTP | Figure 9: Example Registration Payload as Expressed Using HTTP | |||
| 5.1. Simple Registration | 5.1. Simple Registration | |||
| Not all endpoints hosting resources are expected to know how to | Not all endpoints hosting resources are expected to know how to | |||
| upload links to an RD as described in Section 5. Instead, simple | upload links to an RD, as described in Section 5. Instead, simple | |||
| endpoints can implement the Simple Registration approach described in | endpoints can implement the simple registration approach described in | |||
| this section. An RD implementing this specification MUST implement | this section. An RD implementing this specification MUST implement | |||
| Simple Registration. However, there may be security reasons why this | simple registration. However, there may be security reasons why this | |||
| form of directory discovery would be disabled. | form of directory discovery would be disabled. | |||
| This approach requires that the registrant-ep makes available the | This approach requires that the registrant-EP makes available the | |||
| hosted resources that it wants to be discovered, as links on its | hosted resources that it wants to be discovered as links on its | |||
| "/.well-known/core" interface as specified in [RFC6690]. The links | /.well-known/core interface, as specified in [RFC6690]. The links in | |||
| in that document are subject to the same limitations as the payload | that document are subject to the same limitations as the payload of a | |||
| of a registration (with respect to Appendix C). | registration (with respect to Appendix C). | |||
| * The registrant-ep finds one or more addresses of the directory | * The registrant-EP finds one or more addresses of the directory | |||
| server as described in Section 4.1. | server, as described in Section 4.1. | |||
| * The registrant-ep sends (and regularly refreshes with) a POST | * The registrant-EP sends (and regularly refreshes with) a POST | |||
| request to the "/.well-known/rd" URI of the directory server of | request to the /.well-known/rd URI of the directory server of | |||
| choice. The body of the POST request is empty, and triggers the | choice. The body of the POST request is empty and triggers the | |||
| resource directory server to perform GET requests at the | resource directory server to perform GET requests (redone before | |||
| requesting registrant-ep's /.well-known/core to obtain the link- | lifetime expiry) at the requesting registrant-EP's /.well-known/ | |||
| format payload to register. | core to obtain the link-format payload to register. | |||
| The registrant-ep includes the same registration parameters in the | The registrant-EP includes the same registration parameters in the | |||
| POST request as it would with a regular registration per | POST request as it would with a regular registration, per | |||
| Section 5. The registration base URI of the registration is taken | Section 5. The registration base URI of the registration is taken | |||
| from the registrant-ep's network address (as is default with | from the registrant-EP's network address (as is default with | |||
| regular registrations). | regular registrations). | |||
| Example request from registrant-EP to RD (unanswered until the | The following is an example request from the registrant-EP to the | |||
| next step): | RD (unanswered until the next step): | |||
| Req: POST /.well-known/rd?lt=6000&ep=node1 | Req: POST /.well-known/rd?lt=6000&ep=node1 | |||
| (No payload) | (No payload) | |||
| Figure 10: First half example exchange of a simple registration | Figure 10: First-Half Example Exchange of a Simple Registration | |||
| * The RD queries the registrant-ep's discovery resource to determine | * The RD queries the registrant-EP's discovery resource to determine | |||
| the success of the operation. It SHOULD keep a cache of the | 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. | discovery resource and not query it again as long as it is fresh. | |||
| Example request from the RD to the registrant-EP: | The following is an example request from the RD to the registrant- | |||
| EP: | ||||
| Req: GET /.well-known/core | Req: GET /.well-known/core | |||
| Accept: 40 | Accept: 40 | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Content-Format: 40 | Content-Format: 40 | |||
| Payload: | Payload: | |||
| </sen/temp> | </sen/temp> | |||
| Figure 11: Example exchange of the RD querying the simple endpoint | Figure 11: Example Exchange of the RD Querying the Simple Endpoint | |||
| With this response, the RD would answer the previous step's request: | With this response, the RD would answer the previous step's request: | |||
| Res: 2.04 Changed | Res: 2.04 Changed | |||
| Figure 12: Second half example exchange of a simple registration | Figure 12: Second-Half Example Exchange of a Simple Registration | |||
| The sequence of fetching the registration content before sending a | The sequence of fetching the registration content before sending a | |||
| successful response was chosen to make responses reliable, and the | successful response was chosen to make responses reliable, and the | |||
| point about caching was chosen to still allow very constrained | point about caching was chosen to still allow very constrained | |||
| registrants. Registrants MUST be able to serve a GET request to | registrants. Registrants MUST be able to serve a GET request to | |||
| "/.well-known/core" after having requested registration. Constrained | /.well-known/core after having requested registration. Constrained | |||
| devices MAY regard the initial request as temporarily failed when | devices MAY regard the initial request as temporarily failed when | |||
| they need RAM occupied by their own request to serve the RD's GET, | they need RAM occupied by their own request to serve the RD's GET and | |||
| and retry later when the RD already has a cached representation of | retry later when the RD already has a cached representation of their | |||
| their discovery resources. Then, the RD can reply immediately and | discovery resources. Then, the RD can reply immediately, and the | |||
| the registrant can receive the response. | registrant can receive the response. | |||
| The simple registration request interface is specified as follows: | The simple registration request interface is specified as follows: | |||
| Interaction: EP -> RD | Interaction: EP -> RD | |||
| Method: POST | Method: POST | |||
| URI Template: /.well-known/rd{?ep,d,lt,extra-attrs*} | URI Template: /.well-known/rd{?ep,d,lt,extra-attrs*} | |||
| URI Template Variables are as they are for registration in Section 5. | URI Template Variables are the same as for registration in Section 5. | |||
| The base attribute is not accepted to keep the registration interface | The base attribute is not accepted to keep the registration interface | |||
| simple; that rules out registration over CoAP-over-TCP or HTTP that | simple; that rules out registration over CoAP-over-TCP or HTTP that | |||
| would need to specify one. For some time during this document's | would need to specify one. For some time during this document's | |||
| development, the URI template "/.well-known/core{?ep,...}" has been | development, the URI Template /.well-known/core{?ep,...} was in use | |||
| in use instead. | instead. | |||
| The following response is expected on this interface: | The following response is expected on this interface: | |||
| Success: 2.04 "Changed". | Success: 2.04 (Changed) | |||
| For the second interaction triggered by the above, the registrant-ep | For the second interaction triggered by the above, the registrant-EP | |||
| takes the role of server and the RD the role of client. (Note that | takes the role of server and the RD takes the role of client. (Note | |||
| this is exactly the Well-Known Interface of [RFC6690] Section 4): | that this is exactly the well-known interface of [RFC6690], | |||
| Section 4): | ||||
| Interaction: RD -> EP | Interaction: RD -> EP | |||
| Method: GET | Method: GET | |||
| URI Template: /.well-known/core | URI Template: /.well-known/core | |||
| The following response is expected on this interface: | The following response is expected on this interface: | |||
| Success: 2.05 "Content". | Success: 2.05 (Content) | |||
| When the RD uses any authorization credentials to access the | When the RD uses any authorization credentials to access the | |||
| endpoint's discovery resource, or when it is deployed in a location | endpoint's discovery resource or when it is deployed in a location | |||
| where third parties might reach it but not the endpoint, it SHOULD | where third parties might reach it but not the endpoint, it SHOULD | |||
| verify that the apparent registrant-ep intends to register with the | verify that the apparent registrant-EP intends to register with the | |||
| given registration parameters before revealing the obtained discovery | given registration parameters before revealing the obtained discovery | |||
| information to lookup clients. An easy way to do that is to verify | information to lookup clients. An easy way to do that is to verify | |||
| the simple registration request's sender address using the Echo | the simple registration request's sender address using the Echo | |||
| option as described in [I-D.ietf-core-echo-request-tag] Section 2.4. | option, as described in [RFC9175], Section 2.4. | |||
| The RD MUST delete registrations created by simple registration after | The RD MUST delete registrations created by simple registration after | |||
| the expiration of their lifetime. Additional operations on the | the expiration of their lifetime. Additional operations on the | |||
| registration resource cannot be executed because no registration | registration resource cannot be executed because no registration | |||
| location is returned. | location is returned. | |||
| 5.2. Third-party registration | 5.2. Third-Party Registration | |||
| For some applications, even Simple Registration may be too taxing for | For some applications, even simple registration may be too taxing for | |||
| some very constrained devices, in particular if the security | some very constrained devices, in particular, if the security | |||
| requirements become too onerous. | requirements become too onerous. | |||
| In a controlled environment (e.g. building control), the RD can be | In a controlled environment (e.g., building control), the RD can be | |||
| filled by a third party device, called a Commissioning Tool (CT). | filled by a third-party device, called a Commissioning Tool (CT). | |||
| The commissioning tool can fill the RD from a database or other | The CT can fill the RD from a database or other means. For that | |||
| means. For that purpose scheme, IP address and port of the URI of | purpose scheme, the IP address and port of the URI of the registered | |||
| the registered device is the value of the "base" parameter of the | device is the value of the "base" parameter of the registration | |||
| registration described in Section 5. | described in Section 5. | |||
| It should be noted that the value of the "base" parameter applies to | 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 | all the links of the registration and has consequences for the anchor | |||
| value of the individual links as exemplified in Appendix B. An | value of the individual links, as exemplified in Appendix B. A | |||
| eventual (currently non-existing) "base" attribute of the link is not | potential (currently nonexistent) "base" attribute of the link is not | |||
| affected by the value of "base" parameter in the registration. | affected by the value of "base" parameter in the registration. | |||
| 5.3. Operations on the Registration Resource | 5.3. Operations on the Registration Resource | |||
| This section describes how the registering endpoint can maintain the | This section describes how the registering endpoint can maintain the | |||
| registrations that it created. The registering endpoint can be the | registrations that it created. The registering endpoint can be the | |||
| registrant-ep or the CT. The registrations are resources of the RD. | registrant-EP or the CT. The registrations are resources of the RD. | |||
| An endpoint should not use this interface for registrations that it | An endpoint should not use this interface for registrations that it | |||
| did not create. This is usually enforced by security policies, which | did not create. This is usually enforced by security policies, | |||
| in general require equivalent credentials for creation of and | which, in general, require equivalent credentials for creation of and | |||
| operations on a registration. | operations on a registration. | |||
| After the initial registration, the registering endpoint retains the | After the initial registration, the registering endpoint retains the | |||
| returned location of the registration resource for further | returned location of the registration resource for further | |||
| operations, including refreshing the registration in order to extend | operations, including refreshing the registration in order to extend | |||
| the lifetime and "keep-alive" the registration. When the lifetime of | the lifetime and "keep-alive" the registration. When the lifetime of | |||
| the registration has expired, the RD SHOULD NOT respond to discovery | the registration has expired, the RD SHOULD NOT respond to discovery | |||
| queries concerning this endpoint. The RD SHOULD continue to provide | queries concerning this endpoint. The RD SHOULD continue to provide | |||
| access to the registration resource after a registration time-out | access to the registration resource after a registration timeout | |||
| occurs in order to enable the registering endpoint to eventually | occurs in order to enable the registering endpoint to eventually | |||
| refresh the registration. The RD MAY eventually remove the | refresh the registration. The RD MAY eventually remove the | |||
| registration resource for the purpose of garbage collection. If the | registration resource for the purpose of garbage collection. If the | |||
| registration resource is removed, the corresponding endpoint will | registration resource is removed, the corresponding endpoint will | |||
| need to be re-registered. | need to be reregistered. | |||
| The registration resource may also be used cancel the registration | The registration resource may also be used to cancel the registration | |||
| using DELETE, and to perform further operations beyond the scope of | using DELETE and to perform further operations beyond the scope of | |||
| this specification. | this specification. | |||
| Operations on the registration resource are sensitive to reordering; | Operations on the registration resource are sensitive to reordering; | |||
| Section 5.3.4 describes how order is restored. | Section 5.3.4 describes how order is restored. | |||
| The operations on the registration resource are described below. | The operations on the registration resource are described below. | |||
| 5.3.1. Registration Update | 5.3.1. Registration Update | |||
| The update interface is used by the registering endpoint to refresh | The update interface is used by the registering endpoint to refresh | |||
| or update its registration with an RD. To use the interface, the | or update its registration with an RD. To use the interface, the | |||
| registering endpoint sends a POST request to the registration | registering endpoint sends a POST request to the registration | |||
| resource returned by the initial registration operation. | resource returned by the initial registration operation. | |||
| An update MAY update registration parameters like lifetime, base URI | An update MAY update registration parameters, such as lifetime, base | |||
| or others. Parameters that are not being changed should not be | URI, or others. Parameters that are not being changed should not be | |||
| included in an update. Adding parameters that have not changed | included in an update. Adding parameters that have not changed | |||
| increases the size of the message but does not have any other | increases the size of the message but does not have any other | |||
| implications. Parameters are included as query parameters in an | implications. Parameters are included as query parameters in an | |||
| update operation as in Section 5. | update operation, as in Section 5. | |||
| A registration update resets the timeout of the registration to the | A registration update resets the timeout of the registration to the | |||
| (possibly updated) lifetime of the registration, independent of | (possibly updated) lifetime of the registration, independent of | |||
| whether a "lt" parameter was given. | whether an lt parameter was given. | |||
| If the base URI of the registration is changed in an update, relative | If the base URI of the registration is changed in an update, relative | |||
| references submitted in the original registration or later updates | references submitted in the original registration or later updates | |||
| are resolved anew against the new base. | are resolved anew against the new base. | |||
| The registration update operation only describes the use of POST with | The registration update operation only describes the use of POST with | |||
| an empty payload. Future standards might describe the semantics of | an empty payload. Future standards might describe the semantics of | |||
| using content formats and payloads with the POST method to update the | using content formats and payloads with the POST method to update the | |||
| links of a registration (see Section 5.3.3). | links of a registration (see Section 5.3.3). | |||
| The update registration request interface is specified as follows: | The update registration request interface is specified as follows: | |||
| Interaction: EP or CT -> RD | Interaction: EP or CT -> RD | |||
| Method: POST | Method: POST | |||
| URI Template: {+location}{?lt,base,extra-attrs*} | URI Template: {+location}{?lt,base,extra-attrs*} | |||
| URI Template Variables: location := This is the Location returned | URI Template Variables: | |||
| by the RD as a result of a successful earlier registration. | ||||
| lt := Lifetime (optional). Lifetime of the | location := This is the location returned by the RD as a result | |||
| registration in seconds. Range of 1-4294967295. If no | 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 | lifetime is included, the previous last lifetime set on a | |||
| previous update or the original registration (falling back to | previous update or the original registration (falling back to | |||
| 90000) SHOULD be used. | 90000) SHOULD be used. | |||
| base := Base URI (optional). This | base := Base URI (optional). This parameter updates the base URI | |||
| parameter updates the Base URI established in the original | established in the original registration to a new value and is | |||
| registration to a new value, and is subject to the same | subject to the same restrictions as in the registration. | |||
| restrictions as in the registration. | ||||
| If the parameter is set in an update, it is stored by the RD as | 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 | the new base URI under which to interpret the relative links | |||
| present in the payload of the original registration. | present in the payload of the original registration. | |||
| If the parameter is not set in the request but was set before, | If the parameter is not set in the request but was set before, | |||
| the previous Base URI value is kept unmodified. | the previous base URI value is kept unmodified. | |||
| If the parameter is not set in the request and was not set | If the parameter is not set in the request and was not set | |||
| before either, the source address and source port of the update | before either, the source address and source port of the update | |||
| request are stored as the Base URI. | request are stored as the base URI. | |||
| extra-attrs := Additional registration | ||||
| attributes (optional). As with the registration, the RD | extra-attrs := Additional registration attributes (optional). As | |||
| processes them if it knows their semantics. Otherwise, unknown | with the registration, the RD processes them if it knows their | |||
| attributes are stored as endpoint attributes, overriding any | semantics. Otherwise, unknown attributes are stored as | |||
| previously stored endpoint attributes of the same key. | endpoint attributes, overriding any previously stored endpoint | |||
| attributes of the same key. | ||||
| Note that this default behavior does not allow removing an | Note that this default behavior does not allow removing an | |||
| endpoint attribute in an update. For attributes whose | endpoint attribute in an update. For attributes whose | |||
| functionality depends on the endpoints' ability to remove them | functionality depends on the endpoints' ability to remove them | |||
| in an update, it can make sense to define a value whose | in an update, it can make sense to define a value whose | |||
| presence is equivalent to the absence of a value. As an | presence is equivalent to the absence of a value. As an | |||
| alternative, an extension can define different updating rules | alternative, an extension can define different updating rules | |||
| for their attributes. That necessitates either discovery of | for their attributes. That necessitates either discovering | |||
| whether the RD is aware of that extension, or tolerating the | whether the RD is aware of that extension or tolerating the | |||
| default behavior. | default behavior. | |||
| Content-Format: none (no payload) | Content-Format: none (no payload) | |||
| The following responses are expected on this interface: | The following responses are expected on this interface: | |||
| Success: 2.04 "Changed" or 204 "No Content" if the update was | Success: 2.04 (Changed) or 204 (No Content) if the update was | |||
| successfully processed. | successfully processed. | |||
| Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | Failure: 4.04 (Not Found) or 404 (Not Found). Registration does not | |||
| exist (e.g. may have been removed). | exist (e.g., may have been removed). | |||
| If the registration update fails in any way, including "Not Found" | If the registration update fails in any way, including "Not Found" | |||
| and request timeouts, or if the time indicated in a Service | and request timeouts, or if the time indicated in a Service | |||
| Unavailable Max-Age/Retry-After exceeds the remaining lifetime, the | Unavailable Max-Age/Retry-After exceeds the remaining lifetime, the | |||
| registering endpoint SHOULD attempt registration again. | registering endpoint SHOULD attempt registration again. | |||
| The following example shows how the registering endpoint resets the | The following example shows how the registering endpoint resets the | |||
| timeout on its registration resource at an RD using this interface | timeout on its registration resource at an RD using this interface | |||
| with the example location value: /rd/4521. | with the example location value /rd/4521: | |||
| Req: POST /rd/4521 | Req: POST /rd/4521 | |||
| Res: 2.04 Changed | Res: 2.04 Changed | |||
| Figure 13: Example update of a registration | Figure 13: Example Update of a Registration | |||
| The following example shows the registering endpoint updating its | The following example shows the registering endpoint updating its | |||
| registration resource at an RD using this interface with the example | registration resource at an RD using this interface with the example | |||
| location value: /rd/4521. The initial registration by the | location value /rd/4521. The initial registration by the registering | |||
| registering endpoint set the following values: | endpoint set the following values: | |||
| * endpoint name (ep)=endpoint1 | * endpoint name (ep)=endpoint1 | |||
| * lifetime (lt)=500 | * lifetime (lt)=500 | |||
| * Base URI (base)=coap://local-proxy-old.example.com | ||||
| * base URI (base)=coap://local-proxy-old.example.com | ||||
| * payload of Figure 8 | * payload of Figure 8 | |||
| The initial state of the RD is reflected in the following request: | The initial state of the RD is reflected in the following request: | |||
| Req: GET /rd-lookup/res?ep=endpoint1 | Req: GET /rd-lookup/res?ep=endpoint1 | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://local-proxy-old.example.com/sensors/temp>; | <coap://local-proxy-old.example.com/sensors/temp>; | |||
| rt=temperature-c;if=sensor, | rt=temperature-c;if=sensor, | |||
| <http://www.example.com/sensors/temp>; | <http://www.example.com/sensors/temp>; | |||
| anchor="coap://local-proxy-old.example.com/sensors/temp"; | anchor="coap://local-proxy-old.example.com/sensors/temp"; | |||
| rel=describedby | rel=describedby | |||
| Figure 14: Example lookup before a change to the base address | Figure 14: Example Lookup Before a Change to the Base Address | |||
| The following example shows the registering endpoint changing the | The following example shows the registering endpoint changing the | |||
| Base URI to "coaps://new.example.com:5684": | base URI to coaps://new.example.com:5684: | |||
| Req: POST /rd/4521?base=coaps://new.example.com | Req: POST /rd/4521?base=coaps://new.example.com | |||
| Res: 2.04 Changed | Res: 2.04 Changed | |||
| Figure 15: Example registration update that changes the base address | Figure 15: Example Registration Update that Changes the Base Address | |||
| The consecutive query returns: | The consecutive query returns: | |||
| Req: GET /rd-lookup/res?ep=endpoint1 | Req: GET /rd-lookup/res?ep=endpoint1 | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coaps://new.example.com/sensors/temp>; | <coaps://new.example.com/sensors/temp>; | |||
| rt=temperature-c;if=sensor, | rt=temperature-c;if=sensor, | |||
| <http://www.example.com/sensors/temp>; | <http://www.example.com/sensors/temp>; | |||
| anchor="coaps://new.example.com/sensors/temp"; | anchor="coaps://new.example.com/sensors/temp"; | |||
| rel=describedby | rel=describedby | |||
| Figure 16: Example lookup after a change to the base address | Figure 16: Example Lookup After a Change to the Base Address | |||
| 5.3.2. Registration Removal | 5.3.2. Registration Removal | |||
| Although RD registrations have soft state and will eventually timeout | Although RD registrations have soft state and will eventually time | |||
| after their lifetime, the registering endpoint SHOULD explicitly | out after their lifetime, the registering endpoint SHOULD explicitly | |||
| remove an entry from the RD if it knows it will no longer be | remove an entry from the RD if it knows it will no longer be | |||
| available (for example on shut-down). This is accomplished using a | available (for example, on shutdown). This is accomplished using a | |||
| removal interface on the RD by performing a DELETE on the endpoint | removal interface on the RD by performing a DELETE on the endpoint | |||
| resource. | resource. | |||
| The removal request interface is specified as follows: | The removal request interface is specified as follows: | |||
| Interaction: EP or CT -> RD | Interaction: EP or CT -> RD | |||
| Method: DELETE | Method: DELETE | |||
| URI Template: {+location} | URI Template: {+location} | |||
| URI Template Variables: location := This is the Location returned | URI Template Variables: | |||
| by the RD as a result of a successful earlier registration. | ||||
| 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: | The following responses are expected on this interface: | |||
| Success: 2.02 "Deleted" or 204 "No Content" upon successful deletion | Success: 2.02 (Deleted) or 204 (No Content) upon successful | |||
| deletion. | ||||
| Failure: 4.04 "Not Found" or 404 "Not Found". Registration does not | Failure: 4.04 (Not Found) or 404 (Not Found). Registration does not | |||
| exist (e.g. may already have been removed). | exist (e.g., may already have been removed). | |||
| The following examples shows successful removal of the endpoint from | The following example shows successful removal of the endpoint from | |||
| the RD with example location value /rd/4521. | the RD with example location value /rd/4521: | |||
| Req: DELETE /rd/4521 | Req: DELETE /rd/4521 | |||
| Res: 2.02 Deleted | Res: 2.02 Deleted | |||
| Figure 17: Example of a registration removal | Figure 17: Example of a Registration Removal | |||
| 5.3.3. Further operations | 5.3.3. Further Operations | |||
| Additional operations on the registration can be specified in future | Additional operations on the registration can be specified in future | |||
| documents, for example: | documents, for example: | |||
| * Send iPATCH (or PATCH) updates ([RFC8132]) to add, remove or | * Send iPATCH (or PATCH) updates [RFC8132] to add, remove, or change | |||
| change the links of a registration. | the links of a registration. | |||
| * Use GET to read the currently stored set of links in a | * Use GET to read the currently stored set of links in a | |||
| registration resource. | registration resource. | |||
| Those operations are out of scope of this document, and will require | Those operations are out of scope of this document and will require | |||
| media types suitable for modifying sets of links. | media types suitable for modifying sets of links. | |||
| 5.3.4. Request freshness | 5.3.4. Request Freshness | |||
| Some security mechanisms usable with an RD allow out of order request | Some security mechanisms usable with an RD allow out-of-order request | |||
| processing, or do not even mandate replay protection at all. The RD | processing or do not even mandate replay protection at all. The RD | |||
| needs to ensure that operations on the registration resource are | needs to ensure that operations on the registration resource are | |||
| executed in an order that does not distort the client's intentions. | executed in an order that does not distort the client's intentions. | |||
| This ordering of operations is expressed in terms of freshness as | This ordering of operations is expressed in terms of freshness, as | |||
| defined in [I-D.ietf-core-echo-request-tag]. Requests that alter a | defined in [RFC9175]. Requests that alter a resource's state need to | |||
| resource's state need to be fresh relative to the latest request that | be fresh relative to the latest request that altered that state in a | |||
| altered that state in a conflicting way. | conflicting way. | |||
| An RD SHOULD determine a request's freshness, and MUST use the Echo | An RD SHOULD determine a request's freshness and MUST use the Echo | |||
| option if it requires request freshness and can not determine the it | option if it requires request freshness and cannot determine it in | |||
| in any other way. An endpoint MUST support the use of the Echo | any other way. An endpoint MUST support the use of the Echo option. | |||
| option. (One reason why an RD would not require freshness is when no | (One reason why an RD would not require freshness is when no relevant | |||
| relevant registration properties are covered by is security | registration properties are covered by its security policies.) | |||
| policies.) | ||||
| 5.3.4.1. Efficient use of Echo by an RD | 5.3.4.1. Efficient Use of Echo by an RD | |||
| To keep latency and traffic added by the freshness requirements to a | To keep latency and traffic added by the freshness requirements to a | |||
| minimum, RDs should avoid naive (sufficient but inefficient) | minimum, RDs should avoid naive (sufficient but inefficient) | |||
| freshness criteria. | freshness criteria. | |||
| Some simple mechanisms the RD can employ are: | Some simple mechanisms the RD can employ are: | |||
| * State counter. The RD can keep a monotonous counter that | * State counter. The RD can keep a monotonous counter that | |||
| increments whenever a registration changes. For every | increments whenever a registration changes. For every | |||
| registration resource, it stores the post-increment value of that | registration resource, it stores the post-increment value of that | |||
| resource's last change. Requests altering them need to have at | resource's last change. Requests altering them need to have at | |||
| least that value encoded in their Echo option, and are otherwise | least that value encoded in their Echo option and are otherwise | |||
| rejected with a 4.01 Unauthorized and the current counter value as | rejected with a 4.01 (Unauthorized) and the current counter value | |||
| the Echo value. If other applications on the same server use Echo | as the Echo value. If other applications on the same server use | |||
| as well, that encoding may include a prefix indicating that it | Echo as well, that encoding may include a prefix indicating that | |||
| pertains to the RD's counter. | it pertains to the RD's counter. | |||
| The value associated with a resource needs to be kept across the | The value associated with a resource needs to be kept across the | |||
| removal of registrations if the same registration resource is to | removal of registrations if the same registration resource is to | |||
| be reused. | be reused. | |||
| The counter can be reset (and the values of removed resources | The counter can be reset (and the values of removed resources | |||
| forgotten) when all previous security associations are reset. | forgotten) when all previous security associations are reset. | |||
| This is the "Persistent Counter" method of | This is the "Persistent Counter" method of [RFC9175], Appendix A. | |||
| [I-D.ietf-core-echo-request-tag] Appendix A. | ||||
| * Preemptive Echo values. The current state counter can be sent in | * Preemptive Echo values. The current state counter can be sent in | |||
| an Echo option not only when requests are rejected with 4.01 | an Echo option not only when requests are rejected with 4.01 | |||
| Unauthorized, but also with successful responses. Thus, clients | (Unauthorized) but also with successful responses. Thus, clients | |||
| can be provided with Echo values sufficient for their next request | can be provided with Echo values sufficient for their next request | |||
| on a regular basis. | on a regular basis. This is also described in Section 2.3 of | |||
| [RFC9175] | ||||
| While endpoints may discard received Echo values at leisure | While endpoints may discard received Echo values at leisure | |||
| between requests, they are encouraged to retain these values for | between requests, they are encouraged to retain these values for | |||
| the next request to avoid additional round trips. | the next request to avoid additional round trips. | |||
| * If the RD can ensure that only one security association has | * If the RD can ensure that only one security association has | |||
| modifying access to any registration at any given time, and that | modifying access to any registration at any given time and that | |||
| security association provides order on the requests, that order is | security association provides order on the requests, that order is | |||
| sufficient to show request freshness. | sufficient to show request freshness. | |||
| 5.3.4.2. Examples of Echo usage | 5.3.4.2. Examples of Echo Usage | |||
| Figure 18 shows the interactions of an endpoint that has forgotten | Figure 18 shows the interactions of an endpoint that has forgotten | |||
| the server's latest Echo value and temporarily reduces its | the server's latest Echo value and temporarily reduces its | |||
| registration lifetime: | registration lifetime: | |||
| Req: POST /rd/4521?lt=7200 | Req: POST /rd/4521?lt=7200 | |||
| Res: 4.01 Unauthorized | Res: 4.01 Unauthorized | |||
| Echo: 0x0123 | Echo: 0x0123 | |||
| (EP tries again immediately) | (EP tries again immediately.) | |||
| Req: POST /rd/4521?lt=7200 | Req: POST /rd/4521?lt=7200 | |||
| Echo: 0x0123 | Echo: 0x0123 | |||
| Res: 2.04 Changed | Res: 2.04 Changed | |||
| Echo: 0x0124 | Echo: 0x0124 | |||
| (Later the EP regains its confidence in its long-term reachability) | (Later, the EP regains its confidence in its long-term reachability.) | |||
| Req: POST /rd/4521?lt=90000 | Req: POST /rd/4521?lt=90000 | |||
| Echo: 0x0124 | Echo: 0x0124 | |||
| Res: 2.04 Changed | Res: 2.04 Changed | |||
| Echo: 0x0247 | Echo: 0x0247 | |||
| Figure 18: Example update of a registration | Figure 18: Example Update of a Registration | |||
| The other examples do not show Echo options for simplicity, and | The other examples do not show Echo options for two reasons: (1) for | |||
| because they lack the context for any example values to have meaning. | simplicity and (2) because they lack the context for any example | |||
| values to have meaning. | ||||
| 6. RD Lookup | 6. RD Lookup | |||
| To discover the resources registered with the RD, a lookup interface | To discover the resources registered with the RD, a lookup interface | |||
| must be provided. This lookup interface is defined as a default, and | must be provided. This lookup interface is defined as a default, and | |||
| it is assumed that RDs may also support lookups to return resource | it is assumed that RDs may also support lookups to return resource | |||
| descriptions in alternative formats (e.g. JSON or CBOR link format | descriptions in alternative formats (e.g., JSON or CBOR link format | |||
| [I-D.ietf-core-links-json]) or using more advanced interfaces (e.g. | [CORE-LINKS-JSON]) or use more advanced interfaces (e.g., supporting | |||
| supporting context or semantic based lookup) on different resources | context- or semantic-based lookup) on different resources that are | |||
| that are discovered independently. | discovered independently. | |||
| RD Lookup allows lookups for endpoints and resources using attributes | RD lookup allows lookups for endpoints and resources using attributes | |||
| defined in this document and for use with the CoRE Link Format. The | 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) | result of a lookup request is the list of links (if any) | |||
| corresponding to the type of lookup. Thus, an endpoint lookup MUST | corresponding to the type of lookup. Thus, an endpoint lookup MUST | |||
| return a list of endpoints and a resource lookup MUST return a list | return a list of endpoints, and a resource lookup MUST return a list | |||
| of links to resources. | of links to resources. | |||
| The lookup type is selected by a URI endpoint, which is indicated by | The lookup type implemented by a lookup resource is indicated by a | |||
| a Resource Type as per Table 1 below: | resource type, as per Table 1: | |||
| +=============+====================+===========+ | +=============+====================+===========+ | |||
| | Lookup Type | Resource Type | Mandatory | | | Lookup Type | Resource Type | Mandatory | | |||
| +=============+====================+===========+ | +=============+====================+===========+ | |||
| | Resource | core.rd-lookup-res | Mandatory | | | Resource | core.rd-lookup-res | Mandatory | | |||
| +-------------+--------------------+-----------+ | +-------------+--------------------+-----------+ | |||
| | Endpoint | core.rd-lookup-ep | Mandatory | | | Endpoint | core.rd-lookup-ep | Mandatory | | |||
| +-------------+--------------------+-----------+ | +-------------+--------------------+-----------+ | |||
| Table 1: Lookup Types | Table 1: Lookup Types | |||
| 6.1. Resource lookup | 6.1. Resource Lookup | |||
| Resource lookup results in links that are semantically equivalent to | Resource lookup results in links that are semantically equivalent to | |||
| the links submitted to the RD by the registrant. The links and link | the links submitted to the RD by the registrant. The links and link | |||
| parameters returned by the lookup are equal to the originally | parameters returned by the lookup are equal to the originally | |||
| submitted ones, except that the target reference is fully resolved, | submitted ones, except that the target reference is fully resolved | |||
| and that the anchor reference is fully resolved if it is present in | and that the anchor reference is fully resolved if it is present in | |||
| the lookup result at all. | the lookup result at all. | |||
| Links that did not have an anchor attribute in the registration are | Links that did not have an anchor attribute in the registration are | |||
| returned without an anchor attribute. Links of which href or anchor | returned without an anchor attribute. Links of which href or anchor | |||
| was submitted as a (full) URI are returned with the respective | was submitted as a (full) URI are returned with the respective | |||
| attribute unmodified. | attribute unmodified. | |||
| The above rules allow the client to interpret the response as links | The above rules allow the client to interpret the response as links | |||
| without any further knowledge of the storage conventions of the RD. | without any further knowledge of the storage conventions of the RD. | |||
| The RD MAY replace the registration base URIs with a configured | The RD MAY replace the registration base URIs with a configured | |||
| intermediate proxy, e.g. in the case of an HTTP lookup interface for | intermediate proxy, e.g., in the case of an HTTP lookup interface for | |||
| CoAP endpoints. | CoAP endpoints. | |||
| If the base URI of a registration contains a link-local address, the | 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 | 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 | on which the registered endpoint can be reached. The RD MUST NOT | |||
| include zone identifiers in the resolved URIs. | include zone identifiers in the resolved URIs. | |||
| 6.2. Lookup filtering | 6.2. Lookup Filtering | |||
| Using the Accept Option, the requester can control whether the | Using the Accept option, the requester can control whether the | |||
| returned list is returned in CoRE Link Format ("application/link- | returned list is returned in CoRE Link Format (application/link- | |||
| format", default) or in alternate content-formats (e.g. from | format, default) or in alternate content formats (e.g., from | |||
| [I-D.ietf-core-links-json]). | [CORE-LINKS-JSON]). | |||
| Multiple search criteria MAY be included in a lookup. All included | Multiple search criteria MAY be included in a lookup. All included | |||
| criteria MUST match for a link to be returned. The RD MUST support | criteria MUST match for a link to be returned. The RD MUST support | |||
| matching with multiple search criteria. | matching with multiple search criteria. | |||
| A link matches a search criterion if it has an attribute of the same | A link matches a search criterion if it has an attribute of the same | |||
| name and the same value, allowing for a trailing "*" wildcard | name and the same value, allowing for a trailing "*" wildcard | |||
| operator as in Section 4.1 of [RFC6690]. Attributes that are defined | operator, as in Section 4.1 of [RFC6690]. Attributes that are | |||
| as "relation-types" (in the link-format ABNF) match if the search | defined as relation-types (in the link-format ABNF) match if the | |||
| value matches any of their values (see Section 4.1 of [RFC6690]; e.g. | search value matches any of their values (see Section 4.1 of | |||
| "?if=tag:example.net,2020:sensor" matches ";if="example.regname | [RFC6690]; for example, ?if=tag:example.net,2020:sensor matches | |||
| tag:example.net,2020:sensor";"). A resource link also matches a | ;if="example.regname tag:example.net,2020:sensor";. A resource link | |||
| search criterion if its endpoint would match the criterion, and vice | also matches a search criterion if its endpoint would match the | |||
| versa, an endpoint link matches a search criterion if any of its | criterion, and vice versa, an endpoint link matches a search | |||
| resource links matches it. | criterion if any of its resource links matches it. | |||
| Note that "href" is a valid search criterion and matches target | Note that href is a valid search criterion and matches target | |||
| references. Like all search criteria, on a resource lookup it can | references. Like all search criteria, on a resource lookup, it can | |||
| match the target reference of the resource link itself, but also the | match the target reference of the resource link itself but also the | |||
| registration resource of the endpoint that registered it. Queries | registration resource of the endpoint that registered it. Queries | |||
| for resource link targets MUST be in URI form (i.e. not relative | for resource link targets MUST be in URI form (i.e., not relative | |||
| references) and are matched against a resolved link target. Queries | references) and are matched against a resolved link target. Queries | |||
| for endpoints SHOULD be expressed in path-absolute form if possible | for endpoints SHOULD be expressed in path-absolute form if possible | |||
| and MUST be expressed in URI form otherwise; the RD SHOULD recognize | and MUST be expressed in URI form otherwise; the RD SHOULD recognize | |||
| either. The "anchor" attribute is usable for resource lookups, and, | either. The anchor attribute is usable for resource lookups and, if | |||
| if queried, MUST be in URI form as well. | queried, MUST be in URI form as well. | |||
| Additional query parameters "page" and "count" are used to obtain | Additional query parameters "page" and "count" are used to obtain | |||
| lookup results in specified increments using pagination, where count | lookup results in specified increments using pagination, where count | |||
| specifies how many links to return and page specifies which subset of | specifies how many links to return and page specifies which subset of | |||
| links organized in sequential pages, each containing 'count' links, | links organized in sequential pages, each containing 'count' links, | |||
| starting with link zero and page zero. Thus, specifying count of 10 | starting with link zero and page zero. Thus, specifying a count of | |||
| and page of 0 will return the first 10 links in the result set (links | 10 and page of 0 will return the first 10 links in the result set | |||
| 0-9). Count = 10 and page = 1 will return the next 'page' containing | (links 0-9). Specifying a count of 10 and page of 1 will return the | |||
| links 10-19, and so on. Unlike block-wise transfer of a compelte | next 'page' containing links 10-19, and so on. Unlike block-wise | |||
| result set, these parameters ensure that each chunk of results can be | transfer of a complete result set, these parameters ensure that each | |||
| interpreted on its own. This simplifies the processing, but can | chunk of results can be interpreted on its own. This simplifies the | |||
| result in duplicate or missed items when coinciding with changes from | processing but can result in duplicate or missed items when | |||
| the registration interface. | coinciding with changes from the registration interface. | |||
| Endpoints that are interested in a lookup result repeatedly or | Endpoints that are interested in a lookup result repeatedly or | |||
| continuously can use mechanisms like ETag caching, resource | continuously can use mechanisms such as ETag caching, resource | |||
| observation ([RFC7641]), or any future mechanism that might allow | observation [RFC7641], or any future mechanism that might allow more | |||
| more efficient observations of collections. These are advertised, | efficient observations of collections. These are advertised, | |||
| detected and used according to their own specifications and can be | detected, and used according to their own specifications and can be | |||
| used with the lookup interface as with any other resource. | used with the lookup interface as with any other resource. | |||
| When resource observation is used, every time the set of matching | When resource observation is used, every time the set of matching | |||
| links changes, or the content of a matching link changes, the RD | links changes or the content of a matching link changes, the RD sends | |||
| sends a notification with the matching link set. The notification | a notification with the matching link set. The notification contains | |||
| contains the successful current response to the given request, | the successful current response to the given request, especially with | |||
| especially with respect to representing zero matching links (see | respect to representing zero matching links (see "Success" item | |||
| "Success" item below). | below). | |||
| The lookup interface is specified as follows: | The lookup interface is specified as follows: | |||
| Interaction: Client -> RD | Interaction: Client -> RD | |||
| Method: GET | Method: GET | |||
| URI Template: {+type-lookup-location}{?page,count,search*} | URI Template: {+type-lookup-location}{?page,count,search*} | |||
| URI Template Variables: type-lookup-location := RD Lookup URI for a | URI Template Variables: | |||
| 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 | type-lookup-location := RD lookup URI for a given lookup type | |||
| form-style query as per the URI template (see [RFC6570] | (mandatory). The address is discovered as described in | |||
| Sections 2.4.2 and 3.2.8) | Section 4.3. | |||
| page := Page (optional). Parameter cannot | search := Search criteria for limiting the number of results | |||
| be used without the count parameter. Results are returned from | (optional). The search criteria are an associative array, | |||
| result set in pages that contain 'count' links starting from | expressed in a form-style query, as per the URI Template (see | |||
| index (page * count). Page numbering starts with zero. | [RFC6570], Sections 2.4.2 and 3.2.8). | |||
| count := Count (optional). Number of | 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. | ||||
| results is limited to this parameter value. If the page | count := Count (optional). The number of results is limited to | |||
| parameter is also present, the response MUST only include | this parameter value. If the page parameter is also present, | |||
| 'count' links starting with the (page * count) link in the | the response MUST only include 'count' links starting with the | |||
| result set from the query. If the count parameter is not | (page * count) link in the result set from the query. If the | |||
| present, then the response MUST return all matching links in | count parameter is not present, then the response MUST return | |||
| the result set. Link numbering starts with zero. | all matching links in the result set. Link numbering starts | |||
| with zero. | ||||
| Accept: absent, application/link-format or any other indicated media | Accept: absent, application/link-format, or any other indicated | |||
| type representing web links | media type representing web links | |||
| The following responses codes are defined for this interface: | The following responses codes are defined for this interface: | |||
| Success: 2.05 "Content" or 200 "OK" with an "application/link- | Success: 2.05 (Content) or 200 (OK) with an application/link-format | |||
| format" or other web link payload containing matching entries for | or other web link payload containing matching entries for the | |||
| the lookup. | lookup. | |||
| The payload can contain zero links (which is an empty payload in | The payload can contain zero links (which is an empty payload in | |||
| [RFC6690] link format, but could also be "[]" in JSON based | the link format described in [RFC6690] but could also be [] in | |||
| formats), indicating that no entities matched the request. | JSON-based formats), indicating that no entities matched the | |||
| request. | ||||
| 6.3. Resource lookup examples | 6.3. Resource Lookup Examples | |||
| The examples in this section assume the existence of CoAP hosts with | 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 | a default CoAP port 61616. HTTP hosts are possible and do not change | |||
| the nature of the examples. | the nature of the examples. | |||
| The following example shows a client performing a resource lookup | The following example shows a client performing a resource lookup | |||
| with the example resource look-up locations discovered in Figure 5: | with the example resource lookup locations discovered in Figure 5: | |||
| Req: GET /rd-lookup/res?rt=tag:example.org,2020:temperature | Req: GET /rd-lookup/res?rt=tag:example.org,2020:temperature | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://[2001:db8:3::123]:61616/temp>; | <coap://[2001:db8:3::123]:61616/temp>; | |||
| rt="tag:example.org,2020:temperature" | rt="tag:example.org,2020:temperature" | |||
| Figure 19: Example a resource lookup | Figure 19: Example of a Resource Lookup | |||
| A client that wants to be notified of new resources as they show up | A client that wants to be notified of new resources as they show up | |||
| can use observation: | can use this observation: | |||
| Req: GET /rd-lookup/res?rt=tag:example.org,2020:light | Req: GET /rd-lookup/res?rt=tag:example.org,2020:light | |||
| Observe: 0 | Observe: 0 | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Observe: 23 | Observe: 23 | |||
| Payload: empty | Payload: empty | |||
| (at a later point in time) | (at a later point in time) | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Observe: 24 | Observe: 24 | |||
| Payload: | Payload: | |||
| <coap://[2001:db8:3::124]/west>;rt="tag:example.org,2020:light", | <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]/south>;rt="tag:example.org,2020:light", | |||
| <coap://[2001:db8:3::124]/east>;rt="tag:example.org,2020:light" | <coap://[2001:db8:3::124]/east>;rt="tag:example.org,2020:light" | |||
| Figure 20: Example an observing resource lookup | Figure 20: Example of an Observing Resource Lookup | |||
| The following example shows a client performing a paginated resource | The following example shows a client performing a paginated resource | |||
| lookup | lookup: | |||
| Req: GET /rd-lookup/res?page=0&count=5 | Req: GET /rd-lookup/res?page=0&count=5 | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://[2001:db8:3::123]:61616/res/0>;ct=60, | <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/1>;ct=60, | |||
| <coap://[2001:db8:3::123]:61616/res/2>;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/3>;ct=60, | |||
| <coap://[2001:db8:3::123]:61616/res/4>;ct=60 | <coap://[2001:db8:3::123]:61616/res/4>;ct=60 | |||
| skipping to change at page 41, line 46 ¶ | skipping to change at line 1872 ¶ | |||
| Req: GET /rd-lookup/res?page=1&count=5 | Req: GET /rd-lookup/res?page=1&count=5 | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://[2001:db8:3::123]:61616/res/5>;ct=60, | <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/6>;ct=60, | |||
| <coap://[2001:db8:3::123]:61616/res/7>;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/8>;ct=60, | |||
| <coap://[2001:db8:3::123]:61616/res/9>;ct=60 | <coap://[2001:db8:3::123]:61616/res/9>;ct=60 | |||
| Figure 21: Examples of paginated resource lookup | Figure 21: Example of Paginated Resource Lookup | |||
| The following example shows a client performing a lookup of all | The following example shows a client performing a lookup of all | |||
| resources of all endpoints of a given endpoint type. It assumes that | resources of all endpoints of a given endpoint type. It assumes that | |||
| two endpoints (with endpoint names "sensor1" and "sensor2") have | two endpoints (with endpoint names sensor1 and sensor2) have | |||
| previously registered with their respective addresses | previously registered with their respective addresses | |||
| "coap://sensor1.example.com" and "coap://sensor2.example.com", and | (coap://sensor1.example.com and coap://sensor2.example.com) and | |||
| posted the very payload of the 6th response of section 5 of | posted the very payload of the 6th response of Section 5 of | |||
| [RFC6690]. | [RFC6690]. | |||
| It demonstrates how absolute link targets stay unmodified, while | It demonstrates how absolute link targets stay unmodified, while | |||
| relative ones are resolved: | relative ones are resolved: | |||
| Req: GET /rd-lookup/res?et=tag:example.com,2020:platform | Req: GET /rd-lookup/res?et=tag:example.com,2020:platform | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://sensor1.example.com/sensors>;ct=40;title="Sensor Index", | <coap://sensor1.example.com/sensors>;ct=40;title="Sensor Index", | |||
| skipping to change at page 42, line 35 ¶ | skipping to change at line 1904 ¶ | |||
| <coap://sensor1.example.com/t>;rel=alternate; | <coap://sensor1.example.com/t>;rel=alternate; | |||
| anchor="coap://sensor1.example.com/sensors/temp", | anchor="coap://sensor1.example.com/sensors/temp", | |||
| <coap://sensor2.example.com/sensors>;ct=40;title="Sensor Index", | <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/temp>;rt=temperature-c;if=sensor, | |||
| <coap://sensor2.example.com/sensors/light>;rt=light-lux;if=sensor, | <coap://sensor2.example.com/sensors/light>;rt=light-lux;if=sensor, | |||
| <http://www.example.com/sensors/t123>;rel=describedby; | <http://www.example.com/sensors/t123>;rel=describedby; | |||
| anchor="coap://sensor2.example.com/sensors/temp", | anchor="coap://sensor2.example.com/sensors/temp", | |||
| <coap://sensor2.example.com/t>;rel=alternate; | <coap://sensor2.example.com/t>;rel=alternate; | |||
| anchor="coap://sensor2.example.com/sensors/temp" | anchor="coap://sensor2.example.com/sensors/temp" | |||
| Figure 22: Example of resource lookup from multiple endpoints | Figure 22: Example of a Resource Lookup from Multiple Endpoints | |||
| 6.4. Endpoint lookup | 6.4. Endpoint Lookup | |||
| The endpoint lookup returns links to and information about | The endpoint lookup returns links to and information about | |||
| registration resources, which themselves can only be manipulated by | registration resources, which themselves can only be manipulated by | |||
| the registering endpoint. | the registering endpoint. | |||
| Endpoint registration resources are annotated with their endpoint | Endpoint registration resources are annotated with their endpoint | |||
| names (ep), sectors (d, if present) and registration base URI (base; | names (ep), sectors (d, if present), and registration base URI (base; | |||
| reports the registrant-ep's address if no explicit base was given) as | reports the registrant-EP's address if no explicit base was given), | |||
| well as a constant resource type (rt="core.rd-ep"); the lifetime (lt) | as well as a constant resource type (rt="core.rd-ep"); the lifetime | |||
| is not reported. Additional endpoint attributes are added as target | (lt) is not reported. Additional endpoint attributes are added as | |||
| attributes to their endpoint link unless their specification says | target attributes to their endpoint link unless their specification | |||
| otherwise. | says otherwise. | |||
| Links to endpoints SHOULD be presented in path-absolute form or, if | Links to endpoints SHOULD be presented in path-absolute form or, if | |||
| required, as (full) URIs. (This ensures that the output conforms to | required, as (full) URIs. (This ensures that the output conforms to | |||
| Limited Link Format as described in Appendix C.) | Limited Link Format, as described in Appendix C.) | |||
| Base addresses that contain link-local addresses MUST NOT include | Base addresses that contain link-local addresses MUST NOT include | |||
| zone identifiers, and such registrations MUST NOT be shown unless the | zone identifiers, and such registrations MUST NOT be shown unless the | |||
| lookup was made from the same link from which the registration was | lookup was made from the same link from which the registration was | |||
| made. | made. | |||
| While Endpoint Lookup does expose the registration resources, the RD | While the endpoint lookup does expose the registration resources, the | |||
| does not need to make them accessible to clients. Clients SHOULD NOT | RD does not need to make them accessible to clients. Clients SHOULD | |||
| attempt to dereference or manipulate them. | NOT attempt to dereference or manipulate them. | |||
| An RD can report registrations in lookup whose URI scheme and | An RD can report registrations in lookup whose URI scheme and | |||
| authority differ from the lookup resource's. Lookup clients MUST be | authority differ from that of the lookup resource. Lookup clients | |||
| prepared to see arbitrary URIs as registration resources in the | MUST be prepared to see arbitrary URIs as registration resources in | |||
| results and treat them as opaque identifiers; the precise semantics | the results and treat them as opaque identifiers; the precise | |||
| of such links are left to future specifications. | semantics of such links are left to future specifications. | |||
| The following example shows a client performing an endpoint lookup | The following example shows a client performing an endpoint lookup | |||
| limited to endpoints of endpoint type | that is limited to endpoints of endpoint type | |||
| "tag:example.com,2020:platform": | tag:example.com,2020:platform: | |||
| Req: GET /rd-lookup/ep?et=tag:example.com,2020:platform | Req: GET /rd-lookup/ep?et=tag:example.com,2020:platform | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| </rd/1234>;base="coap://[2001:db8:3::127]:61616";ep=node5; | </rd/1234>;base="coap://[2001:db8:3::127]:61616";ep=node5; | |||
| et="tag:example.com,2020:platform";ct=40;rt=core.rd-ep, | et="tag:example.com,2020:platform";ct=40;rt=core.rd-ep, | |||
| </rd/4521>;base="coap://[2001:db8:3::129]:61616";ep=node7; | </rd/4521>;base="coap://[2001:db8:3::129]:61616";ep=node7; | |||
| et="tag:example.com,2020:platform";ct=40;d=floor-3; | et="tag:example.com,2020:platform";ct=40;d=floor-3; | |||
| rt=core.rd-ep | rt=core.rd-ep | |||
| Figure 23: Examples of endpoint lookup | Figure 23: Example of Endpoint Lookup | |||
| 7. Security policies | 7. Security Policies | |||
| The security policies that are applicable to an RD strongly depend on | The security policies that are applicable to an RD strongly depend on | |||
| the application, and are not set out normatively here. | the application and are not set out normatively here. | |||
| This section provides a list of aspects that applications should | This section provides a list of aspects that applications should | |||
| consider when describing their use of the RD, without claiming to | consider when describing their use of the RD, without claiming to | |||
| cover all cases. It is using terminology of | cover all cases. It uses terminology of [ACE-OAUTH-AUTHZ], in which | |||
| [I-D.ietf-ace-oauth-authz], in which the RD acts as the Resource | the RD acts as the Resource Server (RS), and both registrant-EPs and | |||
| Server (RS), and both registrant-eps and lookup clients act as | lookup clients act as Clients (C) with support from an Authorization | |||
| Clients (C) with support from an Authorization Server (AS), without | Server (AS), without the intention of ruling out other schemes (e.g., | |||
| the intention of ruling out other (e.g. certificate / public-key | those based on certificates/Public Key Infrastructures (PKIs)). | |||
| infrastructure (PKI) based) schemes. | ||||
| Any, all or none of the below can apply to an application. Which are | Any, all, or none of the below can apply to an application. Which | |||
| relevant depends on its protection objectives. | are relevant depends on its protection objectives. | |||
| Security policies are set by configuration of the RD, or by choice of | Security policies are set by configuration of the RD or by choice of | |||
| the implementation. Lookup clients (and, where relevant, endpoints) | the implementation. Lookup clients (and, where relevant, endpoints) | |||
| can only trust an RD to uphold them if it is authenticated, and | can only trust an RD to uphold them if it is authenticated and | |||
| authorized to serve as an RD according to the application's | authorized to serve as an RD according to the application's | |||
| requirements. | requirements. | |||
| 7.1. Endpoint name | 7.1. Endpoint Name | |||
| Whenever an RD needs to provide trustworthy results to clients doing | Whenever an RD needs to provide trustworthy results to clients doing | |||
| endpoint lookup, or resource lookup with filtering on the endpoint | endpoint lookup or resource lookup with filtering on the endpoint | |||
| name, the RD must ensure that the registrant is authorized to use the | name, the RD must ensure that the registrant is authorized to use the | |||
| given endpoint name. This applies both to registration and later to | given endpoint name. This applies both to registration and later to | |||
| operations on the registration resource. It is immaterial whether | operations on the registration resource. It is immaterial whether | |||
| the client is the registrant-ep itself or a CT is doing the | the client is the registrant-EP itself or a CT is doing the | |||
| registration: The RD cannot tell the difference, and CTs may use | registration. The RD cannot tell the difference, and CTs may use | |||
| authorization credentials authorizing only operations on that | authorization credentials authorizing only operations on that | |||
| particular endpoint name, or a wider range of endpoint names. | particular endpoint name or a wider range of endpoint names. | |||
| It is up to the concrete security policy to describe how endpoint | It is up to the concrete security policy to describe how the endpoint | |||
| name and sector are transported when certificates are used. For | name and sector are transported when certificates are used. For | |||
| example, it may describe how SubjectAltName dNSName entries are | example, it may describe how SubjectAltName dNSName entries are | |||
| mapped to endpoint and domain names. | mapped to endpoint and domain names. | |||
| 7.1.1. Random endpoint names | 7.1.1. Random Endpoint Names | |||
| Conversely, in applications where the RD does not check the endpoint | Conversely, in applications where the RD does not check the endpoint | |||
| name, the authorized registering endpoint can generate a random | name, the authorized registering endpoint can generate a random | |||
| number (or string) that identifies the endpoint. The RD should then | number (or string) that identifies the endpoint. The RD should then | |||
| remember unique properties of the registrant, associate them with the | remember unique properties of the registrant, associate them with the | |||
| registration for as long as its registration resource is active | registration for as long as its registration resource is active | |||
| (which may be longer than the registration's lifetime), and require | (which may be longer than the registration's lifetime), and require | |||
| the same properties for operations on the registration resource. | the same properties for operations on the registration resource. | |||
| Registrants that are prepared to pick a different identifier when | Registrants that are prepared to pick a different identifier when | |||
| their initial attempt (or attempts, in the unlikely case of two | their initial attempt (or attempts, in the unlikely case of two | |||
| subsequent collisions) at registration is unauthorized should pick an | subsequent collisions) at registration is unauthorized should pick an | |||
| identifier at least twice as long as the expected number of | identifier at least twice as long as would be needed to enumerate the | |||
| registrants; registrants without such a recovery options should pick | expected number of registrants; registrants without any such recovery | |||
| significantly longer endpoint names (e.g. using UUID URNs [RFC4122]). | options should pick significantly longer endpoint names (e.g., using | |||
| Universally Unique Identifier (UUID) URNs [RFC4122]). | ||||
| 7.2. Entered resources | 7.2. Entered Links | |||
| When lookup clients expect that certain types of links can only | When lookup clients expect that certain types of links can only | |||
| originate from certain endpoints, then the RD needs to apply | originate from certain endpoints, then the RD needs to apply | |||
| filtering to the links an endpoint may register. | filtering to the links an endpoint may register. | |||
| For example, if clients use an RD to find a server that provides | For example, if clients use an RD to find a server that provides | |||
| firmware updates, then any registrant that wants to register (or | firmware updates, then any registrant that wants to register (or | |||
| update) links to firmware sources will need to provide suitable | update) links to firmware sources will need to provide suitable | |||
| credentials to do so, independently of its endpoint name. | credentials to do so, independently of its endpoint name. | |||
| Note that the impact of having undesirable links in the RD depends on | Note that the impact of having undesirable links in the RD depends on | |||
| the application: if the client requires the firmware server to | the application. If the client requires the firmware server to | |||
| present credentials as a firmware server, a fraudulent link's impact | present credentials as a firmware server, a fraudulent link's impact | |||
| is limited to the client revealing its intention to obtain updates | is limited to the client revealing its intention to obtain updates | |||
| and slowing down the client until it finds a legitimate firmware | and slowing down the client until it finds a legitimate firmware | |||
| server; if the client accepts any credentials from the server as long | server; if the client accepts any credentials from the server as long | |||
| as they fit the provided URI, the impact is larger. | as they fit the provided URI, the impact is larger. | |||
| An RD may also require that links are only registered if the | An RD may also require that links are only registered if the | |||
| registrant is authorized to publish information about the anchor (or | 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 | even target) of the link. One way to do this is to demand that the | |||
| registrant present the same credentials as a client that they'd need | registrant present the same credentials in its role as a registering | |||
| to present if contacted as a server at the resources' URI, which may | client that it would need to present in its role as a server when | |||
| include using the address and port that are part of the URI. Such a | contacted at the resources' URI. These credentials may include using | |||
| restriction places severe practical limitations on the links that can | the address and port that are part of the URI. Such a restriction | |||
| be registered. | places severe practical limitations on the links that can be | |||
| registered. | ||||
| As above, the impact of undesirable links depends on the extent to | As above, the impact of undesirable links depends on the extent to | |||
| which the lookup client relies on the RD. To avoid the limitations, | which the lookup client relies on the RD. To avoid the limitations, | |||
| RD applications should consider prescribing that lookup clients only | RD applications should consider prescribing that lookup clients only | |||
| use the discovered information as hints, and describe which pieces of | use the discovered information as hints and describe which pieces of | |||
| information need to be verified because they impact the application's | information need to be verified because they impact the application's | |||
| security. A straightforward way to verify such information is to | security. A straightforward way to verify such information is to | |||
| request it again from an authorized server, typically the one that | request it again from an authorized server, typically the one that | |||
| hosts the target resource. That similar to what happens in | hosts the target resource. That is similar to what happens in | |||
| Section 4.3 when the URI discovery step is repeated. | Section 4.3 when the "URI discovery" step is repeated. | |||
| 7.3. Link confidentiality | 7.3. Link Confidentiality | |||
| When registrants publish information in the RD that is not available | When registrants publish information in the RD that is not available | |||
| to any client that would query the registrant's /.well-known/core | to any client that would query the registrant's /.well-known/core | |||
| interface, or when lookups to that interface are subject so stricter | interface, or when lookups to that interface are subject to stricter | |||
| firewalling than lookups to the RD, the RD may need to limit which | firewalling than lookups to the RD, the RD may need to limit which | |||
| lookup clients may access the information. | lookup clients may access the information. | |||
| In this case, the endpoint (and not the lookup clients) needs to be | 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 | careful to check the RD's authorization. The RD needs to check any | |||
| lookup client's authorization before revealing information directly | lookup client's authorization before revealing information directly | |||
| (in resource lookup) or indirectly (when using it to satisfy a | (in resource lookup) or indirectly (when using it to satisfy a | |||
| resource lookup search criterion). | resource lookup search criterion). | |||
| 7.4. Segmentation | 7.4. Segmentation | |||
| skipping to change at page 46, line 20 ¶ | skipping to change at line 2080 ¶ | |||
| sector (d) parameter. Some sectors might apply limitations on the | sector (d) parameter. Some sectors might apply limitations on the | |||
| endpoint names available, while others use a random identifier | endpoint names available, while others use a random identifier | |||
| approach to endpoint names and place limits on the entered links | approach to endpoint names and place limits on the entered links | |||
| based on their attributes instead. | based on their attributes instead. | |||
| Care must be taken in such setups to determine the applicable access | 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 | 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 | mandate the use of the sector parameter on all operations, as no | |||
| credentials are suitable for operations across sector borders anyway. | credentials are suitable for operations across sector borders anyway. | |||
| 7.5. First-Come-First-Remembered: A default policy | 7.5. "First Come First Remembered": A Default Policy | |||
| The First-Come-First-Remembered policy is provided both as a | The "First Come First Remembered" policy is provided both as a | |||
| reference example for a security policy definition, and as a policy | reference example for a security policy definition and as a policy | |||
| that implementations may choose to use as default policy in absence | that implementations may choose to use as default policy in the | |||
| of other configuration. It is designed to enable efficient discovery | absence of any other configuration. It is designed to enable | |||
| operations even in ad-hoc settings. | efficient discovery operations even in ad hoc settings. | |||
| Under this policy, the RD accepts registrations for any endpoint name | Under this policy, the RD accepts registrations for any endpoint name | |||
| that is not assigned to an active registration resource, and only | that is not assigned to an active registration resource and only | |||
| accepts registration updates from the same endpoint. The policy is | accepts registration updates from the same endpoint. The policy is | |||
| minimal in that towards lookup clients it does not make any of the | minimal in that it does not make any promises to lookup clients about | |||
| claims of Section 7.2 and Section 7.3, and its claims on Section 7.1 | the claims of Sections 7.2 and 7.3, and promises about the claims in | |||
| are limited to the lifetime of that endpoint's registration. It | Section 7.1 are limited to the lifetime of that endpoint's | |||
| does, however, guarantee towards any endpoint that for the duration | registration. It does however promise the endpoint that, for the | |||
| of its registration, its links will be discoverable on the RD. | duration of its registration, its links will be discoverable on the | |||
| RD. | ||||
| When a registration or operation is attempted, the RD MUST determine | When a registration or operation is attempted, the RD MUST determine | |||
| the client's subject name or public key: | the client's subject name or public key: | |||
| * If the client's credentials indicate any subject name that is | * If the client's credentials indicate any subject name that is | |||
| certified by any authority which the RD recognizes (which may be | certified by any authority that the RD recognizes (which may be | |||
| the system's trust anchor store), all such subject names are | the system's trust anchor store), all such subject names are | |||
| stored. With CWT or JWT based credentials (as common with ACE), | stored. With credentials based on CWT or JWT (as common with | |||
| the Subject (sub) claim is stored as a single name, if it exists. | Authentication and Authorization for Constrained Environments | |||
| With X.509 certificates, the Common Name (CN) and the complete | (ACE)), the Subject (sub) claim is stored as a single name, if it | |||
| list of SubjectAltName entries are stored. In both cases, the | exists. With X.509 certificates, the Common Name (CN) and the | |||
| authority that certified the claim is stored along with the | complete list of SubjectAltName entries are stored. In both | |||
| subject, as the latter may only be locally unique. | 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 | * Otherwise, if the client proves possession of a private key, the | |||
| matching public key is stored. This applies both to raw public | matching public key is stored. This applies both to raw public | |||
| keys and to the public keys indicated in certificates that failed | keys and to the public keys indicated in certificates that failed | |||
| the above authority check. | the above authority check. | |||
| * If neither is present, a reference to the security session itself | * If neither is present, a reference to the security session itself | |||
| is stored. With (D)TLS, that is the connection itself, or the | is stored. With (D)TLS, that is the connection itself or the | |||
| session resumption information if available. With OSCORE, that is | session resumption information, if available. With OSCORE, that | |||
| the security context. | is the security context. | |||
| As part of the registration operation, that information is stored | As part of the registration operation, that information is stored | |||
| along with the registration resource. | along with the registration resource. | |||
| The RD MUST accept all registrations whose registration resource is | The RD MUST accept all registrations whose registration resource is | |||
| not already active, as long as they are made using a security layer | not already active, as long as they are made using a security layer | |||
| supported by the RD. | supported by the RD. | |||
| Any operation on a registration resource, including registrations | Any operation on a registration resource, including registrations | |||
| that lead to an existing registration resource, MUST be rejected by | that lead to an existing registration resource, MUST be rejected by | |||
| the RD unless all the stored information is found in the new | the RD unless all the stored information is found in the new | |||
| request's credentials. | request's credentials. | |||
| Note that even though subject names are compared in this policy, they | Note that, even though subject names are compared in this policy, | |||
| are never directly compared to endpoint names, and an endpoint can | they are never directly compared to endpoint names, and an endpoint | |||
| not expect to "own" any particular endpoint name outside of an active | cannot expect to "own" any particular endpoint name outside of an | |||
| registration -- even if a certificate says so. It is an accepted | active registration -- even if a certificate says so. It is an | |||
| shortcoming of this approach that the endpoint has no indication of | accepted shortcoming of this approach that the endpoint has no | |||
| whether the RD remembers it by its subject name or public key; | indication of whether the RD remembers it by its subject name or | |||
| recognition by subject happens on a best-effort base (given the RD | public key; recognition by subject happens on a best-effort basis | |||
| may not recognize any authority). Clients MUST be prepared to pick a | (given the RD may not recognize any authority). Clients MUST be | |||
| different endpoint name when rejected by the RD initially or after a | prepared to pick a different endpoint name when rejected by the RD | |||
| change in their credentials; picking an endpoint name as per | initially or after a change in their credentials; picking an endpoint | |||
| Section 7.1.1 is an easy option for that. | name, as per Section 7.1.1, is an easy option for that. | |||
| For this policy to be usable without configuration, clients should | For this policy to be usable without configuration, clients should | |||
| not set a sector name in their registrations. An RD can set a | not set a sector name in their registrations. An RD can set a | |||
| default sector name for registrations accepted under this policy, | default sector name for registrations accepted under this policy, | |||
| which is useful especially in a segmented setup where different | which is especially useful in a segmented setup where different | |||
| policies apply to different sectors. The configuration of such a | policies apply to different sectors. The configuration of such a | |||
| behavior, as well as any other configuration applicable to such an RD | 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 | (i.e., the set of recognized authorities), is out of scope for this | |||
| document. | document. | |||
| 8. Security Considerations | 8. Security Considerations | |||
| The security considerations as described in Section 5 of [RFC8288] | The security considerations as described in Section 5 of [RFC8288] | |||
| and Section 6 of [RFC6690] apply. The "/.well-known/core" resource | and Section 6 of [RFC6690] apply. The /.well-known/core resource may | |||
| may be protected e.g. using DTLS when hosted on a CoAP server as | be protected, e.g., using DTLS when hosted on a CoAP server, as | |||
| described in [RFC7252]. | described in [RFC7252]. | |||
| Access that is limited or affects sensitive data SHOULD be protected, | 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 | e.g., using (D)TLS or OSCORE [RFC8613]; which aspects of the RD this | |||
| affects depends on the security policies of the application (see | affects depends on the security policies of the application (see | |||
| Section 7). | Section 7). | |||
| 8.1. Discovery | 8.1. Discovery | |||
| Most steps in discovery of the RD, and possibly its resources, are | Most steps in discovery of the RD, and possibly its resources, are | |||
| not covered by CoAP's security mechanisms. This will not endanger | not covered by CoAP's security mechanisms. This will not endanger | |||
| the security properties of the registrations and lookup itself (where | the security properties of the registrations and lookup itself (where | |||
| the client requires authorization of the RD if it expects any | the client requires authorization of the RD if it expects any | |||
| security properties of the operation), but may leak the client's | security properties of the operation) but may leak the client's | |||
| intention to third parties, and allow them to slow down the process. | intention to third parties and allow them to slow down the process. | |||
| To mitigate that, clients can retain the RD's address, use secure | To mitigate that, clients can retain the RD's address, use secure | |||
| discovery options like configured addresses, and send queries for RDs | discovery options (such as configured addresses), and send queries | |||
| in a very general form ("?rt=core.rd*" rather than "?rt=core.rd- | for RDs in a very general form (e.g., ?rt=core.rd* rather than | |||
| lookup-ep"). | ?rt=core.rd-lookup-ep). | |||
| 8.2. Endpoint Identification and Authentication | 8.2. Endpoint Identification and Authentication | |||
| An Endpoint (name, sector) pair is unique within the set of endpoints | An endpoint (name, sector) pair is unique within the set of endpoints | |||
| registered by the RD. An Endpoint MUST NOT be identified by its | 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 | protocol, port, or IP address, as these may change over the lifetime | |||
| an Endpoint. | of an endpoint. | |||
| Every operation performed by an Endpoint on an RD SHOULD be mutually | Every operation performed by an endpoint on an RD SHOULD be mutually | |||
| authenticated using Pre-Shared Key, Raw Public Key or Certificate | authenticated using a pre-shared key, a raw public key, or | |||
| based security. | certificate-based security. | |||
| Consider the following threat: two devices A and B are registered at | Consider the following threat: two devices, A and B, are registered | |||
| a single server. Both devices have unique, per-device credentials | at a single server. Both devices have unique, per-device credentials | |||
| for use with DTLS to make sure that only parties with authorization | for use with DTLS to make sure that only parties with authorization | |||
| to access A or B can do so. | to access A or B can do so. | |||
| Now, imagine that a malicious device A wants to sabotage the device | Now, imagine that a malicious device A wants to sabotage the device | |||
| B. It uses its credentials during the DTLS exchange. Then, it | B. It uses its credentials during the DTLS exchange. Then, it | |||
| specifies the endpoint name of device B as the name of its own | 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 | endpoint in device A. If the server does not check whether the | |||
| identifier provided in the DTLS handshake matches the identifier used | identifier provided in the DTLS handshake matches the identifier used | |||
| at the CoAP layer then it may be inclined to use the endpoint name | 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. | for looking up what information to provision to the malicious device. | |||
| Endpoint authorization needs to be checked on registration and | Endpoint authorization needs to be checked on registration and | |||
| registration resource operations independently of whether there are | registration resource operations independently of whether there are | |||
| configured requirements on the credentials for a given endpoint name | configured requirements on the credentials for a given endpoint name | |||
| (and sector; Section 7.1) or whether arbitrary names are accepted | and sector (Section 7.1) or whether arbitrary names are accepted | |||
| (Section 7.1.1). | (Section 7.1.1). | |||
| Simple registration could be used to circumvent address-based access | Simple registration could be used to circumvent address-based access | |||
| control: An attacker would send a simple registration request with | control. An attacker would send a simple registration request with | |||
| the victim's address as source address, and later look up the | 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 | victim's /.well-known/core content in the RD. Mitigation for this is | |||
| recommended in Section 5.1. | recommended in Section 5.1. | |||
| The registration resource path is visible to any client that is | The registration resource path is visible to any client that is | |||
| allowed endpoint lookup, and can be extracted by resource lookup | allowed endpoint lookup and can be extracted by resource lookup | |||
| clients as well. The same goes for registration attributes that are | clients as well. The same goes for registration attributes that are | |||
| shown as target attributes or lookup attributes. The RD needs to | shown as target attributes or lookup attributes. The RD needs to | |||
| consider this in the choice of registration resource paths, and | consider this in the choice of registration resource paths, as do | |||
| administrators or endpoint in their choice of attributes. | administrators or endpoints in their choice of attributes. | |||
| 8.3. Access Control | 8.3. Access Control | |||
| Access control SHOULD be performed separately for the RD registration | Access control SHOULD be performed separately for the RD registration | |||
| and Lookup API paths, as different endpoints may be authorized to | and lookup API paths, as different endpoints may be authorized to | |||
| register with an RD from those authorized to lookup endpoints from | 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 | the RD. Such access control SHOULD be performed in as fine-grained a | |||
| level as possible. For example access control for lookups could be | level as possible. For example, access control for lookups could be | |||
| performed either at the sector, endpoint or resource level. | performed either at the sector, endpoint, or resource level. | |||
| The precise access controls necessary (and the consequences of | The precise access controls necessary (and the consequences of | |||
| failure to enforce them) depend on the protection objectives of the | failure to enforce them) depend on the protection objectives of the | |||
| application and the security policies (Section 7) derived from them. | application and the security policies (Section 7) derived from them. | |||
| 8.4. Denial of Service Attacks | 8.4. Denial-of-Service Attacks | |||
| Services that run over UDP unprotected are vulnerable to unknowingly | Services that run over UDP unprotected are vulnerable to unknowingly | |||
| amplify and distribute a DoS attack as UDP does not require return | amplify and distribute a DoS attack, as UDP does not require a return | |||
| routability check. Since RD lookup responses can be significantly | routability check. Since RD lookup responses can be significantly | |||
| larger than requests, RDs are prone to this. | larger than requests, RDs are prone to this. | |||
| [RFC7252] describes this at length in its Section 11.3, including | [RFC7252] describes this at length in its Section 11.3, including | |||
| some mitigation by using small block sizes in responses. The | some mitigation by using small block sizes in responses. [RFC9175] | |||
| upcoming [I-D.ietf-core-echo-request-tag] updates that by describing | updates that by describing a source address verification mechanism | |||
| a source address verification mechanism using the Echo option. | using the Echo option. | |||
| [ If this document is published together with or after I-D.ietf-core- | ||||
| echo-request-tag, the above paragraph is replaced with the following: | ||||
| [RFC7252] describes this at length in its Section 11.3, and | ||||
| [I-D.ietf-core-echo-request-tag] (which updates the former) | ||||
| recommends using the Echo option to verify the request's source | ||||
| address. | ||||
| ] | ||||
| 8.5. Skipping freshness checks | 8.5. Skipping Freshness Checks | |||
| When RD based applications are built in which request freshness | When RD-based applications are built in which request freshness | |||
| checks are not performed, these concerns need to be balanced: | checks are not performed, these concerns need to be balanced: | |||
| * When alterations to registration attributes are reordered, an | * When alterations to registration attributes are reordered, an | |||
| attacker may create any combination of attributes ever set, with | attacker may create any combination of attributes ever set, with | |||
| the attack difficulty determined by the security layer's replay | the attack difficulty determined by the security layer's replay | |||
| properties. | properties. | |||
| For example, if Figure 18 were conducted without freshness | For example, if Figure 18 were conducted without freshness | |||
| assurances, an attacker could later reset the lifetime back to | assurances, an attacker could later reset the lifetime back to | |||
| 7200. Thus, the device is made unreachable to lookup clients. | 7200. Thus, the device is made unreachable to lookup clients. | |||
| * When registration updates without query parameters (which just | * When registration updates without query parameters (which just | |||
| serve to restart the lifetime) can be reordered, an attacker can | serve to restart the lifetime) can be reordered, an attacker can | |||
| use intercepted messages to give the appearance of the device | use intercepted messages to give the appearance of the device | |||
| being alive to the RD. | being alive to the RD. | |||
| This is unacceptable when when the RD's security policy promises | This is unacceptable when the RD's security policy promises | |||
| reachability of endpoints (e.g. when disappearing devices would | reachability of endpoints (e.g., when disappearing devices would | |||
| trigger further investigation), but may be acceptable with other | trigger further investigation) but may be acceptable with other | |||
| policies. | policies. | |||
| 9. IANA Considerations | 9. IANA Considerations | |||
| 9.1. Resource Types | 9.1. Resource Types | |||
| IANA is asked to enter the following values into the Resource Type | IANA has added the following values to the "Resource Type (rt=) Link | |||
| (rt=) Link Target Attribute Values sub-registry of the Constrained | Target Attribute Values" subregistry of the "Constrained RESTful | |||
| Restful Environments (CoRE) Parameters registry defined in [RFC6690]: | Environments (CoRE) Parameters" registry defined in [RFC6690]: | |||
| +====================+=============================+=============+ | +====================+=============================+=============+ | |||
| | Value | Description | Reference | | | Value | Description | Reference | | |||
| +====================+=============================+=============+ | +====================+=============================+=============+ | |||
| | core.rd | Directory resource of an RD | RFCTHIS | | | core.rd | Directory resource of an RD | RFC 9176, | | |||
| | | | Section 4.3 | | | | | Section 4.3 | | |||
| +--------------------+-----------------------------+-------------+ | +--------------------+-----------------------------+-------------+ | |||
| | core.rd-lookup-res | Resource lookup of an RD | RFCTHIS | | | core.rd-lookup-res | Resource lookup of an RD | RFC 9176, | | |||
| | | | Section 4.3 | | | | | Section 4.3 | | |||
| +--------------------+-----------------------------+-------------+ | +--------------------+-----------------------------+-------------+ | |||
| | core.rd-lookup-ep | Endpoint lookup of an RD | RFCTHIS | | | core.rd-lookup-ep | Endpoint lookup of an RD | RFC 9176, | | |||
| | | | Section 4.3 | | | | | Section 4.3 | | |||
| +--------------------+-----------------------------+-------------+ | +--------------------+-----------------------------+-------------+ | |||
| | core.rd-ep | Endpoint resource of an RD | RFCTHIS | | | core.rd-ep | Endpoint resource of an RD | RFC 9176, | | |||
| | | | Section 6 | | | | | Section 6 | | |||
| +--------------------+-----------------------------+-------------+ | +--------------------+-----------------------------+-------------+ | |||
| Table 2 | Table 2: Additions to Resource Type (rt=) Link Target | |||
| Attribute Values Subregistry | ||||
| 9.2. IPv6 ND Resource Directory Address Option | 9.2. IPv6 ND Resource Directory Address Option | |||
| This document registers one new ND option type under the sub-registry | IANA has registered one new ND option type in the "IPv6 Neighbor | |||
| "IPv6 Neighbor Discovery Option Formats" of the "Internet Control | Discovery Option Formats" subregistry of the "Internet Control | |||
| Message Protocol version 6 (ICMPv6) Parameters" registry: | Message Protocol version 6 (ICMPv6) Parameters" registry: | |||
| * Resource Directory Address Option (TBD38) | +======+===================================+===========+ | |||
| | Type | Description | Reference | | ||||
| +======+===================================+===========+ | ||||
| | 41 | Resource Directory Address Option | RFC 9176 | | ||||
| +------+-----------------------------------+-----------+ | ||||
| [ The RFC editor is asked to replace TBD38 with the assigned number | Table 3: Addition to IPv6 Neighbor Discovery Option | |||
| in the document; the value 38 is suggested. ] | Formats Subregistry | |||
| 9.3. RD Parameter Registry | 9.3. RD Parameters Registry | |||
| This specification defines a new sub-registry for registration and | This specification defines a new subregistry for registration and | |||
| lookup parameters called "RD Parameters" under "CoRE Parameters". | lookup parameters called "RD Parameters" within the "Constrained | |||
| Although this specification defines a basic set of parameters, it is | RESTful Environments (CoRE) Parameters" registry. Although this | |||
| expected that other standards that make use of this interface will | specification defines a basic set of parameters, it is expected that | |||
| define new ones. | other standards that make use of this interface will define new ones. | |||
| Each entry in the registry must include | Each entry in the registry must include: | |||
| * the human readable name of the parameter, | * the human-readable name of the parameter, | |||
| * the short name as used in query parameters or target attributes, | * 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 | * indication of whether it can be passed as a query parameter at | |||
| registration of endpoints, as a query parameter in lookups, or be | registration of endpoints, passed as a query parameter in lookups, | |||
| expressed as a target attribute, | or expressed as a target attribute, | |||
| * syntax and validity requirements if any, | * a description, and | |||
| * a description, | ||||
| * and a link to reference documentation. | * a link to reference documentation. | |||
| The query parameter MUST be both a valid URI query key [RFC3986] and | The query parameter MUST be both a valid URI query key [RFC3986] and | |||
| a token as used in [RFC8288]. | a token as used in [RFC8288]. | |||
| The description must give details on whether the parameter can be | The reference documentation must give details on whether the | |||
| updated, and how it is to be processed in lookups. | 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 | The mechanisms around new RD parameters should be designed in such a | |||
| way that they tolerate RD implementations that are unaware of the | way that they tolerate RD implementations that are unaware of the | |||
| parameter and expose any parameter passed at registration or updates | parameter and expose any parameter passed at registration or updates | |||
| on in endpoint lookups. (For example, if a parameter used at | in endpoint lookups. (For example, if a parameter used at | |||
| registration were to be confidential, the registering endpoint should | registration were to be confidential, the registering endpoint should | |||
| be instructed to only set that parameter if the RD advertises support | be instructed to only set that parameter if the RD advertises support | |||
| for keeping it confidential at the discovery step.) | for keeping it confidential at the discovery step.) | |||
| Initial entries in this sub-registry are as follows: | Initial entries in this subregistry are as follows: | |||
| +==============+=======+==============+=====+=====================+ | +==============+=======+==============+=====+=====================+ | |||
| | Full name | Short | Validity | Use | Description | | | Name | Short | Validity | Use | Description | | |||
| +==============+=======+==============+=====+=====================+ | +==============+=======+==============+=====+=====================+ | |||
| | Endpoint | ep | Unicode* | RLA | Name of the | | | Endpoint | ep | Unicode* | RLA | Name of the | | |||
| | Name | | | | endpoint | | | Name | | | | endpoint | | |||
| +--------------+-------+--------------+-----+---------------------+ | +--------------+-------+--------------+-----+---------------------+ | |||
| | Lifetime | lt | 1-4294967295 | R | Lifetime of the | | | Lifetime | lt | 1-4294967295 | R | Lifetime of the | | |||
| | | | | | registration in | | | | | | | registration in | | |||
| | | | | | seconds | | | | | | | seconds | | |||
| +--------------+-------+--------------+-----+---------------------+ | +--------------+-------+--------------+-----+---------------------+ | |||
| | Sector | d | Unicode* | RLA | Sector to which | | | Sector | d | Unicode* | RLA | Sector to which | | |||
| | | | | | this endpoint | | | | | | | this endpoint | | |||
| | | | | | belongs | | | | | | | belongs | | |||
| +--------------+-------+--------------+-----+---------------------+ | +--------------+-------+--------------+-----+---------------------+ | |||
| | Registration | base | URI | RLA | The scheme, address | | | Registration | base | URI | RLA | The scheme, | | |||
| | Base URI | | | | and port and path | | | Base URI | | | | address, port, and | | |||
| | | | | | at which this | | | | | | | path at which this | | |||
| | | | | | server is available | | | | | | | server is available | | |||
| +--------------+-------+--------------+-----+---------------------+ | +--------------+-------+--------------+-----+---------------------+ | |||
| | Page | page | Integer | L | Used for pagination | | | Page | page | Integer | L | Used for pagination | | |||
| +--------------+-------+--------------+-----+---------------------+ | +--------------+-------+--------------+-----+---------------------+ | |||
| | Count | count | Integer | L | Used for pagination | | | Count | count | Integer | L | Used for pagination | | |||
| +--------------+-------+--------------+-----+---------------------+ | +--------------+-------+--------------+-----+---------------------+ | |||
| | Endpoint | et | Section | RLA | Semantic type of | | | Endpoint | et | RFC 9176, | RLA | Semantic type of | | |||
| | Type | | 9.3.1 | | the endpoint (see | | | Type | | Section | | the endpoint (see | | |||
| | | | 9.3.1 | | RFC 9176, | | ||||
| | | | | | Section 9.4) | | | | | | | Section 9.4) | | |||
| +--------------+-------+--------------+-----+---------------------+ | +--------------+-------+--------------+-----+---------------------+ | |||
| Table 3: RD Parameters | Table 4: New RD Parameters Registry | |||
| (Short: Short name used in query parameters or target attributes. | Where: | |||
| Validity: Unicode* = 63 Bytes of UTF-8 encoded Unicode, with no | ||||
| control characters as per Section 5. Use: R = used at registration, | Short: Short name used in query parameters or target attributes | |||
| L = used at lookup, A = expressed in target attribute.) | ||||
| 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 | The descriptions for the options defined in this document are only | |||
| summarized here. To which registrations they apply and when they are | summarized here. To which registrations they apply and when they are | |||
| to be shown is described in the respective sections of this document. | to be shown are described in the respective sections of this | |||
| All their reference documentation entries point to this document. | document. All their reference documentation entries point to this | |||
| document. | ||||
| The IANA policy for future additions to the sub-registry is "Expert | The IANA policy for future additions to the subregistry is Expert | |||
| Review" as described in [RFC8126]. The evaluation should consider | Review, as described in [RFC8126]. The evaluation should consider | |||
| formal criteria, duplication of functionality (Is the new entry | formal criteria, duplication of functionality (i.e., is the new entry | |||
| redundant with an existing one?), topical suitability (E.g. is the | redundant with an existing one?), topical suitability (e.g., is the | |||
| described property actually a property of the endpoint and not a | described property actually a property of the endpoint and not a | |||
| property of a particular resource, in which case it should go into | property of a particular resource, in which case it should go into | |||
| the payload of the registration and need not be registered?), and the | the payload of the registration and need not be registered?), and the | |||
| potential for conflict with commonly used target attributes (For | potential for conflict with commonly used target attributes (e.g., if | |||
| example, "if" could be used as a parameter for conditional | could be used as a parameter for conditional registration if it were | |||
| registration if it were not to be used in lookup or attributes, but | not to be used in lookup or attributes but would make a bad parameter | |||
| would make a bad parameter for lookup, because a resource lookup with | for lookup because a resource lookup with an if query parameter could | |||
| an "if" query parameter could ambiguously filter by the registered | ambiguously filter by the registered endpoint property or the target | |||
| endpoint property or the [RFC6690] target attribute). | attribute [RFC6690]). | |||
| 9.3.1. Full description of the "Endpoint Type" RD Parameter | 9.3.1. Full Description of the "Endpoint Type" RD Parameter | |||
| An endpoint registering at an RD can describe itself with endpoint | An endpoint registering at an RD can describe itself with endpoint | |||
| types, similar to how resources are described with Resource Types in | types, similar to how resources are described with resource types in | |||
| [RFC6690]. An endpoint type is expressed as a string, which can be | [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 sub- | either a URI or one of the values defined in the "Endpoint Type (et=) | |||
| registry. Endpoint types can be passed in the "et" query parameter | RD Parameter Values" subregistry. Endpoint types can be passed in | |||
| as part of extra-attrs at the Registration step, are shown on | the et query parameter as part of extra-attrs at the "registration" | |||
| endpoint lookups using the "et" target attribute, and can be filtered | step of Section 5, are shown on endpoint lookups using the et target | |||
| for using "et" as a search criterion in resource and endpoint lookup. | attribute, and can be filtered for using et as a search criterion in | |||
| Multiple endpoint types are given as separate query parameters or | resource and endpoint lookup. Multiple endpoint types are given as | |||
| link attributes. | separate query parameters or link attributes. | |||
| Note that Endpoint Type differs from Resource Type in that it uses | Note that the endpoint type differs from the resource type in that it | |||
| multiple attributes rather than space separated values. As a result, | uses multiple attributes rather than space-separated values. As a | |||
| RDs implementing this specification automatically support correct | result, RDs implementing this specification automatically support | |||
| filtering in the lookup interfaces from the rules for unknown | correct filtering in the lookup interfaces from the rules for unknown | |||
| endpoint attributes. | endpoint attributes. | |||
| 9.4. "Endpoint Type" (et=) RD Parameter values | 9.4. Endpoint Type (et=) RD Parameter Values | |||
| This specification establishes a new sub-registry under "CoRE | ||||
| Parameters" called '"Endpoint Type" (et=) RD Parameter values'. The | ||||
| registry properties (required policy, requirements, template) are | ||||
| identical to those of the Resource Type parameters in [RFC6690], in | ||||
| short: | ||||
| The review policy is IETF Review for values starting with "core", and | This specification establishes a new subregistry called "Endpoint | |||
| Specification Required for others. | 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 requirements to be enforced are: | |||
| * The values MUST be related to the purpose described in | * The values MUST be related to the purpose described in | |||
| Section 9.3.1. | Section 9.3.1. | |||
| * The registered values MUST conform to the ABNF reg-rel-type | * The registered values MUST conform to the ABNF reg-rel-type | |||
| definition of [RFC6690] and MUST NOT be a URI. | definition of [RFC6690] and MUST NOT be a URI. | |||
| * It is recommended to use the period "." character for | * It is recommended to use the period "." character for | |||
| segmentation. | segmentation. | |||
| The registry initially contains one value: | The initial contents of the registry are as follows: | |||
| * "core.rd-group": An application group as described in Appendix A. | +===============+====================================+===========+ | |||
| | Value | Description | Reference | | ||||
| +===============+====================================+===========+ | ||||
| | core.rd-group | An application group, as described | RFC 9176 | | ||||
| | | in RFC 9176, Appendix A. | | | ||||
| +---------------+------------------------------------+-----------+ | ||||
| 9.5. Multicast Address Registration | Table 5: New Endpoint Type (et=) RD Parameter Values Registry | |||
| IANA is asked to assign the following multicast addresses for use by | 9.5. Multicast Address Registration | |||
| CoAP nodes: | ||||
| IPv4 -- "all CoRE Resource Directories" address MCD2 (suggestion: | IANA has assigned the following multicast addresses for use by CoAP | |||
| 224.0.1.189), from the "IPv4 Multicast Address Space Registry". As | nodes: | |||
| 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 MCD1 (suggestions | IPv4 -- "All CoRE Resource Directories" address 224.0.1.190, in the | |||
| FF0X::FE), from the "IPv6 Multicast Address Space Registry", in the | "Internetwork Control Block (224.0.1.0 - 224.0.1.255 | |||
| "Variable Scope Multicast Addresses" space (RFC 3307). Note that | (224.0.1/24))" subregistry within the "IPv4 Multicast Address | |||
| there is a distinct multicast address for each scope that interested | Space Registry". As the address is used for discovery that may | |||
| CoAP nodes should listen to; CoAP needs the Link-Local and Site-Local | span beyond a single network, it has come from the Internetwork | |||
| scopes only. | Control Block (224.0.1.x) [RFC5771]. | |||
| [ The RFC editor is asked to replace MCD1 and MCD2 with the assigned | IPv6 -- "All CoRE Resource Directories" address ff0x::fe, in the | |||
| addresses throughout the document. ] | "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 | 9.6. Well-Known URIs | |||
| IANA is asked to permanently register the URI suffix "rd" in the | IANA has registered the URI suffix "rd" in the "Well-Known URIs" | |||
| "Well-Known URIs" registry. The change controller is the IETF, this | registry as follows: | |||
| document is the reference. | ||||
| 9.7. Service Names and Transport Protocol Port Number Registry | ||||
| IANA is asked to enter four new items into the Service Names and | +============+===================+===========+===========+ | |||
| Transport Protocol Port Number Registry: | | URI Suffix | Change Controller | Reference | Status | | |||
| +============+===================+===========+===========+ | ||||
| | rd | IETF | RFC 9176 | permanent | | ||||
| +------------+-------------------+-----------+-----------+ | ||||
| * Service name: "core-rd", Protocol: "udp", Description: "Resource | Table 6: Addition to Well-Known URIs Registry | |||
| Directory accessed using CoAP" | ||||
| * Service name "core-rd-dtls", Protocol: "udp", Description: | 9.7. Service Name and Transport Protocol Port Number Registry | |||
| "Resource Directory accessed using CoAP over DTLS" | ||||
| * Service name: "core-rd", Protocol: "tcp", Description: "Resource | IANA has added four new items to the "Service Name and Transport | |||
| Directory accessed using CoAP over TCP" | Protocol Port Number Registry" as follows: | |||
| * Service name "core-rd-tls", Protocol: "tcp", Description: | +==============+===========+=====================+===========+ | |||
| "Resource Directory accessed using CoAP over TLS" | | 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 | | | ||||
| +--------------+-----------+---------------------+-----------+ | ||||
| All in common have this document as their reference. | Table 7: Additions to Service Name and Transport Protocol | |||
| Port Number Registry | ||||
| 10. Examples | 10. Examples | |||
| Two examples are presented: a Lighting Installation example in | Two examples are presented: a lighting installation example in | |||
| Section 10.1 and a LwM2M example in Section 10.2. | Section 10.1 and a Lightweight M2M (LwM2M) example in Section 10.2. | |||
| 10.1. Lighting Installation | 10.1. Lighting Installation | |||
| This example shows a simplified lighting installation which makes use | This example shows a simplified lighting installation that makes use | |||
| of the RD with a CoAP interface to facilitate the installation and | of the RD with a CoAP interface to facilitate the installation and | |||
| start-up of the application code in the lights and sensors. In | startup of the application code in the lights and sensors. In | |||
| particular, the example leads to the definition of a group and the | particular, the example leads to the definition of a group and the | |||
| enabling of the corresponding multicast address as described in | enabling of the corresponding multicast address, as described in | |||
| Appendix A. No conclusions must be drawn on the realization of | Appendix A. No conclusions must be drawn on the realization of | |||
| actual installation or naming procedures, because the example only | actual installation or naming procedures, because the example only | |||
| "emphasizes" some of the issues that may influence the use of the RD | emphasizes some of the issues that may influence the use of the RD | |||
| and does not pretend to be normative. | and does not pretend to be normative. | |||
| 10.1.1. Installation Characteristics | 10.1.1. Installation Characteristics | |||
| The example assumes that the installation is managed. That means | The example assumes that the installation is managed. That means | |||
| that a Commissioning Tool (CT) is used to authorize the addition of | that a Commissioning Tool (CT) is used to authorize the addition of | |||
| nodes, name them, and name their services. The CT can be connected | 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 | to the installation in many ways: the CT can be part of the | |||
| installation network, connected by WiFi to the installation network, | installation network, connected by Wi-Fi to the installation network, | |||
| or connected via GPRS link, or other method. | connected via GPRS link, or connected by another method. | |||
| It is assumed that there are two naming authorities for the | It is assumed that there are two naming authorities for the | |||
| installation: (1) the network manager that is responsible for the | installation: (1) the network manager that is responsible for the | |||
| correct operation of the network and the connected interfaces, and | correct operation of the network and the connected interfaces and (2) | |||
| (2) the lighting manager that is responsible for the correct | the lighting manager that is responsible for the correct functioning | |||
| functioning of networked lights and sensors. The result is the | of networked lights and sensors. The result is the existence of two | |||
| existence of two naming schemes coming from the two managing | naming schemes coming from the two managing entities. | |||
| entities. | ||||
| The example installation consists of one presence sensor, and two | The example installation consists of one presence sensor and two | |||
| luminaries, luminary1 and luminary2, each with their own wireless | luminaries, luminary1 and luminary2, each with their own wireless | |||
| interface. Each luminary contains three lamps: left, right and | interface. Each luminary contains three lamps: left, right, and | |||
| middle. Each luminary is accessible through one endpoint. For each | middle. Each luminary is accessible through one endpoint. For each | |||
| lamp a resource exists to modify the settings of a lamp in a | lamp, a resource exists to modify the settings of a lamp in a | |||
| luminary. The purpose of the installation is that the presence | luminary. The purpose of the installation is that the presence | |||
| sensor notifies the presence of persons to a group of lamps. The | sensor notifies the presence of persons to a group of lamps. The | |||
| group of lamps consists of: middle and left lamps of luminary1 and | group of lamps consists of the middle and left lamps of luminary1 and | |||
| right lamp of luminary2. | the right lamp of luminary2. | |||
| Before commissioning by the lighting manager, the network is | Before commissioning by the lighting manager, the network is | |||
| installed and access to the interfaces is proven to work by the | installed, and access to the interfaces is proven to work by the | |||
| network manager. | network manager. | |||
| At the moment of installation, the network under installation is not | At the moment of installation, the network under installation is not | |||
| necessarily connected to the DNS infrastructure. Therefore, SLAAC | necessarily connected to the DNS infrastructure. Therefore, | |||
| IPv6 addresses are assigned to CT, RD, luminaries and the sensor. | Stateless Address Autoconfiguration (SLAAC) IPv6 addresses are | |||
| The addresses shown in Table 4 below stand in for these in the | assigned to CT, RD, luminaries, and the sensor. The addresses shown | |||
| following examples. | in Table 8 below stand in for these in the following examples. | |||
| +=================+================+ | +=================+================+ | |||
| | Name | IPv6 address | | | Name | IPv6 address | | |||
| +=================+================+ | +=================+================+ | |||
| | luminary1 | 2001:db8:4::1 | | | luminary1 | 2001:db8:4::1 | | |||
| +-----------------+----------------+ | +-----------------+----------------+ | |||
| | luminary2 | 2001:db8:4::2 | | | luminary2 | 2001:db8:4::2 | | |||
| +-----------------+----------------+ | +-----------------+----------------+ | |||
| | Presence sensor | 2001:db8:4::3 | | | Presence sensor | 2001:db8:4::3 | | |||
| +-----------------+----------------+ | +-----------------+----------------+ | |||
| | RD | 2001:db8:4::ff | | | RD | 2001:db8:4::ff | | |||
| +-----------------+----------------+ | +-----------------+----------------+ | |||
| Table 4: Addresses used in the | Table 8: Addresses Used in the | |||
| examples | Examples | |||
| In Section 10.1.2 the use of RD during installation is presented. | In Section 10.1.2, the use of RD during installation is presented. | |||
| 10.1.2. RD entries | 10.1.2. RD Entries | |||
| It is assumed that access to the DNS infrastructure is not always | It is assumed that access to the DNS infrastructure is not always | |||
| possible during installation. Therefore, the SLAAC addresses are | possible during installation. Therefore, the SLAAC addresses are | |||
| used in this section. | used in this section. | |||
| For discovery, the resource types (rt) of the devices are important. | 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 lamps in the luminaries have rt=tag:example.com,2020:light, and | |||
| the presence sensor has rt=tag:example.com,2020:p-sensor. The | the presence sensor has rt=tag:example.com,2020:p-sensor. The | |||
| endpoints have names which are relevant to the light installation | endpoints have names that are relevant to the light installation | |||
| manager. In this case luminary1, luminary2, and the presence sensor | manager. In this case, luminary1, luminary2, and the presence sensor | |||
| are located in room 2-4-015, where luminary1 is located at the window | 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 | and luminary2 and the presence sensor are located at the door. The | |||
| endpoint names reflect this physical location. The middle, left and | endpoint names reflect this physical location. The middle, left, and | |||
| right lamps are accessed via path /light/middle, /light/left, and | right lamps are accessed via path /light/middle, /light/left, and | |||
| /light/right respectively. The identifiers relevant to the RD are | /light/right, respectively. The identifiers relevant to the RD are | |||
| shown in Table 5 below: | shown in Table 9. | |||
| +=========+================+========+===============================+ | +=========+================+========+===============================+ | |||
| |Name |endpoint |resource| resource type | | |Name |Endpoint |Resource| Resource Type | | |||
| | | |path | | | | | |Path | | | |||
| +=========+================+========+===============================+ | +=========+================+========+===============================+ | |||
| |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light | | |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light | | |||
| | | |left | | | | | |left | | | |||
| +---------+----------------+--------+-------------------------------+ | +---------+----------------+--------+-------------------------------+ | |||
| |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light | | |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light | | |||
| | | |middle | | | | | |middle | | | |||
| +---------+----------------+--------+-------------------------------+ | +---------+----------------+--------+-------------------------------+ | |||
| |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light | | |luminary1|lm_R2-4-015_wndw|/light/ | tag:example.com,2020:light | | |||
| | | |right | | | | | |right | | | |||
| +---------+----------------+--------+-------------------------------+ | +---------+----------------+--------+-------------------------------+ | |||
| skipping to change at page 58, line 31 ¶ | skipping to change at line 2646 ¶ | |||
| |luminary2|lm_R2-4-015_door|/light/ | tag:example.com,2020:light | | |luminary2|lm_R2-4-015_door|/light/ | tag:example.com,2020:light | | |||
| | | |middle | | | | | |middle | | | |||
| +---------+----------------+--------+-------------------------------+ | +---------+----------------+--------+-------------------------------+ | |||
| |luminary2|lm_R2-4-015_door|/light/ | tag:example.com,2020:light | | |luminary2|lm_R2-4-015_door|/light/ | tag:example.com,2020:light | | |||
| | | |right | | | | | |right | | | |||
| +---------+----------------+--------+-------------------------------+ | +---------+----------------+--------+-------------------------------+ | |||
| |Presence |ps_R2-4-015_door|/ps | tag:example.com,2020:p-sensor | | |Presence |ps_R2-4-015_door|/ps | tag:example.com,2020:p-sensor | | |||
| |sensor | | | | | |sensor | | | | | |||
| +---------+----------------+--------+-------------------------------+ | +---------+----------------+--------+-------------------------------+ | |||
| Table 5: RD identifiers | Table 9: RD Identifiers | |||
| It is assumed that the CT has performed RD discovery and has received | It is assumed that the CT has performed RD discovery and has received | |||
| a response like the one in the Section 4.3 example. | 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 | The CT inserts the endpoints of the luminaries and the sensor in the | |||
| RD using the registration base URI parameter (base) to specify the | RD using the registration base URI parameter (base) to specify the | |||
| interface address: | interface address: | |||
| Req: POST coap://[2001:db8:4::ff]/rd | Req: POST coap://[2001:db8:4::ff]/rd | |||
| ?ep=lm_R2-4-015_wndw&base=coap://[2001:db8:4::1]&d=R2-4-015 | ?ep=lm_R2-4-015_wndw&base=coap://[2001:db8:4::1]&d=R2-4-015 | |||
| Payload: | Payload: | |||
| </light/left>;rt="tag:example.com,2020:light", | </light/left>;rt="tag:example.com,2020:light", | |||
| </light/middle>;rt="tag:example.com,2020:light", | </light/middle>;rt="tag:example.com,2020:light", | |||
| skipping to change at page 59, line 33 ¶ | skipping to change at line 2683 ¶ | |||
| Location-Path: /rd/4522 | Location-Path: /rd/4522 | |||
| Req: POST coap://[2001:db8:4::ff]/rd | Req: POST coap://[2001:db8:4::ff]/rd | |||
| ?ep=ps_R2-4-015_door&base=coap://[2001:db8:4::3]&d=R2-4-015 | ?ep=ps_R2-4-015_door&base=coap://[2001:db8:4::3]&d=R2-4-015 | |||
| Payload: | Payload: | |||
| </ps>;rt="tag:example.com,2020:p-sensor" | </ps>;rt="tag:example.com,2020:p-sensor" | |||
| Res: 2.01 Created | Res: 2.01 Created | |||
| Location-Path: /rd/4523 | Location-Path: /rd/4523 | |||
| Figure 24: Example of registrations a CT enters into an RD | 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 | The sector name d=R2-4-015 has been added for an efficient lookup | |||
| because filtering on "ep" name is more awkward. The same sector name | because filtering on the "ep" name is more awkward. The same sector | |||
| is communicated to the two luminaries and the presence sensor by the | name is communicated to the two luminaries and the presence sensor by | |||
| CT. | the CT. | |||
| The group is specified in the RD. The base parameter is set to the | 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 | site-local multicast address allocated to the group. In the POST in | |||
| the example below, the resources supported by all group members are | the example below, the resources supported by all group members are | |||
| published. | published. | |||
| Req: POST coap://[2001:db8:4::ff]/rd | Req: POST coap://[2001:db8:4::ff]/rd | |||
| ?ep=grp_R2-4-015&et=core.rd-group&base=coap://[ff05::1] | ?ep=grp_R2-4-015&et=core.rd-group&base=coap://[ff05::1] | |||
| Payload: | Payload: | |||
| </light/left>;rt="tag:example.com,2020:light", | </light/left>;rt="tag:example.com,2020:light", | |||
| </light/middle>;rt="tag:example.com,2020:light", | </light/middle>;rt="tag:example.com,2020:light", | |||
| </light/right>;rt="tag:example.com,2020:light" | </light/right>;rt="tag:example.com,2020:light" | |||
| Res: 2.01 Created | Res: 2.01 Created | |||
| Location-Path: /rd/501 | Location-Path: /rd/501 | |||
| Figure 25: Example of a multicast group a CT enters into an RD | 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 | After the filling of the RD by the CT, the application in the | |||
| luminaries can learn to which groups they belong, and enable their | luminaries can learn to which groups they belong and enable their | |||
| interface for the multicast address. | interface for the multicast address. | |||
| The luminary, knowing its sector and being configured to join any | The luminary, knowing its sector and being configured to join any | |||
| group containing lights, searches for candidate groups and joins | group containing lights, searches for candidate groups and joins | |||
| them: | them: | |||
| Req: GET coap://[2001:db8:4::ff]/rd-lookup/ep | Req: GET coap://[2001:db8:4::ff]/rd-lookup/ep | |||
| ?d=R2-4-015&et=core.rd-group&rt=light | ?d=R2-4-015&et=core.rd-group&rt=light | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| </rd/501>;ep=grp_R2-4-015;et=core.rd-group; | </rd/501>;ep=grp_R2-4-015;et=core.rd-group; | |||
| base="coap://[ff05::1]";rt=core.rd-ep | base="coap://[ff05::1]";rt=core.rd-ep | |||
| Figure 26: Example of a lookup exchange to find suitable | Figure 26: Example of a Lookup Exchange to Find Suitable | |||
| multicast addresses | Multicast Addresses | |||
| From the returned base parameter value, the luminary learns the | From the returned base parameter value, the luminary learns the | |||
| multicast address of the multicast group. | multicast address of the multicast group. | |||
| The presence sensor can learn the presence of groups that support | The presence sensor can learn the presence of groups that support | |||
| resources with rt=tag:example.com,2020:light in its own sector by | resources with rt=tag:example.com,2020:light in its own sector by | |||
| sending the same request, as used by the luminary. The presence | sending the same request, as used by the luminary. The presence | |||
| sensor learns the multicast address to use for sending messages to | sensor learns the multicast address to use for sending messages to | |||
| the luminaries. | the luminaries. | |||
| 10.2. OMA Lightweight M2M (LwM2M) | 10.2. OMA Lightweight M2M (LwM2M) | |||
| OMA LwM2M is a profile for device services based on CoAP, providing | OMA LwM2M is a profile for device services based on CoAP, providing | |||
| interfaces and operations for device management and device service | interfaces and operations for device management and device service | |||
| enablement. | enablement. | |||
| An LwM2M server is an instance of an LwM2M middleware service layer, | An LwM2M server is an instance of an LwM2M middleware service layer, | |||
| containing an RD ([LwM2M] page 36f). | containing an RD ([LwM2M], starting at page 36). | |||
| That RD only implements the registration interface, and no lookup is | That RD only implements the registration interface, and no lookup is | |||
| implemented. Instead, the LwM2M server provides access to the | implemented. Instead, the LwM2M server provides access to the | |||
| registered resources, in a similar way to a reverse proxy. | registered resources in a similar way to a reverse proxy. | |||
| The location of the LwM2M Server and RD URI path is provided by the | 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 bootstrap process, so no dynamic discovery of the RD is used. | |||
| LwM2M Servers and endpoints are not required to implement the /.well- | LwM2M servers and endpoints are not required to implement the /.well- | |||
| known/core resource. | known/core resource. | |||
| 11. Acknowledgments | 11. References | |||
| 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. | ||||
| 12. Changelog | ||||
| changes from -27 to -28 | ||||
| * Security policies / link confidentiality: Point out the RD's | ||||
| obligations that follow from such a policy. | ||||
| * Simple registration: clarify term "regular registration" by | ||||
| introducing it along with the reference to Section 5 | ||||
| * Wording fix in first-come-first-remembered | ||||
| * Wording fixes in RD definition | ||||
| * Capitalization: Consistently using "registration resource" | ||||
| changes from -26 to -27 | ||||
| * In general, this addresses the points that were pointed out in | ||||
| https://mailarchive.ietf.org/arch/msg/core/xWLomwwhovkU- | ||||
| CPGNxnvs40BhaM/ as having "evolved from the review comments being | ||||
| discussed in the interim meetings", and the review comments from | ||||
| Esko Dijk that were largely entangled in these points. | ||||
| * Relaxation of the serialization rules for link-format | ||||
| The interpretation of RFC6690 used in Appendix B.4 was shown to be | ||||
| faulty. Along with a correction, the common implementations of | ||||
| link-format were surveyed again and it was found that the only one | ||||
| that employed the faulty interpretation can still safely be | ||||
| upgraded. These were removed from the set considered for Limited | ||||
| Link Format, making the set of valid Limited Link Format documents | ||||
| larger. | ||||
| As a consequence, the prescribed serialization of RD output can be | ||||
| roughly halved in bytes. | ||||
| There might be additional usage patterns that are possible with | ||||
| the new set of constraints, but there is insufficient | ||||
| implementation and deployment experience with them to warrant a | ||||
| change changes on that front at this point. The specification can | ||||
| later be extended compatibly to allow these cases and drop the | ||||
| requirement of Limited Link Format. | ||||
| * Add Request freshness subsection | ||||
| It is now recommended (with security considerations on | ||||
| consequences of not doing it) to require ordering of RD | ||||
| operations. | ||||
| The Echo mechanism (previously suggested in various places but | ||||
| never exclusively) is the one prescribed way of getting this | ||||
| ordering, making the echo-request-tag reference normative. | ||||
| * Improved expression about when an RD needs to verify simple | ||||
| registration. | ||||
| The simple wording missed the authorization part, and did not | ||||
| emphasize that this is a per-deployment property. | ||||
| * Point out the non-atomic properties of paginated access. | ||||
| * Clarification around impl-info reference. | ||||
| * Inconsistencies and extraneous quotings removed from examples. | ||||
| changes from -25 to -26 | ||||
| * Security policies: | ||||
| - The First-Come-First-Remembered policy is added as an example | ||||
| and a potential default behavior. | ||||
| - Clarify that the mapping between endpoint names and subject | ||||
| fields is up to a policy that defines reliance on names, and | ||||
| give an example. | ||||
| - Random EP names: Point that multiple collisions are possible | ||||
| but unlikely. | ||||
| - Add pointers to policies: | ||||
| o RD replication: Point out that policies may limit that. | ||||
| o Registration: Reword (ep, d) mapping to a previous | ||||
| registration's resource that could have been read as another | ||||
| endpoint taking over an existing registration. | ||||
| - Clarify that the security policy is a property of the RD the | ||||
| any client may need to verify by checking the RD's | ||||
| authorization. | ||||
| - Clarify how information from an untrusted RD can be verified | ||||
| - Remove speculation about how in detail ACE scopes are obtained. | ||||
| * Security considerations: | ||||
| - Generalize to all current options for security layers usable | ||||
| with CoAP (OSCORE was missing as the text predated RFC8613) | ||||
| - Relax the previous SHOULD on secure access to SHOULD where | ||||
| protection is indicated by security policies (bringing the text | ||||
| in line with the -25 changes) | ||||
| - Point out that failure to follow the security considerations | ||||
| has implications depending on the protection objective | ||||
| described with the security policies | ||||
| - Shorten amplification mitigation | ||||
| - Add note about information in Registration Resource path. | ||||
| - Acknowledge that most host discovery operations are not | ||||
| secured; mention consequences and mitigation. | ||||
| * Abstract, introduction: removed "or disperse networks" | ||||
| * RD discovery: | ||||
| - Drop the previously stated assumption that RDAO and any DHCP | ||||
| options would only be used together with SLAAC and DHCP for | ||||
| address configuration, respectivly. | ||||
| - Give concrete guidance for address selection based on RFC6724 | ||||
| when responding to multicasts | ||||
| - RDAO: | ||||
| o Clarify that it is an option for RAs and not other ND | ||||
| messages. | ||||
| o Change Lifetime from 16-bit minutes to 32-bit seconds and | ||||
| swap it with Reserved (aligning it with RDNSS which it | ||||
| shares other properties as well). | ||||
| - Point out that clients may need to check RD authorization | ||||
| already in last discovery step | ||||
| * Registration: | ||||
| - Wording around "mostly mandatory" has been improved, conflicts | ||||
| clarified and sector default selection adjusted. | ||||
| * Simple registration: Rather than coopting POSTs to /.well-known/ | ||||
| core, a new resource /.well-known/rd is registered. A historical | ||||
| note in the text documents the change. | ||||
| * Examples: | ||||
| - Use example URIs rather than unclear reg names (unless it's | ||||
| RFC6690 examples, which were kept for continuity) | ||||
| - The LwM2M example was reduced from an outdated explanation of | ||||
| the complete LwM2M model to a summary of how RD is used in | ||||
| there, with a reference to the current specification. | ||||
| - Luminary example: Explain example addresses | ||||
| - Luminary example: Drop reference to coap-group mechanism that's | ||||
| becoming obsolete, and thus also to RFC7390 | ||||
| - Multicast addresses in the examples were changed from | ||||
| ff35:30:2001:db8::x to ff35:30:2001:db8:f1::8000:x; the 8000 is | ||||
| to follow RFC 3307, and the f1 is for consistency with all the | ||||
| other example addresses where 2001:db8::/32 is subnetted to | ||||
| 2001:db8:x::/48 by groups of internally consistent examples. | ||||
| * Use case text enhancements | ||||
| - Home and building automation: Tie in with RD | ||||
| - M2M: Move system design paragraph towards the topic of | ||||
| reusability. | ||||
| * Various editorial fixes in response to Gen-ART and IESG reviews. | ||||
| * Rename 'Full description of the "Endpoint Type" Registration | ||||
| Parameter' section to '... RD Parameter' | ||||
| * Error handling: Place a SHOULD around the likely cases, and make | ||||
| the previous "MUST to the best of their capabilities" a "must". | ||||
| * impl-info: Add note about the type being WIP | ||||
| * Interaction tables: list CTs as possible initiators where | ||||
| applicable | ||||
| * Registration update: Relax requirement to not send parameters | ||||
| needlessly | ||||
| * Terminology: Clarify that the CTs' installation events can occur | ||||
| multiple times. | ||||
| * Promote RFCs 7252, 7230 and 8288 to normative references | ||||
| * Moved Christian Amsuess to first author | ||||
| changes from -24 to -25 | ||||
| * Large rework of section 7 (Security policies) | ||||
| Rather than prescribing which data in the RD _is_ authenticated | ||||
| (and how), it now describes what applications built on an RD _can_ | ||||
| choose to authenticate, show possibilities on how to do it and | ||||
| outline what it means for clients. | ||||
| This addresses Russ' Genart review points on details in the text | ||||
| in a rather broad fashion. That is because the discussion on the | ||||
| topic inside the WG showed that that text on security has been | ||||
| driven more review-by-review than by an architectural plan of the | ||||
| authors and WG. | ||||
| * Add concrete suggestions (twice as long as registrant number with | ||||
| retries, or UUIDs without) for random endpoint names | ||||
| * Point out that simple registration can have faked origins, | ||||
| RECOMMEND mitigation when applicable and suggest the Echo | ||||
| mechanism to implement it. | ||||
| * Reference existing and upcoming specifications for DDOS mitigation | ||||
| in CoAP. | ||||
| * Explain the provenance of the example's multicast address. | ||||
| * Make "SHOULD" of not manipulating foreign registrations a "should" | ||||
| and explain how it is enforced | ||||
| * Clarify application of RFC6570 to search parameters | ||||
| * Syntactic fixes in examples | ||||
| * IANA: | ||||
| - Don't announce expected number of registrations (goes to write- | ||||
| up) | ||||
| - Include syntax as part of a field's validity in entry | ||||
| requirements | ||||
| * Editorial changes | ||||
| - Align wording between abstract and introduction | ||||
| - Abbreviation normalization: "ER model", "RD" | ||||
| - RFC8174 boilerplate update | ||||
| - Minor clarity fixes | ||||
| - Markup and layouting | ||||
| changes from -23 to -24 | ||||
| * Discovery using DNS-SD added again | ||||
| * Minimum lifetime (lt) reduced from 60 to 1 | ||||
| * References added | ||||
| * IANA considerations | ||||
| - added about .well-known/core resource | ||||
| - added DNS-SD service names | ||||
| - made RDAO option number a suggestion | ||||
| - added "reference" field to endpoint type registry | ||||
| * Lookup: mention that anchor is a legitimate lookup attribute | ||||
| * Terminology and example fixes | ||||
| * Layout fixes, esp. the use of non-ASCII characters in figures | ||||
| changes from -22 to -23 | ||||
| * Explain that updates can not remove attributes | ||||
| * Typo fixes | ||||
| changes from -21 to -22 | ||||
| * Request a dedicated IPv4 address from IANA (rather than sharing | ||||
| with All CoAP nodes) | ||||
| * Fix erroneous examples | ||||
| * Editorial changes | ||||
| - Add figure numbers to examples | ||||
| - Update RD parameters table to reflect changes of earlier | ||||
| versions in the text | ||||
| - Typos and minor wording | ||||
| changes from -20 to -21 | ||||
| (Processing comments during WGLC) | ||||
| * Defer outdated description of using DNS-SD to find an RD to the | ||||
| defining document | ||||
| * Describe operational conditions in automation example | ||||
| * Recommend particular discovery mechanisms for some managed network | ||||
| scenarios | ||||
| changes from -19 to -20 | ||||
| (Processing comments from the WG chair review) | ||||
| * Define the permissible characters in endpoint and sector names | ||||
| * Express requirements on NAT situations in more abstract terms | ||||
| * Shifted heading levels to have the interfaces on the same level | ||||
| * Group instructions for error handling into general section | ||||
| * Simple Registration: process reflowed into items list | ||||
| * Updated introduction to reflect state of CoRE in general, | ||||
| reference RFC7228 (defining "constrained") and use "IoT" term in | ||||
| addition to "M2M" | ||||
| * Update acknowledgements | ||||
| * Assorted editorial changes | ||||
| - Unify examples style | ||||
| - Terminology: RDAO defined and not only expanded | ||||
| - Add CT to Figure 1 | ||||
| - Consistency in the use of the term "Content Format" | ||||
| changes from -18 to -19 | ||||
| * link-local addresses: allow but prescribe split-horizon fashion | ||||
| when used, disallow zone identifiers | ||||
| * Remove informative references to documents not mentioned any more | ||||
| changes from -17 to -18 | ||||
| * Rather than re-specifying link format (Modernized Link Format), | ||||
| describe a Limited Link Format that's the uncontested subset of | ||||
| Link Format | ||||
| * Acknowledging the -17 version as part of the draft | ||||
| * Move "Read endpoint links" operation to future specification like | ||||
| PATCH | ||||
| * Demote links-json to an informative reference, and removed them | ||||
| from exchange examples | ||||
| * Add note on unusability of link-local IP addresses, and describe | ||||
| mitigation. | ||||
| * Reshuffling of sections: Move additional operations and endpoint | ||||
| lookup back from appendix, and groups into one | ||||
| * Lookup interface tightened to not imply applicability for non | ||||
| link-format lookups (as those can have vastly different views on | ||||
| link cardinality) | ||||
| * Simple registration: Change sequence of GET and POST-response, | ||||
| ensuring unsuccessful registrations are reported as such, and | ||||
| suggest how devices that would have required the inverse behavior | ||||
| can still cope with it. | ||||
| * Abstract and introduction reworded to avoid the impression that | ||||
| resources are stored in full in the RD | ||||
| * Simplify the rules governing when a registration resource can or | ||||
| must be changed. | ||||
| * Drop a figure that has become useless due to the changes of and | ||||
| -13 and -17 | ||||
| * Wording consistency fixes: Use "Registrations" and "target | ||||
| attributes" | ||||
| * Fix incorrect use of content negotiation in discovery interface | ||||
| description (Content-Format -> Accept) | ||||
| * State that the base attribute value is part of endpoint lookup | ||||
| even when implicit in the registration | ||||
| * Update references from RFC5988 to its update RFC8288 | ||||
| * Remove appendix on protocol-negotiation (which had a note to be | ||||
| removed before publication) | ||||
| changes from -16 to -17 | ||||
| (Note that -17 is published as a direct follow-up to -16, containing | ||||
| a single change to be discussed at IETF103) | ||||
| * Removed groups that are enumerations of registrations and have | ||||
| dedicated mechanism | ||||
| * Add groups that are enumerations of shared resources and are a | ||||
| special case of endpoint registrations | ||||
| changes from -15 to -16 | ||||
| * Recommend a common set of resources for members of a group | ||||
| * Clarified use of multicast group in lighting example | ||||
| * Add note on concurrent registrations from one EP being possible | ||||
| but not expected | ||||
| * Refresh web examples appendix to reflect current use of Modernized | ||||
| Link Format | ||||
| * Add examples of URIs where Modernized Link Format matters | ||||
| * Editorial changes | ||||
| changes from -14 to -15 | ||||
| * Rewrite of section "Security policies" | ||||
| * Clarify that the "base" parameter text applies both to relative | ||||
| references both in anchor and href | ||||
| * Renamed "Registree-EP" to Registrant-EP" | ||||
| * Talk of "relative references" and "URIs" rather than "relative" | ||||
| and "absolute" URIs. (The concept of "absolute URIs" of [RFC3986] | ||||
| is not needed in RD). | ||||
| * Fixed examples | ||||
| * Editorial changes | ||||
| changes from -13 to -14 | ||||
| * Rename "registration context" to "registration base URI" (and | ||||
| "con" to "base") and "domain" to "sector" (where the abbreviation | ||||
| "d" stays for compatibility reasons) | ||||
| * Introduced resource types core.rd-ep and core.rd-gp | ||||
| * Registration management moved to appendix A, including endpoint | ||||
| and group lookup | ||||
| * Minor editorial changes | ||||
| - PATCH/iPATCH is clearly deferred to another document | ||||
| - Recommend against query / fragment identifier in con= | ||||
| - Interface description lists are described as illustrative | ||||
| - Rewording of Simple Registration | ||||
| * Simple registration carries no error information and succeeds | ||||
| immediately (previously, sequence was unspecified) | ||||
| * Lookup: href are matched against resolved values (previously, this | ||||
| was unspecified) | ||||
| * Lookup: lt are not exposed any more | ||||
| * con/base: Paths are allowed | ||||
| * Registration resource locations can not have query or fragment | ||||
| parts | ||||
| * Default life time extended to 25 hours | ||||
| * clarified registration update rules | ||||
| * lt-value semantics for lookup clarified. | ||||
| * added template for simple registration | ||||
| changes from -12 to -13 | ||||
| * Added "all resource directory" nodes MC address | ||||
| * Clarified observation behavior | ||||
| * version identification | ||||
| * example rt= and et= values | ||||
| * domain from figure 2 | ||||
| * more explanatory text | ||||
| * endpoints of a groups hosted by different RD | ||||
| * resolve RFC6690-vs-8288 resolution ambiguities: | ||||
| - require registered links not to be relative when using anchor | ||||
| - return absolute URIs in resource lookup | ||||
| changes from -11 to -12 | ||||
| * added Content Model section, including ER diagram | ||||
| * removed domain lookup interface; domains are now plain attributes | ||||
| of groups and endpoints | ||||
| * updated chapter "Finding a Resource Directory"; now distinguishes | ||||
| configuration-provided, network-provided and heuristic sources | ||||
| * improved text on: atomicity, idempotency, lookup with multiple | ||||
| parameters, endpoint removal, simple registration | ||||
| * updated LWM2M description | ||||
| * clarified where relative references are resolved, and how context | ||||
| and anchor interact | ||||
| * new appendix on the interaction with RFCs 6690, 5988 and 3986 | ||||
| * lookup interface: group and endpoint lookup return group and | ||||
| registration resources as link targets | ||||
| * lookup interface: search parameters work the same across all | ||||
| entities | ||||
| * removed all methods that modify links in an existing registration | ||||
| (POST with payload, PATCH and iPATCH) | ||||
| * removed plurality definition (was only needed for link | ||||
| modification) | ||||
| * enhanced IANA registry text | ||||
| * state that lookup resources can be observable | ||||
| * More examples and improved text | ||||
| changes from -09 to -10 | ||||
| * removed "ins" and "exp" link-format extensions. | ||||
| * removed all text concerning DNS-SD. | ||||
| * removed inconsistency in RDAO text. | ||||
| * suggestions taken over from various sources | ||||
| * replaced "Function Set" with "REST API", "base URI", "base path" | ||||
| * moved simple registration to registration section | ||||
| changes from -08 to -09 | ||||
| * clarified the "example use" of the base RD resource values /rd, | ||||
| /rd-lookup, and /rd-group. | ||||
| * changed "ins" ABNF notation. | ||||
| * various editorial improvements, including in examples | ||||
| * clarifications for RDAO | ||||
| changes from -07 to -08 | ||||
| * removed link target value returned from domain and group lookup | ||||
| types | ||||
| * Maximum length of domain parameter 63 bytes for consistency with | ||||
| group | ||||
| * removed option for simple POST of link data, don't require a | ||||
| .well-known/core resource to accept POST data and handle it in a | ||||
| special way; we already have /rd for that | ||||
| * add IPv6 ND Option for discovery of an RD | ||||
| * clarify group configuration section 6.1 that endpoints must be | ||||
| registered before including them in a group | ||||
| * removed all superfluous client-server diagrams | ||||
| * simplified lighting example | ||||
| * introduced Commissioning Tool | ||||
| * RD-Look-up text is extended. | ||||
| changes from -06 to -07 | ||||
| * added text in the discovery section to allow content format hints | ||||
| to be exposed in the discovery link attributes | ||||
| * editorial updates to section 9 | ||||
| * update author information | ||||
| * minor text corrections | ||||
| Changes from -05 to -06 | ||||
| * added note that the PATCH section is contingent on the progress of | ||||
| the PATCH method | ||||
| changes from -04 to -05 | ||||
| * added Update Endpoint Links using PATCH | ||||
| * http access made explicit in interface specification | ||||
| * Added http examples | ||||
| Changes from -03 to -04: | ||||
| * Added http response codes | ||||
| * Clarified endpoint name usage | ||||
| * Add application/link-format+cbor content-format | ||||
| Changes from -02 to -03: | ||||
| * Added an example for lighting and DNS integration | ||||
| * Added an example for RD use in OMA LWM2M | ||||
| * Added Read Links operation for link inspection by endpoints | ||||
| * Expanded DNS-SD section | ||||
| * Added draft authors Peter van der Stok and Michael Koster | ||||
| Changes from -01 to -02: | ||||
| * Added a catalogue use case. | ||||
| * Changed the registration update to a POST with optional link | ||||
| format payload. Removed the endpoint type update from the update. | ||||
| * Additional examples section added for more complex use cases. | ||||
| * New DNS-SD mapping section. | ||||
| * Added text on endpoint identification and authentication. | ||||
| * Error code 4.04 added to Registration Update and Delete requests. | ||||
| * Made 63 bytes a SHOULD rather than a MUST for endpoint name and | ||||
| resource type parameters. | ||||
| Changes from -00 to -01: | ||||
| * Removed the ETag validation feature. | ||||
| * Place holder for the DNS-SD mapping section. | ||||
| * Explicitly disabled GET or POST on returned Location. | ||||
| * New registry for RD parameters. | ||||
| * Added support for the JSON Link Format. | ||||
| * Added reference to the Groupcomm WG draft. | ||||
| Changes from -05 to WG Document -00: | ||||
| * Updated the version and date. | ||||
| Changes from -04 to -05: | ||||
| * Restricted Update to parameter updates. | ||||
| * Added pagination support for the Lookup interface. | ||||
| * Minor editing, bug fixes and reference updates. | ||||
| * Added group support. | ||||
| * Changed rt to et for the registration and update interface. | ||||
| Changes from -03 to -04: | ||||
| * Added the ins= parameter back for the DNS-SD mapping. | ||||
| * Integrated the Simple Directory Discovery from Carsten. | ||||
| * Editorial improvements. | ||||
| * Fixed the use of ETags. | ||||
| * Fixed tickets 383 and 372 | ||||
| Changes from -02 to -03: | ||||
| * Changed the endpoint name back to a single registration parameter | ||||
| ep= and removed the h= and ins= parameters. | ||||
| * Updated REST interface descriptions to use RFC6570 URI Template | ||||
| format. | ||||
| * Introduced an improved RD Lookup design as its own function set. | ||||
| * Improved the security considerations section. | ||||
| * Made the POST registration interface idempotent by requiring the | ||||
| ep= parameter to be present. | ||||
| Changes from -01 to -02: | ||||
| * Added a terminology section. | ||||
| * Changed the inclusion of an ETag in registration or update to a | ||||
| MAY. | ||||
| * Added the concept of an RD Domain and a registration parameter for | ||||
| it. | ||||
| * Recommended the Location returned from a registration to be | ||||
| stable, allowing for endpoint and Domain information to be changed | ||||
| during updates. | ||||
| * Changed the lookup interface to accept endpoint and Domain as | ||||
| query string parameters to control the scope of a lookup. | ||||
| 13. References | ||||
| 13.1. Normative References | ||||
| [I-D.ietf-core-echo-request-tag] | 11.1. Normative References | |||
| Amsüss, C., Mattsson, J. P., and G. Selander, "CoAP: Echo, | ||||
| Request-Tag, and Token Processing", Work in Progress, | ||||
| Internet-Draft, draft-ietf-core-echo-request-tag-12, 1 | ||||
| February 2021, <https://www.ietf.org/archive/id/draft- | ||||
| ietf-core-echo-request-tag-12.txt>. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
| <https://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
| skipping to change at page 77, line 46 ¶ | skipping to change at line 2803 ¶ | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8288] Nottingham, M., "Web Linking", RFC 8288, | [RFC8288] Nottingham, M., "Web Linking", RFC 8288, | |||
| DOI 10.17487/RFC8288, October 2017, | DOI 10.17487/RFC8288, October 2017, | |||
| <https://www.rfc-editor.org/info/rfc8288>. | <https://www.rfc-editor.org/info/rfc8288>. | |||
| 13.2. Informative References | [RFC9175] Amsüss, C., Preuß Mattsson, J., and G. Selander, | |||
| "Constrained Application Protocol (CoAP): Echo, Request- | ||||
| [ER] Chen, P., "The entity-relationship model--toward a unified | Tag, and Token Processing", RFC 9175, | |||
| view of data", DOI 10.1145/320434.320440, ACM Transactions | DOI 10.17487/RFC9175, February 2022, | |||
| on Database Systems Vol. 1, pp. 9-36, March 1976, | <https://www.rfc-editor.org/info/rfc9175>. | |||
| <https://doi.org/10.1145/320434.320440>. | ||||
| [I-D.bormann-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://www.ietf.org/archive/id/draft- | ||||
| bormann-t2trg-rel-impl-02.txt>. | ||||
| [I-D.hartke-t2trg-coral] | 11.2. Informative References | |||
| Hartke, K., "The Constrained RESTful Application Language | ||||
| (CoRAL)", Work in Progress, Internet-Draft, draft-hartke- | ||||
| t2trg-coral-09, 8 July 2019, | ||||
| <https://www.ietf.org/archive/id/draft-hartke-t2trg-coral- | ||||
| 09.txt>. | ||||
| [I-D.ietf-ace-oauth-authz] | [ACE-OAUTH-AUTHZ] | |||
| Seitz, L., Selander, G., Wahlstroem, E., Erdtman, S., and | Seitz, L., Selander, G., Wahlstroem, E., Erdtman, S., and | |||
| H. Tschofenig, "Authentication and Authorization for | H. Tschofenig, "Authentication and Authorization for | |||
| Constrained Environments (ACE) using the OAuth 2.0 | Constrained Environments Using the OAuth 2.0 Framework | |||
| Framework (ACE-OAuth)", Work in Progress, Internet-Draft, | (ACE-OAuth)", Work in Progress, Internet-Draft, draft- | |||
| draft-ietf-ace-oauth-authz-37, 4 February 2021, | ietf-ace-oauth-authz-46, 8 November 2021, | |||
| <https://www.ietf.org/archive/id/draft-ietf-ace-oauth- | <https://datatracker.ietf.org/doc/html/draft-ietf-ace- | |||
| authz-37.txt>. | oauth-authz-46>. | |||
| [I-D.ietf-core-links-json] | [COAP-PROT-NEG] | |||
| LI, K., Rahman, A., and C. Bormann, "Representing | 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 | Constrained RESTful Environments (CoRE) Link Format in | |||
| JSON and CBOR", Work in Progress, Internet-Draft, draft- | JSON and CBOR", Work in Progress, Internet-Draft, draft- | |||
| ietf-core-links-json-10, 26 February 2018, | ietf-core-links-json-10, 26 February 2018, | |||
| <https://www.ietf.org/archive/id/draft-ietf-core-links- | <https://datatracker.ietf.org/doc/html/draft-ietf-core- | |||
| json-10.txt>. | links-json-10>. | |||
| [I-D.ietf-core-rd-dns-sd] | [CORE-RD-DNS-SD] | |||
| Stok, P. V. D., Koster, M., and C. Amsüss, "CoRE Resource | van der Stok, P., Koster, M., and C. Amsuess, "CoRE | |||
| Directory: DNS-SD mapping", Work in Progress, Internet- | Resource Directory: DNS-SD mapping", Work in Progress, | |||
| Draft, draft-ietf-core-rd-dns-sd-05, 7 July 2019, | Internet-Draft, draft-ietf-core-rd-dns-sd-05, 7 July 2019, | |||
| <https://www.ietf.org/archive/id/draft-ietf-core-rd-dns- | <https://datatracker.ietf.org/doc/html/draft-ietf-core-rd- | |||
| sd-05.txt>. | dns-sd-05>. | |||
| [I-D.silverajan-core-coap-protocol-negotiation] | [ER] Chen, P., "The entity-relationship model--toward a unified | |||
| Silverajan, B. and M. Ocak, "CoAP Protocol Negotiation", | view of data", ACM Transactions on Database Systems, Vol. | |||
| Work in Progress, Internet-Draft, draft-silverajan-core- | 1, pp. 9-36, DOI 10.1145/320434.320440, March 1976, | |||
| coap-protocol-negotiation-09, 2 July 2018, | <https://doi.org/10.1145/320434.320440>. | |||
| <https://www.ietf.org/archive/id/draft-silverajan-core- | ||||
| coap-protocol-negotiation-09.txt>. | ||||
| [LwM2M] Open Mobile Alliance, "Lightweight Machine to Machine | [LwM2M] Open Mobile Alliance, "Lightweight Machine to Machine | |||
| Technical Specification: Transport Bindings (Candidate | Technical Specification: Transport Bindings (Candidate | |||
| Version 1.1)", 12 June 2018, | Version 1.1)", June 2018, | |||
| <https://openmobilealliance.org/RELEASE/LightweightM2M/ | <https://openmobilealliance.org/RELEASE/LightweightM2M/ | |||
| V1_1-20180612-C/OMA-TS-LightweightM2M_Transport- | V1_1-20180612-C/OMA-TS-LightweightM2M_Transport- | |||
| V1_1-20180612-C.pdf>. | V1_1-20180612-C.pdf>. | |||
| [RFC3306] Haberman, B. and D. Thaler, "Unicast-Prefix-based IPv6 | [RFC3306] Haberman, B. and D. Thaler, "Unicast-Prefix-based IPv6 | |||
| Multicast Addresses", RFC 3306, DOI 10.17487/RFC3306, | Multicast Addresses", RFC 3306, DOI 10.17487/RFC3306, | |||
| August 2002, <https://www.rfc-editor.org/info/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 | [RFC3849] Huston, G., Lord, A., and P. Smith, "IPv6 Address Prefix | |||
| Reserved for Documentation", RFC 3849, | Reserved for Documentation", RFC 3849, | |||
| DOI 10.17487/RFC3849, July 2004, | DOI 10.17487/RFC3849, July 2004, | |||
| <https://www.rfc-editor.org/info/rfc3849>. | <https://www.rfc-editor.org/info/rfc3849>. | |||
| [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | |||
| Unique IDentifier (UUID) URN Namespace", RFC 4122, | Unique IDentifier (UUID) URN Namespace", RFC 4122, | |||
| DOI 10.17487/RFC4122, July 2005, | DOI 10.17487/RFC4122, July 2005, | |||
| <https://www.rfc-editor.org/info/rfc4122>. | <https://www.rfc-editor.org/info/rfc4122>. | |||
| skipping to change at page 80, line 29 ¶ | skipping to change at line 2934 ¶ | |||
| [RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names | [RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names | |||
| (URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017, | (URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017, | |||
| <https://www.rfc-editor.org/info/rfc8141>. | <https://www.rfc-editor.org/info/rfc8141>. | |||
| [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | |||
| "Object Security for Constrained RESTful Environments | "Object Security for Constrained RESTful Environments | |||
| (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, | (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, | |||
| <https://www.rfc-editor.org/info/rfc8613>. | <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 | Appendix A. Groups Registration and Lookup | |||
| The RD-Groups usage pattern allows announcing application groups | The RD-Group's usage pattern allows announcing application groups | |||
| inside an RD. | inside an RD. | |||
| Groups are represented by endpoint registrations. Their base address | Groups are represented by endpoint registrations. Their base address | |||
| is a multicast address, and they SHOULD be entered with the endpoint | 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 | type core.rd-group. The endpoint name can also be referred to as a | |||
| group name in this context. | group name in this context. | |||
| The registration is inserted into the RD by a Commissioning Tool, | The registration is inserted into the RD by a Commissioning Tool, | |||
| which might also be known as a group manager here. It performs third | which might also be known as a group manager here. It performs | |||
| party registration and registration updates. | third-party registration and registration updates. | |||
| The links it registers SHOULD be available on all members that join | The links it registers SHOULD be available on all members that join | |||
| the group. Depending on the application, members that lack some | the group. Depending on the application, members that lack some | |||
| resource MAY be permissible if requests to them fail gracefully. | resources MAY be permissible if requests to them fail gracefully. | |||
| The following example shows a CT registering a group with the name | The following example shows a CT registering a group with the name | |||
| "lights" which provides two resources. The directory resource path | "lights", which provides two resources. The directory resource path | |||
| /rd is an example RD location discovered in a request similar to | /rd is an example RD location discovered in a request similar to | |||
| Figure 5. The group address in the example is constructed from | Figure 5. The group address in the example is constructed from the | |||
| [RFC3849]'s reserved 2001:db8:: prefix as a unicast-prefix based | reserved 2001:db8:: prefix in [RFC3849] as a unicast-prefix-based | |||
| site-local address (see [RFC3306]. | site-local address (see [RFC3306]). | |||
| Req: POST coap://rd.example.com/rd?ep=lights&et=core.rd-group | Req: POST coap://rd.example.com/rd?ep=lights&et=core.rd-group | |||
| &base=coap://[ff35:30:2001:db8:f1::8000:1] | &base=coap://[ff35:30:2001:db8:f1::8000:1] | |||
| Content-Format: 40 | Content-Format: 40 | |||
| Payload: | Payload: | |||
| </light>;rt="tag:example.com,2020:light"; | </light>;rt="tag:example.com,2020:light"; | |||
| if="tag:example.net,2020:actuator", | if="tag:example.net,2020:actuator", | |||
| </color-temperature>;if="tag:example.net,2020:parameter";u=K | </color-temperature>;if="tag:example.net,2020:parameter";u=K | |||
| Res: 2.01 Created | Res: 2.01 Created | |||
| Location-Path: /rd/12 | Location-Path: /rd/12 | |||
| Figure 27: Example registration of a group | Figure 27: Example Registration of a Group | |||
| In this example, the group manager can easily permit devices that | In this example, the group manager can easily permit devices that | |||
| have no writable color-temperature to join, as they would still | have no writable color-temperature to join, as they would still | |||
| respond to brightness changing commands. Had the group instead | respond to brightness-changing commands. Had the group instead | |||
| contained a single resource that sets brightness and color | contained a single resource that sets brightness and color- | |||
| temperature atomically, endpoints would need to support both | temperature atomically, endpoints would need to support both | |||
| properties. | properties. | |||
| The resources of a group can be looked up like any other resource, | The resources of a group can be looked up like any other resource, | |||
| and the group registrations (along with any additional registration | and the group registrations (along with any additional registration | |||
| parameters) can be looked up using the endpoint lookup interface. | parameters) can be looked up using the endpoint lookup interface. | |||
| The following example shows a client performing an endpoint lookup | The following example shows a client performing an endpoint lookup | |||
| for all groups. | for all groups: | |||
| Req: GET /rd-lookup/ep?et=core.rd-group | Req: GET /rd-lookup/ep?et=core.rd-group | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| </rd/12>;ep=lights&et=core.rd-group; | </rd/12>;ep=lights&et=core.rd-group; | |||
| base="coap://[ff35:30:2001:f1:db8::8000:1]";rt=core.rd-ep | base="coap://[ff35:30:2001:f1:db8::8000:1]";rt=core.rd-ep | |||
| Figure 28: Example lookup of groups | Figure 28: Example Lookup of Groups | |||
| The following example shows a client performing a lookup of all | The following example shows a client performing a lookup of all | |||
| resources of all endpoints (groups) with et=core.rd-group. | resources of all endpoints (groups) with et=core.rd-group: | |||
| Req: GET /rd-lookup/res?et=core.rd-group | Req: GET /rd-lookup/res?et=core.rd-group | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://[ff35:30:2001:db8:f1::8000:1]/light>; | <coap://[ff35:30:2001:db8:f1::8000:1]/light>; | |||
| rt="tag:example.com,2020:light"; | rt="tag:example.com,2020:light"; | |||
| if="tag:example.net,2020:actuator", | if="tag:example.net,2020:actuator", | |||
| <coap://[ff35:30:2001:db8:f1::8000:1]/color-temperature>; | <coap://[ff35:30:2001:db8:f1::8000:1]/color-temperature>; | |||
| if="tag:example.net,2020:parameter";u=K, | if="tag:example.net,2020:parameter";u=K, | |||
| Figure 29: Example lookup of resources inside groups | ||||
| Appendix B. Web links and the Resource Directory | 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 | Understanding the semantics of a link-format document and its URI | |||
| references is a journey through different documents ([RFC3986] | references is a journey through different documents ([RFC3986] | |||
| defining URIs, [RFC6690] defining link-format documents based on | defining URIs, [RFC6690] defining link-format documents based on | |||
| [RFC8288] which defines Link header fields, and [RFC7252] providing | [RFC8288], which defines Link header fields, and [RFC7252] providing | |||
| the transport). This appendix summarizes the mechanisms and | the transport). This appendix summarizes the mechanisms and | |||
| semantics at play from an entry in "/.well-known/core" to a resource | semantics at play from an entry in /.well-known/core to a resource | |||
| lookup. | lookup. | |||
| This text is primarily aimed at people entering the field of | This text is primarily aimed at people entering the field of | |||
| Constrained Restful Environments from applications that previously | Constrained Restful Environments from applications that previously | |||
| did not use web mechanisms. | did not use web mechanisms. | |||
| B.1. A simple example | B.1. A Simple Example | |||
| Let's start this example with a very simple host, "2001:db8:f0::1". | Let's start this example with a very simple host, 2001:db8:f0::1. A | |||
| A client that follows classical CoAP Discovery ([RFC7252] Section 7), | client that follows classical CoAP discovery ([RFC7252], Section 7) | |||
| sends the following multicast request to learn about neighbours | sends the following multicast request to learn about neighbors | |||
| supporting resources with resource-type "temperature". | supporting resources with resource-type "temperature". | |||
| The client sends a link-local multicast: | The client sends a link-local multicast: | |||
| Req: GET coap://[ff02::fd]:5683/.well-known/core?rt=temperature | Req: GET coap://[ff02::fd]:5683/.well-known/core?rt=temperature | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| </sensors/temp>;rt=temperature;ct=0 | </sensors/temp>;rt=temperature;ct=0 | |||
| Figure 30: Example of direct resource discovery | Figure 30: Example of Direct Resource Discovery | |||
| where the response is sent by the server, "[2001:db8:f0::1]:5683". | where the response is sent by the server, [2001:db8:f0::1]:5683. | |||
| While the client -- on the practical or implementation side -- can | While a practical client side implementation might just go ahead and | |||
| just go ahead and create a new request to "[2001:db8:f0::1]:5683" | create a new request to [2001:db8:f0::1]:5683 with Uri-Path sensors | |||
| with Uri-Path: "sensors" and "temp", the full resolution steps for | and temp, the full resolution steps for insertion into and retrieval | |||
| insertion into and retrieval from the RD without any shortcuts are: | from the RD without any shortcuts are as follows. | |||
| B.1.1. Resolving the URIs | B.1.1. Resolving the URIs | |||
| The client parses the single returned record. The link's target | The client parses the single returned link. Its target (sometimes | |||
| (sometimes called "href") is ""/sensors/temp"", which is a relative | called "href") is /sensors/temp, which is a relative URI that needs | |||
| URI that needs resolving. The base URI | resolving. The base URI coap://[ff02::fd]:5683/.well-known/core is | |||
| <coap://[ff02::fd]:5683/.well-known/core> is used to resolve the | used to resolve the reference against /sensors/temp. | |||
| reference /sensors/temp against. | ||||
| The Base URI of the requested resource can be composed from the | The base URI of the requested resource can be composed from the | |||
| options of the CoAP GET request by following the steps of [RFC7252] | options of the CoAP GET request by following the steps of [RFC7252], | |||
| section 6.5 (with an addition at the end of 8.2) into | Section 6.5 (with an addition at the end of Section 8.2) into | |||
| ""coap://[2001:db8:f0::1]/.well-known/core"". | coap://[2001:db8:f0::1]/.well-known/core. | |||
| Because ""/sensors/temp"" starts with a single slash, the record's | Because /sensors/temp starts with a single slash, the link's target | |||
| target is resolved by replacing the path ""/.well-known/core"" from | is resolved by replacing the path /.well-known/core from the base URI | |||
| the Base URI (section 5.2 [RFC3986]) with the relative target URI | ([RFC3986], Section 5.2) with the relative target URI /sensors/temp | |||
| ""/sensors/temp"" into ""coap://[2001:db8:f0::1]/sensors/temp"". | into coap://[2001:db8:f0::1]/sensors/temp. | |||
| B.1.2. Interpreting attributes and relations | B.1.2. Interpreting Attributes and Relations | |||
| Some more information but the record's target can be obtained from | Some more information about the link's target can be obtained from | |||
| the payload: the resource type of the target is "temperature", and | the payload: the resource type of the target is "temperature", and | |||
| its content format is text/plain (ct=0). | its content format is text/plain (ct=0). | |||
| A relation in a web link is a three-part statement that specifies a | A relation in a web link is a three-part statement that specifies a | |||
| named relation between the so-called "context resource" and the | named relation between the so-called "context resource" and the | |||
| target resource, like "_This page_ has _its table of contents_ at _/ | target resource, like "_This page_ has _its table of contents_ at _/ | |||
| toc.html_". In link format documents, there is an implicit "host | toc.html_". In link-format documents, there is an implicit "host | |||
| relation" specified with default parameter: rel="hosts". | relation" specified with default parameter rel="hosts". | |||
| In our example, the context resource of the link is implied to be | 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 | 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: | 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] is hosting the resource | |||
| "coap://[2001:db8:f0::1]/sensors/temp", which is of the resource type | coap://[2001:db8:f0::1]/sensors/temp, which is of the resource | |||
| "temperature" and can be accessed using the text/plain content | type "temperature" and can be read in the text/plain content | |||
| format.' | format. | |||
| B.2. A slightly more complex example | B.2. A Slightly More Complex Example | |||
| Omitting the "rt=temperature" filter, the discovery query would have | Omitting the rt=temperature filter, the discovery query would have | |||
| given some more records in the payload: | given some more links in the payload: | |||
| Req: GET coap://[ff02::fd]:5683/.well-known/core | Req: GET coap://[ff02::fd]:5683/.well-known/core | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| </sensors/temp>;rt=temperature;ct=0, | </sensors/temp>;rt=temperature;ct=0, | |||
| </sensors/light>;rt=light-lux;ct=0, | </sensors/light>;rt=light-lux;ct=0, | |||
| </t>;anchor="/sensors/temp";rel=alternate, | </t>;anchor="/sensors/temp";rel=alternate, | |||
| <http://www.example.com/sensors/t123>;anchor="/sensors/temp"; | <http://www.example.com/sensors/t123>;anchor="/sensors/temp"; | |||
| rel=describedby | rel=describedby | |||
| Figure 31: Extended example of direct resource discovery | Figure 31: Extended Example of Direct Resource Discovery | |||
| Parsing the third record, the client encounters the "anchor" | Parsing the third link, the client encounters the "anchor" parameter. | |||
| parameter. It is a URI relative to the Base URI of the request and | It is a URI relative to the base URI of the request and is thus | |||
| is thus resolved to ""coap://[2001:db8:f0::1]/sensors/temp"". That | resolved to coap://[2001:db8:f0::1]/sensors/temp. That is the | |||
| is the context resource of the link, so the "rel" statement is not | context resource of the link, so the "rel" statement is not about the | |||
| about the target and the Base URI any more, but about the target and | target and the base URI any more but about the target and the | |||
| the resolved URI. Thus, the third record could be read as | 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 record can be read as | coap://[2001:db8:f0::1]/sensors/temp has an alternate | |||
| ""coap://[2001:db8:f0::1]/sensors/temp" is described by | representation at coap://[2001:db8:f0::1]/t. | |||
| "http://www.example.com/sensors/t123"". | ||||
| 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 | B.3. Enter the Resource Directory | |||
| The RD tries to carry the semantics obtainable by classical CoAP | The RD tries to carry the semantics obtainable by classical CoAP | |||
| discovery over to the resource lookup interface as faithfully as | discovery over to the resource lookup interface as faithfully as | |||
| possible. | possible. | |||
| For the following queries, we will assume that the simple host has | For the following queries, we will assume that the simple host has | |||
| used Simple Registration to register at the RD that was announced to | 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": | it, sending this request from its UDP port [2001:db8:f0::1]:6553: | |||
| Req: POST coap://[2001:db8:f01::ff]/.well-known/rd?ep=simple-host1 | Req: POST coap://[2001:db8:f0::ff]/.well-known/rd?ep=simple-host1 | |||
| Res: 2.04 Changed | Res: 2.04 Changed | |||
| Figure 32: Example of a simple registration | Figure 32: Example of a Simple Registration | |||
| The RD would have accepted the registration, and queried the simple | The RD would have accepted the registration and queried the simple | |||
| host's "/.well-known/core" by itself. As a result, the host is | 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". | registered as an endpoint in the RD with the name "simple-host1". | |||
| The registration is active for 90000 seconds, and the endpoint | The registration is active for 90000 seconds, and the endpoint | |||
| registration Base URI is ""coap://[2001:db8:f0::1]"" following the | registration base URI is coap://[2001:db8:f0::1], following the | |||
| resolution steps described in Appendix B.1.1. It should be remarked | 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 | that the base URI constructed that way always yields a URI of the | |||
| form: scheme://authority without path suffix. | form scheme://authority without path suffix. | |||
| If the client now queries the RD as it would previously have issued a | 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 | multicast request, it would go through the RD discovery steps by | |||
| fetching "coap://[2001:db8:f0::ff]/.well-known/core?rt=core.rd- | fetching coap://[2001:db8:f0::ff]/.well-known/core?rt=core.rd-lookup- | |||
| lookup-res", obtain "coap://[2001:db8:f0::ff]/rd-lookup/res" as the | res, obtain coap://[2001:db8:f0::ff]/rd-lookup/res as the resource | |||
| resource lookup endpoint, and ask it for all temperature resources: | lookup endpoint, and ask it for all temperature resources: | |||
| Req: GET coap://[2001:db8:f0::ff]/rd-lookup/res?rt=temperature | Req: GET coap://[2001:db8:f0::ff]/rd-lookup/res?rt=temperature | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://[2001:db8:f0::1]/sensors/temp>;rt=temperature;ct=0 | <coap://[2001:db8:f0::1]/sensors/temp>;rt=temperature;ct=0 | |||
| Figure 33: Example exchange performing resource lookup | Figure 33: Example Exchange Performing Resource Lookup | |||
| This is not _literally_ the same response that it would have received | This is not _literally_ the same response that it would have received | |||
| from a multicast request, but it contains the equivalent statement: | from a multicast request, but it contains the equivalent statement: | |||
| '"coap://[2001:db8:f0::1]" is hosting the resource | coap://[2001:db8:f0::1] is hosting the resource | |||
| "coap://[2001:db8:f0::1]/sensors/temp", which is of the resource type | coap://[2001:db8:f0::1]/sensors/temp, which is of the resource | |||
| "temperature" and can be accessed using the text/plain content | type "temperature" and can be accessed using the text/plain | |||
| format.' | content format. | |||
| To complete the examples, the client could also query all resources | To complete the examples, the client could also query all resources | |||
| hosted at the endpoint with the known endpoint name "simple-host1": | hosted at the endpoint with the known endpoint name "simple-host1": | |||
| Req: GET coap://[2001:db8:f0::ff]/rd-lookup/res?ep=simple-host1 | Req: GET coap://[2001:db8:f0::ff]/rd-lookup/res?ep=simple-host1 | |||
| Res: 2.05 Content | Res: 2.05 Content | |||
| Payload: | Payload: | |||
| <coap://[2001:db8:f0::1]/sensors/temp>;rt=temperature;ct=0, | <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]/sensors/light>;rt=light-lux;ct=0, | |||
| <coap://[2001:db8:f0::1]/t>; | <coap://[2001:db8:f0::1]/t>; | |||
| anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=alternate, | anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=alternate, | |||
| <http://www.example.com/sensors/t123>; | <http://www.example.com/sensors/t123>; | |||
| anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=describedby | anchor="coap://[2001:db8:f0::1]/sensors/temp";rel=describedby | |||
| Figure 34: Extended example exchange performing resource lookup | Figure 34: Extended Example Exchange Performing Resource Lookup | |||
| All the target and anchor references are already in absolute form | All the target and anchor references are already in absolute form | |||
| there, which don't need to be resolved any further. | there, which don't need to be resolved any further. | |||
| Had the simple host done an equivalent full registration with a base= | Had the simple host done an equivalent full registration with a base= | |||
| parameter (e.g. "?ep=simple-host1&base=coap+tcp://simple- | parameter (e.g., ?ep=simple-host1&base=coap+tcp://sh1.example.com), | |||
| host1.example.com"), that context would have been used to resolve the | that context would have been used to resolve the relative anchor | |||
| relative anchor values instead, giving | values instead, giving the following and analogous links: | |||
| <coap+tcp://simple-host1.example.com/sensors/temp>;rt=temperature;ct=0 | ||||
| Figure 35: Example payload of a response to a resource lookup | <coap+tcp://sh1.example.com/sensors/temp>;rt=temperature;ct=0 | |||
| with a dedicated base URI | ||||
| and analogous records. | 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 | 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 | While link-format and Link header fields look very similar and are | |||
| based on the same model of typed links, there are some differences | based on the same model of typed links, there are some differences | |||
| between [RFC6690] and [RFC8288]. When implementing an RD or | between [RFC6690] and [RFC8288]. When implementing an RD or | |||
| interacting with an RD, care must be taken to follow the [RFC6690] | interacting with an RD, care must be taken to follow the behavior | |||
| behavior whenever application/link-format representations are used. | described in [RFC6690] whenever application/link-format | |||
| representations are used. | ||||
| * "Default value of anchor": Both under [RFC6690] and [RFC8288], | * "Default value of anchor": Under both [RFC6690] and [RFC8288], | |||
| relative references in the term inside the angle brackets (the | relative references in the term inside the angle brackets (the | |||
| target) and the anchor attribute are resolved against the relevant | target) and the anchor attribute are resolved against the relevant | |||
| base URI (which usually is the URI used to retrieve the entity), | base URI (which usually is the URI used to retrieve the entity) | |||
| and independent of each other. | and independent of each other. | |||
| When, in an [RFC8288] Link header, the anchor attribute is absent, | When, in a Link header [RFC8288], the anchor attribute is absent, | |||
| the link's context is the URI of the selected representation (and | the link's context is the URI of the selected representation (and | |||
| usually equal to the base URI). | usually equal to the base URI). | |||
| In [RFC6690] links, if the anchor attribute is absent, the default | In links per [RFC6690], if the anchor attribute is absent, the | |||
| value is the Origin of (for all relevant cases: the URI reference | default value is the Origin of (for all relevant cases, the URI | |||
| "/" resolved against) the link's target. | reference / resolved against) the link's target. | |||
| * There is no percent encoding in link-format documents. | * There is no percent encoding in link-format documents. | |||
| A link-format document is a UTF-8 encoded string of Unicode | A link-format document is a UTF-8-encoded string of Unicode | |||
| characters and does not have percent encoding, while Link header | characters and does not have percent encoding, while Link header | |||
| fields are practically ASCII strings that use percent encoding for | fields are practically ASCII strings that use percent encoding for | |||
| non-ASCII characters, stating the encoding explicitly when | non-ASCII characters, stating the encoding explicitly when | |||
| required. | required. | |||
| For example, while a Link header field in a page about a Swedish | For example, while a Link header field in a page about a Swedish | |||
| city might read | city might read: | |||
| Link: </temperature/Malm%C3%B6>;rel=live-environment-data | Link: </temperature/Malm%C3%B6>;rel=live-environment-data | |||
| a link-format document from the same source might describe the | a link-format document from the same source might describe the | |||
| link as | link as: | |||
| </temperature/Malmö>;rel=live-environment-data | </temperature/Malmö>;rel=live-environment-data | |||
| Appendix C. Limited Link Format | Appendix C. Limited Link Format | |||
| The CoRE Link Format as described in [RFC6690] has been interpreted | The CoRE Link Format, as described in [RFC6690], has been interpreted | |||
| differently by implementers, and a strict implementation rules out | differently by implementers, and a strict implementation rules out | |||
| some use cases of an RD (e.g. base values with path components in | some use cases of an RD (e.g., base values with path components in | |||
| combination with absent anchors). | combination with absent anchors). | |||
| This appendix describes a subset of link format documents called | This appendix describes a subset of link format documents called the | |||
| Limited Link Format. The one rule herein is not very limiting in | Limited Link Format. The one rule herein is not very limiting in | |||
| practice -- all examples in RFC6690, and all deployments the authors | practice -- all examples in [RFC6690] and all deployments the authors | |||
| are aware of already stick to them -- but ease the implementation of | are aware of already stick to them -- but eases the implementation of | |||
| RD servers. | RD servers. | |||
| It is applicable to representations in the application/link-format | It is applicable to representations in the application/link-format | |||
| media type, and any other media types that inherit [RFC6690] | media type and any other media types that inherit [RFC6690], | |||
| Section 2.1. | Section 2.1. | |||
| A link format representation is in Limited Link format if, for each | A link format representation is in the Limited Link Format if, for | |||
| link in it, the following applies: | each link in it, the following applies: | |||
| All URI references either follow the URI or the path-absolute ABNF | All URI references either follow the URI or the path-absolute ABNF | |||
| rule of RFC3986 (i.e. target and anchor each either start with a | rule of [RFC3986] (i.e., the target and anchor each either start with | |||
| scheme or with a single slash). | 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 | Authors' Addresses | |||
| Christian Amsüss (editor) | Christian Amsüss (editor) | |||
| Hollandstr. 12/4 | ||||
| 1020 | ||||
| Austria | ||||
| Phone: +43-664-9790639 | ||||
| Email: christian@amsuess.com | Email: christian@amsuess.com | |||
| Zach Shelby | Zach Shelby | |||
| ARM | Edge Impulse | |||
| 150 Rose Orchard | 3031 Tisch Way | |||
| San Jose, 95134 | San Jose, 95128 | |||
| United States of America | United States of America | |||
| Email: zach@edgeimpulse.com | ||||
| Phone: +1-408-203-9434 | ||||
| Email: zach.shelby@arm.com | ||||
| Michael Koster | Michael Koster | |||
| SmartThings | PassiveLogic | |||
| 665 Clyde Avenue | 524 H Street | |||
| Mountain View, 94043 | Antioch, CA 94509 | |||
| United States of America | United States of America | |||
| Phone: +1-707-502-5136 | Phone: +1-707-502-5136 | |||
| Email: Michael.Koster@smartthings.com | Email: michaeljohnkoster@gmail.com | |||
| Carsten Bormann | Carsten Bormann | |||
| Universitaet Bremen TZI | Universität Bremen TZI | |||
| Postfach 330440 | Postfach 330440 | |||
| D-28359 Bremen | D-28359 Bremen | |||
| Germany | Germany | |||
| Phone: +49-421-218-63921 | Phone: +49-421-218-63921 | |||
| Email: cabo@tzi.org | Email: cabo@tzi.org | |||
| Peter van der Stok | Peter van der Stok | |||
| consultant | vanderstok consultancy | |||
| Email: stokcons@bbhmail.nl | ||||
| Phone: +31-492474673 (Netherlands), +33-966015248 (France) | ||||
| Email: consultancy@vanderstok.org | ||||
| URI: www.vanderstok.org | ||||
| End of changes. 510 change blocks. | ||||
| 1990 lines changed or deleted | 1286 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||