diff options
Diffstat (limited to 'doc/rfc/rfc7252.txt')
-rw-r--r-- | doc/rfc/rfc7252.txt | 6275 |
1 files changed, 6275 insertions, 0 deletions
diff --git a/doc/rfc/rfc7252.txt b/doc/rfc/rfc7252.txt new file mode 100644 index 0000000..7ba5d03 --- /dev/null +++ b/doc/rfc/rfc7252.txt @@ -0,0 +1,6275 @@ + + + + + + +Internet Engineering Task Force (IETF) Z. Shelby +Request for Comments: 7252 ARM +Category: Standards Track K. Hartke +ISSN: 2070-1721 C. Bormann + Universitaet Bremen TZI + June 2014 + + + The Constrained Application Protocol (CoAP) + +Abstract + + The Constrained Application Protocol (CoAP) is a specialized web + transfer protocol for use with constrained nodes and constrained + (e.g., low-power, lossy) networks. The nodes often have 8-bit + microcontrollers with small amounts of ROM and RAM, while constrained + networks such as IPv6 over Low-Power Wireless Personal Area Networks + (6LoWPANs) often have high packet error rates and a typical + throughput of 10s of kbit/s. The protocol is designed for machine- + to-machine (M2M) applications such as smart energy and building + automation. + + CoAP provides a request/response interaction model between + application endpoints, supports built-in discovery of services and + resources, and includes key concepts of the Web such as URIs and + Internet media types. CoAP is designed to easily interface with HTTP + for integration with the Web while meeting specialized requirements + such as multicast support, very low overhead, and simplicity for + constrained environments. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc7252. + + + + + + + + +Shelby, et al. Standards Track [Page 1] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +Copyright Notice + + Copyright (c) 2014 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.1. Features . . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6 + 2. Constrained Application Protocol . . . . . . . . . . . . . . 10 + 2.1. Messaging Model . . . . . . . . . . . . . . . . . . . . . 11 + 2.2. Request/Response Model . . . . . . . . . . . . . . . . . 12 + 2.3. Intermediaries and Caching . . . . . . . . . . . . . . . 15 + 2.4. Resource Discovery . . . . . . . . . . . . . . . . . . . 15 + 3. Message Format . . . . . . . . . . . . . . . . . . . . . . . 15 + 3.1. Option Format . . . . . . . . . . . . . . . . . . . . . . 17 + 3.2. Option Value Formats . . . . . . . . . . . . . . . . . . 19 + 4. Message Transmission . . . . . . . . . . . . . . . . . . . . 20 + 4.1. Messages and Endpoints . . . . . . . . . . . . . . . . . 20 + 4.2. Messages Transmitted Reliably . . . . . . . . . . . . . . 21 + 4.3. Messages Transmitted without Reliability . . . . . . . . 23 + 4.4. Message Correlation . . . . . . . . . . . . . . . . . . . 24 + 4.5. Message Deduplication . . . . . . . . . . . . . . . . . . 24 + 4.6. Message Size . . . . . . . . . . . . . . . . . . . . . . 25 + 4.7. Congestion Control . . . . . . . . . . . . . . . . . . . 26 + 4.8. Transmission Parameters . . . . . . . . . . . . . . . . . 27 + 4.8.1. Changing the Parameters . . . . . . . . . . . . . . . 27 + 4.8.2. Time Values Derived from Transmission Parameters . . 28 + 5. Request/Response Semantics . . . . . . . . . . . . . . . . . 31 + 5.1. Requests . . . . . . . . . . . . . . . . . . . . . . . . 31 + 5.2. Responses . . . . . . . . . . . . . . . . . . . . . . . . 31 + 5.2.1. Piggybacked . . . . . . . . . . . . . . . . . . . . . 33 + 5.2.2. Separate . . . . . . . . . . . . . . . . . . . . . . 33 + 5.2.3. Non-confirmable . . . . . . . . . . . . . . . . . . . 34 + 5.3. Request/Response Matching . . . . . . . . . . . . . . . . 34 + 5.3.1. Token . . . . . . . . . . . . . . . . . . . . . . . . 34 + 5.3.2. Request/Response Matching Rules . . . . . . . . . . . 35 + + + +Shelby, et al. Standards Track [Page 2] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + 5.4. Options . . . . . . . . . . . . . . . . . . . . . . . . . 36 + 5.4.1. Critical/Elective . . . . . . . . . . . . . . . . . . 37 + 5.4.2. Proxy Unsafe or Safe-to-Forward and NoCacheKey . . . 38 + 5.4.3. Length . . . . . . . . . . . . . . . . . . . . . . . 38 + 5.4.4. Default Values . . . . . . . . . . . . . . . . . . . 38 + 5.4.5. Repeatable Options . . . . . . . . . . . . . . . . . 39 + 5.4.6. Option Numbers . . . . . . . . . . . . . . . . . . . 39 + 5.5. Payloads and Representations . . . . . . . . . . . . . . 40 + 5.5.1. Representation . . . . . . . . . . . . . . . . . . . 40 + 5.5.2. Diagnostic Payload . . . . . . . . . . . . . . . . . 41 + 5.5.3. Selected Representation . . . . . . . . . . . . . . . 41 + 5.5.4. Content Negotiation . . . . . . . . . . . . . . . . . 41 + 5.6. Caching . . . . . . . . . . . . . . . . . . . . . . . . . 42 + 5.6.1. Freshness Model . . . . . . . . . . . . . . . . . . . 43 + 5.6.2. Validation Model . . . . . . . . . . . . . . . . . . 43 + 5.7. Proxying . . . . . . . . . . . . . . . . . . . . . . . . 44 + 5.7.1. Proxy Operation . . . . . . . . . . . . . . . . . . . 44 + 5.7.2. Forward-Proxies . . . . . . . . . . . . . . . . . . . 46 + 5.7.3. Reverse-Proxies . . . . . . . . . . . . . . . . . . . 46 + 5.8. Method Definitions . . . . . . . . . . . . . . . . . . . 47 + 5.8.1. GET . . . . . . . . . . . . . . . . . . . . . . . . . 47 + 5.8.2. POST . . . . . . . . . . . . . . . . . . . . . . . . 47 + 5.8.3. PUT . . . . . . . . . . . . . . . . . . . . . . . . . 48 + 5.8.4. DELETE . . . . . . . . . . . . . . . . . . . . . . . 48 + 5.9. Response Code Definitions . . . . . . . . . . . . . . . . 48 + 5.9.1. Success 2.xx . . . . . . . . . . . . . . . . . . . . 48 + 5.9.2. Client Error 4.xx . . . . . . . . . . . . . . . . . . 50 + 5.9.3. Server Error 5.xx . . . . . . . . . . . . . . . . . . 51 + 5.10. Option Definitions . . . . . . . . . . . . . . . . . . . 52 + 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query . . . . 53 + 5.10.2. Proxy-Uri and Proxy-Scheme . . . . . . . . . . . . . 54 + 5.10.3. Content-Format . . . . . . . . . . . . . . . . . . . 55 + 5.10.4. Accept . . . . . . . . . . . . . . . . . . . . . . . 55 + 5.10.5. Max-Age . . . . . . . . . . . . . . . . . . . . . . 55 + 5.10.6. ETag . . . . . . . . . . . . . . . . . . . . . . . . 56 + 5.10.7. Location-Path and Location-Query . . . . . . . . . . 57 + 5.10.8. Conditional Request Options . . . . . . . . . . . . 57 + 5.10.9. Size1 Option . . . . . . . . . . . . . . . . . . . . 59 + 6. CoAP URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 59 + 6.1. coap URI Scheme . . . . . . . . . . . . . . . . . . . . . 59 + 6.2. coaps URI Scheme . . . . . . . . . . . . . . . . . . . . 60 + 6.3. Normalization and Comparison Rules . . . . . . . . . . . 61 + 6.4. Decomposing URIs into Options . . . . . . . . . . . . . . 61 + 6.5. Composing URIs from Options . . . . . . . . . . . . . . . 62 + 7. Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . 64 + 7.1. Service Discovery . . . . . . . . . . . . . . . . . . . . 64 + 7.2. Resource Discovery . . . . . . . . . . . . . . . . . . . 64 + 7.2.1. 'ct' Attribute . . . . . . . . . . . . . . . . . . . 64 + + + +Shelby, et al. Standards Track [Page 3] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + 8. Multicast CoAP . . . . . . . . . . . . . . . . . . . . . . . 65 + 8.1. Messaging Layer . . . . . . . . . . . . . . . . . . . . . 65 + 8.2. Request/Response Layer . . . . . . . . . . . . . . . . . 66 + 8.2.1. Caching . . . . . . . . . . . . . . . . . . . . . . . 67 + 8.2.2. Proxying . . . . . . . . . . . . . . . . . . . . . . 67 + 9. Securing CoAP . . . . . . . . . . . . . . . . . . . . . . . . 68 + 9.1. DTLS-Secured CoAP . . . . . . . . . . . . . . . . . . . . 69 + 9.1.1. Messaging Layer . . . . . . . . . . . . . . . . . . . 70 + 9.1.2. Request/Response Layer . . . . . . . . . . . . . . . 71 + 9.1.3. Endpoint Identity . . . . . . . . . . . . . . . . . . 71 + 10. Cross-Protocol Proxying between CoAP and HTTP . . . . . . . . 74 + 10.1. CoAP-HTTP Proxying . . . . . . . . . . . . . . . . . . . 75 + 10.1.1. GET . . . . . . . . . . . . . . . . . . . . . . . . 76 + 10.1.2. PUT . . . . . . . . . . . . . . . . . . . . . . . . 77 + 10.1.3. DELETE . . . . . . . . . . . . . . . . . . . . . . . 77 + 10.1.4. POST . . . . . . . . . . . . . . . . . . . . . . . . 77 + 10.2. HTTP-CoAP Proxying . . . . . . . . . . . . . . . . . . . 77 + 10.2.1. OPTIONS and TRACE . . . . . . . . . . . . . . . . . 78 + 10.2.2. GET . . . . . . . . . . . . . . . . . . . . . . . . 78 + 10.2.3. HEAD . . . . . . . . . . . . . . . . . . . . . . . . 79 + 10.2.4. POST . . . . . . . . . . . . . . . . . . . . . . . . 79 + 10.2.5. PUT . . . . . . . . . . . . . . . . . . . . . . . . 79 + 10.2.6. DELETE . . . . . . . . . . . . . . . . . . . . . . . 80 + 10.2.7. CONNECT . . . . . . . . . . . . . . . . . . . . . . 80 + 11. Security Considerations . . . . . . . . . . . . . . . . . . . 80 + 11.1. Parsing the Protocol and Processing URIs . . . . . . . . 80 + 11.2. Proxying and Caching . . . . . . . . . . . . . . . . . . 81 + 11.3. Risk of Amplification . . . . . . . . . . . . . . . . . 81 + 11.4. IP Address Spoofing Attacks . . . . . . . . . . . . . . 83 + 11.5. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 84 + 11.6. Constrained-Node Considerations . . . . . . . . . . . . 86 + 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 86 + 12.1. CoAP Code Registries . . . . . . . . . . . . . . . . . . 86 + 12.1.1. Method Codes . . . . . . . . . . . . . . . . . . . . 87 + 12.1.2. Response Codes . . . . . . . . . . . . . . . . . . . 88 + 12.2. CoAP Option Numbers Registry . . . . . . . . . . . . . . 89 + 12.3. CoAP Content-Formats Registry . . . . . . . . . . . . . 91 + 12.4. URI Scheme Registration . . . . . . . . . . . . . . . . 93 + 12.5. Secure URI Scheme Registration . . . . . . . . . . . . . 94 + 12.6. Service Name and Port Number Registration . . . . . . . 95 + 12.7. Secure Service Name and Port Number Registration . . . . 96 + 12.8. Multicast Address Registration . . . . . . . . . . . . . 97 + 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 97 + 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 98 + 14.1. Normative References . . . . . . . . . . . . . . . . . . 98 + 14.2. Informative References . . . . . . . . . . . . . . . . . 100 + Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 104 + Appendix B. URI Examples . . . . . . . . . . . . . . . . . . . . 110 + + + +Shelby, et al. Standards Track [Page 4] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +1. Introduction + + The use of web services (web APIs) on the Internet has become + ubiquitous in most applications and depends on the fundamental + Representational State Transfer [REST] architecture of the Web. + + The work on Constrained RESTful Environments (CoRE) aims at realizing + the REST architecture in a suitable form for the most constrained + nodes (e.g., 8-bit microcontrollers with limited RAM and ROM) and + networks (e.g., 6LoWPAN, [RFC4944]). Constrained networks such as + 6LoWPAN support the fragmentation of IPv6 packets into small link- + layer frames; however, this causes significant reduction in packet + delivery probability. One design goal of CoAP has been to keep + message overhead small, thus limiting the need for fragmentation. + + One of the main goals of CoAP is to design a generic web protocol for + the special requirements of this constrained environment, especially + considering energy, building automation, and other machine-to-machine + (M2M) applications. The goal of CoAP is not to blindly compress HTTP + [RFC2616], but rather to realize a subset of REST common with HTTP + but optimized for M2M applications. Although CoAP could be used for + refashioning simple HTTP interfaces into a more compact protocol, + more importantly it also offers features for M2M such as built-in + discovery, multicast support, and asynchronous message exchanges. + + This document specifies the Constrained Application Protocol (CoAP), + which easily translates to HTTP for integration with the existing Web + while meeting specialized requirements such as multicast support, + very low overhead, and simplicity for constrained environments and + M2M applications. + +1.1. Features + + CoAP has the following main features: + + o Web protocol fulfilling M2M requirements in constrained + environments + + o UDP [RFC0768] binding with optional reliability supporting unicast + and multicast requests. + + o Asynchronous message exchanges. + + o Low header overhead and parsing complexity. + + o URI and Content-type support. + + o Simple proxy and caching capabilities. + + + +Shelby, et al. Standards Track [Page 5] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + o A stateless HTTP mapping, allowing proxies to be built providing + access to CoAP resources via HTTP in a uniform way or for HTTP + simple interfaces to be realized alternatively over CoAP. + + o Security binding to Datagram Transport Layer Security (DTLS) + [RFC6347]. + +1.2. Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + [RFC2119] when they appear in ALL CAPS. These words may also appear + in this document in lowercase, absent their normative meanings. + + This specification requires readers to be familiar with all the terms + and concepts that are discussed in [RFC2616], including "resource", + "representation", "cache", and "fresh". (Having been completed + before the updated set of HTTP RFCs, RFC 7230 to RFC 7235, became + available, this specification specifically references the predecessor + version -- RFC 2616.) In addition, this specification defines the + following terminology: + + Endpoint + An entity participating in the CoAP protocol. Colloquially, an + endpoint lives on a "Node", although "Host" would be more + consistent with Internet standards usage, and is further + identified by transport-layer multiplexing information that can + include a UDP port number and a security association + (Section 4.1). + + Sender + The originating endpoint of a message. When the aspect of + identification of the specific sender is in focus, also "source + endpoint". + + Recipient + The destination endpoint of a message. When the aspect of + identification of the specific recipient is in focus, also + "destination endpoint". + + Client + The originating endpoint of a request; the destination endpoint of + a response. + + Server + The destination endpoint of a request; the originating endpoint of + a response. + + + +Shelby, et al. Standards Track [Page 6] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Origin Server + The server on which a given resource resides or is to be created. + + Intermediary + A CoAP endpoint that acts both as a server and as a client towards + an origin server (possibly via further intermediaries). A common + form of an intermediary is a proxy; several classes of such + proxies are discussed in this specification. + + Proxy + An intermediary that mainly is concerned with forwarding requests + and relaying back responses, possibly performing caching, + namespace translation, or protocol translation in the process. As + opposed to intermediaries in the general sense, proxies generally + do not implement specific application semantics. Based on the + position in the overall structure of the request forwarding, there + are two common forms of proxy: forward-proxy and reverse-proxy. + In some cases, a single endpoint might act as an origin server, + forward-proxy, or reverse-proxy, switching behavior based on the + nature of each request. + + Forward-Proxy + An endpoint selected by a client, usually via local configuration + rules, to perform requests on behalf of the client, doing any + necessary translations. Some translations are minimal, such as + for proxy requests for "coap" URIs, whereas other requests might + require translation to and from entirely different application- + layer protocols. + + Reverse-Proxy + An endpoint that stands in for one or more other server(s) and + satisfies requests on behalf of these, doing any necessary + translations. Unlike a forward-proxy, the client may not be aware + that it is communicating with a reverse-proxy; a reverse-proxy + receives requests as if it were the origin server for the target + resource. + + CoAP-to-CoAP Proxy + A proxy that maps from a CoAP request to a CoAP request, i.e., + uses the CoAP protocol both on the server and the client side. + Contrast to cross-proxy. + + Cross-Proxy + A cross-protocol proxy, or "cross-proxy" for short, is a proxy + that translates between different protocols, such as a CoAP-to- + HTTP proxy or an HTTP-to-CoAP proxy. While this specification + makes very specific demands of CoAP-to-CoAP proxies, there is more + variation possible in cross-proxies. + + + +Shelby, et al. Standards Track [Page 7] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Confirmable Message + Some messages require an acknowledgement. These messages are + called "Confirmable". When no packets are lost, each Confirmable + message elicits exactly one return message of type Acknowledgement + or type Reset. + + Non-confirmable Message + Some other messages do not require an acknowledgement. This is + particularly true for messages that are repeated regularly for + application requirements, such as repeated readings from a sensor. + + Acknowledgement Message + An Acknowledgement message acknowledges that a specific + Confirmable message arrived. By itself, an Acknowledgement + message does not indicate success or failure of any request + encapsulated in the Confirmable message, but the Acknowledgement + message may also carry a Piggybacked Response (see below). + + Reset Message + A Reset message indicates that a specific message (Confirmable or + Non-confirmable) was received, but some context is missing to + properly process it. This condition is usually caused when the + receiving node has rebooted and has forgotten some state that + would be required to interpret the message. Provoking a Reset + message (e.g., by sending an Empty Confirmable message) is also + useful as an inexpensive check of the liveness of an endpoint + ("CoAP ping"). + + Piggybacked Response + A piggybacked Response is included right in a CoAP Acknowledgement + (ACK) message that is sent to acknowledge receipt of the Request + for this Response (Section 5.2.1). + + Separate Response + When a Confirmable message carrying a request is acknowledged with + an Empty message (e.g., because the server doesn't have the answer + right away), a Separate Response is sent in a separate message + exchange (Section 5.2.2). + + Empty Message + A message with a Code of 0.00; neither a request nor a response. + An Empty message only contains the 4-byte header. + + + + + + + + + +Shelby, et al. Standards Track [Page 8] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Critical Option + An option that would need to be understood by the endpoint + ultimately receiving the message in order to properly process the + message (Section 5.4.1). Note that the implementation of critical + options is, as the name "Option" implies, generally optional: + unsupported critical options lead to an error response or summary + rejection of the message. + + Elective Option + An option that is intended to be ignored by an endpoint that does + not understand it. Processing the message even without + understanding the option is acceptable (Section 5.4.1). + + Unsafe Option + An option that would need to be understood by a proxy receiving + the message in order to safely forward the message + (Section 5.4.2). Not every critical option is an unsafe option. + + Safe-to-Forward Option + An option that is intended to be safe for forwarding by a proxy + that does not understand it. Forwarding the message even without + understanding the option is acceptable (Section 5.4.2). + + Resource Discovery + The process where a CoAP client queries a server for its list of + hosted resources (i.e., links as defined in Section 7). + + Content-Format + The combination of an Internet media type, potentially with + specific parameters given, and a content-coding (which is often + the identity content-coding), identified by a numeric identifier + defined by the "CoAP Content-Formats" registry. When the focus is + less on the numeric identifier than on the combination of these + characteristics of a resource representation, this is also called + "representation format". + + Additional terminology for constrained nodes and constrained-node + networks can be found in [RFC7228]. + + In this specification, the term "byte" is used in its now customary + sense as a synonym for "octet". + + All multi-byte integers in this protocol are interpreted in network + byte order. + + Where arithmetic is used, this specification uses the notation + familiar from the programming language C, except that the operator + "**" stands for exponentiation. + + + +Shelby, et al. Standards Track [Page 9] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +2. Constrained Application Protocol + + The interaction model of CoAP is similar to the client/server model + of HTTP. However, machine-to-machine interactions typically result + in a CoAP implementation acting in both client and server roles. A + CoAP request is equivalent to that of HTTP and is sent by a client to + request an action (using a Method Code) on a resource (identified by + a URI) on a server. The server then sends a response with a Response + Code; this response may include a resource representation. + + Unlike HTTP, CoAP deals with these interchanges asynchronously over a + datagram-oriented transport such as UDP. This is done logically + using a layer of messages that supports optional reliability (with + exponential back-off). CoAP defines four types of messages: + Confirmable, Non-confirmable, Acknowledgement, Reset. Method Codes + and Response Codes included in some of these messages make them carry + requests or responses. The basic exchanges of the four types of + messages are somewhat orthogonal to the request/response + interactions; requests can be carried in Confirmable and Non- + confirmable messages, and responses can be carried in these as well + as piggybacked in Acknowledgement messages. + + One could think of CoAP logically as using a two-layer approach, a + CoAP messaging layer used to deal with UDP and the asynchronous + nature of the interactions, and the request/response interactions + using Method and Response Codes (see Figure 1). CoAP is however a + single protocol, with messaging and request/response as just features + of the CoAP header. + + +----------------------+ + | Application | + +----------------------+ + +----------------------+ \ + | Requests/Responses | | + |----------------------| | CoAP + | Messages | | + +----------------------+ / + +----------------------+ + | UDP | + +----------------------+ + + Figure 1: Abstract Layering of CoAP + + + + + + + + + +Shelby, et al. Standards Track [Page 10] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +2.1. Messaging Model + + The CoAP messaging model is based on the exchange of messages over + UDP between endpoints. + + CoAP uses a short fixed-length binary header (4 bytes) that may be + followed by compact binary options and a payload. This message + format is shared by requests and responses. The CoAP message format + is specified in Section 3. Each message contains a Message ID used + to detect duplicates and for optional reliability. (The Message ID + is compact; its 16-bit size enables up to about 250 messages per + second from one endpoint to another with default protocol + parameters.) + + Reliability is provided by marking a message as Confirmable (CON). A + Confirmable message is retransmitted using a default timeout and + exponential back-off between retransmissions, until the recipient + sends an Acknowledgement message (ACK) with the same Message ID (in + this example, 0x7d34) from the corresponding endpoint; see Figure 2. + When a recipient is not at all able to process a Confirmable message + (i.e., not even able to provide a suitable error response), it + replies with a Reset message (RST) instead of an Acknowledgement + (ACK). + + Client Server + | | + | CON [0x7d34] | + +----------------->| + | | + | ACK [0x7d34] | + |<-----------------+ + | | + + Figure 2: Reliable Message Transmission + + A message that does not require reliable transmission (for example, + each single measurement out of a stream of sensor data) can be sent + as a Non-confirmable message (NON). These are not acknowledged, but + still have a Message ID for duplicate detection (in this example, + 0x01a0); see Figure 3. When a recipient is not able to process a + Non-confirmable message, it may reply with a Reset message (RST). + + + + + + + + + + +Shelby, et al. Standards Track [Page 11] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Client Server + | | + | NON [0x01a0] | + +----------------->| + | | + + Figure 3: Unreliable Message Transmission + + See Section 4 for details of CoAP messages. + + As CoAP runs over UDP, it also supports the use of multicast IP + destination addresses, enabling multicast CoAP requests. Section 8 + discusses the proper use of CoAP messages with multicast addresses + and precautions for avoiding response congestion. + + Several security modes are defined for CoAP in Section 9 ranging from + no security to certificate-based security. This document specifies a + binding to DTLS for securing the protocol; the use of IPsec with CoAP + is discussed in [IPsec-CoAP]. + +2.2. Request/Response Model + + CoAP request and response semantics are carried in CoAP messages, + which include either a Method Code or Response Code, respectively. + Optional (or default) request and response information, such as the + URI and payload media type are carried as CoAP options. A Token is + used to match responses to requests independently from the underlying + messages (Section 5.3). (Note that the Token is a concept separate + from the Message ID.) + + A request is carried in a Confirmable (CON) or Non-confirmable (NON) + message, and, if immediately available, the response to a request + carried in a Confirmable message is carried in the resulting + Acknowledgement (ACK) message. This is called a piggybacked + response, detailed in Section 5.2.1. (There is no need for + separately acknowledging a piggybacked response, as the client will + retransmit the request if the Acknowledgement message carrying the + piggybacked response is lost.) Two examples for a basic GET request + with piggybacked response are shown in Figure 4, one successful, one + resulting in a 4.04 (Not Found) response. + + + + + + + + + + + +Shelby, et al. Standards Track [Page 12] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Client Server Client Server + | | | | + | CON [0xbc90] | | CON [0xbc91] | + | GET /temperature | | GET /temperature | + | (Token 0x71) | | (Token 0x72) | + +----------------->| +----------------->| + | | | | + | ACK [0xbc90] | | ACK [0xbc91] | + | 2.05 Content | | 4.04 Not Found | + | (Token 0x71) | | (Token 0x72) | + | "22.5 C" | | "Not found" | + |<-----------------+ |<-----------------+ + | | | | + + Figure 4: Two GET Requests with Piggybacked Responses + + If the server is not able to respond immediately to a request carried + in a Confirmable message, it simply responds with an Empty + Acknowledgement message so that the client can stop retransmitting + the request. When the response is ready, the server sends it in a + new Confirmable message (which then in turn needs to be acknowledged + by the client). This is called a "separate response", as illustrated + in Figure 5 and described in more detail in Section 5.2.2. + + Client Server + | | + | CON [0x7a10] | + | GET /temperature | + | (Token 0x73) | + +----------------->| + | | + | ACK [0x7a10] | + |<-----------------+ + | | + ... Time Passes ... + | | + | CON [0x23bb] | + | 2.05 Content | + | (Token 0x73) | + | "22.5 C" | + |<-----------------+ + | | + | ACK [0x23bb] | + +----------------->| + | | + + Figure 5: A GET Request with a Separate Response + + + + +Shelby, et al. Standards Track [Page 13] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + If a request is sent in a Non-confirmable message, then the response + is sent using a new Non-confirmable message, although the server may + instead send a Confirmable message. This type of exchange is + illustrated in Figure 6. + + Client Server + | | + | NON [0x7a11] | + | GET /temperature | + | (Token 0x74) | + +----------------->| + | | + | NON [0x23bc] | + | 2.05 Content | + | (Token 0x74) | + | "22.5 C" | + |<-----------------+ + | | + + Figure 6: A Request and a Response Carried in Non-confirmable + Messages + + CoAP makes use of GET, PUT, POST, and DELETE methods in a similar + manner to HTTP, with the semantics specified in Section 5.8. (Note + that the detailed semantics of CoAP methods are "almost, but not + entirely unlike" [HHGTTG] those of HTTP methods: intuition taken from + HTTP experience generally does apply well, but there are enough + differences that make it worthwhile to actually read the present + specification.) + + Methods beyond the basic four can be added to CoAP in separate + specifications. New methods do not necessarily have to use requests + and responses in pairs. Even for existing methods, a single request + may yield multiple responses, e.g., for a multicast request + (Section 8) or with the Observe option [OBSERVE]. + + URI support in a server is simplified as the client already parses + the URI and splits it into host, port, path, and query components, + making use of default values for efficiency. Response Codes relate + to a small subset of HTTP status codes with a few CoAP-specific codes + added, as defined in Section 5.9. + + + + + + + + + + +Shelby, et al. Standards Track [Page 14] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +2.3. Intermediaries and Caching + + The protocol supports the caching of responses in order to + efficiently fulfill requests. Simple caching is enabled using + freshness and validity information carried with CoAP responses. A + cache could be located in an endpoint or an intermediary. Caching + functionality is specified in Section 5.6. + + Proxying is useful in constrained networks for several reasons, + including to limit network traffic, to improve performance, to access + resources of sleeping devices, and for security reasons. The + proxying of requests on behalf of another CoAP endpoint is supported + in the protocol. When using a proxy, the URI of the resource to + request is included in the request, while the destination IP address + is set to the address of the proxy. See Section 5.7 for more + information on proxy functionality. + + As CoAP was designed according to the REST architecture [REST], and + thus exhibits functionality similar to that of the HTTP protocol, it + is quite straightforward to map from CoAP to HTTP and from HTTP to + CoAP. Such a mapping may be used to realize an HTTP REST interface + using CoAP or to convert between HTTP and CoAP. This conversion can + be carried out by a cross-protocol proxy ("cross-proxy"), which + converts the Method or Response Code, media type, and options to the + corresponding HTTP feature. Section 10 provides more detail about + HTTP mapping. + +2.4. Resource Discovery + + Resource discovery is important for machine-to-machine interactions + and is supported using the CoRE Link Format [RFC6690] as discussed in + Section 7. + +3. Message Format + + CoAP is based on the exchange of compact messages that, by default, + are transported over UDP (i.e., each CoAP message occupies the data + section of one UDP datagram). CoAP may also be used over Datagram + Transport Layer Security (DTLS) (see Section 9.1). It could also be + used over other transports such as SMS, TCP, or SCTP, the + specification of which is out of this document's scope. (UDP-lite + [RFC3828] and UDP zero checksum [RFC6936] are not supported by CoAP.) + + CoAP messages are encoded in a simple binary format. The message + format starts with a fixed-size 4-byte header. This is followed by a + variable-length Token value, which can be between 0 and 8 bytes long. + + + + + +Shelby, et al. Standards Track [Page 15] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Following the Token value comes a sequence of zero or more CoAP + Options in Type-Length-Value (TLV) format, optionally followed by a + payload that takes up the rest of the datagram. + + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |Ver| T | TKL | Code | Message ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Token (if any, TKL bytes) ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Options (if any) ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |1 1 1 1 1 1 1 1| Payload (if any) ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 7: Message Format + + The fields in the header are defined as follows: + + Version (Ver): 2-bit unsigned integer. Indicates the CoAP version + number. Implementations of this specification MUST set this field + to 1 (01 binary). Other values are reserved for future versions. + Messages with unknown version numbers MUST be silently ignored. + + Type (T): 2-bit unsigned integer. Indicates if this message is of + type Confirmable (0), Non-confirmable (1), Acknowledgement (2), or + Reset (3). The semantics of these message types are defined in + Section 4. + + Token Length (TKL): 4-bit unsigned integer. Indicates the length of + the variable-length Token field (0-8 bytes). Lengths 9-15 are + reserved, MUST NOT be sent, and MUST be processed as a message + format error. + + Code: 8-bit unsigned integer, split into a 3-bit class (most + significant bits) and a 5-bit detail (least significant bits), + documented as "c.dd" where "c" is a digit from 0 to 7 for the + 3-bit subfield and "dd" are two digits from 00 to 31 for the 5-bit + subfield. The class can indicate a request (0), a success + response (2), a client error response (4), or a server error + response (5). (All other class values are reserved.) As a + special case, Code 0.00 indicates an Empty message. In case of a + request, the Code field indicates the Request Method; in case of a + response, a Response Code. Possible values are maintained in the + CoAP Code Registries (Section 12.1). The semantics of requests + and responses are defined in Section 5. + + + + +Shelby, et al. Standards Track [Page 16] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Message ID: 16-bit unsigned integer in network byte order. Used to + detect message duplication and to match messages of type + Acknowledgement/Reset to messages of type Confirmable/Non- + confirmable. The rules for generating a Message ID and matching + messages are defined in Section 4. + + The header is followed by the Token value, which may be 0 to 8 bytes, + as given by the Token Length field. The Token value is used to + correlate requests and responses. The rules for generating a Token + and correlating requests and responses are defined in Section 5.3.1. + + Header and Token are followed by zero or more Options (Section 3.1). + An Option can be followed by the end of the message, by another + Option, or by the Payload Marker and the payload. + + Following the header, token, and options, if any, comes the optional + payload. If present and of non-zero length, it is prefixed by a + fixed, one-byte Payload Marker (0xFF), which indicates the end of + options and the start of the payload. The payload data extends from + after the marker to the end of the UDP datagram, i.e., the Payload + Length is calculated from the datagram size. The absence of the + Payload Marker denotes a zero-length payload. The presence of a + marker followed by a zero-length payload MUST be processed as a + message format error. + + Implementation Note: The byte value 0xFF may also occur within an + option length or value, so simple byte-wise scanning for 0xFF is + not a viable technique for finding the payload marker. The byte + 0xFF has the meaning of a payload marker only where the beginning + of another option could occur. + +3.1. Option Format + + CoAP defines a number of options that can be included in a message. + Each option instance in a message specifies the Option Number of the + defined CoAP option, the length of the Option Value, and the Option + Value itself. + + Instead of specifying the Option Number directly, the instances MUST + appear in order of their Option Numbers and a delta encoding is used + between them: the Option Number for each instance is calculated as + the sum of its delta and the Option Number of the preceding instance + in the message. For the first instance in a message, a preceding + option instance with Option Number zero is assumed. Multiple + instances of the same option can be included by using a delta of + zero. + + + + + +Shelby, et al. Standards Track [Page 17] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Option Numbers are maintained in the "CoAP Option Numbers" registry + (Section 12.2). See Section 5.4 for the semantics of the options + defined in this document. + + 0 1 2 3 4 5 6 7 + +---------------+---------------+ + | | | + | Option Delta | Option Length | 1 byte + | | | + +---------------+---------------+ + \ \ + / Option Delta / 0-2 bytes + \ (extended) \ + +-------------------------------+ + \ \ + / Option Length / 0-2 bytes + \ (extended) \ + +-------------------------------+ + \ \ + / / + \ \ + / Option Value / 0 or more bytes + \ \ + / / + \ \ + +-------------------------------+ + + Figure 8: Option Format + + The fields in an option are defined as follows: + + Option Delta: 4-bit unsigned integer. A value between 0 and 12 + indicates the Option Delta. Three values are reserved for special + constructs: + + 13: An 8-bit unsigned integer follows the initial byte and + indicates the Option Delta minus 13. + + 14: A 16-bit unsigned integer in network byte order follows the + initial byte and indicates the Option Delta minus 269. + + 15: Reserved for the Payload Marker. If the field is set to this + value but the entire byte is not the payload marker, this MUST + be processed as a message format error. + + + + + + + +Shelby, et al. Standards Track [Page 18] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + The resulting Option Delta is used as the difference between the + Option Number of this option and that of the previous option (or + zero for the first option). In other words, the Option Number is + calculated by simply summing the Option Delta values of this and + all previous options before it. + + Option Length: 4-bit unsigned integer. A value between 0 and 12 + indicates the length of the Option Value, in bytes. Three values + are reserved for special constructs: + + 13: An 8-bit unsigned integer precedes the Option Value and + indicates the Option Length minus 13. + + 14: A 16-bit unsigned integer in network byte order precedes the + Option Value and indicates the Option Length minus 269. + + 15: Reserved for future use. If the field is set to this value, + it MUST be processed as a message format error. + + Value: A sequence of exactly Option Length bytes. The length and + format of the Option Value depend on the respective option, which + MAY define variable-length values. See Section 3.2 for the + formats used in this document; options defined in other documents + MAY make use of other option value formats. + +3.2. Option Value Formats + + The options defined in this document make use of the following option + value formats. + + empty: A zero-length sequence of bytes. + + opaque: An opaque sequence of bytes. + + uint: A non-negative integer that is represented in network byte + order using the number of bytes given by the Option Length + field. + + An option definition may specify a range of permissible + numbers of bytes; if it has a choice, a sender SHOULD + represent the integer with as few bytes as possible, i.e., + without leading zero bytes. For example, the number 0 is + represented with an empty option value (a zero-length + sequence of bytes) and the number 1 by a single byte with + the numerical value of 1 (bit combination 00000001 in most + significant bit first notation). A recipient MUST be + prepared to process values with leading zero bytes. + + + + +Shelby, et al. Standards Track [Page 19] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Implementation Note: The exceptional behavior permitted + for the sender is intended for highly constrained, + templated implementations (e.g., hardware + implementations) that use fixed-size options in the + templates. + + string: A Unicode string that is encoded using UTF-8 [RFC3629] in + Net-Unicode form [RFC5198]. + + Note that here, and in all other places where UTF-8 + encoding is used in the CoAP protocol, the intention is + that the encoded strings can be directly used and compared + as opaque byte strings by CoAP protocol implementations. + There is no expectation and no need to perform + normalization within a CoAP implementation (except where + Unicode strings that are not known to be normalized are + imported from sources outside the CoAP protocol). Note + also that ASCII strings (that do not make use of special + control characters) are always valid UTF-8 Net-Unicode + strings. + +4. Message Transmission + + CoAP messages are exchanged asynchronously between CoAP endpoints. + They are used to transport CoAP requests and responses, the semantics + of which are defined in Section 5. + + As CoAP is bound to unreliable transports such as UDP, CoAP messages + may arrive out of order, appear duplicated, or go missing without + notice. For this reason, CoAP implements a lightweight reliability + mechanism, without trying to re-create the full feature set of a + transport like TCP. It has the following features: + + o Simple stop-and-wait retransmission reliability with exponential + back-off for Confirmable messages. + + o Duplicate detection for both Confirmable and Non-confirmable + messages. + +4.1. Messages and Endpoints + + A CoAP endpoint is the source or destination of a CoAP message. The + specific definition of an endpoint depends on the transport being + used for CoAP. For the transports defined in this specification, the + endpoint is identified depending on the security mode used (see + Section 9): With no security, the endpoint is solely identified by an + IP address and a UDP port number. With other security modes, the + endpoint is identified as defined by the security mode. + + + +Shelby, et al. Standards Track [Page 20] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + There are different types of messages. The type of a message is + specified by the Type field of the CoAP Header. + + Separate from the message type, a message may carry a request, a + response, or be Empty. This is signaled by the Request/Response Code + field in the CoAP Header and is relevant to the request/response + model. Possible values for the field are maintained in the CoAP Code + Registries (Section 12.1). + + An Empty message has the Code field set to 0.00. The Token Length + field MUST be set to 0 and bytes of data MUST NOT be present after + the Message ID field. If there are any bytes, they MUST be processed + as a message format error. + +4.2. Messages Transmitted Reliably + + The reliable transmission of a message is initiated by marking the + message as Confirmable in the CoAP header. A Confirmable message + always carries either a request or response, unless it is used only + to elicit a Reset message, in which case it is Empty. A recipient + MUST either (a) acknowledge a Confirmable message with an + Acknowledgement message or (b) reject the message if the recipient + lacks context to process the message properly, including situations + where the message is Empty, uses a code with a reserved class (1, 6, + or 7), or has a message format error. Rejecting a Confirmable + message is effected by sending a matching Reset message and otherwise + ignoring it. The Acknowledgement message MUST echo the Message ID of + the Confirmable message and MUST carry a response or be Empty (see + Sections 5.2.1 and 5.2.2). The Reset message MUST echo the Message + ID of the Confirmable message and MUST be Empty. Rejecting an + Acknowledgement or Reset message (including the case where the + Acknowledgement carries a request or a code with a reserved class, or + the Reset message is not Empty) is effected by silently ignoring it. + More generally, recipients of Acknowledgement and Reset messages MUST + NOT respond with either Acknowledgement or Reset messages. + + The sender retransmits the Confirmable message at exponentially + increasing intervals, until it receives an acknowledgement (or Reset + message) or runs out of attempts. + + Retransmission is controlled by two things that a CoAP endpoint MUST + keep track of for each Confirmable message it sends while waiting for + an acknowledgement (or reset): a timeout and a retransmission + counter. For a new Confirmable message, the initial timeout is set + to a random duration (often not an integral number of seconds) + between ACK_TIMEOUT and (ACK_TIMEOUT * ACK_RANDOM_FACTOR) (see + Section 4.8), and the retransmission counter is set to 0. When the + timeout is triggered and the retransmission counter is less than + + + +Shelby, et al. Standards Track [Page 21] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + MAX_RETRANSMIT, the message is retransmitted, the retransmission + counter is incremented, and the timeout is doubled. If the + retransmission counter reaches MAX_RETRANSMIT on a timeout, or if the + endpoint receives a Reset message, then the attempt to transmit the + message is canceled and the application process informed of failure. + On the other hand, if the endpoint receives an acknowledgement in + time, transmission is considered successful. + + This specification makes no strong requirements on the accuracy of + the clocks used to implement the above binary exponential back-off + algorithm. In particular, an endpoint may be late for a specific + retransmission due to its sleep schedule and may catch up on the next + one. However, the minimum spacing before another retransmission is + ACK_TIMEOUT, and the entire sequence of (re-)transmissions MUST stay + in the envelope of MAX_TRANSMIT_SPAN (see Section 4.8.2), even if + that means a sender may miss an opportunity to transmit. + + A CoAP endpoint that sent a Confirmable message MAY give up in + attempting to obtain an ACK even before the MAX_RETRANSMIT counter + value is reached. For example, the application has canceled the + request as it no longer needs a response, or there is some other + indication that the CON message did arrive. In particular, a CoAP + request message may have elicited a separate response, in which case + it is clear to the requester that only the ACK was lost and a + retransmission of the request would serve no purpose. However, a + responder MUST NOT in turn rely on this cross-layer behavior from a + requester, i.e., it MUST retain the state to create the ACK for the + request, if needed, even if a Confirmable response was already + acknowledged by the requester. + + Another reason for giving up retransmission MAY be the receipt of + ICMP errors. If it is desired to take account of ICMP errors, to + mitigate potential spoofing attacks, implementations SHOULD take care + to check the information about the original datagram in the ICMP + message, including port numbers and CoAP header information such as + message type and code, Message ID, and Token; if this is not possible + due to limitations of the UDP service API, ICMP errors SHOULD be + ignored. Packet Too Big errors [RFC4443] ("fragmentation needed and + DF set" for IPv4 [RFC0792]) cannot properly occur and SHOULD be + ignored if the implementation note in Section 4.6 is followed; + otherwise, they SHOULD feed into a path MTU discovery algorithm + [RFC4821]. Source Quench and Time Exceeded ICMP messages SHOULD be + ignored. Host, network, port, or protocol unreachable errors or + parameter problem errors MAY, after appropriate vetting, be used to + inform the application of a failure in sending. + + + + + + +Shelby, et al. Standards Track [Page 22] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +4.3. Messages Transmitted without Reliability + + Some messages do not require an acknowledgement. This is + particularly true for messages that are repeated regularly for + application requirements, such as repeated readings from a sensor + where eventual success is sufficient. + + As a more lightweight alternative, a message can be transmitted less + reliably by marking the message as Non-confirmable. A Non- + confirmable message always carries either a request or response and + MUST NOT be Empty. A Non-confirmable message MUST NOT be + acknowledged by the recipient. A recipient MUST reject the message + if it lacks context to process the message properly, including the + case where the message is Empty, uses a code with a reserved class + (1, 6, or 7), or has a message format error. Rejecting a Non- + confirmable message MAY involve sending a matching Reset message, and + apart from the Reset message the rejected message MUST be silently + ignored. + + At the CoAP level, there is no way for the sender to detect if a Non- + confirmable message was received or not. A sender MAY choose to + transmit multiple copies of a Non-confirmable message within + MAX_TRANSMIT_SPAN (limited by the provisions of Section 4.7, in + particular, by PROBING_RATE if no response is received), or the + network may duplicate the message in transit. To enable the receiver + to act only once on the message, Non-confirmable messages specify a + Message ID as well. (This Message ID is drawn from the same number + space as the Message IDs for Confirmable messages.) + + Summarizing Sections 4.2 and 4.3, the four message types can be used + as in Table 1. "*" means that the combination is not used in normal + operation but only to elicit a Reset message ("CoAP ping"). + + +----------+-----+-----+-----+-----+ + | | CON | NON | ACK | RST | + +----------+-----+-----+-----+-----+ + | Request | X | X | - | - | + | Response | X | X | X | - | + | Empty | * | - | X | X | + +----------+-----+-----+-----+-----+ + + Table 1: Usage of Message Types + + + + + + + + + +Shelby, et al. Standards Track [Page 23] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +4.4. Message Correlation + + An Acknowledgement or Reset message is related to a Confirmable + message or Non-confirmable message by means of a Message ID along + with additional address information of the corresponding endpoint. + The Message ID is a 16-bit unsigned integer that is generated by the + sender of a Confirmable or Non-confirmable message and included in + the CoAP header. The Message ID MUST be echoed in the + Acknowledgement or Reset message by the recipient. + + The same Message ID MUST NOT be reused (in communicating with the + same endpoint) within the EXCHANGE_LIFETIME (Section 4.8.2). + + Implementation Note: Several implementation strategies can be + employed for generating Message IDs. In the simplest case, a CoAP + endpoint generates Message IDs by keeping a single Message ID + variable, which is changed each time a new Confirmable or Non- + confirmable message is sent, regardless of the destination address + or port. Endpoints dealing with large numbers of transactions + could keep multiple Message ID variables, for example, per prefix + or destination address. (Note that some receiving endpoints may + not be able to distinguish unicast and multicast packets addressed + to it, so endpoints generating Message IDs need to make sure these + do not overlap.) It is strongly recommended that the initial + value of the variable (e.g., on startup) be randomized, in order + to make successful off-path attacks on the protocol less likely. + + For an Acknowledgement or Reset message to match a Confirmable or + Non-confirmable message, the Message ID and source endpoint of the + Acknowledgement or Reset message MUST match the Message ID and + destination endpoint of the Confirmable or Non-confirmable message. + +4.5. Message Deduplication + + A recipient might receive the same Confirmable message (as indicated + by the Message ID and source endpoint) multiple times within the + EXCHANGE_LIFETIME (Section 4.8.2), for example, when its + Acknowledgement went missing or didn't reach the original sender + before the first timeout. The recipient SHOULD acknowledge each + duplicate copy of a Confirmable message using the same + Acknowledgement or Reset message but SHOULD process any request or + response in the message only once. This rule MAY be relaxed in case + the Confirmable message transports a request that is idempotent (see + Section 5.1) or can be handled in an idempotent fashion. Examples + for relaxed message deduplication: + + + + + + +Shelby, et al. Standards Track [Page 24] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + o A server might relax the requirement to answer all retransmissions + of an idempotent request with the same response (Section 4.2), so + that it does not have to maintain state for Message IDs. For + example, an implementation might want to process duplicate + transmissions of a GET, PUT, or DELETE request as separate + requests if the effort incurred by duplicate processing is less + expensive than keeping track of previous responses would be. + + o A constrained server might even want to relax this requirement for + certain non-idempotent requests if the application semantics make + this trade-off favorable. For example, if the result of a POST + request is just the creation of some short-lived state at the + server, it may be less expensive to incur this effort multiple + times for a request than keeping track of whether a previous + transmission of the same request already was processed. + + A recipient might receive the same Non-confirmable message (as + indicated by the Message ID and source endpoint) multiple times + within NON_LIFETIME (Section 4.8.2). As a general rule that MAY be + relaxed based on the specific semantics of a message, the recipient + SHOULD silently ignore any duplicated Non-confirmable message and + SHOULD process any request or response in the message only once. + +4.6. Message Size + + While specific link layers make it beneficial to keep CoAP messages + small enough to fit into their link-layer packets (see Section 1), + this is a matter of implementation quality. The CoAP specification + itself provides only an upper bound to the message size. Messages + larger than an IP packet result in undesirable packet fragmentation. + A CoAP message, appropriately encapsulated, SHOULD fit within a + single IP packet (i.e., avoid IP fragmentation) and (by fitting into + one UDP payload) obviously needs to fit within a single IP datagram. + If the Path MTU is not known for a destination, an IP MTU of 1280 + bytes SHOULD be assumed; if nothing is known about the size of the + headers, good upper bounds are 1152 bytes for the message size and + 1024 bytes for the payload size. + + Implementation Note: CoAP's choice of message size parameters works + well with IPv6 and with most of today's IPv4 paths. (However, + with IPv4, it is harder to absolutely ensure that there is no IP + fragmentation. If IPv4 support on unusual networks is a + consideration, implementations may want to limit themselves to + more conservative IPv4 datagram sizes such as 576 bytes; per + [RFC0791], the absolute minimum value of the IP MTU for IPv4 is as + low as 68 bytes, which would leave only 40 bytes minus security + overhead for a UDP payload. Implementations extremely focused on + this problem set might also set the IPv4 DF bit and perform some + + + +Shelby, et al. Standards Track [Page 25] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + form of path MTU discovery [RFC4821]; this should generally be + unnecessary in realistic use cases for CoAP, however.) A more + important kind of fragmentation in many constrained networks is + that on the adaptation layer (e.g., 6LoWPAN L2 packets are limited + to 127 bytes including various overheads); this may motivate + implementations to be frugal in their packet sizes and to move to + block-wise transfers [BLOCK] when approaching three-digit message + sizes. + + Message sizes are also of considerable importance to + implementations on constrained nodes. Many implementations will + need to allocate a buffer for incoming messages. If an + implementation is too constrained to allow for allocating the + above-mentioned upper bound, it could apply the following + implementation strategy for messages not using DTLS security: + Implementations receiving a datagram into a buffer that is too + small are usually able to determine if the trailing portion of a + datagram was discarded and to retrieve the initial portion. So, + at least the CoAP header and options, if not all of the payload, + are likely to fit within the buffer. A server can thus fully + interpret a request and return a 4.13 (Request Entity Too Large; + see Section 5.9.2.9) Response Code if the payload was truncated. + A client sending an idempotent request and receiving a response + larger than would fit in the buffer can repeat the request with a + suitable value for the Block Option [BLOCK]. + +4.7. Congestion Control + + Basic congestion control for CoAP is provided by the exponential + back-off mechanism in Section 4.2. + + In order not to cause congestion, clients (including proxies) MUST + strictly limit the number of simultaneous outstanding interactions + that they maintain to a given server (including proxies) to NSTART. + An outstanding interaction is either a CON for which an ACK has not + yet been received but is still expected (message layer) or a request + for which neither a response nor an Acknowledgment message has yet + been received but is still expected (which may both occur at the same + time, counting as one outstanding interaction). The default value of + NSTART for this specification is 1. + + Further congestion control optimizations and considerations are + expected in the future, may for example provide automatic + initialization of the CoAP transmission parameters defined in + Section 4.8, and thus may allow a value for NSTART greater than one. + + After EXCHANGE_LIFETIME, a client stops expecting a response to a + Confirmable request for which no acknowledgment message was received. + + + +Shelby, et al. Standards Track [Page 26] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + The specific algorithm by which a client stops to "expect" a response + to a Confirmable request that was acknowledged, or to a Non- + confirmable request, is not defined. Unless this is modified by + additional congestion control optimizations, it MUST be chosen in + such a way that an endpoint does not exceed an average data rate of + PROBING_RATE in sending to another endpoint that does not respond. + + Note: CoAP places the onus of congestion control mostly on the + clients. However, clients may malfunction or actually be + attackers, e.g., to perform amplification attacks (Section 11.3). + To limit the damage (to the network and to its own energy + resources), a server SHOULD implement some rate limiting for its + response transmission based on reasonable assumptions about + application requirements. This is most helpful if the rate limit + can be made effective for the misbehaving endpoints, only. + +4.8. Transmission Parameters + + Message transmission is controlled by the following parameters: + + +-------------------+---------------+ + | name | default value | + +-------------------+---------------+ + | ACK_TIMEOUT | 2 seconds | + | ACK_RANDOM_FACTOR | 1.5 | + | MAX_RETRANSMIT | 4 | + | NSTART | 1 | + | DEFAULT_LEISURE | 5 seconds | + | PROBING_RATE | 1 byte/second | + +-------------------+---------------+ + + Table 2: CoAP Protocol Parameters + +4.8.1. Changing the Parameters + + The values for ACK_TIMEOUT, ACK_RANDOM_FACTOR, MAX_RETRANSMIT, + NSTART, DEFAULT_LEISURE (Section 8.2), and PROBING_RATE may be + configured to values specific to the application environment + (including dynamically adjusted values); however, the configuration + method is out of scope of this document. It is RECOMMENDED that an + application environment use consistent values for these parameters; + the specific effects of operating with inconsistent values in an + application environment are outside the scope of the present + specification. + + The transmission parameters have been chosen to achieve a behavior in + the presence of congestion that is safe in the Internet. If a + configuration desires to use different values, the onus is on the + + + +Shelby, et al. Standards Track [Page 27] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + configuration to ensure these congestion control properties are not + violated. In particular, a decrease of ACK_TIMEOUT below 1 second + would violate the guidelines of [RFC5405]. ([RTO-CONSIDER] provides + some additional background.) CoAP was designed to enable + implementations that do not maintain round-trip-time (RTT) + measurements. However, where it is desired to decrease the + ACK_TIMEOUT significantly or increase NSTART, this can only be done + safely when maintaining such measurements. Configurations MUST NOT + decrease ACK_TIMEOUT or increase NSTART without using mechanisms that + ensure congestion control safety, either defined in the configuration + or in future standards documents. + + ACK_RANDOM_FACTOR MUST NOT be decreased below 1.0, and it SHOULD have + a value that is sufficiently different from 1.0 to provide some + protection from synchronization effects. + + MAX_RETRANSMIT can be freely adjusted, but a value that is too small + will reduce the probability that a Confirmable message is actually + received, while a larger value than given here will require further + adjustments in the time values (see Section 4.8.2). + + If the choice of transmission parameters leads to an increase of + derived time values (see Section 4.8.2), the configuration mechanism + MUST ensure the adjusted value is also available to all the endpoints + with which these adjusted values are to be used to communicate. + +4.8.2. Time Values Derived from Transmission Parameters + + The combination of ACK_TIMEOUT, ACK_RANDOM_FACTOR, and MAX_RETRANSMIT + influences the timing of retransmissions, which in turn influences + how long certain information items need to be kept by an + implementation. To be able to unambiguously reference these derived + time values, we give them names as follows: + + o MAX_TRANSMIT_SPAN is the maximum time from the first transmission + of a Confirmable message to its last retransmission. For the + default transmission parameters, the value is (2+4+8+16)*1.5 = 45 + seconds, or more generally: + + ACK_TIMEOUT * ((2 ** MAX_RETRANSMIT) - 1) * ACK_RANDOM_FACTOR + + + + + + + + + + + +Shelby, et al. Standards Track [Page 28] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + o MAX_TRANSMIT_WAIT is the maximum time from the first transmission + of a Confirmable message to the time when the sender gives up on + receiving an acknowledgement or reset. For the default + transmission parameters, the value is (2+4+8+16+32)*1.5 = 93 + seconds, or more generally: + + ACK_TIMEOUT * ((2 ** (MAX_RETRANSMIT + 1)) - 1) * + ACK_RANDOM_FACTOR + + In addition, some assumptions need to be made on the characteristics + of the network and the nodes. + + o MAX_LATENCY is the maximum time a datagram is expected to take + from the start of its transmission to the completion of its + reception. This constant is related to the MSL (Maximum Segment + Lifetime) of [RFC0793], which is "arbitrarily defined to be 2 + minutes" ([RFC0793] glossary, page 81). Note that this is not + necessarily smaller than MAX_TRANSMIT_WAIT, as MAX_LATENCY is not + intended to describe a situation when the protocol works well, but + the worst-case situation against which the protocol has to guard. + We, also arbitrarily, define MAX_LATENCY to be 100 seconds. Apart + from being reasonably realistic for the bulk of configurations as + well as close to the historic choice for TCP, this value also + allows Message ID lifetime timers to be represented in 8 bits + (when measured in seconds). In these calculations, there is no + assumption that the direction of the transmission is irrelevant + (i.e., that the network is symmetric); there is just the + assumption that the same value can reasonably be used as a maximum + value for both directions. If that is not the case, the following + calculations become only slightly more complex. + + o PROCESSING_DELAY is the time a node takes to turn around a + Confirmable message into an acknowledgement. We assume the node + will attempt to send an ACK before having the sender time out, so + as a conservative assumption we set it equal to ACK_TIMEOUT. + + o MAX_RTT is the maximum round-trip time, or: + + (2 * MAX_LATENCY) + PROCESSING_DELAY + + From these values, we can derive the following values relevant to the + protocol operation: + + o EXCHANGE_LIFETIME is the time from starting to send a Confirmable + message to the time when an acknowledgement is no longer expected, + i.e., message-layer information about the message exchange can be + purged. EXCHANGE_LIFETIME includes a MAX_TRANSMIT_SPAN, a + MAX_LATENCY forward, PROCESSING_DELAY, and a MAX_LATENCY for the + + + +Shelby, et al. Standards Track [Page 29] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + way back. Note that there is no need to consider + MAX_TRANSMIT_WAIT if the configuration is chosen such that the + last waiting period (ACK_TIMEOUT * (2 ** MAX_RETRANSMIT) or the + difference between MAX_TRANSMIT_SPAN and MAX_TRANSMIT_WAIT) is + less than MAX_LATENCY -- which is a likely choice, as MAX_LATENCY + is a worst-case value unlikely to be met in the real world. In + this case, EXCHANGE_LIFETIME simplifies to: + + MAX_TRANSMIT_SPAN + (2 * MAX_LATENCY) + PROCESSING_DELAY + + or 247 seconds with the default transmission parameters. + + o NON_LIFETIME is the time from sending a Non-confirmable message to + the time its Message ID can be safely reused. If multiple + transmission of a NON message is not used, its value is + MAX_LATENCY, or 100 seconds. However, a CoAP sender might send a + NON message multiple times, in particular for multicast + applications. While the period of reuse is not bounded by the + specification, an expectation of reliable detection of duplication + at the receiver is on the timescales of MAX_TRANSMIT_SPAN. + Therefore, for this purpose, it is safer to use the value: + + MAX_TRANSMIT_SPAN + MAX_LATENCY + + or 145 seconds with the default transmission parameters; however, + an implementation that just wants to use a single timeout value + for retiring Message IDs can safely use the larger value for + EXCHANGE_LIFETIME. + + Table 3 lists the derived parameters introduced in this subsection + with their default values. + + +-------------------+---------------+ + | name | default value | + +-------------------+---------------+ + | MAX_TRANSMIT_SPAN | 45 s | + | MAX_TRANSMIT_WAIT | 93 s | + | MAX_LATENCY | 100 s | + | PROCESSING_DELAY | 2 s | + | MAX_RTT | 202 s | + | EXCHANGE_LIFETIME | 247 s | + | NON_LIFETIME | 145 s | + +-------------------+---------------+ + + Table 3: Derived Protocol Parameters + + + + + + +Shelby, et al. Standards Track [Page 30] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5. Request/Response Semantics + + CoAP operates under a similar request/response model as HTTP: a CoAP + endpoint in the role of a "client" sends one or more CoAP requests to + a "server", which services the requests by sending CoAP responses. + Unlike HTTP, requests and responses are not sent over a previously + established connection but are exchanged asynchronously over CoAP + messages. + +5.1. Requests + + A CoAP request consists of the method to be applied to the resource, + the identifier of the resource, a payload and Internet media type (if + any), and optional metadata about the request. + + CoAP supports the basic methods of GET, POST, PUT, and DELETE, which + are easily mapped to HTTP. They have the same properties of safe + (only retrieval) and idempotent (you can invoke it multiple times + with the same effects) as HTTP (see Section 9.1 of [RFC2616]). The + GET method is safe; therefore, it MUST NOT take any other action on a + resource other than retrieval. The GET, PUT, and DELETE methods MUST + be performed in such a way that they are idempotent. POST is not + idempotent, because its effect is determined by the origin server and + dependent on the target resource; it usually results in a new + resource being created or the target resource being updated. + + A request is initiated by setting the Code field in the CoAP header + of a Confirmable or a Non-confirmable message to a Method Code and + including request information. + + The methods used in requests are described in detail in Section 5.8. + +5.2. Responses + + After receiving and interpreting a request, a server responds with a + CoAP response that is matched to the request by means of a client- + generated token (Section 5.3); note that this is different from the + Message ID that matches a Confirmable message to its Acknowledgement. + + A response is identified by the Code field in the CoAP header being + set to a Response Code. Similar to the HTTP Status Code, the CoAP + Response Code indicates the result of the attempt to understand and + satisfy the request. These codes are fully defined in Section 5.9. + The Response Code numbers to be set in the Code field of the CoAP + header are maintained in the CoAP Response Code Registry + (Section 12.1.2). + + + + + +Shelby, et al. Standards Track [Page 31] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + 0 + 0 1 2 3 4 5 6 7 + +-+-+-+-+-+-+-+-+ + |class| detail | + +-+-+-+-+-+-+-+-+ + + Figure 9: Structure of a Response Code + + The upper three bits of the 8-bit Response Code number define the + class of response. The lower five bits do not have any + categorization role; they give additional detail to the overall class + (Figure 9). + + As a human-readable notation for specifications and protocol + diagnostics, CoAP code numbers including the Response Code are + documented in the format "c.dd", where "c" is the class in decimal, + and "dd" is the detail as a two-digit decimal. For example, + "Forbidden" is written as 4.03 -- indicating an 8-bit code value of + hexadecimal 0x83 (4*0x20+3) or decimal 131 (4*32+3). + + There are 3 classes of Response Codes: + + 2 - Success: The request was successfully received, understood, and + accepted. + + 4 - Client Error: The request contains bad syntax or cannot be + fulfilled. + + 5 - Server Error: The server failed to fulfill an apparently valid + request. + + The Response Codes are designed to be extensible: Response Codes in + the Client Error or Server Error class that are unrecognized by an + endpoint are treated as being equivalent to the generic Response Code + of that class (4.00 and 5.00, respectively). However, there is no + generic Response Code indicating success, so a Response Code in the + Success class that is unrecognized by an endpoint can only be used to + determine that the request was successful without any further + details. + + The possible Response Codes are described in detail in Section 5.9. + + Responses can be sent in multiple ways, which are defined in the + following subsections. + + + + + + + +Shelby, et al. Standards Track [Page 32] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.2.1. Piggybacked + + In the most basic case, the response is carried directly in the + Acknowledgement message that acknowledges the request (which requires + that the request was carried in a Confirmable message). This is + called a "Piggybacked Response". + + The response is returned in the Acknowledgement message, independent + of whether the response indicates success or failure. In effect, the + response is piggybacked on the Acknowledgement message, and no + separate message is required to return the response. + + Implementation Note: The protocol leaves the decision whether to + piggyback a response or not (i.e., send a separate response) to + the server. The client MUST be prepared to receive either. On + the quality-of-implementation level, there is a strong expectation + that servers will implement code to piggyback whenever possible -- + saving resources in the network and both at the client and at the + server. + +5.2.2. Separate + + It may not be possible to return a piggybacked response in all cases. + For example, a server might need longer to obtain the representation + of the resource requested than it can wait to send back the + Acknowledgement message, without risking the client repeatedly + retransmitting the request message (see also the discussion of + PROCESSING_DELAY in Section 4.8.2). The response to a request + carried in a Non-confirmable message is always sent separately (as + there is no Acknowledgement message). + + One way to implement this in a server is to initiate the attempt to + obtain the resource representation and, while that is in progress, + time out an acknowledgement timer. A server may also immediately + send an acknowledgement if it knows in advance that there will be no + piggybacked response. In both cases, the acknowledgement effectively + is a promise that the request will be acted upon later. + + When the server finally has obtained the resource representation, it + sends the response. When it is desired that this message is not + lost, it is sent as a Confirmable message from the server to the + client and answered by the client with an Acknowledgement, echoing + the new Message ID chosen by the server. (It may also be sent as a + Non-confirmable message; see Section 5.2.3.) + + When the server chooses to use a separate response, it sends the + Acknowledgement to the Confirmable request as an Empty message. Once + the server sends back an Empty Acknowledgement, it MUST NOT send back + + + +Shelby, et al. Standards Track [Page 33] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + the response in another Acknowledgement, even if the client + retransmits another identical request. If a retransmitted request is + received (perhaps because the original Acknowledgement was delayed), + another Empty Acknowledgement is sent, and any response MUST be sent + as a separate response. + + If the server then sends a Confirmable response, the client's + Acknowledgement to that response MUST also be an Empty message (one + that carries neither a request nor a response). The server MUST stop + retransmitting its response on any matching Acknowledgement (silently + ignoring any Response Code or payload) or Reset message. + + Implementation Notes: Note that, as the underlying datagram + transport may not be sequence-preserving, the Confirmable message + carrying the response may actually arrive before or after the + Acknowledgement message for the request; for the purposes of + terminating the retransmission sequence, this also serves as an + acknowledgement. Note also that, while the CoAP protocol itself + does not make any specific demands here, there is an expectation + that the response will come within a time frame that is reasonable + from an application point of view. As there is no underlying + transport protocol that could be instructed to run a keep-alive + mechanism, the requester may want to set up a timeout that is + unrelated to CoAP's retransmission timers in case the server is + destroyed or otherwise unable to send the response. + +5.2.3. Non-confirmable + + If the request message is Non-confirmable, then the response SHOULD + be returned in a Non-confirmable message as well. However, an + endpoint MUST be prepared to receive a Non-confirmable response + (preceded or followed by an Empty Acknowledgement message) in reply + to a Confirmable request, or a Confirmable response in reply to a + Non-confirmable request. + +5.3. Request/Response Matching + + Regardless of how a response is sent, it is matched to the request by + means of a token that is included by the client in the request, along + with additional address information of the corresponding endpoint. + +5.3.1. Token + + The Token is used to match a response with a request. The token + value is a sequence of 0 to 8 bytes. (Note that every message + carries a token, even if it is of zero length.) Every request + carries a client-generated token that the server MUST echo (without + modification) in any resulting response. + + + +Shelby, et al. Standards Track [Page 34] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + A token is intended for use as a client-local identifier for + differentiating between concurrent requests (see Section 5.3); it + could have been called a "request ID". + + The client SHOULD generate tokens in such a way that tokens currently + in use for a given source/destination endpoint pair are unique. + (Note that a client implementation can use the same token for any + request if it uses a different endpoint each time, e.g., a different + source port number.) An empty token value is appropriate e.g., when + no other tokens are in use to a destination, or when requests are + made serially per destination and receive piggybacked responses. + There are, however, multiple possible implementation strategies to + fulfill this. + + A client sending a request without using Transport Layer Security + (Section 9) SHOULD use a nontrivial, randomized token to guard + against spoofing of responses (Section 11.4). This protective use of + tokens is the reason they are allowed to be up to 8 bytes in size. + The actual size of the random component to be used for the Token + depends on the security requirements of the client and the level of + threat posed by spoofing of responses. A client that is connected to + the general Internet SHOULD use at least 32 bits of randomness, + keeping in mind that not being directly connected to the Internet is + not necessarily sufficient protection against spoofing. (Note that + the Message ID adds little in protection as it is usually + sequentially assigned, i.e., guessable, and can be circumvented by + spoofing a separate response.) Clients that want to optimize the + Token length may further want to detect the level of ongoing attacks + (e.g., by tallying recent Token mismatches in incoming messages) and + adjust the Token length upwards appropriately. [RFC4086] discusses + randomness requirements for security. + + An endpoint receiving a token it did not generate MUST treat the + token as opaque and make no assumptions about its content or + structure. + +5.3.2. Request/Response Matching Rules + + The exact rules for matching a response to a request are as follows: + + 1. The source endpoint of the response MUST be the same as the + destination endpoint of the original request. + + 2. In a piggybacked response, the Message ID of the Confirmable + request and the Acknowledgement MUST match, and the tokens of the + response and original request MUST match. In a separate + response, just the tokens of the response and original request + MUST match. + + + +Shelby, et al. Standards Track [Page 35] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + In case a message carrying a response is unexpected (the client is + not waiting for a response from the identified endpoint, at the + endpoint addressed, and/or with the given token), the response is + rejected (Sections 4.2 and 4.3). + + Implementation Note: A client that receives a response in a CON + message may want to clean up the message state right after sending + the ACK. If that ACK is lost and the server retransmits the CON, + the client may no longer have any state to which to correlate this + response, making the retransmission an unexpected message; the + client will likely send a Reset message so it does not receive any + more retransmissions. This behavior is normal and not an + indication of an error. (Clients that are not aggressively + optimized in their state memory usage will still have message + state that will identify the second CON as a retransmission. + Clients that actually expect more messages from the server + [OBSERVE] will have to keep state in any case.) + +5.4. Options + + Both requests and responses may include a list of one or more + options. For example, the URI in a request is transported in several + options, and metadata that would be carried in an HTTP header in HTTP + is supplied as options as well. + + CoAP defines a single set of options that are used in both requests + and responses: + + o Content-Format + + o ETag + + o Location-Path + + o Location-Query + + o Max-Age + + o Proxy-Uri + + o Proxy-Scheme + + o Uri-Host + + o Uri-Path + + o Uri-Port + + + + +Shelby, et al. Standards Track [Page 36] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + o Uri-Query + + o Accept + + o If-Match + + o If-None-Match + + o Size1 + + The semantics of these options along with their properties are + defined in detail in Section 5.10. + + Not all options are defined for use with all methods and Response + Codes. The possible options for methods and Response Codes are + defined in Sections 5.8 and 5.9, respectively. In case an option is + not defined for a Method or Response Code, it MUST NOT be included by + a sender and MUST be treated like an unrecognized option by a + recipient. + +5.4.1. Critical/Elective + + Options fall into one of two classes: "critical" or "elective". The + difference between these is how an option unrecognized by an endpoint + is handled: + + o Upon reception, unrecognized options of class "elective" MUST be + silently ignored. + + o Unrecognized options of class "critical" that occur in a + Confirmable request MUST cause the return of a 4.02 (Bad Option) + response. This response SHOULD include a diagnostic payload + describing the unrecognized option(s) (see Section 5.5.2). + + o Unrecognized options of class "critical" that occur in a + Confirmable response, or piggybacked in an Acknowledgement, MUST + cause the response to be rejected (Section 4.2). + + o Unrecognized options of class "critical" that occur in a Non- + confirmable message MUST cause the message to be rejected + (Section 4.3). + + Note that, whether critical or elective, an option is never + "mandatory" (it is always optional): these rules are defined in order + to enable implementations to stop processing options they do not + understand or implement. + + + + + +Shelby, et al. Standards Track [Page 37] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Critical/elective rules apply to non-proxying endpoints. A proxy + processes options based on Unsafe/Safe-to-Forward classes as defined + in Section 5.7. + +5.4.2. Proxy Unsafe or Safe-to-Forward and NoCacheKey + + In addition to an option being marked as critical or elective, + options are also classified based on how a proxy is to deal with the + option if it does not recognize it. For this purpose, an option can + either be considered Unsafe to forward (UnSafe is set) or Safe-to- + Forward (UnSafe is clear). + + In addition, for an option that is marked Safe-to-Forward, the option + number indicates whether or not it is intended to be part of the + Cache-Key (Section 5.6) in a request. If some of the NoCacheKey bits + are 0, it is; if all NoCacheKey bits are 1, it is not (see + Section 5.4.6). + + Note: The Cache-Key indication is relevant only for proxies that do + not implement the given option as a request option and instead + rely on the Unsafe/Safe-to-Forward indication only. For example, + for ETag, actually using the request option as a part of the + Cache-Key is grossly inefficient, but it is the best thing one can + do if ETag is not implemented by a proxy, as the response is going + to differ based on the presence of the request option. A more + useful proxy that does implement the ETag request option is not + using ETag as a part of the Cache-Key. + + NoCacheKey is indicated in three bits so that only one out of + eight codepoints is qualified as NoCacheKey, leaving seven out of + eight codepoints for what appears to be the more likely case. + + Proxy behavior with regard to these classes is defined in + Section 5.7. + +5.4.3. Length + + Option values are defined to have a specific length, often in the + form of an upper and lower bound. If the length of an option value + in a request is outside the defined range, that option MUST be + treated like an unrecognized option (see Section 5.4.1). + +5.4.4. Default Values + + Options may be defined to have a default value. If the value of an + option is intended to be this default value, the option SHOULD NOT be + included in the message. If the option is not present, the default + value MUST be assumed. + + + +Shelby, et al. Standards Track [Page 38] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Where a critical option has a default value, this is chosen in such a + way that the absence of the option in a message can be processed + properly both by implementations unaware of the critical option and + by implementations that interpret this absence as the presence of the + default value for the option. + +5.4.5. Repeatable Options + + The definition of some options specifies that those options are + repeatable. An option that is repeatable MAY be included one or more + times in a message. An option that is not repeatable MUST NOT be + included more than once in a message. + + If a message includes an option with more occurrences than the option + is defined for, each supernumerary option occurrence that appears + subsequently in the message MUST be treated like an unrecognized + option (see Section 5.4.1). + +5.4.6. Option Numbers + + An Option is identified by an option number, which also provides some + additional semantics information, e.g., odd numbers indicate a + critical option, while even numbers indicate an elective option. + Note that this is not just a convention, it is a feature of the + protocol: Whether an option is elective or critical is entirely + determined by whether its option number is even or odd. + + More generally speaking, an Option number is constructed with a bit + mask to indicate if an option is Critical or Elective, Unsafe or + Safe-to-Forward, and, in the case of Safe-to-Forward, to provide a + Cache-Key indication as shown by the following figure. In the + following text, the bit mask is expressed as a single byte that is + applied to the least significant byte of the option number in + unsigned integer representation. When bit 7 (the least significant + bit) is 1, an option is Critical (and likewise Elective when 0). + When bit 6 is 1, an option is Unsafe (and likewise Safe-to-Forward + when 0). When bit 6 is 0, i.e., the option is not Unsafe, it is not + a Cache-Key (NoCacheKey) if and only if bits 3-5 are all set to 1; + all other bit combinations mean that it indeed is a Cache-Key. These + classes of options are explained in the next sections. + + 0 1 2 3 4 5 6 7 + +---+---+---+---+---+---+---+---+ + | | NoCacheKey| U | C | + +---+---+---+---+---+---+---+---+ + + Figure 10: Option Number Mask (Least Significant Byte) + + + + +Shelby, et al. Standards Track [Page 39] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + An endpoint may use an equivalent of the C code in Figure 11 to + derive the characteristics of an option number "onum". + + Critical = (onum & 1); + UnSafe = (onum & 2); + NoCacheKey = ((onum & 0x1e) == 0x1c); + + Figure 11: Determining Characteristics from an Option Number + + The option numbers for the options defined in this document are + listed in the "CoAP Option Numbers" registry (Section 12.2). + +5.5. Payloads and Representations + + Both requests and responses may include a payload, depending on the + Method or Response Code, respectively. If a Method or Response Code + is not defined to have a payload, then a sender MUST NOT include one, + and a recipient MUST ignore it. + +5.5.1. Representation + + The payload of requests or of responses indicating success is + typically a representation of a resource ("resource representation") + or the result of the requested action ("action result"). Its format + is specified by the Internet media type and content coding given by + the Content-Format Option. In the absence of this option, no default + value is assumed, and the format will need to be inferred by the + application (e.g., from the application context). Payload "sniffing" + SHOULD only be attempted if no content type is given. + + Implementation Note: On a quality-of-implementation level, there is + a strong expectation that a Content-Format indication will be + provided with resource representations whenever possible. This is + not a "SHOULD" level requirement solely because it is not a + protocol requirement, and it also would be difficult to outline + exactly in what cases this expectation can be violated. + + For responses indicating a client or server error, the payload is + considered a representation of the result of the requested action + only if a Content-Format Option is given. In the absence of this + option, the payload is a Diagnostic Payload (Section 5.5.2). + + + + + + + + + + +Shelby, et al. Standards Track [Page 40] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.5.2. Diagnostic Payload + + If no Content-Format option is given, the payload of responses + indicating a client or server error is a brief human-readable + diagnostic message, explaining the error situation. This diagnostic + message MUST be encoded using UTF-8 [RFC3629], more specifically + using Net-Unicode form [RFC5198]. + + The message is similar to the Reason-Phrase on an HTTP status line. + It is not intended for end users but for software engineers that + during debugging need to interpret it in the context of the present, + English-language specification; therefore, no mechanism for language + tagging is needed or provided. In contrast to what is usual in HTTP, + the payload SHOULD be empty if there is no additional information + beyond the Response Code. + +5.5.3. Selected Representation + + Not all responses carry a payload that provides a representation of + the resource addressed by the request. It is, however, sometimes + useful to be able to refer to such a representation in relation to a + response, independent of whether it actually was enclosed. + + We use the term "selected representation" to refer to the current + representation of a target resource that would have been selected in + a successful response if the corresponding request had used the + method GET and excluded any conditional request options + (Section 5.10.8). + + Certain response options provide metadata about the selected + representation, which might differ from the representation included + in the message for responses to some state-changing methods. Of the + response options defined in this specification, only the ETag + response option (Section 5.10.6) is defined as metadata about the + selected representation. + +5.5.4. Content Negotiation + + A server may be able to supply a representation for a resource in one + of multiple representation formats. Without further information from + the client, it will provide the representation in the format it + prefers. + + By using the Accept Option (Section 5.10.4) in a request, the client + can indicate which content-format it prefers to receive. + + + + + + +Shelby, et al. Standards Track [Page 41] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.6. Caching + + CoAP endpoints MAY cache responses in order to reduce the response + time and network bandwidth consumption on future, equivalent + requests. + + The goal of caching in CoAP is to reuse a prior response message to + satisfy a current request. In some cases, a stored response can be + reused without the need for a network request, reducing latency and + network round-trips; a "freshness" mechanism is used for this purpose + (see Section 5.6.1). Even when a new request is required, it is + often possible to reuse the payload of a prior response to satisfy + the request, thereby reducing network bandwidth usage; a "validation" + mechanism is used for this purpose (see Section 5.6.2). + + Unlike HTTP, the cacheability of CoAP responses does not depend on + the request method, but it depends on the Response Code. The + cacheability of each Response Code is defined along the Response Code + definitions in Section 5.9. Response Codes that indicate success and + are unrecognized by an endpoint MUST NOT be cached. + + For a presented request, a CoAP endpoint MUST NOT use a stored + response, unless: + + o the presented request method and that used to obtain the stored + response match, + + o all options match between those in the presented request and those + of the request used to obtain the stored response (which includes + the request URI), except that there is no need for a match of any + request options marked as NoCacheKey (Section 5.4) or recognized + by the Cache and fully interpreted with respect to its specified + cache behavior (such as the ETag request option described in + Section 5.10.6; see also Section 5.4.2), and + + o the stored response is either fresh or successfully validated as + defined below. + + The set of request options that is used for matching the cache entry + is also collectively referred to as the "Cache-Key". For URI schemes + other than coap and coaps, matching of those options that constitute + the request URI may be performed under rules specific to the URI + scheme. + + + + + + + + +Shelby, et al. Standards Track [Page 42] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.6.1. Freshness Model + + When a response is "fresh" in the cache, it can be used to satisfy + subsequent requests without contacting the origin server, thereby + improving efficiency. + + The mechanism for determining freshness is for an origin server to + provide an explicit expiration time in the future, using the Max-Age + Option (see Section 5.10.5). The Max-Age Option indicates that the + response is to be considered not fresh after its age is greater than + the specified number of seconds. + + The Max-Age Option defaults to a value of 60. Thus, if it is not + present in a cacheable response, then the response is considered not + fresh after its age is greater than 60 seconds. If an origin server + wishes to prevent caching, it MUST explicitly include a Max-Age + Option with a value of zero seconds. + + If a client has a fresh stored response and makes a new request + matching the request for that stored response, the new response + invalidates the old response. + +5.6.2. Validation Model + + When an endpoint has one or more stored responses for a GET request, + but cannot use any of them (e.g., because they are not fresh), it can + use the ETag Option (Section 5.10.6) in the GET request to give the + origin server an opportunity both to select a stored response to be + used, and to update its freshness. This process is known as + "validating" or "revalidating" the stored response. + + When sending such a request, the endpoint SHOULD add an ETag Option + specifying the entity-tag of each stored response that is applicable. + + A 2.03 (Valid) response indicates the stored response identified by + the entity-tag given in the response's ETag Option can be reused + after updating it as described in Section 5.9.1.3. + + Any other Response Code indicates that none of the stored responses + nominated in the request is suitable. Instead, the response SHOULD + be used to satisfy the request and MAY replace the stored response. + + + + + + + + + + +Shelby, et al. Standards Track [Page 43] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.7. Proxying + + A proxy is a CoAP endpoint that can be tasked by CoAP clients to + perform requests on their behalf. This may be useful, for example, + when the request could otherwise not be made, or to service the + response from a cache in order to reduce response time and network + bandwidth or energy consumption. + + In an overall architecture for a Constrained RESTful Environment, + proxies can serve quite different purposes. Proxies can be + explicitly selected by clients, a role that we term "forward-proxy". + Proxies can also be inserted to stand in for origin servers, a role + that we term "reverse-proxy". Orthogonal to this distinction, a + proxy can map from a CoAP request to a CoAP request (CoAP-to-CoAP + proxy) or translate from or to a different protocol ("cross-proxy"). + Full definitions of these terms are provided in Section 1.2. + + Notes: The terminology in this specification has been selected to be + culturally compatible with the terminology used in the wider web + application environments, without necessarily matching it in every + detail (which may not even be relevant to Constrained RESTful + Environments). Not too much semantics should be ascribed to the + components of the terms (such as "forward", "reverse", or + "cross"). + + HTTP proxies, besides acting as HTTP proxies, often offer a + transport-protocol proxying function ("CONNECT") to enable end-to- + end transport layer security through the proxy. No such function + is defined for CoAP-to-CoAP proxies in this specification, as + forwarding of UDP packets is unlikely to be of much value in + Constrained RESTful Environments. See also Section 10.2.7 for the + cross-proxy case. + + When a client uses a proxy to make a request that will use a secure + URI scheme (e.g., "coaps" or "https"), the request towards the proxy + SHOULD be sent using DTLS except where equivalent lower-layer + security is used for the leg between the client and the proxy. + +5.7.1. Proxy Operation + + A proxy generally needs a way to determine potential request + parameters for a request it places to a destination, based on the + request it received from its client. This way is fully specified for + a forward-proxy but may depend on the specific configuration for a + reverse-proxy. In particular, the client of a reverse-proxy + generally does not indicate a locator for the destination, + + + + + +Shelby, et al. Standards Track [Page 44] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + necessitating some form of namespace translation in the reverse- + proxy. However, some aspects of the operation of proxies are common + to all its forms. + + If a proxy does not employ a cache, then it simply forwards the + translated request to the determined destination. Otherwise, if it + does employ a cache but does not have a stored response that matches + the translated request and is considered fresh, then it needs to + refresh its cache according to Section 5.6. For options in the + request that the proxy recognizes, it knows whether the option is + intended to act as part of the key used in looking up the cached + value or not. For example, since requests for different Uri-Path + values address different resources, Uri-Path values are always part + of the Cache-Key, while, e.g., Token values are never part of the + Cache-Key. For options that the proxy does not recognize but that + are marked Safe-to-Forward in the option number, the option also + indicates whether it is to be included in the Cache-Key (NoCacheKey + is not all set) or not (NoCacheKey is all set). (Options that are + unrecognized and marked Unsafe lead to 4.02 Bad Option.) + + If the request to the destination times out, then a 5.04 (Gateway + Timeout) response MUST be returned. If the request to the + destination returns a response that cannot be processed by the proxy + (e.g, due to unrecognized critical options or message format errors), + then a 5.02 (Bad Gateway) response MUST be returned. Otherwise, the + proxy returns the response to the client. + + If a response is generated out of a cache, the generated (or implied) + Max-Age Option MUST NOT extend the max-age originally set by the + server, considering the time the resource representation spent in the + cache. For example, the Max-Age Option could be adjusted by the + proxy for each response using the formula: + + proxy-max-age = original-max-age - cache-age + + For example, if a request is made to a proxied resource that was + refreshed 20 seconds ago and had an original Max-Age of 60 seconds, + then that resource's proxied max-age is now 40 seconds. Considering + potential network delays on the way from the origin server, a proxy + should be conservative in the max-age values offered. + + All options present in a proxy request MUST be processed at the + proxy. Unsafe options in a request that are not recognized by the + proxy MUST lead to a 4.02 (Bad Option) response being returned by the + proxy. A CoAP-to-CoAP proxy MUST forward to the origin server all + Safe-to-Forward options that it does not recognize. Similarly, + + + + + +Shelby, et al. Standards Track [Page 45] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Unsafe options in a response that are not recognized by the CoAP-to- + CoAP proxy server MUST lead to a 5.02 (Bad Gateway) response. Again, + Safe-to-Forward options that are not recognized MUST be forwarded. + + Additional considerations for cross-protocol proxying between CoAP + and HTTP are discussed in Section 10. + +5.7.2. Forward-Proxies + + CoAP distinguishes between requests made (as if) to an origin server + and requests made through a forward-proxy. CoAP requests to a + forward-proxy are made as normal Confirmable or Non-confirmable + requests to the forward-proxy endpoint, but they specify the request + URI in a different way: The request URI in a proxy request is + specified as a string in the Proxy-Uri Option (see Section 5.10.2), + while the request URI in a request to an origin server is split into + the Uri-Host, Uri-Port, Uri-Path, and Uri-Query Options (see + Section 5.10.1). Alternatively, the URI in a proxy request can be + assembled from a Proxy-Scheme option and the split options mentioned. + + When a proxy request is made to an endpoint and the endpoint is + unwilling or unable to act as proxy for the request URI, it MUST + return a 5.05 (Proxying Not Supported) response. If the authority + (host and port) is recognized as identifying the proxy endpoint + itself (see Section 5.10.2), then the request MUST be treated as a + local (non-proxied) request. + + Unless a proxy is configured to forward the proxy request to another + proxy, it MUST translate the request as follows: the scheme of the + request URI defines the outgoing protocol and its details (e.g., CoAP + is used over UDP for the "coap" scheme and over DTLS for the "coaps" + scheme.) For a CoAP-to-CoAP proxy, the origin server's IP address + and port are determined by the authority component of the request + URI, and the request URI is decoded and split into the Uri-Host, Uri- + Port, Uri-Path and Uri-Query Options. This consumes the Proxy-Uri or + Proxy-Scheme option, which is therefore not forwarded to the origin + server. + +5.7.3. Reverse-Proxies + + Reverse-proxies do not make use of the Proxy-Uri or Proxy-Scheme + options but need to determine the destination (next hop) of a request + from information in the request and information in their + configuration. For example, a reverse-proxy might offer various + resources as if they were its own resources, after having learned of + their existence through resource discovery. The reverse-proxy is + free to build a namespace for the URIs that identify these resources. + A reverse-proxy may also build a namespace that gives the client more + + + +Shelby, et al. Standards Track [Page 46] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + control over where the request goes, e.g., by embedding host + identifiers and port numbers into the URI path of the resources + offered. + + In processing the response, a reverse-proxy has to be careful that + ETag option values from different sources are not mixed up on one + resource offered to its clients. In many cases, the ETag can be + forwarded unchanged. If the mapping from a resource offered by the + reverse-proxy to resources offered by its various origin servers is + not unique, the reverse-proxy may need to generate a new ETag, making + sure the semantics of this option are properly preserved. + +5.8. Method Definitions + + In this section, each method is defined along with its behavior. A + request with an unrecognized or unsupported Method Code MUST generate + a 4.05 (Method Not Allowed) piggybacked response. + +5.8.1. GET + + The GET method retrieves a representation for the information that + currently corresponds to the resource identified by the request URI. + If the request includes an Accept Option, that indicates the + preferred content-format of a response. If the request includes an + ETag Option, the GET method requests that ETag be validated and that + the representation be transferred only if validation failed. Upon + success, a 2.05 (Content) or 2.03 (Valid) Response Code SHOULD be + present in the response. + + The GET method is safe and idempotent. + +5.8.2. POST + + The POST method requests that the representation enclosed in the + request be processed. The actual function performed by the POST + method is determined by the origin server and dependent on the target + resource. It usually results in a new resource being created or the + target resource being updated. + + If a resource has been created on the server, the response returned + by the server SHOULD have a 2.01 (Created) Response Code and SHOULD + include the URI of the new resource in a sequence of one or more + Location-Path and/or Location-Query Options (Section 5.10.7). If the + POST succeeds but does not result in a new resource being created on + the server, the response SHOULD have a 2.04 (Changed) Response Code. + If the POST succeeds and results in the target resource being + deleted, the response SHOULD have a 2.02 (Deleted) Response Code. + POST is neither safe nor idempotent. + + + +Shelby, et al. Standards Track [Page 47] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.8.3. PUT + + The PUT method requests that the resource identified by the request + URI be updated or created with the enclosed representation. The + representation format is specified by the media type and content + coding given in the Content-Format Option, if provided. + + If a resource exists at the request URI, the enclosed representation + SHOULD be considered a modified version of that resource, and a 2.04 + (Changed) Response Code SHOULD be returned. If no resource exists, + then the server MAY create a new resource with that URI, resulting in + a 2.01 (Created) Response Code. If the resource could not be created + or modified, then an appropriate error Response Code SHOULD be sent. + + Further restrictions to a PUT can be made by including the If-Match + (see Section 5.10.8.1) or If-None-Match (see Section 5.10.8.2) + options in the request. + + PUT is not safe but is idempotent. + +5.8.4. DELETE + + The DELETE method requests that the resource identified by the + request URI be deleted. A 2.02 (Deleted) Response Code SHOULD be + used on success or in case the resource did not exist before the + request. + + DELETE is not safe but is idempotent. + +5.9. Response Code Definitions + + Each Response Code is described below, including any options required + in the response. Where appropriate, some of the codes will be + specified in regards to related Response Codes in HTTP [RFC2616]; + this does not mean that any such relationship modifies the HTTP + mapping specified in Section 10. + +5.9.1. Success 2.xx + + This class of Response Code indicates that the clients request was + successfully received, understood, and accepted. + +5.9.1.1. 2.01 Created + + Like HTTP 201 "Created", but only used in response to POST and PUT + requests. The payload returned with the response, if any, is a + representation of the action result. + + + + +Shelby, et al. Standards Track [Page 48] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + If the response includes one or more Location-Path and/or Location- + Query Options, the values of these options specify the location at + which the resource was created. Otherwise, the resource was created + at the request URI. A cache receiving this response MUST mark any + stored response for the created resource as not fresh. + + This response is not cacheable. + +5.9.1.2. 2.02 Deleted + + This Response Code is like HTTP 204 "No Content" but only used in + response to requests that cause the resource to cease being + available, such as DELETE and, in certain circumstances, POST. The + payload returned with the response, if any, is a representation of + the action result. + + This response is not cacheable. However, a cache MUST mark any + stored response for the deleted resource as not fresh. + +5.9.1.3. 2.03 Valid + + This Response Code is related to HTTP 304 "Not Modified" but only + used to indicate that the response identified by the entity-tag + identified by the included ETag Option is valid. Accordingly, the + response MUST include an ETag Option and MUST NOT include a payload. + + When a cache that recognizes and processes the ETag response option + receives a 2.03 (Valid) response, it MUST update the stored response + with the value of the Max-Age Option included in the response + (explicitly, or implicitly as a default value; see also + Section 5.6.2). For each type of Safe-to-Forward option present in + the response, the (possibly empty) set of options of this type that + are present in the stored response MUST be replaced with the set of + options of this type in the response received. (Unsafe options may + trigger similar option-specific processing as defined by the option.) + +5.9.1.4. 2.04 Changed + + This Response Code is like HTTP 204 "No Content" but only used in + response to POST and PUT requests. The payload returned with the + response, if any, is a representation of the action result. + + This response is not cacheable. However, a cache MUST mark any + stored response for the changed resource as not fresh. + + + + + + + +Shelby, et al. Standards Track [Page 49] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.9.1.5. 2.05 Content + + This Response Code is like HTTP 200 "OK" but only used in response to + GET requests. + + The payload returned with the response is a representation of the + target resource. + + This response is cacheable: Caches can use the Max-Age Option to + determine freshness (see Section 5.6.1) and (if present) the ETag + Option for validation (see Section 5.6.2). + +5.9.2. Client Error 4.xx + + This class of Response Code is intended for cases in which the client + seems to have erred. These Response Codes are applicable to any + request method. + + The server SHOULD include a diagnostic payload under the conditions + detailed in Section 5.5.2. + + Responses of this class are cacheable: Caches can use the Max-Age + Option to determine freshness (see Section 5.6.1). They cannot be + validated. + +5.9.2.1. 4.00 Bad Request + + This Response Code is Like HTTP 400 "Bad Request". + +5.9.2.2. 4.01 Unauthorized + + The client is not authorized to perform the requested action. The + client SHOULD NOT repeat the request without first improving its + authentication status to the server. Which specific mechanism can be + used for this is outside this document's scope; see also Section 9. + +5.9.2.3. 4.02 Bad Option + + The request could not be understood by the server due to one or more + unrecognized or malformed options. The client SHOULD NOT repeat the + request without modification. + +5.9.2.4. 4.03 Forbidden + + This Response Code is like HTTP 403 "Forbidden". + + + + + + +Shelby, et al. Standards Track [Page 50] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.9.2.5. 4.04 Not Found + + This Response Code is like HTTP 404 "Not Found". + +5.9.2.6. 4.05 Method Not Allowed + + This Response Code is like HTTP 405 "Method Not Allowed" but with no + parallel to the "Allow" header field. + +5.9.2.7. 4.06 Not Acceptable + + This Response Code is like HTTP 406 "Not Acceptable", but with no + response entity. + +5.9.2.8. 4.12 Precondition Failed + + This Response Code is like HTTP 412 "Precondition Failed". + +5.9.2.9. 4.13 Request Entity Too Large + + This Response Code is like HTTP 413 "Request Entity Too Large". + + The response SHOULD include a Size1 Option (Section 5.10.9) to + indicate the maximum size of request entity the server is able and + willing to handle, unless the server is not in a position to make + this information available. + +5.9.2.10. 4.15 Unsupported Content-Format + + This Response Code is like HTTP 415 "Unsupported Media Type". + +5.9.3. Server Error 5.xx + + This class of Response Code indicates cases in which the server is + aware that it has erred or is incapable of performing the request. + These Response Codes are applicable to any request method. + + The server SHOULD include a diagnostic payload under the conditions + detailed in Section 5.5.2. + + Responses of this class are cacheable: Caches can use the Max-Age + Option to determine freshness (see Section 5.6.1). They cannot be + validated. + +5.9.3.1. 5.00 Internal Server Error + + This Response Code is like HTTP 500 "Internal Server Error". + + + + +Shelby, et al. Standards Track [Page 51] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.9.3.2. 5.01 Not Implemented + + This Response Code is like HTTP 501 "Not Implemented". + +5.9.3.3. 5.02 Bad Gateway + + This Response Code is like HTTP 502 "Bad Gateway". + +5.9.3.4. 5.03 Service Unavailable + + This Response Code is like HTTP 503 "Service Unavailable" but uses + the Max-Age Option in place of the "Retry-After" header field to + indicate the number of seconds after which to retry. + +5.9.3.5. 5.04 Gateway Timeout + + This Response Code is like HTTP 504 "Gateway Timeout". + +5.9.3.6. 5.05 Proxying Not Supported + + The server is unable or unwilling to act as a forward-proxy for the + URI specified in the Proxy-Uri Option or using Proxy-Scheme (see + Section 5.10.2). + +5.10. Option Definitions + + The individual CoAP options are summarized in Table 4 and explained + in the subsections of this section. + + In this table, the C, U, and N columns indicate the properties + Critical, UnSafe, and NoCacheKey, respectively. Since NoCacheKey + only has a meaning for options that are Safe-to-Forward (not marked + Unsafe), the column is filled with a dash for UnSafe options. + + + + + + + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 52] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + +-----+---+---+---+---+----------------+--------+--------+----------+ + | No. | C | U | N | R | Name | Format | Length | Default | + +-----+---+---+---+---+----------------+--------+--------+----------+ + | 1 | x | | | x | If-Match | opaque | 0-8 | (none) | + | 3 | x | x | - | | Uri-Host | string | 1-255 | (see | + | | | | | | | | | below) | + | 4 | | | | x | ETag | opaque | 1-8 | (none) | + | 5 | x | | | | If-None-Match | empty | 0 | (none) | + | 7 | x | x | - | | Uri-Port | uint | 0-2 | (see | + | | | | | | | | | below) | + | 8 | | | | x | Location-Path | string | 0-255 | (none) | + | 11 | x | x | - | x | Uri-Path | string | 0-255 | (none) | + | 12 | | | | | Content-Format | uint | 0-2 | (none) | + | 14 | | x | - | | Max-Age | uint | 0-4 | 60 | + | 15 | x | x | - | x | Uri-Query | string | 0-255 | (none) | + | 17 | x | | | | Accept | uint | 0-2 | (none) | + | 20 | | | | x | Location-Query | string | 0-255 | (none) | + | 35 | x | x | - | | Proxy-Uri | string | 1-1034 | (none) | + | 39 | x | x | - | | Proxy-Scheme | string | 1-255 | (none) | + | 60 | | | x | | Size1 | uint | 0-4 | (none) | + +-----+---+---+---+---+----------------+--------+--------+----------+ + + C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable + + Table 4: Options + +5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query + + The Uri-Host, Uri-Port, Uri-Path, and Uri-Query Options are used to + specify the target resource of a request to a CoAP origin server. + The options encode the different components of the request URI in a + way that no percent-encoding is visible in the option values and that + the full URI can be reconstructed at any involved endpoint. The + syntax of CoAP URIs is defined in Section 6. + + The steps for parsing URIs into options is defined in Section 6.4. + These steps result in zero or more Uri-Host, Uri-Port, Uri-Path, and + Uri-Query Options being included in a request, where each option + holds the following values: + + o the Uri-Host Option specifies the Internet host of the resource + being requested, + + o the Uri-Port Option specifies the transport-layer port number of + the resource, + + o each Uri-Path Option specifies one segment of the absolute path to + the resource, and + + + +Shelby, et al. Standards Track [Page 53] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + o each Uri-Query Option specifies one argument parameterizing the + resource. + + Note: Fragments ([RFC3986], Section 3.5) are not part of the request + URI and thus will not be transmitted in a CoAP request. + + The default value of the Uri-Host Option is the IP literal + representing the destination IP address of the request message. + Likewise, the default value of the Uri-Port Option is the destination + UDP port. The default values for the Uri-Host and Uri-Port Options + are sufficient for requests to most servers. Explicit Uri-Host and + Uri-Port Options are typically used when an endpoint hosts multiple + virtual servers. + + The Uri-Path and Uri-Query Option can contain any character sequence. + No percent-encoding is performed. The value of a Uri-Path Option + MUST NOT be "." or ".." (as the request URI must be resolved before + parsing it into options). + + The steps for constructing the request URI from the options are + defined in Section 6.5. Note that an implementation does not + necessarily have to construct the URI; it can simply look up the + target resource by examining the individual options. + + Examples can be found in Appendix B. + +5.10.2. Proxy-Uri and Proxy-Scheme + + The Proxy-Uri Option is used to make a request to a forward-proxy + (see Section 5.7). The forward-proxy is requested to forward the + request or service it from a valid cache and return the response. + + The option value is an absolute-URI ([RFC3986], Section 4.3). + + Note that the forward-proxy MAY forward the request on to another + proxy or directly to the server specified by the absolute-URI. In + order to avoid request loops, a proxy MUST be able to recognize all + of its server names, including any aliases, local variations, and the + numeric IP addresses. + + An endpoint receiving a request with a Proxy-Uri Option that is + unable or unwilling to act as a forward-proxy for the request MUST + cause the return of a 5.05 (Proxying Not Supported) response. + + The Proxy-Uri Option MUST take precedence over any of the Uri-Host, + Uri-Port, Uri-Path or Uri-Query options (each of which MUST NOT be + included in a request containing the Proxy-Uri Option). + + + + +Shelby, et al. Standards Track [Page 54] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + As a special case to simplify many proxy clients, the absolute-URI + can be constructed from the Uri-* options. When a Proxy-Scheme + Option is present, the absolute-URI is constructed as follows: a CoAP + URI is constructed from the Uri-* options as defined in Section 6.5. + In the resulting URI, the initial scheme up to, but not including, + the following colon is then replaced by the content of the Proxy- + Scheme Option. Note that this case is only applicable if the + components of the desired URI other than the scheme component + actually can be expressed using Uri-* options; for example, to + represent a URI with a userinfo component in the authority, only + Proxy-Uri can be used. + +5.10.3. Content-Format + + The Content-Format Option indicates the representation format of the + message payload. The representation format is given as a numeric + Content-Format identifier that is defined in the "CoAP Content- + Formats" registry (Section 12.3). In the absence of the option, no + default value is assumed, i.e., the representation format of any + representation message payload is indeterminate (Section 5.5). + +5.10.4. Accept + + The CoAP Accept option can be used to indicate which Content-Format + is acceptable to the client. The representation format is given as a + numeric Content-Format identifier that is defined in the "CoAP + Content-Formats" registry (Section 12.3). If no Accept option is + given, the client does not express a preference (thus no default + value is assumed). The client prefers the representation returned by + the server to be in the Content-Format indicated. The server returns + the preferred Content-Format if available. If the preferred Content- + Format cannot be returned, then a 4.06 "Not Acceptable" MUST be sent + as a response, unless another error code takes precedence for this + response. + +5.10.5. Max-Age + + The Max-Age Option indicates the maximum time a response may be + cached before it is considered not fresh (see Section 5.6.1). + + The option value is an integer number of seconds between 0 and + 2**32-1 inclusive (about 136.1 years). A default value of 60 seconds + is assumed in the absence of the option in a response. + + The value is intended to be current at the time of transmission. + Servers that provide resources with strict tolerances on the value of + Max-Age SHOULD update the value before each retransmission. (See + also Section 5.7.1.) + + + +Shelby, et al. Standards Track [Page 55] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.10.6. ETag + + An entity-tag is intended for use as a resource-local identifier for + differentiating between representations of the same resource that + vary over time. It is generated by the server providing the + resource, which may generate it in any number of ways including a + version, checksum, hash, or time. An endpoint receiving an entity- + tag MUST treat it as opaque and make no assumptions about its content + or structure. (Endpoints that generate an entity-tag are encouraged + to use the most compact representation possible, in particular in + regards to clients and intermediaries that may want to store multiple + ETag values.) + +5.10.6.1. ETag as a Response Option + + The ETag Option in a response provides the current value (i.e., after + the request was processed) of the entity-tag for the "tagged + representation". If no Location-* options are present, the tagged + representation is the selected representation (Section 5.5.3) of the + target resource. If one or more Location-* options are present and + thus a location URI is indicated (Section 5.10.7), the tagged + representation is the representation that would be retrieved by a GET + request to the location URI. + + An ETag response option can be included with any response for which + there is a tagged representation (e.g., it would not be meaningful in + a 4.04 or 4.00 response). The ETag Option MUST NOT occur more than + once in a response. + + There is no default value for the ETag Option; if it is not present + in a response, the server makes no statement about the entity-tag for + the tagged representation. + +5.10.6.2. ETag as a Request Option + + In a GET request, an endpoint that has one or more representations + previously obtained from the resource, and has obtained ETag response + options with these, can specify an instance of the ETag Option for + one or more of these stored responses. + + A server can issue a 2.03 Valid response (Section 5.9.1.3) in place + of a 2.05 Content response if one of the ETags given is the entity- + tag for the current representation, i.e., is valid; the 2.03 Valid + response then echoes this specific ETag in a response option. + + In effect, a client can determine if any of the stored + representations is current (see Section 5.6.2) without needing to + transfer them again. + + + +Shelby, et al. Standards Track [Page 56] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + The ETag Option MAY occur zero, one, or multiple times in a request. + +5.10.7. Location-Path and Location-Query + + The Location-Path and Location-Query Options together indicate a + relative URI that consists either of an absolute path, a query + string, or both. A combination of these options is included in a + 2.01 (Created) response to indicate the location of the resource + created as the result of a POST request (see Section 5.8.2). The + location is resolved relative to the request URI. + + If a response with one or more Location-Path and/or Location-Query + Options passes through a cache that interprets these options and the + implied URI identifies one or more currently stored responses, those + entries MUST be marked as not fresh. + + Each Location-Path Option specifies one segment of the absolute path + to the resource, and each Location-Query Option specifies one + argument parameterizing the resource. The Location-Path and + Location-Query Option can contain any character sequence. No + percent-encoding is performed. The value of a Location-Path Option + MUST NOT be "." or "..". + + The steps for constructing the location URI from the options are + analogous to Section 6.5, except that the first five steps are + skipped and the result is a relative URI-reference, which is then + interpreted relative to the request URI. Note that the relative URI- + reference constructed this way always includes an absolute path + (e.g., leaving out Location-Path but supplying Location-Query means + the path component in the URI is "/"). + + The options that are used to compute the relative URI-reference are + collectively called Location-* options. Beyond Location-Path and + Location-Query, more Location-* options may be defined in the future + and have been reserved option numbers 128, 132, 136, and 140. If any + of these reserved option numbers occurs in addition to Location-Path + and/or Location-Query and are not supported, then a 4.02 (Bad Option) + error MUST be returned. + +5.10.8. Conditional Request Options + + Conditional request options enable a client to ask the server to + perform the request only if certain conditions specified by the + option are fulfilled. + + + + + + + +Shelby, et al. Standards Track [Page 57] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + For each of these options, if the condition given is not fulfilled, + then the server MUST NOT perform the requested method. Instead, the + server MUST respond with the 4.12 (Precondition Failed) Response + Code. + + If the condition is fulfilled, the server performs the request method + as if the conditional request options were not present. + + If the request would, without the conditional request options, result + in anything other than a 2.xx or 4.12 Response Code, then any + conditional request options MAY be ignored. + +5.10.8.1. If-Match + + The If-Match Option MAY be used to make a request conditional on the + current existence or value of an ETag for one or more representations + of the target resource. If-Match is generally useful for resource + update requests, such as PUT requests, as a means for protecting + against accidental overwrites when multiple clients are acting in + parallel on the same resource (i.e., the "lost update" problem). + + The value of an If-Match option is either an ETag or the empty + string. An If-Match option with an ETag matches a representation + with that exact ETag. An If-Match option with an empty value matches + any existing representation (i.e., it places the precondition on the + existence of any current representation for the target resource). + + The If-Match Option can occur multiple times. If any of the options + match, then the condition is fulfilled. + + If there is one or more If-Match Options, but none of the options + match, then the condition is not fulfilled. + +5.10.8.2. If-None-Match + + The If-None-Match Option MAY be used to make a request conditional on + the nonexistence of the target resource. If-None-Match is useful for + resource creation requests, such as PUT requests, as a means for + protecting against accidental overwrites when multiple clients are + acting in parallel on the same resource. The If-None-Match Option + carries no value. + + If the target resource does exist, then the condition is not + fulfilled. + + (It is not very useful to combine If-Match and If-None-Match options + in one request, because the condition will then never be fulfilled.) + + + + +Shelby, et al. Standards Track [Page 58] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +5.10.9. Size1 Option + + The Size1 option provides size information about the resource + representation in a request. The option value is an integer number + of bytes. Its main use is with block-wise transfers [BLOCK]. In the + present specification, it is used in 4.13 responses (Section 5.9.2.9) + to indicate the maximum size of request entity that the server is + able and willing to handle. + +6. CoAP URIs + + CoAP uses the "coap" and "coaps" URI schemes for identifying CoAP + resources and providing a means of locating the resource. Resources + are organized hierarchically and governed by a potential CoAP origin + server listening for CoAP requests ("coap") or DTLS-secured CoAP + requests ("coaps") on a given UDP port. The CoAP server is + identified via the generic syntax's authority component, which + includes a host component and optional UDP port number. The + remainder of the URI is considered to be identifying a resource that + can be operated on by the methods defined by the CoAP protocol. The + "coap" and "coaps" URI schemes can thus be compared to the "http" and + "https" URI schemes, respectively. + + The syntax of the "coap" and "coaps" URI schemes is specified in this + section in Augmented Backus-Naur Form (ABNF) [RFC5234]. The + definitions of "host", "port", "path-abempty", "query", "segment", + "IP-literal", "IPv4address", and "reg-name" are adopted from + [RFC3986]. + + Implementation Note: Unfortunately, over time, the URI format has + acquired significant complexity. Implementers are encouraged to + examine [RFC3986] closely. For example, the ABNF for IPv6 + addresses is more complicated than maybe expected. Also, + implementers should take care to perform the processing of + percent-decoding or percent-encoding exactly once on the way from + a URI to its decoded components or back. Percent-encoding is + crucial for data transparency but may lead to unusual results such + as a slash character in a path component. + +6.1. coap URI Scheme + + coap-URI = "coap:" "//" host [ ":" port ] path-abempty [ "?" query ] + + If the host component is provided as an IP-literal or IPv4address, + then the CoAP server can be reached at that IP address. If host is a + registered name, then that name is considered an indirect identifier + and the endpoint might use a name resolution service, such as DNS, to + find the address of that host. The host MUST NOT be empty; if a URI + + + +Shelby, et al. Standards Track [Page 59] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + is received with a missing authority or an empty host, then it MUST + be considered invalid. The port subcomponent indicates the UDP port + at which the CoAP server is located. If it is empty or not given, + then the default port 5683 is assumed. + + The path identifies a resource within the scope of the host and port. + It consists of a sequence of path segments separated by a slash + character (U+002F SOLIDUS "/"). + + The query serves to further parameterize the resource. It consists + of a sequence of arguments separated by an ampersand character + (U+0026 AMPERSAND "&"). An argument is often in the form of a + "key=value" pair. + + The "coap" URI scheme supports the path prefix "/.well-known/" + defined by [RFC5785] for "well-known locations" in the namespace of a + host. This enables discovery of policy or other information about a + host ("site-wide metadata"), such as hosted resources (see + Section 7). + + Application designers are encouraged to make use of short but + descriptive URIs. As the environments that CoAP is used in are + usually constrained for bandwidth and energy, the trade-off between + these two qualities should lean towards the shortness, without + ignoring descriptiveness. + +6.2. coaps URI Scheme + + coaps-URI = "coaps:" "//" host [ ":" port ] path-abempty + [ "?" query ] + + All of the requirements listed above for the "coap" scheme are also + requirements for the "coaps" scheme, except that a default UDP port + of 5684 is assumed if the port subcomponent is empty or not given, + and the UDP datagrams MUST be secured through the use of DTLS as + described in Section 9.1. + + Considerations for caching of responses to "coaps" identified + requests are discussed in Section 11.2. + + Resources made available via the "coaps" scheme have no shared + identity with the "coap" scheme even if their resource identifiers + indicate the same authority (the same host listening to the same UDP + port). They are distinct namespaces and are considered to be + distinct origin servers. + + + + + + +Shelby, et al. Standards Track [Page 60] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +6.3. Normalization and Comparison Rules + + Since the "coap" and "coaps" schemes conform to the URI generic + syntax, such URIs are normalized and compared according to the + algorithm defined in [RFC3986], Section 6, using the defaults + described above for each scheme. + + If the port is equal to the default port for a scheme, the normal + form is to elide the port subcomponent. Likewise, an empty path + component is equivalent to an absolute path of "/", so the normal + form is to provide a path of "/" instead. The scheme and host are + case insensitive and normally provided in lowercase; IP-literals are + in recommended form [RFC5952]; all other components are compared in a + case-sensitive manner. Characters other than those in the "reserved" + set are equivalent to their percent-encoded bytes (see [RFC3986], + Section 2.1): the normal form is to not encode them. + + For example, the following three URIs are equivalent and cause the + same options and option values to appear in the CoAP messages: + + coap://example.com:5683/~sensors/temp.xml + coap://EXAMPLE.com/%7Esensors/temp.xml + coap://EXAMPLE.com:/%7esensors/temp.xml + +6.4. Decomposing URIs into Options + + The steps to parse a request's options from a string |url| are as + follows. These steps either result in zero or more of the Uri-Host, + Uri-Port, Uri-Path, and Uri-Query Options being included in the + request or they fail. + + 1. If the |url| string is not an absolute URI ([RFC3986]), then fail + this algorithm. + + 2. Resolve the |url| string using the process of reference + resolution defined by [RFC3986]. At this stage, the URL is in + ASCII encoding [RFC0020], even though the decoded components will + be interpreted in UTF-8 [RFC3629] after steps 5, 8, and 9. + + NOTE: It doesn't matter what it is resolved relative to, since we + already know it is an absolute URL at this point. + + 3. If |url| does not have a <scheme> component whose value, when + converted to ASCII lowercase, is "coap" or "coaps", then fail + this algorithm. + + 4. If |url| has a <fragment> component, then fail this algorithm. + + + + +Shelby, et al. Standards Track [Page 61] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + 5. If the <host> component of |url| does not represent the request's + destination IP address as an IP-literal or IPv4address, include a + Uri-Host Option and let that option's value be the value of the + <host> component of |url|, converted to ASCII lowercase, and then + convert all percent-encodings ("%" followed by two hexadecimal + digits) to the corresponding characters. + + NOTE: In the usual case where the request's destination IP + address is derived from the host part, this ensures that a Uri- + Host Option is only used for a <host> component of the form reg- + name. + + 6. If |url| has a <port> component, then let |port| be that + component's value interpreted as a decimal integer; otherwise, + let |port| be the default port for the scheme. + + 7. If |port| does not equal the request's destination UDP port, + include a Uri-Port Option and let that option's value be |port|. + + 8. If the value of the <path> component of |url| is empty or + consists of a single slash character (U+002F SOLIDUS "/"), then + move to the next step. + + Otherwise, for each segment in the <path> component, include a + Uri-Path Option and let that option's value be the segment (not + including the delimiting slash characters) after converting each + percent-encoding ("%" followed by two hexadecimal digits) to the + corresponding byte. + + 9. If |url| has a <query> component, then, for each argument in the + <query> component, include a Uri-Query Option and let that + option's value be the argument (not including the question mark + and the delimiting ampersand characters) after converting each + percent-encoding to the corresponding byte. + + Note that these rules completely resolve any percent-encoding. + +6.5. Composing URIs from Options + + The steps to construct a URI from a request's options are as follows. + These steps either result in a URI or they fail. In these steps, + percent-encoding a character means replacing each of its + (UTF-8-encoded) bytes by a "%" character followed by two hexadecimal + digits representing the byte, where the digits A-F are in uppercase + (as defined in Section 2.1 of [RFC3986]; to reduce variability, the + hexadecimal notation for percent-encoding in CoAP URIs MUST use + uppercase letters). The definitions of "unreserved" and "sub-delims" + are adopted from [RFC3986]. + + + +Shelby, et al. Standards Track [Page 62] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + 1. If the request is secured using DTLS, let |url| be the string + "coaps://". Otherwise, let |url| be the string "coap://". + + 2. If the request includes a Uri-Host Option, let |host| be that + option's value, where any non-ASCII characters are replaced by + their corresponding percent-encoding. If |host| is not a valid + reg-name or IP-literal or IPv4address, fail the algorithm. If + the request does not include a Uri-Host Option, let |host| be + the IP-literal (making use of the conventions of [RFC5952]) or + IPv4address representing the request's destination IP address. + + 3. Append |host| to |url|. + + 4. If the request includes a Uri-Port Option, let |port| be that + option's value. Otherwise, let |port| be the request's + destination UDP port. + + 5. If |port| is not the default port for the scheme, then append a + single U+003A COLON character (:) followed by the decimal + representation of |port| to |url|. + + 6. Let |resource name| be the empty string. For each Uri-Path + Option in the request, append a single character U+002F SOLIDUS + (/) followed by the option's value to |resource name|, after + converting any character that is not either in the "unreserved" + set, in the "sub-delims" set, a U+003A COLON (:) character, or a + U+0040 COMMERCIAL AT (@) character to its percent-encoded form. + + 7. If |resource name| is the empty string, set it to a single + character U+002F SOLIDUS (/). + + 8. For each Uri-Query Option in the request, append a single + character U+003F QUESTION MARK (?) (first option) or U+0026 + AMPERSAND (&) (subsequent options) followed by the option's + value to |resource name|, after converting any character that is + not either in the "unreserved" set, in the "sub-delims" set + (except U+0026 AMPERSAND (&)), a U+003A COLON (:), a U+0040 + COMMERCIAL AT (@), a U+002F SOLIDUS (/), or a U+003F QUESTION + MARK (?) character to its percent-encoded form. + + 9. Append |resource name| to |url|. + + 10. Return |url|. + + Note that these steps have been designed to lead to a URI in normal + form (see Section 6.3). + + + + + +Shelby, et al. Standards Track [Page 63] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +7. Discovery + +7.1. Service Discovery + + As a part of discovering the services offered by a CoAP server, a + client has to learn about the endpoint used by a server. + + A server is discovered by a client (knowing or) learning a URI that + references a resource in the namespace of the server. Alternatively, + clients can use multicast CoAP (see Section 8) and the "All CoAP + Nodes" multicast address to find CoAP servers. + + Unless the port subcomponent in a "coap" or "coaps" URI indicates the + UDP port at which the CoAP server is located, the server is assumed + to be reachable at the default port. + + The CoAP default port number 5683 MUST be supported by a server that + offers resources for resource discovery (see Section 7.2 below) and + SHOULD be supported for providing access to other resources. The + default port number 5684 for DTLS-secured CoAP MAY be supported by a + server for resource discovery and for providing access to other + resources. In addition, other endpoints may be hosted at other + ports, e.g., in the dynamic port space. + + Implementation Note: When a CoAP server is hosted by a 6LoWPAN node, + header compression efficiency is improved when it also supports a + port number in the 61616-61631 compressed UDP port space defined + in [RFC4944] and [RFC6282]. (Note that, as its UDP port differs + from the default port, it is a different endpoint from the server + at the default port.) + +7.2. Resource Discovery + + The discovery of resources offered by a CoAP endpoint is extremely + important in machine-to-machine applications where there are no + humans in the loop and static interfaces result in fragility. To + maximize interoperability in a CoRE environment, a CoAP endpoint + SHOULD support the CoRE Link Format of discoverable resources as + described in [RFC6690], except where fully manual configuration is + desired. It is up to the server which resources are made + discoverable (if any). + +7.2.1. 'ct' Attribute + + This section defines a new Web Linking [RFC5988] attribute for use + with [RFC6690]. The Content-Format code "ct" attribute provides a + hint about the Content-Formats this resource returns. Note that this + is only a hint, and it does not override the Content-Format Option of + + + +Shelby, et al. Standards Track [Page 64] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + a CoAP response obtained by actually requesting the representation of + the resource. The value is in the CoAP identifier code format as a + decimal ASCII integer and MUST be in the range of 0-65535 (16-bit + unsigned integer). For example, "application/xml" would be indicated + as "ct=41". If no Content-Format code attribute is present, then + nothing about the type can be assumed. The Content-Format code + attribute MAY include a space-separated sequence of Content-Format + codes, indicating that multiple content-formats are available. The + syntax of the attribute value is summarized in the production "ct- + value" in Figure 12, where "cardinal", "SP", and "DQUOTE" are defined + as in [RFC6690]. + + ct-value = cardinal + / DQUOTE cardinal *( 1*SP cardinal ) DQUOTE + + Figure 12 + +8. Multicast CoAP + + CoAP supports making requests to an IP multicast group. This is + defined by a series of deltas to unicast CoAP. A more general + discussion of group communication with CoAP is in [GROUPCOMM]. + + CoAP endpoints that offer services that they want other endpoints to + be able to find using multicast service discovery join one or more of + the appropriate all-CoAP-node multicast addresses (Section 12.8) and + listen on the default CoAP port. Note that an endpoint might receive + multicast requests on other multicast addresses, including the all- + nodes IPv6 address (or via broadcast on IPv4); an endpoint MUST + therefore be prepared to receive such messages but MAY ignore them if + multicast service discovery is not desired. + +8.1. Messaging Layer + + A multicast request is characterized by being transported in a CoAP + message that is addressed to an IP multicast address instead of a + CoAP endpoint. Such multicast requests MUST be Non-confirmable. + + A server SHOULD be aware that a request arrived via multicast, e.g., + by making use of modern APIs such as IPV6_RECVPKTINFO [RFC3542], if + available. + + To avoid an implosion of error responses, when a server is aware that + a request arrived via multicast, it MUST NOT return a Reset message + in reply to a Non-confirmable message. If it is not aware, it MAY + return a Reset message in reply to a Non-confirmable message as + usual. Because such a Reset message will look identical to one for a + + + + +Shelby, et al. Standards Track [Page 65] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + unicast message from the sender, the sender MUST avoid using a + Message ID that is also still active from this endpoint with any + unicast endpoint that might receive the multicast message. + + At the time of writing, multicast messages can only be carried in UDP + not in DTLS. This means that the security modes defined for CoAP in + this document are not applicable to multicast. + +8.2. Request/Response Layer + + When a server is aware that a request arrived via multicast, the + server MAY always ignore the request, in particular if it doesn't + have anything useful to respond (e.g., if it only has an empty + payload or an error response). The decision for this may depend on + the application. (For example, in query filtering as described in + [RFC6690], a server should not respond to a multicast request if the + filter does not match. More examples are in [GROUPCOMM].) + + If a server does decide to respond to a multicast request, it should + not respond immediately. Instead, it should pick a duration for the + period of time during which it intends to respond. For the purposes + of this exposition, we call the length of this period the Leisure. + The specific value of this Leisure may depend on the application or + MAY be derived as described below. The server SHOULD then pick a + random point of time within the chosen leisure period to send back + the unicast response to the multicast request. If further responses + need to be sent based on the same multicast address membership, a new + leisure period starts at the earliest after the previous one + finishes. + + To compute a value for Leisure, the server should have a group size + estimate G, a target data transfer rate R (which both should be + chosen conservatively), and an estimated response size S; a rough + lower bound for Leisure can then be computed as + + lb_Leisure = S * G / R + + For example, for a multicast request with link-local scope on a 2.4 + GHz IEEE 802.15.4 (6LoWPAN) network, G could be (relatively + conservatively) set to 100, S to 100 bytes, and the target rate to 8 + kbit/s = 1 kB/s. The resulting lower bound for the Leisure is 10 + seconds. + + If a CoAP endpoint does not have suitable data to compute a value for + Leisure, it MAY resort to DEFAULT_LEISURE. + + + + + + +Shelby, et al. Standards Track [Page 66] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + When matching a response to a multicast request, only the token MUST + match; the source endpoint of the response does not need to (and will + not) be the same as the destination endpoint of the original request. + + For the purposes of interpreting the Location-* options and any links + embedded in the representation, the request URI (i.e., the base URI + relative to which the response is interpreted) is formed by replacing + the multicast address in the Host component of the original request + URI by the literal IP address of the endpoint actually responding. + +8.2.1. Caching + + When a client makes a multicast request, it always makes a new + request to the multicast group (since there may be new group members + that joined meanwhile or ones that did not get the previous request). + It MAY update a cache with the received responses. Then, it uses + both cached-still-fresh and new responses as the result of the + request. + + A response received in reply to a GET request to a multicast group + MAY be used to satisfy a subsequent request on the related unicast + request URI. The unicast request URI is obtained by replacing the + authority part of the request URI with the transport-layer source + address of the response message. + + A cache MAY revalidate a response by making a GET request on the + related unicast request URI. + + A GET request to a multicast group MUST NOT contain an ETag option. + A mechanism to suppress responses the client already has is left for + further study. + +8.2.2. Proxying + + When a forward-proxy receives a request with a Proxy-Uri or URI + constructed from Proxy-Scheme that indicates a multicast address, the + proxy obtains a set of responses as described above and sends all + responses (both cached-still-fresh and new) back to the original + client. + + This specification does not provide a way to indicate the unicast- + modified request URI (base URI) in responses thus forwarded. + Proxying multicast requests is discussed in more detail in + [GROUPCOMM]; one proposal to address the base URI issue can be found + in Section 3 of [CoAP-MISC]. + + + + + + +Shelby, et al. Standards Track [Page 67] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +9. Securing CoAP + + This section defines the DTLS binding for CoAP. + + During the provisioning phase, a CoAP device is provided with the + security information that it needs, including keying materials and + access control lists. This specification defines provisioning for + the RawPublicKey mode in Section 9.1.3.2.1. At the end of the + provisioning phase, the device will be in one of four security modes + with the following information for the given mode. The NoSec and + RawPublicKey modes are mandatory to implement for this specification. + + NoSec: There is no protocol-level security (DTLS is disabled). + Alternative techniques to provide lower-layer security SHOULD be + used when appropriate. The use of IPsec is discussed in + [IPsec-CoAP]. Certain link layers in use with constrained nodes + also provide link-layer security, which may be appropriate with + proper key management. + + PreSharedKey: DTLS is enabled, there is a list of pre-shared keys + [RFC4279], and each key includes a list of which nodes it can be + used to communicate with as described in Section 9.1.3.1. At the + extreme, there may be one key for each node this CoAP node needs + to communicate with (1:1 node/key ratio). Conversely, if more + than two entities share a specific pre-shared key, this key only + enables the entities to authenticate as a member of that group and + not as a specific peer. + + RawPublicKey: DTLS is enabled and the device has an asymmetric key + pair without a certificate (a raw public key) that is validated + using an out-of-band mechanism [RFC7250] as described in + Section 9.1.3.2. The device also has an identity calculated from + the public key and a list of identities of the nodes it can + communicate with. + + Certificate: DTLS is enabled and the device has an asymmetric key + pair with an X.509 certificate [RFC5280] that binds it to its + subject and is signed by some common trust root as described in + Section 9.1.3.3. The device also has a list of root trust anchors + that can be used for validating a certificate. + + In the "NoSec" mode, the system simply sends the packets over normal + UDP over IP and is indicated by the "coap" scheme and the CoAP + default port. The system is secured only by keeping attackers from + being able to send or receive packets from the network with the CoAP + nodes; see Section 11.5 for an additional complication with this + approach. + + + + +Shelby, et al. Standards Track [Page 68] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + The other three security modes are achieved using DTLS and are + indicated by the "coaps" scheme and DTLS-secured CoAP default port. + The result is a security association that can be used to authenticate + (within the limits of the security model) and, based on this + authentication, authorize the communication partner. CoAP itself + does not provide protocol primitives for authentication or + authorization; where this is required, it can either be provided by + communication security (i.e., IPsec or DTLS) or by object security + (within the payload). Devices that require authorization for certain + operations are expected to require one of these two forms of + security. Necessarily, where an intermediary is involved, + communication security only works when that intermediary is part of + the trust relationships. CoAP does not provide a way to forward + different levels of authorization that clients may have with an + intermediary to further intermediaries or origin servers -- it + therefore may be required to perform all authorization at the first + intermediary. + +9.1. DTLS-Secured CoAP + + Just as HTTP is secured using Transport Layer Security (TLS) over + TCP, CoAP is secured using Datagram TLS (DTLS) [RFC6347] over UDP + (see Figure 13). This section defines the CoAP binding to DTLS, + along with the minimal mandatory-to-implement configurations + appropriate for constrained environments. The binding is defined by + a series of deltas to unicast CoAP. In practice, DTLS is TLS with + added features to deal with the unreliable nature of the UDP + transport. + + +----------------------+ + | Application | + +----------------------+ + +----------------------+ + | Requests/Responses | + |----------------------| CoAP + | Messages | + +----------------------+ + +----------------------+ + | DTLS | + +----------------------+ + +----------------------+ + | UDP | + +----------------------+ + + Figure 13: Abstract Layering of DTLS-Secured CoAP + + + + + + +Shelby, et al. Standards Track [Page 69] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + In some constrained nodes (limited flash and/or RAM) and networks + (limited bandwidth or high scalability requirements), and depending + on the specific cipher suites in use, all modes of DTLS may not be + applicable. Some DTLS cipher suites can add significant + implementation complexity as well as some initial handshake overhead + needed when setting up the security association. Once the initial + handshake is completed, DTLS adds a limited per-datagram overhead of + approximately 13 bytes, not including any initialization vectors/ + nonces (e.g., 8 bytes with TLS_PSK_WITH_AES_128_CCM_8 [RFC6655]), + integrity check values (e.g., 8 bytes with TLS_PSK_WITH_AES_128_CCM_8 + [RFC6655]), and padding required by the cipher suite. Whether the + use of a given mode of DTLS is applicable for a CoAP-based + application should be carefully weighed considering the specific + cipher suites that may be applicable, whether the session maintenance + makes it compatible with application flows, and whether sufficient + resources are available on the constrained nodes and for the added + network overhead. (For some modes of using DTLS, this specification + identifies a mandatory-to-implement cipher suite. This is an + implementation requirement to maximize interoperability in those + cases where these cipher suites are indeed appropriate. The specific + security policies of an application may determine the actual set of + cipher suites that can be used.) DTLS is not applicable to group + keying (multicast communication); however, it may be a component in a + future group key management protocol. + +9.1.1. Messaging Layer + + The endpoint acting as the CoAP client should also act as the DTLS + client. It should initiate a session to the server on the + appropriate port. When the DTLS handshake has finished, the client + may initiate the first CoAP request. All CoAP messages MUST be sent + as DTLS "application data". + + The following rules are added for matching an Acknowledgement message + or Reset message to a Confirmable message, or a Reset message to a + Non-confirmable message: The DTLS session MUST be the same, and the + epoch MUST be the same. + + A message is the same when it is sent within the same DTLS session + and same epoch and has the same Message ID. + + Note: When a Confirmable message is retransmitted, a new DTLS + sequence_number is used for each attempt, even though the CoAP + Message ID stays the same. So a recipient still has to perform + deduplication as described in Section 4.5. Retransmissions MUST NOT + be performed across epochs. + + + + + +Shelby, et al. Standards Track [Page 70] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + DTLS connections in RawPublicKey and Certificate mode are set up + using mutual authentication so they can remain up and be reused for + future message exchanges in either direction. Devices can close a + DTLS connection when they need to recover resources, but in general + they should keep the connection up for as long as possible. Closing + the DTLS connection after every CoAP message exchange is very + inefficient. + +9.1.2. Request/Response Layer + + The following rules are added for matching a response to a request: + The DTLS session MUST be the same, and the epoch MUST be the same. + + This means the response to a DTLS secured request MUST always be DTLS + secured using the same security session and epoch. Any attempt to + supply a NoSec response to a DTLS request simply does not match the + request and therefore MUST be rejected (unless it does match an + unrelated NoSec request). + +9.1.3. Endpoint Identity + + Devices SHOULD support the Server Name Indication (SNI) to indicate + their authority in the SNI HostName field as defined in Section 3 of + [RFC6066]. This is needed so that when a host that acts as a virtual + server for multiple Authorities receives a new DTLS connection, it + knows which keys to use for the DTLS session. + +9.1.3.1. Pre-Shared Keys + + When forming a connection to a new node, the system selects an + appropriate key based on which nodes it is trying to reach and then + forms a DTLS session using a PSK (Pre-Shared Key) mode of DTLS. + Implementations in these modes MUST support the mandatory-to- + implement cipher suite TLS_PSK_WITH_AES_128_CCM_8 as specified in + [RFC6655]. + + Depending on the commissioning model, applications may need to define + an application profile for identity hints (as required and detailed + in Section 5.2 of [RFC4279]) to enable the use of PSK identity hints. + + The security considerations of Section 7 of [RFC4279] apply. In + particular, applications should carefully weigh whether or not they + need Perfect Forward Secrecy (PFS) and select an appropriate cipher + suite (Section 7.1 of [RFC4279]). The entropy of the PSK must be + sufficient to mitigate against brute-force and (where the PSK is not + chosen randomly but by a human) dictionary attacks (Section 7.2 of + [RFC4279]). The cleartext communication of client identities may + leak data or compromise privacy (Section 7.3 of [RFC4279]). + + + +Shelby, et al. Standards Track [Page 71] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +9.1.3.2. Raw Public Key Certificates + + In this mode, the device has an asymmetric key pair but without an + X.509 certificate (called a raw public key); for example, the + asymmetric key pair is generated by the manufacturer and installed on + the device (see also Section 11.6). A device MAY be configured with + multiple raw public keys. The type and length of the raw public key + depends on the cipher suite used. Implementations in RawPublicKey + mode MUST support the mandatory-to-implement cipher suite + TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 as specified in [RFC7251], + [RFC5246], and [RFC4492]. The key used MUST be ECDSA capable. The + curve secp256r1 MUST be supported [RFC4492]; this curve is equivalent + to the NIST P-256 curve. The hash algorithm is SHA-256. + Implementations MUST use the Supported Elliptic Curves and Supported + Point Formats Extensions [RFC4492]; the uncompressed point format + MUST be supported; [RFC6090] can be used as an implementation method. + Some guidance relevant to the implementation of this cipher suite can + be found in [W3CXMLSEC]. The mechanism for using raw public keys + with TLS is specified in [RFC7250]. + + Implementation Note: Specifically, this means the extensions listed + in Figure 14 with at least the values listed will be present in + the DTLS handshake. + + Extension: elliptic_curves + Type: elliptic_curves (0x000a) + Length: 4 + Elliptic Curves Length: 2 + Elliptic curves (1 curve) + Elliptic curve: secp256r1 (0x0017) + + Extension: ec_point_formats + Type: ec_point_formats (0x000b) + Length: 2 + EC point formats Length: 1 + Elliptic curves point formats (1) + EC point format: uncompressed (0) + + Extension: signature_algorithms + Type: signature_algorithms (0x000d) + Length: 4 + Data (4 bytes): 00 02 04 03 + HashAlgorithm: sha256 (4) + SignatureAlgorithm: ecdsa (3) + + Figure 14: DTLS Extensions Present for + TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 + + + + +Shelby, et al. Standards Track [Page 72] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +9.1.3.2.1. Provisioning + + The RawPublicKey mode was designed to be easily provisioned in M2M + deployments. It is assumed that each device has an appropriate + asymmetric public key pair installed. An identifier is calculated by + the endpoint from the public key as described in Section 2 of + [RFC6920]. All implementations that support checking RawPublicKey + identities MUST support at least the sha-256-120 mode (SHA-256 + truncated to 120 bits). Implementations SHOULD also support longer + length identifiers and MAY support shorter lengths. Note that the + shorter lengths provide less security against attacks, and their use + is NOT RECOMMENDED. + + Depending on how identifiers are given to the system that verifies + them, support for URI, binary, and/or human-speakable format + [RFC6920] needs to be implemented. All implementations SHOULD + support the binary mode, and implementations that have a user + interface SHOULD also support the human-speakable format. + + During provisioning, the identifier of each node is collected, for + example, by reading a barcode on the outside of the device or by + obtaining a pre-compiled list of the identifiers. These identifiers + are then installed in the corresponding endpoint, for example, an M2M + data collection server. The identifier is used for two purposes, to + associate the endpoint with further device information and to perform + access control. During (initial and ongoing) provisioning, an access + control list of identifiers with which the device may start DTLS + sessions SHOULD also be installed and maintained. + +9.1.3.3. X.509 Certificates + + Implementations in Certificate Mode MUST support the mandatory-to- + implement cipher suite TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 as + specified in [RFC7251], [RFC5246], and [RFC4492]. Namely, the + certificate includes a SubjectPublicKeyInfo that indicates an + algorithm of id-ecPublicKey with namedCurves secp256r1 [RFC5480]; the + public key format is uncompressed [RFC5480]; the hash algorithm is + SHA-256; if included, the key usage extension indicates + digitalSignature. Certificates MUST be signed with ECDSA using + secp256r1, and the signature MUST use SHA-256. The key used MUST be + ECDSA capable. The curve secp256r1 MUST be supported [RFC4492]; this + curve is equivalent to the NIST P-256 curve. The hash algorithm is + SHA-256. Implementations MUST use the Supported Elliptic Curves and + Supported Point Formats Extensions [RFC4492]; the uncompressed point + format MUST be supported; [RFC6090] can be used as an implementation + method. + + + + + +Shelby, et al. Standards Track [Page 73] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + The subject in the certificate would be built out of a long-term + unique identifier for the device such as the EUI-64 [EUI64]. The + subject could also be based on the Fully Qualified Domain Name (FQDN) + that was used as the Host part of the CoAP URI. However, the + device's IP address should not typically be used as the subject, as + it would change over time. The discovery process used in the system + would build up the mapping between IP addresses of the given devices + and the subject for each device. Some devices could have more than + one subject and would need more than a single certificate. + + When a new connection is formed, the certificate from the remote + device needs to be verified. If the CoAP node has a source of + absolute time, then the node SHOULD check that the validity dates of + the certificate are within range. The certificate MUST be validated + as appropriate for the security requirements, using functionality + equivalent to the algorithm specified in Section 6 of [RFC5280]. If + the certificate contains a SubjectAltName, then the authority of the + request URI MUST match at least one of the authorities of any CoAP + URI found in a field of URI type in the SubjectAltName set. If there + is no SubjectAltName in the certificate, then the authority of the + request URI MUST match the Common Name (CN) found in the certificate + using the matching rules defined in [RFC3280] with the exception that + certificates with wildcards are not allowed. + + CoRE support for certificate status checking requires further study. + As a mapping of the Online Certificate Status Protocol (OCSP) + [RFC6960] onto CoAP is not currently defined and OCSP may also not be + easily applicable in all environments, an alternative approach may be + using the TLS Certificate Status Request extension (Section 8 of + [RFC6066]; also known as "OCSP stapling") or preferably the Multiple + Certificate Status Extension ([RFC6961]), if available. + + If the system has a shared key in addition to the certificate, then a + cipher suite that includes the shared key such as + TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA [RFC5489] SHOULD be used. + +10. Cross-Protocol Proxying between CoAP and HTTP + + CoAP supports a limited subset of HTTP functionality, and thus cross- + protocol proxying to HTTP is straightforward. There might be several + reasons for proxying between CoAP and HTTP, for example, when + designing a web interface for use over either protocol or when + realizing a CoAP-HTTP proxy. Likewise, CoAP could equally be proxied + to other protocols such as XMPP [RFC6120] or SIP [RFC3264]; the + definition of these mechanisms is out of scope for this + specification. + + + + + +Shelby, et al. Standards Track [Page 74] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + There are two possible directions to access a resource via a forward- + proxy: + + CoAP-HTTP Proxying: Enables CoAP clients to access resources on HTTP + servers through an intermediary. This is initiated by including + the Proxy-Uri or Proxy-Scheme Option with an "http" or "https" URI + in a CoAP request to a CoAP-HTTP proxy. + + HTTP-CoAP Proxying: Enables HTTP clients to access resources on CoAP + servers through an intermediary. This is initiated by specifying + a "coap" or "coaps" URI in the Request-Line of an HTTP request to + an HTTP-CoAP proxy. + + Either way, only the request/response model of CoAP is mapped to + HTTP. The underlying model of Confirmable or Non-confirmable + messages, etc., is invisible and MUST have no effect on a proxy + function. The following sections describe the handling of requests + to a forward-proxy. Reverse-proxies are not specified, as the proxy + function is transparent to the client with the proxy acting as if it + were the origin server. However, similar considerations apply to + reverse-proxies as to forward-proxies, and there generally will be an + expectation that reverse-proxies operate in a similar way forward- + proxies would. As an implementation note, HTTP client libraries may + make it hard to operate an HTTP-CoAP forward-proxy by not providing a + way to put a CoAP URI on the HTTP Request-Line; reverse-proxying may + therefore lead to wider applicability of a proxy. A separate + specification may define a convention for URIs operating such an + HTTP-CoAP reverse-proxy [MAPPING]. + +10.1. CoAP-HTTP Proxying + + If a request contains a Proxy-Uri or Proxy-Scheme Option with an + 'http' or 'https' URI [RFC2616], then the receiving CoAP endpoint + (called "the proxy" henceforth) is requested to perform the operation + specified by the request method on the indicated HTTP resource and + return the result to the client. (See also Section 5.7 for how the + request to the proxy is formulated, including security requirements.) + + This section specifies for any CoAP request the CoAP response that + the proxy should return to the client. How the proxy actually + satisfies the request is an implementation detail, although the + typical case is expected to be that the proxy translates and forwards + the request to an HTTP origin server. + + + + + + + + +Shelby, et al. Standards Track [Page 75] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Since HTTP and CoAP share the basic set of request methods, + performing a CoAP request on an HTTP resource is not so different + from performing it on a CoAP resource. The meanings of the + individual CoAP methods when performed on HTTP resources are + explained in the subsections of this section. + + If the proxy is unable or unwilling to service a request with an HTTP + URI, a 5.05 (Proxying Not Supported) response is returned to the + client. If the proxy services the request by interacting with a + third party (such as the HTTP origin server) and is unable to obtain + a result within a reasonable time frame, a 5.04 (Gateway Timeout) + response is returned; if a result can be obtained but is not + understood, a 5.02 (Bad Gateway) response is returned. + +10.1.1. GET + + The GET method requests the proxy to return a representation of the + HTTP resource identified by the request URI. + + Upon success, a 2.05 (Content) Response Code SHOULD be returned. The + payload of the response MUST be a representation of the target HTTP + resource, and the Content-Format Option MUST be set accordingly. The + response MUST indicate a Max-Age value that is no greater than the + remaining time the representation can be considered fresh. If the + HTTP entity has an entity-tag, the proxy SHOULD include an ETag + Option in the response and process ETag Options in requests as + described below. + + A client can influence the processing of a GET request by including + the following option: + + Accept: The request MAY include an Accept Option, identifying the + preferred response content-format. + + ETag: The request MAY include one or more ETag Options, identifying + responses that the client has stored. This requests the proxy to + send a 2.03 (Valid) response whenever it would send a 2.05 + (Content) response with an entity-tag in the requested set + otherwise. Note that CoAP ETags are always strong ETags in the + HTTP sense; CoAP does not have the equivalent of HTTP weak ETags, + and there is no good way to make use of these in a cross-proxy. + + + + + + + + + + +Shelby, et al. Standards Track [Page 76] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +10.1.2. PUT + + The PUT method requests the proxy to update or create the HTTP + resource identified by the request URI with the enclosed + representation. + + If a new resource is created at the request URI, a 2.01 (Created) + response MUST be returned to the client. If an existing resource is + modified, a 2.04 (Changed) response MUST be returned to indicate + successful completion of the request. + +10.1.3. DELETE + + The DELETE method requests the proxy to delete the HTTP resource + identified by the request URI at the HTTP origin server. + + A 2.02 (Deleted) response MUST be returned to the client upon success + or if the resource does not exist at the time of the request. + +10.1.4. POST + + The POST method requests the proxy to have the representation + enclosed in the request be processed by the HTTP origin server. The + actual function performed by the POST method is determined by the + origin server and dependent on the resource identified by the request + URI. + + If the action performed by the POST method does not result in a + resource that can be identified by a URI, a 2.04 (Changed) response + MUST be returned to the client. If a resource has been created on + the origin server, a 2.01 (Created) response MUST be returned. + +10.2. HTTP-CoAP Proxying + + If an HTTP request contains a Request-URI with a "coap" or "coaps" + URI, then the receiving HTTP endpoint (called "the proxy" henceforth) + is requested to perform the operation specified by the request method + on the indicated CoAP resource and return the result to the client. + + This section specifies for any HTTP request the HTTP response that + the proxy should return to the client. Unless otherwise specified, + all the statements made are RECOMMENDED behavior; some highly + constrained implementations may need to resort to shortcuts. How the + proxy actually satisfies the request is an implementation detail, + although the typical case is expected to be that the proxy translates + and forwards the request to a CoAP origin server. The meanings of + the individual HTTP methods when performed on CoAP resources are + explained in the subsections of this section. + + + +Shelby, et al. Standards Track [Page 77] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + If the proxy is unable or unwilling to service a request with a CoAP + URI, a 501 (Not Implemented) response is returned to the client. If + the proxy services the request by interacting with a third party + (such as the CoAP origin server) and is unable to obtain a result + within a reasonable time frame, a 504 (Gateway Timeout) response is + returned; if a result can be obtained but is not understood, a 502 + (Bad Gateway) response is returned. + +10.2.1. OPTIONS and TRACE + + As the OPTIONS and TRACE methods are not supported in CoAP, a 501 + (Not Implemented) error MUST be returned to the client. + +10.2.2. GET + + The GET method requests the proxy to return a representation of the + CoAP resource identified by the Request-URI. + + Upon success, a 200 (OK) response is returned. The payload of the + response MUST be a representation of the target CoAP resource, and + the Content-Type and Content-Encoding header fields MUST be set + accordingly. The response MUST indicate a max-age directive that + indicates a value no greater than the remaining time the + representation can be considered fresh. If the CoAP response has an + ETag option, the proxy should include an ETag header field in the + response. + + A client can influence the processing of a GET request by including + the following options: + + Accept: The most-preferred media type of the HTTP Accept header + field in a request is mapped to a CoAP Accept option. HTTP Accept + media-type ranges, parameters, and extensions are not supported by + the CoAP Accept option. If the proxy cannot send a response that + is acceptable according to the combined Accept field value, then + the proxy sends a 406 (Not Acceptable) response. The proxy MAY + then retry the request with further media types from the HTTP + Accept header field. + + Conditional GETs: Conditional HTTP GET requests that include an "If- + Match" or "If-None-Match" request-header field can be mapped to a + corresponding CoAP request. The "If-Modified-Since" and "If- + Unmodified-Since" request-header fields are not directly supported + by CoAP but are implemented locally by a caching proxy. + + + + + + + +Shelby, et al. Standards Track [Page 78] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +10.2.3. HEAD + + The HEAD method is identical to GET except that the server MUST NOT + return a message-body in the response. + + Although there is no direct equivalent of HTTP's HEAD method in CoAP, + an HTTP-CoAP proxy responds to HEAD requests for CoAP resources, and + the HTTP headers are returned without a message-body. + + Implementation Note: An HTTP-CoAP proxy may want to try using a + block-wise transfer option [BLOCK] to minimize the amount of data + actually transferred, but it needs to be prepared for the case + that the origin server does not support block-wise transfers. + +10.2.4. POST + + The POST method requests the proxy to have the representation + enclosed in the request be processed by the CoAP origin server. The + actual function performed by the POST method is determined by the + origin server and dependent on the resource identified by the request + URI. + + If the action performed by the POST method does not result in a + resource that can be identified by a URI, a 200 (OK) or 204 (No + Content) response MUST be returned to the client. If a resource has + been created on the origin server, a 201 (Created) response MUST be + returned. + + If any of the Location-* Options are present in the CoAP response, a + Location header field constructed from the values of these options is + returned. + +10.2.5. PUT + + The PUT method requests the proxy to update or create the CoAP + resource identified by the Request-URI with the enclosed + representation. + + If a new resource is created at the Request-URI, a 201 (Created) + response is returned to the client. If an existing resource is + modified, either the 200 (OK) or 204 (No Content) Response Codes is + sent to indicate successful completion of the request. + + + + + + + + + +Shelby, et al. Standards Track [Page 79] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +10.2.6. DELETE + + The DELETE method requests the proxy to delete the CoAP resource + identified by the Request-URI at the CoAP origin server. + + A successful response is 200 (OK) if the response includes an entity + describing the status or 204 (No Content) if the action has been + enacted but the response does not include an entity. + +10.2.7. CONNECT + + This method cannot currently be satisfied by an HTTP-CoAP proxy + function, as TLS to DTLS tunneling has not yet been specified. For + now, a 501 (Not Implemented) error is returned to the client. + +11. Security Considerations + + This section analyzes the possible threats to the protocol. It is + meant to inform protocol and application developers about the + security limitations of CoAP as described in this document. As CoAP + realizes a subset of the features in HTTP/1.1, the security + considerations in Section 15 of [RFC2616] are also pertinent to CoAP. + This section concentrates on describing limitations specific to CoAP. + +11.1. Parsing the Protocol and Processing URIs + + A network-facing application can exhibit vulnerabilities in its + processing logic for incoming packets. Complex parsers are well- + known as a likely source of such vulnerabilities, such as the ability + to remotely crash a node, or even remotely execute arbitrary code on + it. CoAP attempts to narrow the opportunities for introducing such + vulnerabilities by reducing parser complexity, by giving the entire + range of encodable values a meaning where possible, and by + aggressively reducing complexity that is often caused by unnecessary + choice between multiple representations that mean the same thing. + Much of the URI processing has been moved to the clients, further + reducing the opportunities for introducing vulnerabilities into the + servers. Even so, the URI processing code in CoAP implementations is + likely to be a large source of remaining vulnerabilities and should + be implemented with special care. CoAP access control + implementations need to ensure they don't introduce vulnerabilities + through discrepancies between the code deriving access control + decisions from a URI and the code finally serving up the resource + addressed by the URI. The most complex parser remaining could be the + one for the CoRE Link Format, although this also has been designed + with a goal of reduced implementation complexity [RFC6690]. (See + also Section 15.2 of [RFC2616].) + + + + +Shelby, et al. Standards Track [Page 80] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +11.2. Proxying and Caching + + As mentioned in Section 15.7 of [RFC2616], proxies are by their very + nature men-in-the-middle, breaking any IPsec or DTLS protection that + a direct CoAP message exchange might have. They are therefore + interesting targets for breaking confidentiality or integrity of CoAP + message exchanges. As noted in [RFC2616], they are also interesting + targets for breaking availability. + + The threat to confidentiality and integrity of request/response data + is amplified where proxies also cache. Note that CoAP does not + define any of the cache-suppressing Cache-Control options that + HTTP/1.1 provides to better protect sensitive data. + + For a caching implementation, any access control considerations that + would apply to making the request that generated the cache entry also + need to be applied to the value in the cache. This is relevant for + clients that implement multiple security domains, as well as for + proxies that may serve multiple clients. Also, a caching proxy MUST + NOT make cached values available to requests that have lesser + transport-security properties than those the proxy would require to + perform request forwarding in the first place. + + Unlike the "coap" scheme, responses to "coaps" identified requests + are never "public" and thus MUST NOT be reused for shared caching, + unless the cache is able to make equivalent access control decisions + to the ones that led to the cached entry. They can, however, be + reused in a private cache if the message is cacheable by default in + CoAP. + + Finally, a proxy that fans out Separate Responses (as opposed to + piggybacked Responses) to multiple original requesters may provide + additional amplification (see Section 11.3). + +11.3. Risk of Amplification + + CoAP servers generally reply to a request packet with a response + packet. This response packet may be significantly larger than the + request packet. An attacker might use CoAP nodes to turn a small + attack packet into a larger attack packet, an approach known as + amplification. There is therefore a danger that CoAP nodes could + become implicated in denial-of-service (DoS) attacks by using the + amplifying properties of the protocol: an attacker that is attempting + to overload a victim but is limited in the amount of traffic it can + generate can use amplification to generate a larger amount of + traffic. + + + + + +Shelby, et al. Standards Track [Page 81] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + This is particularly a problem in nodes that enable NoSec access, are + accessible from an attacker, and can access potential victims (e.g., + on the general Internet), as the UDP protocol provides no way to + verify the source address given in the request packet. An attacker + need only place the IP address of the victim in the source address of + a suitable request packet to generate a larger packet directed at the + victim. + + As a mitigating factor, many constrained networks will only be able + to generate a small amount of traffic, which may make CoAP nodes less + attractive for this attack. However, the limited capacity of the + constrained network makes the network itself a likely victim of an + amplification attack. + + Therefore, large amplification factors SHOULD NOT be provided in the + response if the request is not authenticated. A CoAP server can + reduce the amount of amplification it provides to an attacker by + using slicing/blocking modes of CoAP [BLOCK] and offering large + resource representations only in relatively small slices. For + example, for a 1000-byte resource, a 10-byte request might result in + an 80-byte response (with a 64-byte block) instead of a 1016-byte + response, considerably reducing the amplification provided. + + CoAP also supports the use of multicast IP addresses in requests, an + important requirement for M2M. Multicast CoAP requests may be the + source of accidental or deliberate DoS attacks, especially over + constrained networks. This specification attempts to reduce the + amplification effects of multicast requests by limiting when a + response is returned. To limit the possibility of malicious use, + CoAP servers SHOULD NOT accept multicast requests that can not be + authenticated in some way, cryptographically or by some multicast + boundary limiting the potential sources. If possible, a CoAP server + SHOULD limit the support for multicast requests to the specific + resources where the feature is required. + + On some general-purpose operating systems providing a POSIX-style API + [IEEE1003.1], it is not straightforward to find out whether a packet + received was addressed to a multicast address. While many + implementations will know whether they have joined a multicast group, + this creates a problem for packets addressed to multicast addresses + of the form FF0x::1, which are received by every IPv6 node. + Implementations SHOULD make use of modern APIs such as + IPV6_RECVPKTINFO [RFC3542], if available, to make this determination. + + + + + + + + +Shelby, et al. Standards Track [Page 82] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +11.4. IP Address Spoofing Attacks + + Due to the lack of a handshake in UDP, a rogue endpoint that is free + to read and write messages carried by the constrained network (i.e., + NoSec or PreSharedKey deployments with a nodes/key ratio > 1:1), may + easily attack a single endpoint, a group of endpoints, as well as the + whole network, e.g., by: + + 1. spoofing a Reset message in response to a Confirmable message or + Non-confirmable message, thus making an endpoint "deaf"; or + + 2. spoofing an ACK in response to a CON message, thus potentially + preventing the sender of the CON message from retransmitting, and + drowning out the actual response; or + + 3. spoofing the entire response with forged payload/options (this + has different levels of impact: from single-response disruption, + to much bolder attacks on the supporting infrastructure, e.g., + poisoning proxy caches, or tricking validation/lookup interfaces + in resource directories and, more generally, any component that + stores global network state and uses CoAP as the messaging + facility to handle setting or updating state is a potential + target.); or + + 4. spoofing a multicast request for a target node; this may result + in network congestion/collapse, a DoS attack on the victim, or + forced wake-up from sleeping; or + + 5. spoofing observe messages, etc. + + Response spoofing by off-path attackers can be detected and mitigated + even without transport layer security by choosing a nontrivial, + randomized token in the request (Section 5.3.1). [RFC4086] discusses + randomness requirements for security. + + In principle, other kinds of spoofing can be detected by CoAP only in + case Confirmable message semantics is used, because of unexpected + Acknowledgement or Reset messages coming from the deceived endpoint. + But this imposes keeping track of the used Message IDs, which is not + always possible, and moreover detection becomes available usually + after the damage is already done. This kind of attack can be + prevented using security modes other than NoSec. + + With or without source address spoofing, a client can attempt to + overload a server by sending requests, preferably complex ones, to a + server; address spoofing makes tracing back, and blocking, this + attack harder. Given that the cost of a CON request is small, this + attack can easily be executed. Under this attack, a constrained node + + + +Shelby, et al. Standards Track [Page 83] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + with limited total energy available may exhaust that energy much more + quickly than planned (battery depletion attack). Also, if the client + uses a Confirmable message and the server responds with a Confirmable + separate response to a (possibly spoofed) address that does not + respond, the server will have to allocate buffer and retransmission + logic for each response up to the exhaustion of MAX_TRANSMIT_SPAN, + making it more likely that it runs out of resources for processing + legitimate traffic. The latter problem can be mitigated somewhat by + limiting the rate of responses as discussed in Section 4.7. An + attacker could also spoof the address of a legitimate client; this + might cause the server, if it uses separate responses, to block + legitimate responses to that client because of NSTART=1. All these + attacks can be prevented using a security mode other than NoSec, thus + leaving only attacks on the security protocol. + +11.5. Cross-Protocol Attacks + + The ability to incite a CoAP endpoint to send packets to a fake + source address can be used not only for amplification, but also for + cross-protocol attacks against a victim listening to UDP packets at a + given address (IP address and port). This would occur as follows: + + o The attacker sends a message to a CoAP endpoint with the given + address as the fake source address. + + o The CoAP endpoint replies with a message to the given source + address. + + o The victim at the given address receives a UDP packet that it + interprets according to the rules of a different protocol. + + This may be used to circumvent firewall rules that prevent direct + communication from the attacker to the victim but happen to allow + communication from the CoAP endpoint (which may also host a valid + role in the other protocol) to the victim. + + Also, CoAP endpoints may be the victim of a cross-protocol attack + generated through an endpoint of another UDP-based protocol such as + DNS. In both cases, attacks are possible if the security properties + of the endpoints rely on checking IP addresses (and firewalling off + direct attacks sent from outside using fake IP addresses). In + general, because of their lack of context, UDP-based protocols are + relatively easy targets for cross-protocol attacks. + + Finally, CoAP URIs transported by other means could be used to incite + clients to send messages to endpoints of other protocols. + + + + + +Shelby, et al. Standards Track [Page 84] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + One mitigation against cross-protocol attacks is strict checking of + the syntax of packets received, combined with sufficient difference + in syntax. As an example, it might help if it were difficult to + incite a DNS server to send a DNS response that would pass the checks + of a CoAP endpoint. Unfortunately, the first two bytes of a DNS + reply are an ID that can be chosen by the attacker and that map into + the interesting part of the CoAP header, and the next two bytes are + then interpreted as CoAP's Message ID (i.e., any value is + acceptable). The DNS count words may be interpreted as multiple + instances of a (nonexistent but elective) CoAP option 0, or possibly + as a Token. The echoed query finally may be manufactured by the + attacker to achieve a desired effect on the CoAP endpoint; the + response added by the server (if any) might then just be interpreted + as added payload. + + 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ID | T, TKL, code + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |QR| Opcode |AA|TC|RD|RA| Z | RCODE | Message ID + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | QDCOUNT | (options 0) + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ANCOUNT | (options 0) + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | NSCOUNT | (options 0) + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ARCOUNT | (options 0) + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + + Figure 15: DNS Header ([RFC1035], Section 4.1.1) vs. CoAP Message + + In general, for any pair of protocols, one of the protocols can very + well have been designed in a way that enables an attacker to cause + the generation of replies that look like messages of the other + protocol. It is often much harder to ensure or prove the absence of + viable attacks than to generate examples that may not yet completely + enable an attack but might be further developed by more creative + minds. Cross-protocol attacks can therefore only be completely + mitigated if endpoints don't authorize actions desired by an attacker + just based on trusting the source IP address of a packet. + Conversely, a NoSec environment that completely relies on a firewall + for CoAP security not only needs to firewall off the CoAP endpoints + but also all other endpoints that might be incited to send UDP + messages to CoAP endpoints using some other UDP-based protocol. + + + + + +Shelby, et al. Standards Track [Page 85] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + In addition to the considerations above, the security considerations + for DTLS with respect to cross-protocol attacks apply. For example, + if the same DTLS security association ("connection") is used to carry + data of multiple protocols, DTLS no longer provides protection + against cross-protocol attacks between these protocols. + +11.6. Constrained-Node Considerations + + Implementers on constrained nodes often find themselves without a + good source of entropy [RFC4086]. If that is the case, the node MUST + NOT be used for processes that require good entropy, such as key + generation. Instead, keys should be generated externally and added + to the device during manufacturing or commissioning. + + Due to their low processing power, constrained nodes are particularly + susceptible to timing attacks. Special care must be taken in + implementation of cryptographic primitives. + + Large numbers of constrained nodes will be installed in exposed + environments and will have little resistance to tampering, including + recovery of keying materials. This needs to be considered when + defining the scope of credentials assigned to them. In particular, + assigning a shared key to a group of nodes may make any single + constrained node a target for subverting the entire group. + +12. IANA Considerations + +12.1. CoAP Code Registries + + This document defines two sub-registries for the values of the Code + field in the CoAP header within the "Constrained RESTful Environments + (CoRE) Parameters" registry, hereafter referred to as the "CoRE + Parameters" registry. + + Values in the two sub-registries are eight-bit values notated as + three decimal digits c.dd separated by a period between the first and + the second digit; the first digit c is between 0 and 7 and denotes + the code class; the second and third digits dd denote a decimal + number between 00 and 31 for the detail. + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 86] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + All Code values are assigned by sub-registries according to the + following ranges: + + 0.00 Indicates an Empty message (see Section 4.1). + + 0.01-0.31 Indicates a request. Values in this range are assigned by + the "CoAP Method Codes" sub-registry (see Section 12.1.1). + + 1.00-1.31 Reserved + + 2.00-5.31 Indicates a response. Values in this range are assigned by + the "CoAP Response Codes" sub-registry (see + Section 12.1.2). + + 6.00-7.31 Reserved + +12.1.1. Method Codes + + The name of the sub-registry is "CoAP Method Codes". + + Each entry in the sub-registry must include the Method Code in the + range 0.01-0.31, the name of the method, and a reference to the + method's documentation. + + Initial entries in this sub-registry are as follows: + + +------+--------+-----------+ + | Code | Name | Reference | + +------+--------+-----------+ + | 0.01 | GET | [RFC7252] | + | 0.02 | POST | [RFC7252] | + | 0.03 | PUT | [RFC7252] | + | 0.04 | DELETE | [RFC7252] | + +------+--------+-----------+ + + Table 5: CoAP Method Codes + + All other Method Codes are Unassigned. + + The IANA policy for future additions to this sub-registry is "IETF + Review or IESG Approval" as described in [RFC5226]. + + The documentation of a Method Code should specify the semantics of a + request with that code, including the following properties: + + o The Response Codes the method returns in the success case. + + o Whether the method is idempotent, safe, or both. + + + +Shelby, et al. Standards Track [Page 87] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +12.1.2. Response Codes + + The name of the sub-registry is "CoAP Response Codes". + + Each entry in the sub-registry must include the Response Code in the + range 2.00-5.31, a description of the Response Code, and a reference + to the Response Code's documentation. + + Initial entries in this sub-registry are as follows: + + +------+------------------------------+-----------+ + | Code | Description | Reference | + +------+------------------------------+-----------+ + | 2.01 | Created | [RFC7252] | + | 2.02 | Deleted | [RFC7252] | + | 2.03 | Valid | [RFC7252] | + | 2.04 | Changed | [RFC7252] | + | 2.05 | Content | [RFC7252] | + | 4.00 | Bad Request | [RFC7252] | + | 4.01 | Unauthorized | [RFC7252] | + | 4.02 | Bad Option | [RFC7252] | + | 4.03 | Forbidden | [RFC7252] | + | 4.04 | Not Found | [RFC7252] | + | 4.05 | Method Not Allowed | [RFC7252] | + | 4.06 | Not Acceptable | [RFC7252] | + | 4.12 | Precondition Failed | [RFC7252] | + | 4.13 | Request Entity Too Large | [RFC7252] | + | 4.15 | Unsupported Content-Format | [RFC7252] | + | 5.00 | Internal Server Error | [RFC7252] | + | 5.01 | Not Implemented | [RFC7252] | + | 5.02 | Bad Gateway | [RFC7252] | + | 5.03 | Service Unavailable | [RFC7252] | + | 5.04 | Gateway Timeout | [RFC7252] | + | 5.05 | Proxying Not Supported | [RFC7252] | + +------+------------------------------+-----------+ + + Table 6: CoAP Response Codes + + The Response Codes 3.00-3.31 are Reserved for future use. All other + Response Codes are Unassigned. + + The IANA policy for future additions to this sub-registry is "IETF + Review or IESG Approval" as described in [RFC5226]. + + + + + + + + +Shelby, et al. Standards Track [Page 88] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + The documentation of a Response Code should specify the semantics of + a response with that code, including the following properties: + + o The methods the Response Code applies to. + + o Whether payload is required, optional, or not allowed. + + o The semantics of the payload. For example, the payload of a 2.05 + (Content) response is a representation of the target resource; the + payload in an error response is a human-readable diagnostic + payload. + + o The format of the payload. For example, the format in a 2.05 + (Content) response is indicated by the Content-Format Option; the + format of the payload in an error response is always Net-Unicode + text. + + o Whether the response is cacheable according to the freshness + model. + + o Whether the response is validatable according to the validation + model. + + o Whether the response causes a cache to mark responses stored for + the request URI as not fresh. + +12.2. CoAP Option Numbers Registry + + This document defines a sub-registry for the Option Numbers used in + CoAP options within the "CoRE Parameters" registry. The name of the + sub-registry is "CoAP Option Numbers". + + Each entry in the sub-registry must include the Option Number, the + name of the option, and a reference to the option's documentation. + + + + + + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 89] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Initial entries in this sub-registry are as follows: + + +--------+------------------+-----------+ + | Number | Name | Reference | + +--------+------------------+-----------+ + | 0 | (Reserved) | [RFC7252] | + | 1 | If-Match | [RFC7252] | + | 3 | Uri-Host | [RFC7252] | + | 4 | ETag | [RFC7252] | + | 5 | If-None-Match | [RFC7252] | + | 7 | Uri-Port | [RFC7252] | + | 8 | Location-Path | [RFC7252] | + | 11 | Uri-Path | [RFC7252] | + | 12 | Content-Format | [RFC7252] | + | 14 | Max-Age | [RFC7252] | + | 15 | Uri-Query | [RFC7252] | + | 17 | Accept | [RFC7252] | + | 20 | Location-Query | [RFC7252] | + | 35 | Proxy-Uri | [RFC7252] | + | 39 | Proxy-Scheme | [RFC7252] | + | 60 | Size1 | [RFC7252] | + | 128 | (Reserved) | [RFC7252] | + | 132 | (Reserved) | [RFC7252] | + | 136 | (Reserved) | [RFC7252] | + | 140 | (Reserved) | [RFC7252] | + +--------+------------------+-----------+ + + Table 7: CoAP Option Numbers + + The IANA policy for future additions to this sub-registry is split + into three tiers as follows. The range of 0..255 is reserved for + options defined by the IETF (IETF Review or IESG Approval). The + range of 256..2047 is reserved for commonly used options with public + specifications (Specification Required). The range of 2048..64999 is + for all other options including private or vendor-specific ones, + which undergo a Designated Expert review to help ensure that the + option semantics are defined correctly. The option numbers between + 65000 and 65535 inclusive are reserved for experiments. They are not + meant for vendor-specific use of any kind and MUST NOT be used in + operational deployments. + + + + + + + + + + + +Shelby, et al. Standards Track [Page 90] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + +-------------+---------------------------------------+ + | Range | Registration Procedures | + +-------------+---------------------------------------+ + | 0-255 | IETF Review or IESG Approval | + | 256-2047 | Specification Required | + | 2048-64999 | Expert Review | + | 65000-65535 | Experimental use (no operational use) | + +-------------+---------------------------------------+ + + Table 8: CoAP Option Numbers: Registration Procedures + + The documentation of an Option Number should specify the semantics of + an option with that number, including the following properties: + + o The meaning of the option in a request. + + o The meaning of the option in a response. + + o Whether the option is critical or elective, as determined by the + Option Number. + + o Whether the option is Safe-to-Forward, and, if yes, whether it is + part of the Cache-Key, as determined by the Option Number (see + Section 5.4.2). + + o The format and length of the option's value. + + o Whether the option must occur at most once or whether it can occur + multiple times. + + o The default value, if any. For a critical option with a default + value, a discussion on how the default value enables processing by + implementations that do not support the critical option + (Section 5.4.4). + +12.3. CoAP Content-Formats Registry + + Internet media types are identified by a string, such as + "application/xml" [RFC2046]. In order to minimize the overhead of + using these media types to indicate the format of payloads, this + document defines a sub-registry for a subset of Internet media types + to be used in CoAP and assigns each, in combination with a content- + coding, a numeric identifier. The name of the sub-registry is "CoAP + Content-Formats", within the "CoRE Parameters" registry. + + + + + + + +Shelby, et al. Standards Track [Page 91] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Each entry in the sub-registry must include the media type registered + with IANA, the numeric identifier in the range 0-65535 to be used for + that media type in CoAP, the content-coding associated with this + identifier, and a reference to a document describing what a payload + with that media type means semantically. + + CoAP does not include a separate way to convey content-encoding + information with a request or response, and for that reason the + content-encoding is also specified for each identifier (if any). If + multiple content-encodings will be used with a media type, then a + separate Content-Format identifier for each is to be registered. + Similarly, other parameters related to an Internet media type, such + as level, can be defined for a CoAP Content-Format entry. + + Initial entries in this sub-registry are as follows: + + +--------------------------+----------+----+------------------------+ + | Media type | Encoding | ID | Reference | + +--------------------------+----------+----+------------------------+ + | text/plain; | - | 0 | [RFC2046] [RFC3676] | + | charset=utf-8 | | | [RFC5147] | + | application/link-format | - | 40 | [RFC6690] | + | application/xml | - | 41 | [RFC3023] | + | application/octet-stream | - | 42 | [RFC2045] [RFC2046] | + | application/exi | - | 47 | [REC-exi-20140211] | + | application/json | - | 50 | [RFC7159] | + +--------------------------+----------+----+------------------------+ + + Table 9: CoAP Content-Formats + + The identifiers between 65000 and 65535 inclusive are reserved for + experiments. They are not meant for vendor-specific use of any kind + and MUST NOT be used in operational deployments. The identifiers + between 256 and 9999 are reserved for future use in IETF + specifications (IETF Review or IESG Approval). All other identifiers + are Unassigned. + + Because the namespace of single-byte identifiers is so small, the + IANA policy for future additions in the range 0-255 inclusive to the + sub-registry is "Expert Review" as described in [RFC5226]. The IANA + policy for additions in the range 10000-64999 inclusive is "First + Come First Served" as described in [RFC5226]. This is summarized in + the following table. + + + + + + + + +Shelby, et al. Standards Track [Page 92] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + +-------------+---------------------------------------+ + | Range | Registration Procedures | + +-------------+---------------------------------------+ + | 0-255 | Expert Review | + | 256-9999 | IETF Review or IESG Approval | + | 10000-64999 | First Come First Served | + | 65000-65535 | Experimental use (no operational use) | + +-------------+---------------------------------------+ + + Table 10: CoAP Content-Formats: Registration Procedures + + In machine-to-machine applications, it is not expected that generic + Internet media types such as text/plain, application/xml or + application/octet-stream are useful for real applications in the long + term. It is recommended that M2M applications making use of CoAP + request new Internet media types from IANA indicating semantic + information about how to create or parse a payload. For example, a + Smart Energy application payload carried as XML might request a more + specific type like application/se+xml or application/se-exi. + +12.4. URI Scheme Registration + + This document contains the request for the registration of the + Uniform Resource Identifier (URI) scheme "coap". The registration + request complies with [RFC4395]. + + URI scheme name. + coap + + Status. + Permanent. + + URI scheme syntax. + Defined in Section 6.1 of [RFC7252]. + + URI scheme semantics. + The "coap" URI scheme provides a way to identify resources that + are potentially accessible over the Constrained Application + Protocol (CoAP). The resources can be located by contacting the + governing CoAP server and operated on by sending CoAP requests to + the server. This scheme can thus be compared to the "http" URI + scheme [RFC2616]. See Section 6 of [RFC7252] for the details of + operation. + + Encoding considerations. + The scheme encoding conforms to the encoding rules established for + URIs in [RFC3986], i.e., internationalized and reserved characters + are expressed using UTF-8-based percent-encoding. + + + +Shelby, et al. Standards Track [Page 93] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Applications/protocols that use this URI scheme name. + The scheme is used by CoAP endpoints to access CoAP resources. + + Interoperability considerations. + None. + + Security considerations. + See Section 11.1 of [RFC7252]. + + Contact. + IETF Chair <chair@ietf.org> + + Author/Change controller. + IESG <iesg@ietf.org> + + References. + [RFC7252] + +12.5. Secure URI Scheme Registration + + This document contains the request for the registration of the + Uniform Resource Identifier (URI) scheme "coaps". The registration + request complies with [RFC4395]. + + URI scheme name. + coaps + + Status. + Permanent. + + URI scheme syntax. + Defined in Section 6.2 of [RFC7252]. + + URI scheme semantics. + The "coaps" URI scheme provides a way to identify resources that + are potentially accessible over the Constrained Application + Protocol (CoAP) using Datagram Transport Layer Security (DTLS) for + transport security. The resources can be located by contacting + the governing CoAP server and operated on by sending CoAP requests + to the server. This scheme can thus be compared to the "https" + URI scheme [RFC2616]. See Section 6 of [RFC7252] for the details + of operation. + + Encoding considerations. + The scheme encoding conforms to the encoding rules established for + URIs in [RFC3986], i.e., internationalized and reserved characters + are expressed using UTF-8-based percent-encoding. + + + + +Shelby, et al. Standards Track [Page 94] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Applications/protocols that use this URI scheme name. + The scheme is used by CoAP endpoints to access CoAP resources + using DTLS. + + Interoperability considerations. + None. + + Security considerations. + See Section 11.1 of [RFC7252]. + + Contact. + IETF Chair <chair@ietf.org> + + Author/Change controller. + IESG <iesg@ietf.org> + + References. + [RFC7252] + +12.6. Service Name and Port Number Registration + + One of the functions of CoAP is resource discovery: a CoAP client can + ask a CoAP server about the resources offered by it (see Section 7). + To enable resource discovery just based on the knowledge of an IP + address, the CoAP port for resource discovery needs to be + standardized. + + IANA has assigned the port number 5683 and the service name "coap", + in accordance with [RFC6335]. + + Besides unicast, CoAP can be used with both multicast and anycast. + + Service Name. + coap + + Transport Protocol. + udp + + Assignee. + IESG <iesg@ietf.org> + + Contact. + IETF Chair <chair@ietf.org> + + Description. + Constrained Application Protocol (CoAP) + + + + + +Shelby, et al. Standards Track [Page 95] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Reference. + [RFC7252] + + Port Number. + 5683 + +12.7. Secure Service Name and Port Number Registration + + CoAP resource discovery may also be provided using the DTLS-secured + CoAP "coaps" scheme. Thus, the CoAP port for secure resource + discovery needs to be standardized. + + IANA has assigned the port number 5684 and the service name "coaps", + in accordance with [RFC6335]. + + Besides unicast, DTLS-secured CoAP can be used with anycast. + + Service Name. + coaps + + Transport Protocol. + udp + + Assignee. + IESG <iesg@ietf.org> + + Contact. + IETF Chair <chair@ietf.org> + + Description. + DTLS-secured CoAP + + Reference. + [RFC7252] + + Port Number. + 5684 + + + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 96] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +12.8. Multicast Address Registration + + Section 8, "Multicast CoAP", defines the use of multicast. IANA has + assigned the following multicast addresses for use by CoAP nodes: + + IPv4 -- "All CoAP Nodes" address 224.0.1.187, from the "IPv4 + Multicast Address Space Registry". As the address is used for + discovery that may span beyond a single network, it has come from + the Internetwork Control Block (224.0.1.x, RFC 5771). + + IPv6 -- "All CoAP Nodes" address FF0X::FD, from the "IPv6 Multicast + Address Space Registry", in the "Variable Scope Multicast + Addresses" space (RFC 3307). 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. + +13. Acknowledgements + + Brian Frank was a contributor to and coauthor of early versions of + this specification. + + Special thanks to Peter Bigot, Esko Dijk, and Cullen Jennings for + substantial contributions to the ideas and text in the document, + along with countless detailed reviews and discussions. + + Thanks to Floris Van den Abeele, Anthony Baire, Ed Beroset, Berta + Carballido, Angelo P. Castellani, Gilbert Clark, Robert Cragie, + Pierre David, Esko Dijk, Lisa Dusseault, Mehmet Ersue, Thomas + Fossati, Tobias Gondrom, Bert Greevenbosch, Tom Herbst, Jeroen + Hoebeke, Richard Kelsey, Sye Loong Keoh, Ari Keranen, Matthias + Kovatsch, Avi Lior, Stephan Lohse, Salvatore Loreto, Kerry Lynn, + Andrew McGregor, Alexey Melnikov, Guido Moritz, Petri Mutka, Colin + O'Flynn, Charles Palmer, Adriano Pezzuto, Thomas Poetsch, Robert + Quattlebaum, Akbar Rahman, Eric Rescorla, Dan Romascanu, David Ryan, + Peter Saint-Andre, Szymon Sasin, Michael Scharf, Dale Seed, Robby + Simpson, Peter van der Stok, Michael Stuber, Linyi Tian, Gilman + Tolle, Matthieu Vial, Maciej Wasilak, Fan Xianyou, and Alper Yegin + for helpful comments and discussions that have shaped the document. + Special thanks also to the responsible IETF area director at the time + of completion, Barry Leiba, and the IESG reviewers, Adrian Farrel, + Martin Stiemerling, Pete Resnick, Richard Barnes, Sean Turner, + Spencer Dawkins, Stephen Farrell, and Ted Lemon, who contributed in- + depth reviews. + + Some of the text has been borrowed from the working documents of the + IETF HTTPBIS working group. + + + + + +Shelby, et al. Standards Track [Page 97] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +14. References + +14.1. Normative References + + [RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, + August 1980. + + [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, November 1996. + + [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part Two: Media Types", RFC 2046, + November 1996. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., + Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext + Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. + + [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media + Types", RFC 3023, January 2001. + + [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", STD 63, RFC 3629, November 2003. + + [RFC3676] Gellens, R., "The Text/Plain Format and DelSp Parameters", + RFC 3676, February 2004. + + [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform + Resource Identifier (URI): Generic Syntax", STD 66, RFC + 3986, January 2005. + + [RFC4279] Eronen, P. and H. Tschofenig, "Pre-Shared Key Ciphersuites + for Transport Layer Security (TLS)", RFC 4279, December + 2005. + + [RFC4395] Hansen, T., Hardie, T., and L. Masinter, "Guidelines and + Registration Procedures for New URI Schemes", BCP 35, RFC + 4395, February 2006. + + [RFC5147] Wilde, E. and M. Duerst, "URI Fragment Identifiers for the + text/plain Media Type", RFC 5147, April 2008. + + [RFC5198] Klensin, J. and M. Padlipsky, "Unicode Format for Network + Interchange", RFC 5198, March 2008. + + + +Shelby, et al. Standards Track [Page 98] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an + IANA Considerations Section in RFCs", BCP 26, RFC 5226, + May 2008. + + [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, January 2008. + + [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security + (TLS) Protocol Version 1.2", RFC 5246, August 2008. + + [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., + Housley, R., and W. Polk, "Internet X.509 Public Key + Infrastructure Certificate and Certificate Revocation List + (CRL) Profile", RFC 5280, May 2008. + + [RFC5480] Turner, S., Brown, D., Yiu, K., Housley, R., and T. Polk, + "Elliptic Curve Cryptography Subject Public Key + Information", RFC 5480, March 2009. + + [RFC5785] Nottingham, M. and E. Hammer-Lahav, "Defining Well-Known + Uniform Resource Identifiers (URIs)", RFC 5785, April + 2010. + + [RFC5952] Kawamura, S. and M. Kawashima, "A Recommendation for IPv6 + Address Text Representation", RFC 5952, August 2010. + + [RFC5988] Nottingham, M., "Web Linking", RFC 5988, October 2010. + + [RFC6066] Eastlake, D., "Transport Layer Security (TLS) Extensions: + Extension Definitions", RFC 6066, January 2011. + + [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer + Security Version 1.2", RFC 6347, January 2012. + + [RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link + Format", RFC 6690, August 2012. + + [RFC6920] Farrell, S., Kutscher, D., Dannewitz, C., Ohlman, B., + Keranen, A., and P. Hallam-Baker, "Naming Things with + Hashes", RFC 6920, April 2013. + + [RFC7250] Wouters, P., Tschofenig, H., Gilmore, J., Weiler, S., and + T. Kivinen, "Using Raw Public Keys in Transport Layer + Security (TLS) and Datagram Transport Layer Security + (DTLS)", RFC 7250, June 2014. + + + + + + +Shelby, et al. Standards Track [Page 99] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + [RFC7251] McGrew, D., Bailey, D., Campagna, M., and R. Dugal, "AES- + CCM Elliptic Curve Cryptography (ECC) Cipher Suites for + Transport Layer Security (TLS)", RFC 7251, June 2014. + +14.2. Informative References + + [BLOCK] Bormann, C. and Z. Shelby, "Blockwise transfers in CoAP", + Work in Progress, October 2013. + + [CoAP-MISC] + Bormann, C. and K. Hartke, "Miscellaneous additions to + CoAP", Work in Progress, December 2013. + + [EUI64] IEEE Standards Association, "Guidelines for 64-bit Global + Identifier (EUI-64 (TM))", Registration Authority + Tutorials, April 2010, <http://standards.ieee.org/regauth/ + oui/tutorials/EUI64.html>. + + [GROUPCOMM] + Rahman, A. and E. Dijk, "Group Communication for CoAP", + Work in Progress, December 2013. + + [HHGTTG] Adams, D., "The Hitchhiker's Guide to the Galaxy", Pan + Books ISBN 3320258648, 1979. + + [IEEE1003.1] + IEEE and The Open Group, "Portable Operating System + Interface (POSIX)", The Open Group Base Specifications + Issue 7, IEEE 1003.1, 2013 Edition, + <http://pubs.opengroup.org/onlinepubs/9699919799/>. + + [IPsec-CoAP] + Bormann, C., "Using CoAP with IPsec", Work in Progress, + December 2012. + + [MAPPING] Castellani, A., Loreto, S., Rahman, A., Fossati, T., and + E. Dijk, "Guidelines for HTTP-CoAP Mapping + Implementations", Work in Progress, February 2014. + + [OBSERVE] Hartke, K., "Observing Resources in CoAP", Work in + Progress, April 2014. + + [REC-exi-20140211] + Schneider, J., Kamiya, T., Peintner, D., and R. Kyusakov, + "Efficient XML Interchange (EXI) Format 1.0 (Second + Edition)", W3C Recommendation REC-exi-20140211, February + 2014, <http://www.w3.org/TR/2014/REC-exi-20140211/>. + + + + +Shelby, et al. Standards Track [Page 100] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + [REST] Fielding, R., "Architectural Styles and the Design of + Network-based Software Architectures", Ph.D. Dissertation, + University of California, Irvine, 2000, + <http://www.ics.uci.edu/~fielding/pubs/dissertation/ + fielding_dissertation.pdf>. + + [RFC0020] Cerf, V., "ASCII format for network interchange", RFC 20, + October 1969. + + [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, September + 1981. + + [RFC0792] Postel, J., "Internet Control Message Protocol", STD 5, + RFC 792, September 1981. + + [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, RFC + 793, September 1981. + + [RFC1035] Mockapetris, P., "Domain names - implementation and + specification", STD 13, RFC 1035, November 1987. + + [RFC3264] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model + with Session Description Protocol (SDP)", RFC 3264, June + 2002. + + [RFC3280] Housley, R., Polk, W., Ford, W., and D. Solo, "Internet + X.509 Public Key Infrastructure Certificate and + Certificate Revocation List (CRL) Profile", RFC 3280, + April 2002. + + [RFC3542] Stevens, W., Thomas, M., Nordmark, E., and T. Jinmei, + "Advanced Sockets Application Program Interface (API) for + IPv6", RFC 3542, May 2003. + + [RFC3828] Larzon, L-A., Degermark, M., Pink, S., Jonsson, L-E., and + G. Fairhurst, "The Lightweight User Datagram Protocol + (UDP-Lite)", RFC 3828, July 2004. + + [RFC4086] Eastlake, D., Schiller, J., and S. Crocker, "Randomness + Requirements for Security", BCP 106, RFC 4086, June 2005. + + [RFC4443] Conta, A., Deering, S., and M. Gupta, "Internet Control + Message Protocol (ICMPv6) for the Internet Protocol + Version 6 (IPv6) Specification", RFC 4443, March 2006. + + [RFC4492] Blake-Wilson, S., Bolyard, N., Gupta, V., Hawk, C., and B. + Moeller, "Elliptic Curve Cryptography (ECC) Cipher Suites + for Transport Layer Security (TLS)", RFC 4492, May 2006. + + + +Shelby, et al. Standards Track [Page 101] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + [RFC4821] Mathis, M. and J. Heffner, "Packetization Layer Path MTU + Discovery", RFC 4821, March 2007. + + [RFC4944] Montenegro, G., Kushalnagar, N., Hui, J., and D. Culler, + "Transmission of IPv6 Packets over IEEE 802.15.4 + Networks", RFC 4944, September 2007. + + [RFC5405] Eggert, L. and G. Fairhurst, "Unicast UDP Usage Guidelines + for Application Designers", BCP 145, RFC 5405, November + 2008. + + [RFC5489] Badra, M. and I. Hajjeh, "ECDHE_PSK Cipher Suites for + Transport Layer Security (TLS)", RFC 5489, March 2009. + + [RFC6090] McGrew, D., Igoe, K., and M. Salter, "Fundamental Elliptic + Curve Cryptography Algorithms", RFC 6090, February 2011. + + [RFC6120] Saint-Andre, P., "Extensible Messaging and Presence + Protocol (XMPP): Core", RFC 6120, March 2011. + + [RFC6282] Hui, J. and P. Thubert, "Compression Format for IPv6 + Datagrams over IEEE 802.15.4-Based Networks", RFC 6282, + September 2011. + + [RFC6335] Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. + Cheshire, "Internet Assigned Numbers Authority (IANA) + Procedures for the Management of the Service Name and + Transport Protocol Port Number Registry", BCP 165, RFC + 6335, August 2011. + + [RFC6655] McGrew, D. and D. Bailey, "AES-CCM Cipher Suites for + Transport Layer Security (TLS)", RFC 6655, July 2012. + + [RFC6936] Fairhurst, G. and M. Westerlund, "Applicability Statement + for the Use of IPv6 UDP Datagrams with Zero Checksums", + RFC 6936, April 2013. + + [RFC6960] Santesson, S., Myers, M., Ankney, R., Malpani, A., + Galperin, S., and C. Adams, "X.509 Internet Public Key + Infrastructure Online Certificate Status Protocol - OCSP", + RFC 6960, June 2013. + + [RFC6961] Pettersen, Y., "The Transport Layer Security (TLS) + Multiple Certificate Status Request Extension", RFC 6961, + June 2013. + + [RFC7159] Bray, T., "The JavaScript Object Notation (JSON) Data + Interchange Format", RFC 7159, March 2014. + + + +Shelby, et al. Standards Track [Page 102] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + [RFC7228] Bormann, C., Ersue, M., and A. Keranen, "Terminology for + Constrained-Node Networks", RFC 7228, May 2014. + + [RTO-CONSIDER] + Allman, M., "Retransmission Timeout Considerations", Work + in Progress, May 2012. + + [W3CXMLSEC] + Wenning, R., "Report of the XML Security PAG", W3C XML + Security PAG, October 2012, + <http://www.w3.org/2011/xmlsec-pag/pagreport.html>. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 103] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + +Appendix A. Examples + + This section gives a number of short examples with message flows for + GET requests. These examples demonstrate the basic operation, the + operation in the presence of retransmissions, and multicast. + + Figure 16 shows a basic GET request causing a piggybacked response: + The client sends a Confirmable GET request for the resource + coap://server/temperature to the server with a Message ID of 0x7d34. + The request includes one Uri-Path Option (Delta 0 + 11 = 11, Length + 11, Value "temperature"); the Token is left empty. This request is a + total of 16 bytes long. A 2.05 (Content) response is returned in the + Acknowledgement message that acknowledges the Confirmable request, + echoing both the Message ID 0x7d34 and the empty Token value. The + response includes a Payload of "22.3 C" and is 11 bytes long. + + Client Server + | | + | | + +----->| Header: GET (T=CON, Code=0.01, MID=0x7d34) + | GET | Uri-Path: "temperature" + | | + | | + |<-----+ Header: 2.05 Content (T=ACK, Code=2.05, MID=0x7d34) + | 2.05 | Payload: "22.3 C" + | | + + + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 1 | 0 | 0 | GET=1 | MID=0x7d34 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 11 | 11 | "temperature" (11 B) ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 1 | 2 | 0 | 2.05=69 | MID=0x7d34 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |1 1 1 1 1 1 1 1| "22.3 C" (6 B) ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 16: Confirmable Request; Piggybacked Response + + + + + + +Shelby, et al. Standards Track [Page 104] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Figure 17 shows a similar example, but with the inclusion of an non- + empty Token (Value 0x20) in the request and the response, increasing + the sizes to 17 and 12 bytes, respectively. + + Client Server + | | + | | + +----->| Header: GET (T=CON, Code=0.01, MID=0x7d35) + | GET | Token: 0x20 + | | Uri-Path: "temperature" + | | + | | + |<-----+ Header: 2.05 Content (T=ACK, Code=2.05, MID=0x7d35) + | 2.05 | Token: 0x20 + | | Payload: "22.3 C" + | | + + + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 1 | 0 | 1 | GET=1 | MID=0x7d35 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 0x20 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 11 | 11 | "temperature" (11 B) ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 1 | 2 | 1 | 2.05=69 | MID=0x7d35 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 0x20 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |1 1 1 1 1 1 1 1| "22.3 C" (6 B) ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 17: Confirmable Request; Piggybacked Response + + + + + + + + + + + +Shelby, et al. Standards Track [Page 105] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + In Figure 18, the Confirmable GET request is lost. After ACK_TIMEOUT + seconds, the client retransmits the request, resulting in a + piggybacked response as in the previous example. + + Client Server + | | + | | + +----X | Header: GET (T=CON, Code=0.01, MID=0x7d36) + | GET | Token: 0x31 + | | Uri-Path: "temperature" + TIMEOUT | + | | + +----->| Header: GET (T=CON, Code=0.01, MID=0x7d36) + | GET | Token: 0x31 + | | Uri-Path: "temperature" + | | + | | + |<-----+ Header: 2.05 Content (T=ACK, Code=2.05, MID=0x7d36) + | 2.05 | Token: 0x31 + | | Payload: "22.3 C" + | | + + Figure 18: Confirmable Request (Retransmitted); Piggybacked Response + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 106] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + In Figure 19, the first Acknowledgement message from the server to + the client is lost. After ACK_TIMEOUT seconds, the client + retransmits the request. + + Client Server + | | + | | + +----->| Header: GET (T=CON, Code=0.01, MID=0x7d37) + | GET | Token: 0x42 + | | Uri-Path: "temperature" + | | + | | + | X----+ Header: 2.05 Content (T=ACK, Code=2.05, MID=0x7d37) + | 2.05 | Token: 0x42 + | | Payload: "22.3 C" + TIMEOUT | + | | + +----->| Header: GET (T=CON, Code=0.01, MID=0x7d37) + | GET | Token: 0x42 + | | Uri-Path: "temperature" + | | + | | + |<-----+ Header: 2.05 Content (T=ACK, Code=2.05, MID=0x7d37) + | 2.05 | Token: 0x42 + | | Payload: "22.3 C" + | | + + Figure 19: Confirmable Request; Piggybacked Response (Retransmitted) + + + + + + + + + + + + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 107] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + In Figure 20, the server acknowledges the Confirmable request and + sends a 2.05 (Content) response separately in a Confirmable message. + Note that the Acknowledgement message and the Confirmable response do + not necessarily arrive in the same order as they were sent. The + client acknowledges the Confirmable response. + + Client Server + | | + | | + +----->| Header: GET (T=CON, Code=0.01, MID=0x7d38) + | GET | Token: 0x53 + | | Uri-Path: "temperature" + | | + | | + |<- - -+ Header: (T=ACK, Code=0.00, MID=0x7d38) + | | + | | + |<-----+ Header: 2.05 Content (T=CON, Code=2.05, MID=0xad7b) + | 2.05 | Token: 0x53 + | | Payload: "22.3 C" + | | + | | + +- - ->| Header: (T=ACK, Code=0.00, MID=0xad7b) + | | + + Figure 20: Confirmable Request; Separate Response + + + + + + + + + + + + + + + + + + + + + + + + + +Shelby, et al. Standards Track [Page 108] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Figure 21 shows an example where the client loses its state (e.g., + crashes and is rebooted) right after sending a Confirmable request, + so the separate response arriving some time later comes unexpected. + In this case, the client rejects the Confirmable response with a + Reset message. Note that the unexpected ACK is silently ignored. + + Client Server + | | + | | + +----->| Header: GET (T=CON, Code=0.01, MID=0x7d39) + | GET | Token: 0x64 + | | Uri-Path: "temperature" + CRASH | + | | + |<- - -+ Header: (T=ACK, Code=0.00, MID=0x7d39) + | | + | | + |<-----+ Header: 2.05 Content (T=CON, Code=2.05, MID=0xad7c) + | 2.05 | Token: 0x64 + | | Payload: "22.3 C" + | | + | | + +- - ->| Header: (T=RST, Code=0.00, MID=0xad7c) + | | + + Figure 21: Confirmable Request; Separate Response (Unexpected) + + Figure 22 shows a basic GET request where the request and the + response are Non-confirmable, so both may be lost without notice. + + Client Server + | | + | | + +----->| Header: GET (T=NON, Code=0.01, MID=0x7d40) + | GET | Token: 0x75 + | | Uri-Path: "temperature" + | | + | | + |<-----+ Header: 2.05 Content (T=NON, Code=2.05, MID=0xad7d) + | 2.05 | Token: 0x75 + | | Payload: "22.3 C" + | | + + Figure 22: Non-confirmable Request; Non-confirmable Response + + + + + + + +Shelby, et al. Standards Track [Page 109] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + In Figure 23, the client sends a Non-confirmable GET request to a + multicast address: all nodes in link-local scope. There are 3 + servers on the link: A, B and C. Servers A and B have a matching + resource, therefore they send back a Non-confirmable 2.05 (Content) + response. The response sent by B is lost. C does not have matching + response, therefore it sends a Non-confirmable 4.04 (Not Found) + response. + + Client ff02::1 A B C + | | | | | + | | | | | + +------>| | | | Header: GET (T=NON, Code=0.01, MID=0x7d41) + | GET | | | | Token: 0x86 + | | | | Uri-Path: "temperature" + | | | | + | | | | + |<------------+ | | Header: 2.05 (T=NON, Code=2.05, MID=0x60b1) + | 2.05 | | | Token: 0x86 + | | | | Payload: "22.3 C" + | | | | + | | | | + | X------------+ | Header: 2.05 (T=NON, Code=2.05, MID=0x01a0) + | 2.05 | | | Token: 0x86 + | | | | Payload: "20.9 C" + | | | | + | | | | + |<------------------+ Header: 4.04 (T=NON, Code=4.04, MID=0x952a) + | 4.04 | | | Token: 0x86 + | | | | + + Figure 23: Non-confirmable Request (Multicast); Non-confirmable + Response + +Appendix B. URI Examples + + The following examples demonstrate different sets of Uri options, and + the result after constructing an URI from them. In addition to the + options, Section 6.5 refers to the destination IP address and port, + but not all paths of the algorithm cause the destination IP address + and port to be included in the URI. + + o Input: + + Destination IP Address = [2001:db8::2:1] + Destination UDP Port = 5683 + + + + + + +Shelby, et al. Standards Track [Page 110] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + Output: + + coap://[2001:db8::2:1]/ + + o Input: + + Destination IP Address = [2001:db8::2:1] + Destination UDP Port = 5683 + Uri-Host = "example.net" + + Output: + + coap://example.net/ + + o Input: + + Destination IP Address = [2001:db8::2:1] + Destination UDP Port = 5683 + Uri-Host = "example.net" + Uri-Path = ".well-known" + Uri-Path = "core" + + Output: + + coap://example.net/.well-known/core + + o Input: + + Destination IP Address = [2001:db8::2:1] + Destination UDP Port = 5683 + Uri-Host = "xn--18j4d.example" + Uri-Path = the string composed of the Unicode characters U+3053 + U+3093 U+306b U+3061 U+306f, usually represented in UTF-8 as + E38193E38293E381ABE381A1E381AF hexadecimal + + Output: + + coap://xn--18j4d.example/ + %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF + + (The line break has been inserted for readability; it is not + part of the URI.) + + + + + + + + + +Shelby, et al. Standards Track [Page 111] + +RFC 7252 The Constrained Application Protocol (CoAP) June 2014 + + + o Input: + + Destination IP Address = 198.51.100.1 + Destination UDP Port = 61616 + Uri-Path = "" + Uri-Path = "/" + Uri-Path = "" + Uri-Path = "" + Uri-Query = "//" + Uri-Query = "?&" + + Output: + + coap://198.51.100.1:61616//%2F//?%2F%2F&?%26 + +Authors' Addresses + + Zach Shelby + ARM + 150 Rose Orchard + San Jose, CA 95134 + USA + + Phone: +1-408-203-9434 + EMail: zach.shelby@arm.com + + + Klaus Hartke + Universitaet Bremen TZI + Postfach 330440 + Bremen D-28359 + Germany + + Phone: +49-421-218-63905 + EMail: hartke@tzi.org + + + Carsten Bormann + Universitaet Bremen TZI + Postfach 330440 + Bremen D-28359 + Germany + + Phone: +49-421-218-63921 + EMail: cabo@tzi.org + + + + + + +Shelby, et al. Standards Track [Page 112] + |