| < draft-ietf-core-coap-tcp-tls-06.txt | draft-ietf-core-coap-tcp-tls-07.txt > | |||
|---|---|---|---|---|
| CORE C. Bormann | CORE C. Bormann | |||
| Internet-Draft Universitaet Bremen TZI | Internet-Draft Universitaet Bremen TZI | |||
| Updates: 7641 (if approved) S. Lemay | Updates: 7641 (if approved) S. Lemay | |||
| Intended status: Standards Track Zebra Technologies | Intended status: Standards Track Zebra Technologies | |||
| Expires: August 18, 2017 H. Tschofenig | Expires: September 7, 2017 H. Tschofenig | |||
| ARM Ltd. | ARM Ltd. | |||
| K. Hartke | K. Hartke | |||
| Universitaet Bremen TZI | Universitaet Bremen TZI | |||
| B. Silverajan | B. Silverajan | |||
| Tampere University of Technology | Tampere University of Technology | |||
| B. Raymor, Ed. | B. Raymor, Ed. | |||
| Microsoft | Microsoft | |||
| February 14, 2017 | March 06, 2017 | |||
| CoAP (Constrained Application Protocol) over TCP, TLS, and WebSockets | CoAP (Constrained Application Protocol) over TCP, TLS, and WebSockets | |||
| draft-ietf-core-coap-tcp-tls-06 | draft-ietf-core-coap-tcp-tls-07 | |||
| Abstract | Abstract | |||
| The Constrained Application Protocol (CoAP), although inspired by | The Constrained Application Protocol (CoAP), although inspired by | |||
| HTTP, was designed to use UDP instead of TCP. The message layer of | HTTP, was designed to use UDP instead of TCP. The message layer of | |||
| the CoAP over UDP protocol includes support for reliable delivery, | the CoAP over UDP protocol includes support for reliable delivery, | |||
| simple congestion control, and flow control. | simple congestion control, and flow control. | |||
| Some environments benefit from the availability of CoAP carried over | Some environments benefit from the availability of CoAP carried over | |||
| reliable transports such as TCP or TLS. This document outlines the | reliable transports such as TCP or TLS. This document outlines the | |||
| skipping to change at page 1, line 48 ¶ | skipping to change at page 1, line 48 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on August 18, 2017. | This Internet-Draft will expire on September 7, 2017. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2017 IETF Trust and the persons identified as the | Copyright (c) 2017 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 1.1. Conventions and Terminology . . . . . . . . . . . . . . . 5 | 2. Conventions and Terminology . . . . . . . . . . . . . . . . . 5 | |||
| 2. CoAP over TCP . . . . . . . . . . . . . . . . . . . . . . . . 6 | 3. CoAP over TCP . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 2.1. Messaging Model . . . . . . . . . . . . . . . . . . . . . 6 | 3.1. Messaging Model . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 2.2. Message Format . . . . . . . . . . . . . . . . . . . . . 7 | 3.2. Message Format . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.3. Message Transmission . . . . . . . . . . . . . . . . . . 10 | 3.3. Message Transmission . . . . . . . . . . . . . . . . . . 10 | |||
| 2.4. Connection Health . . . . . . . . . . . . . . . . . . . . 11 | 3.4. Connection Health . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3. CoAP over WebSockets . . . . . . . . . . . . . . . . . . . . 11 | 4. CoAP over WebSockets . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.1. Opening Handshake . . . . . . . . . . . . . . . . . . . . 13 | 4.1. Opening Handshake . . . . . . . . . . . . . . . . . . . . 13 | |||
| 3.2. Message Format . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. Message Format . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.3. Message Transmission . . . . . . . . . . . . . . . . . . 15 | 4.3. Message Transmission . . . . . . . . . . . . . . . . . . 15 | |||
| 3.4. Connection Health . . . . . . . . . . . . . . . . . . . . 15 | 4.4. Connection Health . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4. Signaling . . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 5. Signaling . . . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.1. Signaling Codes . . . . . . . . . . . . . . . . . . . . . 16 | 5.1. Signaling Codes . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2. Signaling Option Numbers . . . . . . . . . . . . . . . . 16 | 5.2. Signaling Option Numbers . . . . . . . . . . . . . . . . 16 | |||
| 4.3. Capabilities and Settings Messages (CSM) . . . . . . . . 16 | 5.3. Capabilities and Settings Messages (CSM) . . . . . . . . 16 | |||
| 4.4. Ping and Pong Messages . . . . . . . . . . . . . . . . . 18 | 5.4. Ping and Pong Messages . . . . . . . . . . . . . . . . . 18 | |||
| 4.5. Release Messages . . . . . . . . . . . . . . . . . . . . 19 | 5.5. Release Messages . . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.6. Abort Messages . . . . . . . . . . . . . . . . . . . . . 20 | 5.6. Abort Messages . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.7. Signaling examples . . . . . . . . . . . . . . . . . . . 21 | 5.7. Signaling examples . . . . . . . . . . . . . . . . . . . 21 | |||
| 5. Block-wise Transfer and Reliable Transports . . . . . . . . . 22 | 6. Block-wise Transfer and Reliable Transports . . . . . . . . . 22 | |||
| 5.1. Example: GET with BERT Blocks . . . . . . . . . . . . . . 23 | 6.1. Example: GET with BERT Blocks . . . . . . . . . . . . . . 23 | |||
| 5.2. Example: PUT with BERT Blocks . . . . . . . . . . . . . . 24 | 6.2. Example: PUT with BERT Blocks . . . . . . . . . . . . . . 24 | |||
| 6. CoAP over Reliable Transport URIs . . . . . . . . . . . . . . 24 | 7. CoAP over Reliable Transport URIs . . . . . . . . . . . . . . 24 | |||
| 6.1. coap+tcp URI scheme . . . . . . . . . . . . . . . . . . . 25 | 7.1. coap+tcp URI scheme . . . . . . . . . . . . . . . . . . . 25 | |||
| 6.2. coaps+tcp URI scheme . . . . . . . . . . . . . . . . . . 25 | 7.2. coaps+tcp URI scheme . . . . . . . . . . . . . . . . . . 25 | |||
| 6.3. coap+ws URI scheme . . . . . . . . . . . . . . . . . . . 26 | 7.3. coap+ws URI scheme . . . . . . . . . . . . . . . . . . . 26 | |||
| 6.4. coaps+ws URI scheme . . . . . . . . . . . . . . . . . . . 27 | 7.4. coaps+ws URI scheme . . . . . . . . . . . . . . . . . . . 27 | |||
| 6.5. Uri-Host and Uri-Port Options . . . . . . . . . . . . . . 28 | 7.5. Uri-Host and Uri-Port Options . . . . . . . . . . . . . . 28 | |||
| 6.6. Decomposing URIs into Options . . . . . . . . . . . . . . 28 | 7.6. Decomposing URIs into Options . . . . . . . . . . . . . . 28 | |||
| 6.7. Composing URIs from Options . . . . . . . . . . . . . . . 29 | 7.7. Composing URIs from Options . . . . . . . . . . . . . . . 29 | |||
| 7. Securing CoAP . . . . . . . . . . . . . . . . . . . . . . . . 29 | 8. Securing CoAP . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 7.1. TLS binding for CoAP over TCP . . . . . . . . . . . . . . 29 | 8.1. TLS binding for CoAP over TCP . . . . . . . . . . . . . . 30 | |||
| 7.2. TLS usage for CoAP over WebSockets . . . . . . . . . . . 30 | 8.2. TLS usage for CoAP over WebSockets . . . . . . . . . . . 30 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 30 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 31 | |||
| 8.1. Signaling Messages . . . . . . . . . . . . . . . . . . . 31 | 9.1. Signaling Messages . . . . . . . . . . . . . . . . . . . 31 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 31 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 9.1. Signaling Codes . . . . . . . . . . . . . . . . . . . . . 31 | 10.1. Signaling Codes . . . . . . . . . . . . . . . . . . . . 31 | |||
| 9.2. CoAP Signaling Option Numbers Registry . . . . . . . . . 31 | 10.2. CoAP Signaling Option Numbers Registry . . . . . . . . . 32 | |||
| 9.3. Service Name and Port Number Registration . . . . . . . . 32 | 10.3. Service Name and Port Number Registration . . . . . . . 33 | |||
| 9.4. Secure Service Name and Port Number Registration . . . . 33 | 10.4. Secure Service Name and Port Number Registration . . . . 34 | |||
| 9.5. URI Scheme Registration . . . . . . . . . . . . . . . . . 34 | 10.5. URI Scheme Registration . . . . . . . . . . . . . . . . 34 | |||
| 9.6. Well-Known URI Suffix Registration . . . . . . . . . . . 36 | 10.6. Well-Known URI Suffix Registration . . . . . . . . . . . 37 | |||
| 9.7. ALPN Protocol Identifier . . . . . . . . . . . . . . . . 36 | 10.7. ALPN Protocol Identifier . . . . . . . . . . . . . . . . 37 | |||
| 9.8. WebSocket Subprotocol Registration . . . . . . . . . . . 36 | 10.8. WebSocket Subprotocol Registration . . . . . . . . . . . 37 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 37 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 37 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 38 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 38 | 11.2. Informative References . . . . . . . . . . . . . . . . . 39 | |||
| Appendix A. Updates to RFC7641 Observing Resources in the | Appendix A. Updates to RFC 7641 Observing Resources in the | |||
| Constrained Application Protocol (CoAP) . . . . . . 40 | Constrained Application Protocol (CoAP) . . . . . . 40 | |||
| A.1. Notifications and Reordering . . . . . . . . . . . . . . 40 | A.1. Notifications and Reordering . . . . . . . . . . . . . . 40 | |||
| A.2. Transmission and Acknowledgements . . . . . . . . . . . . 40 | A.2. Transmission and Acknowledgements . . . . . . . . . . . . 41 | |||
| A.3. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 40 | A.3. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| A.4. Cancellation . . . . . . . . . . . . . . . . . . . . . . 41 | A.4. Cancellation . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| Appendix B. CoAP over WebSocket Examples . . . . . . . . . . . . 41 | Appendix B. CoAP over WebSocket Examples . . . . . . . . . . . . 42 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 44 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 45 | |||
| C.1. Since draft-core-coap-tcp-tls-02 . . . . . . . . . . . . 44 | C.1. Since draft-ietf-core-coap-tcp-tls-02 . . . . . . . . . . 45 | |||
| C.2. Since draft-core-coap-tcp-tls-03 . . . . . . . . . . . . 44 | C.2. Since draft-ietf-core-coap-tcp-tls-03 . . . . . . . . . . 45 | |||
| C.3. Since draft-core-coap-tcp-tls-04 . . . . . . . . . . . . 44 | C.3. Since draft-ietf-core-coap-tcp-tls-04 . . . . . . . . . . 45 | |||
| C.4. Since draft-core-coap-tcp-tls-05 . . . . . . . . . . . . 44 | C.4. Since draft-ietf-core-coap-tcp-tls-05 . . . . . . . . . . 45 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 45 | C.5. Since draft-ietf-core-coap-tcp-tls-06 . . . . . . . . . . 46 | |||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 45 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 45 | Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 46 | ||||
| 1. Introduction | 1. Introduction | |||
| The Constrained Application Protocol (CoAP) [RFC7252] was designed | The Constrained Application Protocol (CoAP) [RFC7252] was designed | |||
| for Internet of Things (IoT) deployments, assuming that UDP [RFC0768] | for Internet of Things (IoT) deployments, assuming that UDP [RFC0768] | |||
| or DTLS [RFC6347] over UDP can be used unimpeded. UDP is a good | or DTLS [RFC6347] over UDP can be used unimpeded. UDP is a good | |||
| choice for transferring small amounts of data across networks that | choice for transferring small amounts of data across networks that | |||
| follow the IP architecture. | follow the IP architecture. | |||
| Some CoAP deployments need to integrate well with existing enterprise | Some CoAP deployments need to integrate well with existing enterprise | |||
| skipping to change at page 5, line 11 ¶ | skipping to change at page 5, line 11 ¶ | |||
| then CoAP over TCP between the back-end services. A TCP-to-UDP | then CoAP over TCP between the back-end services. A TCP-to-UDP | |||
| gateway can be used at the cloud boundary to communicate with the | gateway can be used at the cloud boundary to communicate with the | |||
| UDP-based IoT device. | UDP-based IoT device. | |||
| To allow IoT devices to better communicate in these demanding | To allow IoT devices to better communicate in these demanding | |||
| environments, CoAP needs to support different transport protocols, | environments, CoAP needs to support different transport protocols, | |||
| namely TCP [RFC0793], in some situations secured by TLS [RFC5246]. | namely TCP [RFC0793], in some situations secured by TLS [RFC5246]. | |||
| In addition, some corporate networks only allow Internet access via a | In addition, some corporate networks only allow Internet access via a | |||
| HTTP proxy. In this case, the best transport for CoAP might be the | HTTP proxy. In this case, the best transport for CoAP might be the | |||
| WebSocket Protocol [RFC6455]. The WebSocket protocol provides two- | WebSocket protocol [RFC6455]. The WebSocket protocol provides two- | |||
| way communication between a WebSocket client and a WebSocket server | way communication between a WebSocket client and a WebSocket server | |||
| after upgrading an HTTP/1.1 [RFC7230] connection and may be available | after upgrading an HTTP/1.1 [RFC7230] connection and may be available | |||
| in an environment that blocks CoAP over UDP. Another scenario for | in an environment that blocks CoAP over UDP. Another scenario for | |||
| CoAP over WebSockets is a CoAP application running inside a web | CoAP over WebSockets is a CoAP application running inside a web | |||
| browser without access to connectivity other than HTTP and | browser without access to connectivity other than HTTP and | |||
| WebSockets. | WebSockets. | |||
| This document specifies how to access resources using CoAP requests | This document specifies how to access resources using CoAP requests | |||
| and responses over the TCP/TLS and WebSocket protocols. This allows | and responses over the TCP, TLS and WebSocket protocols. This allows | |||
| connectivity-limited applications to obtain end-to-end CoAP | connectivity-limited applications to obtain end-to-end CoAP | |||
| connectivity either by communicating CoAP directly with a CoAP server | connectivity either by communicating CoAP directly with a CoAP server | |||
| accessible over a TCP/TLS or WebSocket connection or via a CoAP | accessible over a TCP, TLS or WebSocket connection or via a CoAP | |||
| intermediary that proxies CoAP requests and responses between | intermediary that proxies CoAP requests and responses between | |||
| different transports, such as between WebSockets and UDP. | different transports, such as between WebSockets and UDP. | |||
| Appendix A updates Observing Resources in the Constrained Application | Appendix A updates the "Observing Resources in the Constrained | |||
| Protocol [RFC7641] for use with CoAP over reliable transports. | Application Protocol" [RFC7641] specification for use with CoAP over | |||
| [RFC7641] is an extension to the CoAP core protocol that enables CoAP | reliable transports. [RFC7641] is an extension to the CoAP protocol | |||
| clients to "observe" a resource on a CoAP server. (The CoAP client | that enables CoAP clients to "observe" a resource on a CoAP server. | |||
| retrieves a representation of a resource and registers to be notified | (The CoAP client retrieves a representation of a resource and | |||
| by the CoAP server when the representation is updated.) | registers to be notified by the CoAP server when the representation | |||
| is updated.) | ||||
| 1.1. Conventions and Terminology | 2. Conventions and Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
| [RFC2119]. | [RFC2119]. | |||
| This document assumes that readers are familiar with the terms and | This document assumes that readers are familiar with the terms and | |||
| concepts that are used in [RFC6455], [RFC7252], [RFC7641], and | concepts that are used in [RFC6455], [RFC7252], [RFC7641], and | |||
| [RFC7959]. | [RFC7959]. | |||
| The term "reliable transport" is used only to refer to transport | The term "reliable transport" is used only to refer to transport | |||
| protocols such as TCP which provide reliable and ordered delivery of | protocols, such as TCP, which provide reliable and ordered delivery | |||
| a byte-stream. | of a byte-stream. | |||
| BERT Option: | BERT Option: | |||
| A Block1 or Block2 option that includes an SZX value of 7. | A Block1 or Block2 option that includes an SZX value of 7. | |||
| BERT Block: | BERT Block: | |||
| The payload of a CoAP message that is affected by a BERT Option in | The payload of a CoAP message that is affected by a BERT Option in | |||
| descriptive usage (Section 2.1 of [RFC7959]). | descriptive usage (see Section 2.1 of [RFC7959]). | |||
| Connection Initiator: | Connection Initiator: | |||
| The peer that opens a reliable byte stream connection, i.e., the | The peer that opens a reliable byte stream connection, i.e., the | |||
| TCP active opener, TLS client, or WebSocket client. | TCP active opener, TLS client, or WebSocket client. | |||
| Connection Acceptor: | Connection Acceptor: | |||
| The peer that accepts the reliable byte stream connection opened | The peer that accepts the reliable byte stream connection opened | |||
| by the other peer, i.e., the TCP passive opener, TLS server, or | by the other peer, i.e., the TCP passive opener, TLS server, or | |||
| WebSocket server. | WebSocket server. | |||
| For simplicity, a Payload Marker (0xFF) is shown in all examples for | For simplicity, a Payload Marker (0xFF) is shown in all examples for | |||
| message formats: | message formats: | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |1 1 1 1 1 1 1 1| Payload (if any) ... | |1 1 1 1 1 1 1 1| Payload (if any) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The Payload Marker indicates the start of the optional payload and is | The Payload Marker indicates the start of the optional payload and is | |||
| absent for zero-length payloads (see section 3 of [RFC7252]). | absent for zero-length payloads (see Section 3 of [RFC7252]). | |||
| 2. CoAP over TCP | 3. CoAP over TCP | |||
| The request/response interaction model of CoAP over TCP is the same | The request/response interaction model of CoAP over TCP is the same | |||
| as CoAP over UDP. The primary differences are in the message layer. | as CoAP over UDP. The primary differences are in the message layer. | |||
| The message layer of CoAP over UDP supports optional reliability by | The message layer of CoAP over UDP supports optional reliability by | |||
| defining four Types of messages: Confirmable, Non-confirmable, | defining four types of messages: Confirmable, Non-confirmable, | |||
| Acknowledgement, and Reset. In addition, messages include a Message | Acknowledgement, and Reset. In addition, messages include a Message | |||
| ID to relate Acknowledgments to Confirmable messages and to detect | ID to relate Acknowledgments to Confirmable messages and to detect | |||
| duplicate messages. | duplicate messages. | |||
| 2.1. Messaging Model | 3.1. Messaging Model | |||
| Conceptually, CoAP over TCP replaces most of the message layer of | Conceptually, CoAP over TCP replaces most of the message layer of | |||
| CoAP over UDP with a framing mechanism on top of the byte-stream | CoAP over UDP with a framing mechanism on top of the byte-stream | |||
| provided by TCP/TLS, conveying the length information for each | provided by TCP/TLS, conveying the length information for each | |||
| message that on datagram transports is provided by the UDP/DTLS | message that on datagram transports is provided by the UDP/DTLS | |||
| datagram layer. | datagram layer. | |||
| TCP ensures reliable message transmission, so the message layer of | TCP ensures reliable message transmission, so the message layer of | |||
| CoAP over TCP is not required to support acknowledgements or to | CoAP over TCP is not required to support acknowledgements or to | |||
| detect duplicate messages. As a result, both the Type and Message ID | detect duplicate messages. As a result, both the Type and Message ID | |||
| skipping to change at page 7, line 29 ¶ | skipping to change at page 7, line 29 ¶ | |||
| | "22.5 C" | | "22.5 C" | | | "22.5 C" | | "22.5 C" | | |||
| |<-------------------+ |<-------------------+ | |<-------------------+ |<-------------------+ | |||
| | | | | | | | | | | |||
| CoAP over UDP CoAP over reliable | CoAP over UDP CoAP over reliable | |||
| transport | transport | |||
| Figure 2: Comparison between CoAP over unreliable and reliable | Figure 2: Comparison between CoAP over unreliable and reliable | |||
| transport | transport | |||
| 2.2. Message Format | 3.2. Message Format | |||
| The CoAP message format defined in [RFC7252], as shown in Figure 3, | The CoAP message format defined in [RFC7252], as shown in Figure 3, | |||
| relies on the datagram transport (UDP, or DTLS over UDP) for keeping | relies on the datagram transport (UDP, or DTLS over UDP) for keeping | |||
| the individual messages separate and for providing length | the individual messages separate and for providing length | |||
| information. | information. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |Ver| T | TKL | Code | Message ID | | |Ver| T | TKL | Code | Message ID | | |||
| skipping to change at page 8, line 16 ¶ | skipping to change at page 8, line 16 ¶ | |||
| deduplication, there is no need for the reliability mechanisms | deduplication, there is no need for the reliability mechanisms | |||
| provided by CoAP over UDP. The Type (T) and Message ID fields in | provided by CoAP over UDP. The Type (T) and Message ID fields in | |||
| the CoAP message header are elided. | the CoAP message header are elided. | |||
| o The Version (Vers) field is elided as well. In contrast to the | o The Version (Vers) field is elided as well. In contrast to the | |||
| message format of CoAP over UDP, the message format for CoAP over | message format of CoAP over UDP, the message format for CoAP over | |||
| TCP does not include a version number. CoAP is defined in | TCP does not include a version number. CoAP is defined in | |||
| [RFC7252] with a version number of 1. At this time, there is no | [RFC7252] with a version number of 1. At this time, there is no | |||
| known reason to support version numbers different from 1. If | known reason to support version numbers different from 1. If | |||
| version negotiation needs to be addressed in the future, then | version negotiation needs to be addressed in the future, then | |||
| Capabilities and Settings Messages (CSM see Section 4.3) have been | Capabilities and Settings Messages (CSM see Section 5.3) have been | |||
| specifically designed to enable such a potential feature. | specifically designed to enable such a potential feature. | |||
| o In a stream oriented transport protocol such as TCP, a form of | o In a stream oriented transport protocol such as TCP, a form of | |||
| message delimitation is needed. For this purpose, CoAP over TCP | message delimitation is needed. For this purpose, CoAP over TCP | |||
| introduces a length field with variable size. Figure 4 shows the | introduces a length field with variable size. Figure 4 shows the | |||
| adjusted CoAP message format with a modified structure for the | adjusted CoAP message format with a modified structure for the | |||
| fixed header (first 4 bytes of the CoAP over UDP header), which | fixed header (first 4 bytes of the CoAP over UDP header), which | |||
| includes the length information of variable size, shown here as an | includes the length information of variable size, shown here as an | |||
| 8-bit length. | 8-bit length. | |||
| skipping to change at page 9, line 9 ¶ | skipping to change at page 9, line 9 ¶ | |||
| 13. | 13. | |||
| 14: A 16-bit unsigned integer (Extended Length) in network byte | 14: A 16-bit unsigned integer (Extended Length) in network byte | |||
| order follows the initial byte and indicates the length of | order follows the initial byte and indicates the length of | |||
| options/payload minus 269. | options/payload minus 269. | |||
| 15: A 32-bit unsigned integer (Extended Length) in network byte | 15: A 32-bit unsigned integer (Extended Length) in network byte | |||
| order follows the initial byte and indicates the length of | order follows the initial byte and indicates the length of | |||
| options/payload minus 65805. | options/payload minus 65805. | |||
| The encoding of the Length field is modeled on CoAP Options (see | The encoding of the Length field is modeled after the Option Length | |||
| section 3.1 of [RFC7252]). | field of the CoAP Options (see Section 3.1 of [RFC7252]). | |||
| The following figures show the message format for the 0-bit, 16-bit, | The following figures show the message format for the 0-bit, 16-bit, | |||
| and the 32-bit variable length cases. | and the 32-bit variable length cases. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Len | TKL | Code | Token (if any, TKL bytes) ... | | Len | TKL | Code | Token (if any, TKL bytes) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Options (if any) ... | | Options (if any) ... | |||
| skipping to change at page 10, line 24 ¶ | skipping to change at page 10, line 24 ¶ | |||
| |1 1 1 1 1 1 1 1| Payload (if any) ... | |1 1 1 1 1 1 1 1| Payload (if any) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 7: CoAP message format with 16-bit Extended Length field | Figure 7: CoAP message format with 16-bit Extended Length field | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |Len=15 | TKL | Extended Length (32 bits) | |Len=15 | TKL | Extended Length (32 bits) | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | Code | Token (if any, TKL bytes) ... | | Code | Token (if any, TKL bytes) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Options (if any) ... | | Options (if any) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |1 1 1 1 1 1 1 1| Payload (if any) ... | |1 1 1 1 1 1 1 1| Payload (if any) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: CoAP message format with 32-bit Extended Length field | Figure 8: CoAP message format with 32-bit Extended Length field | |||
| The semantics of the other CoAP header fields are left unchanged. | The semantics of the other CoAP header fields are left unchanged. | |||
| 2.3. Message Transmission | 3.3. Message Transmission | |||
| Once a connection is established, both endpoints MUST send a | Once a connection is established, both endpoints MUST send a | |||
| Capabilities and Settings message (CSM see Section 4.3) as their | Capabilities and Settings message (CSM see Section 5.3) as their | |||
| first message on the connection. This message establishes the | first message on the connection. This message establishes the | |||
| initial settings and capabilities for the endpoint such as maximum | initial settings and capabilities for the endpoint, such as maximum | |||
| message size or support for block-wise transfers. The absence of | message size or support for block-wise transfers. The absence of | |||
| options in the CSM indicates that base values are assumed. | options in the CSM indicates that base values are assumed. | |||
| To avoid a deadlock, the Connection Initiator MUST NOT wait for the | To avoid a deadlock, the Connection Initiator MUST NOT wait for the | |||
| Connection Acceptor to send its initial CSM message before sending | Connection Acceptor to send its initial CSM message before sending | |||
| its own initial CSM message. Conversely, the Connection Acceptor MAY | its own initial CSM message. Conversely, the Connection Acceptor MAY | |||
| wait for the Connection Initiator to send its initial CSM message | wait for the Connection Initiator to send its initial CSM message | |||
| before sending its own initial CSM message. | before sending its own initial CSM message. | |||
| To avoid unnecessary latency, a Connection Initiator MAY send | To avoid unnecessary latency, a Connection Initiator MAY send | |||
| additional messages without waiting to receive the Connection | additional messages without waiting to receive the Connection | |||
| Acceptor's CSM; however, it is important to note that the Connection | Acceptor's CSM; however, it is important to note that the Connection | |||
| Acceptor's CSM might advertise capabilities that impact how the | Acceptor's CSM might advertise capabilities that impact how the | |||
| initiator is expected to communicate with the acceptor. For example, | initiator is expected to communicate with the acceptor. For example, | |||
| the acceptor CSM could advertise a Max-Message-Size option (see | the acceptor CSM could advertise a Max-Message-Size option (see | |||
| Section 4.3.1) that is smaller than the base value (1152). | Section 5.3.1) that is smaller than the base value (1152). | |||
| Endpoints MUST treat a missing or invalid CSM as a connection error | Endpoints MUST treat a missing or invalid CSM as a connection error | |||
| and abort the connection (see Section 4.6). | and abort the connection (see Section 5.6). | |||
| CoAP requests and responses are exchanged asynchronously over the | CoAP requests and responses are exchanged asynchronously over the | |||
| TCP/TLS connection. A CoAP client can send multiple requests without | TCP/TLS connection. A CoAP client can send multiple requests without | |||
| waiting for a response and the CoAP server can return responses in | waiting for a response and the CoAP server can return responses in | |||
| any order. Responses MUST be returned over the same connection as | any order. Responses MUST be returned over the same connection as | |||
| the originating request. Concurrent requests are differentiated by | the originating request. Concurrent requests are differentiated by | |||
| their Token, which is scoped locally to the connection. | their Token, which is scoped locally to the connection. | |||
| The connection is bi-directional, so requests can be sent both by the | The connection is bi-directional, so requests can be sent both by the | |||
| entity that established the connection and the remote host. | entity that established the connection (Connection Initiator) and the | |||
| remote host (Connection Acceptor). If one side does not implement a | ||||
| CoAP server, an appropriate error response such as 4.04 (Not Found) | ||||
| or 5.01 (Not Implemented) MUST be returned for all CoAP requests from | ||||
| the other side. | ||||
| Retransmission and deduplication of messages is provided by the TCP/ | Retransmission and deduplication of messages is provided by the TCP | |||
| TLS protocol. | protocol. | |||
| 2.4. Connection Health | 3.4. Connection Health | |||
| Empty messages (Code 0.00) can always be sent and MUST be ignored by | Empty messages (Code 0.00) can always be sent and MUST be ignored by | |||
| the recipient. This provides a basic keep-alive function that can | the recipient. This provides a basic keep-alive function that can | |||
| refresh NAT bindings. | refresh NAT bindings. | |||
| If a CoAP client does not receive any response for some time after | If a CoAP client does not receive any response for some time after | |||
| sending a CoAP request (or, similarly, when a client observes a | sending a CoAP request (or, similarly, when a client observes a | |||
| resource and it does not receive any notification for some time), it | resource and it does not receive any notification for some time), it | |||
| can send a CoAP Ping Signaling message (Section 4.4) to test the | can send a CoAP Ping Signaling message (see Section 5.4) to test the | |||
| connection and verify that the CoAP server is responsive. | connection and verify that the CoAP server is responsive. | |||
| 3. CoAP over WebSockets | 4. CoAP over WebSockets | |||
| CoAP over WebSockets is intentionally similar to CoAP over TCP; | CoAP over WebSockets is intentionally similar to CoAP over TCP; | |||
| therefore, this section only specifies the differences between the | therefore, this section only specifies the differences between the | |||
| transports. | transports. | |||
| CoAP over WebSockets can be used in a number of configurations. The | CoAP over WebSockets can be used in a number of configurations. The | |||
| most basic configuration is a CoAP client retrieving or updating a | most basic configuration is a CoAP client retrieving or updating a | |||
| CoAP resource located on a CoAP server that exposes a WebSocket | CoAP resource located on a CoAP server that exposes a WebSocket | |||
| endpoint (Figure 9). The CoAP client acts as the WebSocket client, | endpoint (see Figure 9). The CoAP client acts as the WebSocket | |||
| establishes a WebSocket connection, and sends a CoAP request, to | client, establishes a WebSocket connection, and sends a CoAP request, | |||
| which the CoAP server returns a CoAP response. The WebSocket | to which the CoAP server returns a CoAP response. The WebSocket | |||
| connection can be used for any number of requests. | connection can be used for any number of requests. | |||
| ___________ ___________ | ___________ ___________ | |||
| | | | | | | | | | | |||
| | _|___ requests ___|_ | | | _|___ requests ___|_ | | |||
| | CoAP / \ \ -------------> / / \ CoAP | | | CoAP / \ \ -------------> / / \ CoAP | | |||
| | Client \__/__/ <------------- \__\__/ Server | | | Client \__/__/ <------------- \__\__/ Server | | |||
| | | responses | | | | | responses | | | |||
| |___________| |___________| | |___________| |___________| | |||
| WebSocket =============> WebSocket | WebSocket =============> WebSocket | |||
| Client Connection Server | Client Connection Server | |||
| Figure 9: CoAP Client (WebSocket client) accesses CoAP Server | Figure 9: CoAP Client (WebSocket client) accesses CoAP Server | |||
| (WebSocket server) | (WebSocket server) | |||
| The challenge with this configuration is how to identify a resource | The challenge with this configuration is how to identify a resource | |||
| in the namespace of the CoAP server. When the WebSocket protocol is | in the namespace of the CoAP server. When the WebSocket protocol is | |||
| used by a dedicated client directly (i.e., not from a web page | used by a dedicated client directly (i.e., not from a web page | |||
| through a web browser), the client can connect to any WebSocket | through a web browser), the client can connect to any WebSocket | |||
| endpoint. Section 6.3 and Section 6.4 define new URI schemes that | endpoint. Section 7.3 and Section 7.4 define new URI schemes that | |||
| enable the client to identify both a WebSocket endpoint and the path | enable the client to identify both a WebSocket endpoint and the path | |||
| and query of the CoAP resource within that endpoint. When the | and query of the CoAP resource within that endpoint. | |||
| WebSocket protocol is used from a web page, the choices are more | ||||
| limited [RFC6454], but the challenge persists. | ||||
| Another possible configuration is to set up a CoAP forward proxy at | Another possible configuration is to set up a CoAP forward proxy at | |||
| the WebSocket endpoint. Depending on what transports are available | the WebSocket endpoint. Depending on what transports are available | |||
| to the proxy, it could forward the request to a CoAP server with a | to the proxy, it could forward the request to a CoAP server with a | |||
| CoAP UDP endpoint (Figure 10), an SMS endpoint (a.k.a. mobile phone), | CoAP UDP endpoint (Figure 10), an SMS endpoint (a.k.a. mobile phone), | |||
| or even another WebSocket endpoint. The CoAP client specifies the | or even another WebSocket endpoint. The CoAP client specifies the | |||
| resource to be updated or retrieved in the Proxy-Uri Option. | resource to be updated or retrieved in the Proxy-Uri Option. | |||
| ___________ ___________ ___________ | ___________ ___________ ___________ | |||
| | | | | | | | | | | | | | | |||
| skipping to change at page 13, line 6 ¶ | skipping to change at page 13, line 6 ¶ | |||
| Figure 10: CoAP Client (WebSocket client) accesses CoAP Server (UDP | Figure 10: CoAP Client (WebSocket client) accesses CoAP Server (UDP | |||
| server) via a CoAP proxy (WebSocket server/UDP client) | server) via a CoAP proxy (WebSocket server/UDP client) | |||
| A third possible configuration is a CoAP server running inside a web | A third possible configuration is a CoAP server running inside a web | |||
| browser (Figure 11). The web browser initially connects to a | browser (Figure 11). The web browser initially connects to a | |||
| WebSocket endpoint and is then reachable through the WebSocket | WebSocket endpoint and is then reachable through the WebSocket | |||
| server. When no connection exists, the CoAP server is unreachable. | server. When no connection exists, the CoAP server is unreachable. | |||
| Because the WebSocket server is the only way to reach the CoAP | Because the WebSocket server is the only way to reach the CoAP | |||
| server, the CoAP proxy should be a Reverse Proxy. | server, the CoAP proxy should be a reverse-proxy. | |||
| ___________ ___________ ___________ | ___________ ___________ ___________ | |||
| | | | | | | | | | | | | | | |||
| | _|___ ___|_ _|___ ___|_ | | | _|___ ___|_ _|___ ___|_ | | |||
| | CoAP / \ \ ---> / / \ CoAP / / \ ---> / \ \ CoAP | | | CoAP / \ \ ---> / / \ CoAP / / \ ---> / \ \ CoAP | | |||
| | Client \__/__/ <--- \__\__/ Proxy \__\__/ <--- \__/__/ Server | | | Client \__/__/ <--- \__\__/ Proxy \__\__/ <--- \__/__/ Server | | |||
| | | | | | | | | | | | | | | |||
| |___________| |___________| |___________| | |___________| |___________| |___________| | |||
| UDP UDP WebSocket <=== WebSocket | UDP UDP WebSocket <=== WebSocket | |||
| Client Server Server Client | Client Server Server Client | |||
| Figure 11: CoAP Client (UDP client) accesses CoAP Server (WebSocket | Figure 11: CoAP Client (UDP client) accesses CoAP Server (WebSocket | |||
| client) via a CoAP proxy (UDP server/WebSocket server) | client) via a CoAP proxy (UDP server/WebSocket server) | |||
| Further configurations are possible, including those where a | Further configurations are possible, including those where a | |||
| WebSocket connection is established through an HTTP proxy. | WebSocket connection is established through an HTTP proxy. | |||
| 3.1. Opening Handshake | 4.1. Opening Handshake | |||
| Before CoAP requests and responses are exchanged, a WebSocket | Before CoAP requests and responses are exchanged, a WebSocket | |||
| connection is established as defined in Section 4 of [RFC6455]. | connection is established as defined in Section 4 of [RFC6455]. | |||
| Figure 12 shows an example. | Figure 12 shows an example. | |||
| The WebSocket client MUST include the subprotocol name "coap" in the | The WebSocket client MUST include the subprotocol name "coap" in the | |||
| list of protocols, which indicates support for the protocol defined | list of protocols, which indicates support for the protocol defined | |||
| in this document. Any later, incompatible versions of CoAP or CoAP | in this document. Any later, incompatible versions of CoAP or CoAP | |||
| over WebSockets will use a different subprotocol name. | over WebSockets will use a different subprotocol name. | |||
| skipping to change at page 14, line 21 ¶ | skipping to change at page 14, line 21 ¶ | |||
| Sec-WebSocket-Version: 13 | Sec-WebSocket-Version: 13 | |||
| HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
| Upgrade: websocket | Upgrade: websocket | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= | Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= | |||
| Sec-WebSocket-Protocol: coap | Sec-WebSocket-Protocol: coap | |||
| Figure 12: Example of an Opening Handshake | Figure 12: Example of an Opening Handshake | |||
| 3.2. Message Format | 4.2. Message Format | |||
| Once a WebSocket connection is established, CoAP requests and | Once a WebSocket connection is established, CoAP requests and | |||
| responses can be exchanged as WebSocket messages. Since CoAP uses a | responses can be exchanged as WebSocket messages. Since CoAP uses a | |||
| binary message format, the messages are transmitted in binary data | binary message format, the messages are transmitted in binary data | |||
| frames as specified in Sections 5 and 6 of [RFC6455]. | frames as specified in Sections 5 and 6 of [RFC6455]. | |||
| The message format shown in Figure 13 is the same as the CoAP over | The message format shown in Figure 13 is the same as the CoAP over | |||
| TCP message format (see Section 2.2) with one change. The Length | TCP message format (see Section 3.2) with one change. The Length | |||
| (Len) field MUST be set to zero because the WebSockets frame contains | (Len) field MUST be set to zero because the WebSockets frame contains | |||
| the length. | the length. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Len=0 | TKL | Code | Token (TKL bytes) ... | | Len=0 | TKL | Code | Token (TKL bytes) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Options (if any) ... | | Options (if any) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 15, line 10 ¶ | skipping to change at page 15, line 10 ¶ | |||
| identifier that is negotiated during the opening handshake. | identifier that is negotiated during the opening handshake. | |||
| Requests and response messages can be fragmented as specified in | Requests and response messages can be fragmented as specified in | |||
| Section 5.4 of [RFC6455], though typically they are sent unfragmented | Section 5.4 of [RFC6455], though typically they are sent unfragmented | |||
| as they tend to be small and fully buffered before transmission. The | as they tend to be small and fully buffered before transmission. The | |||
| WebSocket protocol does not provide means for multiplexing. If it is | WebSocket protocol does not provide means for multiplexing. If it is | |||
| not desirable for a large message to monopolize the connection, | not desirable for a large message to monopolize the connection, | |||
| requests and responses can be transferred in a block-wise fashion as | requests and responses can be transferred in a block-wise fashion as | |||
| defined in [RFC7959]. | defined in [RFC7959]. | |||
| 3.3. Message Transmission | 4.3. Message Transmission | |||
| As with CoAP over TCP, both endpoints MUST send a Capabilities and | As with CoAP over TCP, both endpoints MUST send a Capabilities and | |||
| Settings message (CSM see Section 4.3) as their first message on the | Settings message (CSM see Section 5.3) as their first message on the | |||
| WebSocket connection. | WebSocket connection. | |||
| CoAP requests and responses are exchanged asynchronously over the | CoAP requests and responses are exchanged asynchronously over the | |||
| WebSocket connection. A CoAP client can send multiple requests | WebSocket connection. A CoAP client can send multiple requests | |||
| without waiting for a response and the CoAP server can return | without waiting for a response and the CoAP server can return | |||
| responses in any order. Responses MUST be returned over the same | responses in any order. Responses MUST be returned over the same | |||
| connection as the originating request. Concurrent requests are | connection as the originating request. Concurrent requests are | |||
| differentiated by their Token, which is scoped locally to the | differentiated by their Token, which is scoped locally to the | |||
| connection. | connection. | |||
| The connection is bi-directional, so requests can be sent both by the | The connection is bi-directional, so requests can be sent both by the | |||
| entity that established the connection and the remote host. | entity that established the connection and the remote host. | |||
| As with CoAP over TCP, retransmission and deduplication of messages | As with CoAP over TCP, retransmission and deduplication of messages | |||
| is provided by the WebSocket protocol. CoAP over WebSockets | is provided by the WebSocket protocol. CoAP over WebSockets | |||
| therefore does not make a distinction between Confirmable or Non- | therefore does not make a distinction between Confirmable or Non- | |||
| Confirmable messages, and does not provide Acknowledgement or Reset | Confirmable messages, and does not provide Acknowledgement or Reset | |||
| messages. | messages. | |||
| 3.4. Connection Health | 4.4. Connection Health | |||
| As with CoAP over TCP, a CoAP client can test the health of the CoAP | As with CoAP over TCP, a CoAP client can test the health of the CoAP | |||
| over WebSocket connection by sending a CoAP Ping Signaling message | over WebSocket connection by sending a CoAP Ping Signaling message | |||
| (Section 4.4). WebSocket Ping and unsolicited Pong frames | (Section 5.4). WebSocket Ping and unsolicited Pong frames | |||
| (Section 5.5 of [RFC6455]) SHOULD NOT be used to ensure that | (Section 5.5 of [RFC6455]) SHOULD NOT be used to ensure that | |||
| redundant maintenance traffic is not transmitted. | redundant maintenance traffic is not transmitted. | |||
| 4. Signaling | 5. Signaling | |||
| Signaling messages are introduced to allow peers to: | Signaling messages are introduced to allow peers to: | |||
| o Related characteristics such as maximum message size for the | o Learn related characteristics, such as maximum message size for | |||
| connection | the connection | |||
| o Shut down the connection in an orderly fashion | o Shut down the connection in an orderly fashion | |||
| o Provide diagnostic information when terminating a connection in | o Provide diagnostic information when terminating a connection in | |||
| response to a serious error condition | response to a serious error condition | |||
| Signaling is a third basic kind of message in CoAP, after requests | Signaling is a third basic kind of message in CoAP, after requests | |||
| and responses. Signaling messages share a common structure with the | and responses. Signaling messages share a common structure with the | |||
| existing CoAP messages. There is a code, a token, options, and an | existing CoAP messages. There is a code, a token, options, and an | |||
| optional payload. | optional payload. | |||
| (See Section 3 of [RFC7252] for the overall structure, as adapted to | (See Section 3 of [RFC7252] for the overall structure of the message | |||
| the specific transport.) | format, option format, and option value format.) | |||
| 4.1. Signaling Codes | 5.1. Signaling Codes | |||
| A code in the 7.00-7.31 range indicates a Signaling message. Values | A code in the 7.00-7.31 range indicates a Signaling message. Values | |||
| in this range are assigned by the "CoAP Signaling Codes" sub-registry | in this range are assigned by the "CoAP Signaling Codes" sub-registry | |||
| (see Section 9.1). | (see Section 10.1). | |||
| For each message, there is a sender and a peer receiving the message. | For each message, there is a sender and a peer receiving the message. | |||
| Payloads in Signaling messages are diagnostic payloads as defined in | Payloads in Signaling messages are diagnostic payloads as defined in | |||
| Section 5.5.2 of [RFC7252]), unless otherwise defined by a Signaling | Section 5.5.2 of [RFC7252]), unless otherwise defined by a Signaling | |||
| message option. | message option. | |||
| 4.2. Signaling Option Numbers | 5.2. Signaling Option Numbers | |||
| Option numbers for Signaling messages are specific to the message | Option numbers for Signaling messages are specific to the message | |||
| code. They do not share the number space with CoAP options for | code. They do not share the number space with CoAP options for | |||
| request/response messages or with Signaling messages using other | request/response messages or with Signaling messages using other | |||
| codes. | codes. | |||
| Option numbers are assigned by the "CoAP Signaling Option Numbers" | Option numbers are assigned by the "CoAP Signaling Option Numbers" | |||
| sub-registry (see Section 9.2). | sub-registry (see Section 10.2). | |||
| Signaling options are elective or critical as defined in | Signaling options are elective or critical as defined in | |||
| Section 5.4.1 of [RFC7252]. If a Signaling option is critical and | Section 5.4.1 of [RFC7252]. If a Signaling option is critical and | |||
| not understood by the receiver, it MUST abort the connection (see | not understood by the receiver, it MUST abort the connection (see | |||
| Section 4.6). If the option is understood but cannot be processed, | Section 5.6). If the option is understood but cannot be processed, | |||
| the option documents the behavior. | the option documents the behavior. | |||
| 4.3. Capabilities and Settings Messages (CSM) | 5.3. Capabilities and Settings Messages (CSM) | |||
| Capabilities and Settings messages (CSM) are used for two purposes: | Capabilities and Settings messages (CSM) are used for two purposes: | |||
| o Each capability option advertises one capability of the sender to | o Each capability option advertises one capability of the sender to | |||
| the recipient. | the recipient. | |||
| o Setting options indicate a setting that will be applied by the | o Each setting option indicates a setting that will be applied by | |||
| sender. | the sender. | |||
| One CSM MUST be sent by both endpoints at the start of the | One CSM MUST be sent by both endpoints at the start of the | |||
| connection. Further CSM MAY be sent at any other time by either | connection. Further CSM MAY be sent at any other time by either | |||
| endpoint over the lifetime of the connection. | endpoint over the lifetime of the connection. | |||
| Both capability and setting options are cumulative. A CSM does not | Both capability and setting options are cumulative. A CSM does not | |||
| invalidate a previously sent capability indication or setting even if | invalidate a previously sent capability indication or setting even if | |||
| it is not repeated. A capability message without any option is a no- | it is not repeated. A capability message without any option is a no- | |||
| operation (and can be used as such). An option that is sent might | operation (and can be used as such). An option that is sent might | |||
| override a previous value for the same option. The option defines | override a previous value for the same option. The option defines | |||
| how to handle this case if needed. | how to handle this case if needed. | |||
| Base values are listed below for CSM Options. These are the values | Base values are listed below for CSM Options. These are the values | |||
| for the capability and setting before any Capabilities and Settings | for the capability and setting before any Capabilities and Settings | |||
| messages send a modified value. | messages send a modified value. | |||
| These are not default values for the option as defined in | These are not default values for the option, as defined in | |||
| Section 5.4.4 in [RFC7252]. A default value would mean that an empty | Section 5.4.4 in [RFC7252]. A default value would mean that an empty | |||
| Capabilities and Settings message would result in the option being | Capabilities and Settings message would result in the option being | |||
| set to its default value. | set to its default value. | |||
| Capabilities and Settings messages are indicated by the 7.01 code | Capabilities and Settings messages are indicated by the 7.01 code | |||
| (CSM). | (CSM). | |||
| 4.3.1. Max-Message-Size Capability Option | 5.3.1. Max-Message-Size Capability Option | |||
| The sender can use the elective Max-Message-Size Option to indicate | The sender can use the elective Max-Message-Size Option to indicate | |||
| the maximum message size in bytes that it can receive. | the maximum message size in bytes that it can receive. | |||
| +---+---+---+---------+------------------+--------+--------+--------+ | +---+---+---+---------+------------------+--------+--------+--------+ | |||
| | # | C | R | Applies | Name | Format | Length | Base | | | # | C | R | Applies | Name | Format | Length | Base | | |||
| | | | | to | | | | Value | | | | | | to | | | | Value | | |||
| +---+---+---+---------+------------------+--------+--------+--------+ | +---+---+---+---------+------------------+--------+--------+--------+ | |||
| | 2 | | | CSM | Max-Message-Size | uint | 0-4 | 1152 | | | 2 | | | CSM | Max-Message-Size | uint | 0-4 | 1152 | | |||
| +---+---+---+---------+------------------+--------+--------+--------+ | +---+---+---+---------+------------------+--------+--------+--------+ | |||
| C=Critical, R=Repeatable | C=Critical, R=Repeatable | |||
| As per Section 4.6 of [RFC7252], the base value (and the value used | As per Section 4.6 of [RFC7252], the base value (and the value used | |||
| when this option is not implemented) is 1152. | when this option is not implemented) is 1152. | |||
| The active value of the Max-Message-Size Option is replaced each time | The active value of the Max-Message-Size Option is replaced each time | |||
| the option is sent with a modified value. Its starting value is its | the option is sent with a modified value. Its starting value is its | |||
| base value. | base value. | |||
| 4.3.2. Block-wise Transfer Capability Option | 5.3.2. Block-wise Transfer Capability Option | |||
| +---+---+---+---------+-----------------+--------+--------+---------+ | +---+---+---+---------+-----------------+--------+--------+---------+ | |||
| | # | C | R | Applies | Name | Format | Length | Base | | | # | C | R | Applies | Name | Format | Length | Base | | |||
| | | | | to | | | | Value | | | | | | to | | | | Value | | |||
| +---+---+---+---------+-----------------+--------+--------+---------+ | +---+---+---+---------+-----------------+--------+--------+---------+ | |||
| | 4 | | | CSM | Block-wise | empty | 0 | (none) | | | 4 | | | CSM | Block-wise | empty | 0 | (none) | | |||
| | | | | | Transfer | | | | | | | | | | Transfer | | | | | |||
| +---+---+---+---------+-----------------+--------+--------+---------+ | +---+---+---+---------+-----------------+--------+--------+---------+ | |||
| C=Critical, R=Repeatable | C=Critical, R=Repeatable | |||
| A sender can use the elective Block-wise Transfer Option to indicate | A sender can use the elective Block-wise Transfer Option to indicate | |||
| that it supports the block-wise transfer protocol [RFC7959]. | that it supports the block-wise transfer protocol [RFC7959]. | |||
| If the option is not given, the peer has no information about whether | If the option is not given, the peer has no information about whether | |||
| block-wise transfers are supported by the sender or not. An | block-wise transfers are supported by the sender or not. An | |||
| implementation that supports block-wise transfers SHOULD indicate the | implementation that supports block-wise transfers SHOULD indicate the | |||
| Block-wise Transfer Option. If a Max-Message-Size Option is | Block-wise Transfer Option. If a Max-Message-Size Option is | |||
| indicated with a value that is greater than 1152 (in the same or a | indicated with a value that is greater than 1152 (in the same or a | |||
| different CSM message), the Block-wise Transfer Option also indicates | different CSM message), the Block-wise Transfer Option also indicates | |||
| support for BERT (see Section 5). Subsequently, if the Max-Message- | support for BERT (see Section 6). Subsequently, if the Max-Message- | |||
| Size Option is indicated with a value equal or less than 1152, BERT | Size Option is indicated with a value equal to or less than 1152, | |||
| support is no longer indicated. | BERT support is no longer indicated. | |||
| 4.4. Ping and Pong Messages | 5.4. Ping and Pong Messages | |||
| In CoAP over reliable transports, Empty messages (Code 0.00) can | In CoAP over reliable transports, Empty messages (Code 0.00) can | |||
| always be sent and MUST be ignored by the recipient. This provides a | always be sent and MUST be ignored by the recipient. This provides a | |||
| basic keep-alive function. In contrast, Ping and Pong messages are a | basic keep-alive function. In contrast, Ping and Pong messages are a | |||
| bidirectional exchange. | bidirectional exchange. | |||
| Upon receipt of a Ping message, the receiver MUST return a Pong | Upon receipt of a Ping message, the receiver MUST return a Pong | |||
| message with an identical token in response. Unless there is an | message with an identical token in response. Unless there is an | |||
| option with delaying semantics such as the Custody Option, it SHOULD | option with delaying semantics such as the Custody Option, it SHOULD | |||
| respond as soon as practical. As with all Signaling messages, the | respond as soon as practical. As with all Signaling messages, the | |||
| recipient of a Ping or Pong message MUST ignore elective options it | recipient of a Ping or Pong message MUST ignore elective options it | |||
| does not understand. | does not understand. | |||
| Ping and Pong messages are indicated by the 7.02 code (Ping) and the | Ping and Pong messages are indicated by the 7.02 code (Ping) and the | |||
| 7.03 code (Pong). | 7.03 code (Pong). | |||
| 4.4.1. Custody Option | 5.4.1. Custody Option | |||
| +---+---+---+----------+----------------+--------+--------+---------+ | +---+---+---+----------+----------------+--------+--------+---------+ | |||
| | # | C | R | Applies | Name | Format | Length | Base | | | # | C | R | Applies | Name | Format | Length | Base | | |||
| | | | | to | | | | Value | | | | | | to | | | | Value | | |||
| +---+---+---+----------+----------------+--------+--------+---------+ | +---+---+---+----------+----------------+--------+--------+---------+ | |||
| | 2 | | | Ping, | Custody | empty | 0 | (none) | | | 2 | | | Ping, | Custody | empty | 0 | (none) | | |||
| | | | | Pong | | | | | | | | | | Pong | | | | | | |||
| +---+---+---+----------+----------------+--------+--------+---------+ | +---+---+---+----------+----------------+--------+--------+---------+ | |||
| C=Critical, R=Repeatable | C=Critical, R=Repeatable | |||
| skipping to change at page 19, line 25 ¶ | skipping to change at page 19, line 25 ¶ | |||
| elective Custody Option in the Pong message. This option indicates | elective Custody Option in the Pong message. This option indicates | |||
| that the application has processed all the request/response messages | that the application has processed all the request/response messages | |||
| received prior to the Ping message on the current connection. (Note | received prior to the Ping message on the current connection. (Note | |||
| that there is no definition of specific application semantics for | that there is no definition of specific application semantics for | |||
| "processed", but there is an expectation that the receiver of a Pong | "processed", but there is an expectation that the receiver of a Pong | |||
| Message with a Custody Option should be able to free buffers based on | Message with a Custody Option should be able to free buffers based on | |||
| this indication.) | this indication.) | |||
| A sender can also include an elective Custody Option in a Ping | A sender can also include an elective Custody Option in a Ping | |||
| message to explicitly request the inclusion of an elective Custody | message to explicitly request the inclusion of an elective Custody | |||
| Option in the corresponding Pong message. The receiver SHOULD delay | Option in the corresponding Pong message. In that case, the receiver | |||
| its Pong message until it finishes processing all the request/ | SHOULD delay its Pong message until it finishes processing all the | |||
| response messages received prior to the Ping message on the current | request/response messages received prior to the Ping message on the | |||
| connection. | current connection. | |||
| 4.5. Release Messages | 5.5. Release Messages | |||
| A Release message indicates that the sender does not want to continue | A Release message indicates that the sender does not want to continue | |||
| maintaining the connection and opts for an orderly shutdown. The | maintaining the connection and opts for an orderly shutdown. The | |||
| details are in the options. A diagnostic payload (see Section 5.5.2 | details are in the options. A diagnostic payload (see Section 5.5.2 | |||
| of [RFC7252]) MAY be included. A peer will normally respond to a | of [RFC7252]) MAY be included. A peer will normally respond to a | |||
| Release message by closing the TCP/TLS connection. Messages may be | Release message by closing the TCP/TLS connection. Messages may be | |||
| in flight when the sender decides to send a Release message. The | in flight when the sender decides to send a Release message. The | |||
| general expectation is that these will still be processed. | general expectation is that these will still be processed. | |||
| Release messages are indicated by the 7.04 code (Release). | Release messages are indicated by the 7.04 code (Release). | |||
| skipping to change at page 20, line 21 ¶ | skipping to change at page 20, line 21 ¶ | |||
| +---+---+---+---------+------------------+--------+--------+--------+ | +---+---+---+---------+------------------+--------+--------+--------+ | |||
| C=Critical, R=Repeatable | C=Critical, R=Repeatable | |||
| The elective Alternative-Address Option requests the peer to instead | The elective Alternative-Address Option requests the peer to instead | |||
| open a connection of the same scheme as the present connection to the | open a connection of the same scheme as the present connection to the | |||
| alternative transport address given. Its value is in the form | alternative transport address given. Its value is in the form | |||
| "authority" as defined in Section 3.2 of [RFC3986]. | "authority" as defined in Section 3.2 of [RFC3986]. | |||
| The Alternative-Address Option is a repeatable option as defined in | The Alternative-Address Option is a repeatable option as defined in | |||
| Section 5.4.5 of [RFC7252]. | Section 5.4.5 of [RFC7252]. When multiple occurrences of the option | |||
| are included, the peer can choose any of the alternative transport | ||||
| addresses. | ||||
| +---+---+---+---------+-----------------+--------+--------+---------+ | +---+---+---+---------+-----------------+--------+--------+---------+ | |||
| | # | C | R | Applies | Name | Format | Length | Base | | | # | C | R | Applies | Name | Format | Length | Base | | |||
| | | | | to | | | | Value | | | | | | to | | | | Value | | |||
| +---+---+---+---------+-----------------+--------+--------+---------+ | +---+---+---+---------+-----------------+--------+--------+---------+ | |||
| | 4 | | | Release | Hold-Off | uint | 0-3 | (none) | | | 4 | | | Release | Hold-Off | uint | 0-3 | (none) | | |||
| +---+---+---+---------+-----------------+--------+--------+---------+ | +---+---+---+---------+-----------------+--------+--------+---------+ | |||
| C=Critical, R=Repeatable | C=Critical, R=Repeatable | |||
| The elective Hold-Off Option indicates that the server is requesting | The elective Hold-Off Option indicates that the server is requesting | |||
| that the peer not reconnect to it for the number of seconds given in | that the peer not reconnect to it for the number of seconds given in | |||
| the value. | the value. | |||
| 4.6. Abort Messages | 5.6. Abort Messages | |||
| An Abort message indicates that the sender is unable to continue | An Abort message indicates that the sender is unable to continue | |||
| maintaining the connection and cannot even wait for an orderly | maintaining the connection and cannot even wait for an orderly | |||
| release. The sender shuts down the connection immediately after the | release. The sender shuts down the connection immediately after the | |||
| abort (and may or may not wait for a Release or Abort message or | abort (and may or may not wait for a Release or Abort message or | |||
| connection shutdown in the inverse direction). A diagnostic payload | connection shutdown in the inverse direction). A diagnostic payload | |||
| (see Section 5.5.2 of [RFC7252]) SHOULD be included in the Abort | (see Section 5.5.2 of [RFC7252]) SHOULD be included in the Abort | |||
| message. Messages may be in flight when the sender decides to send | message. Messages may be in flight when the sender decides to send | |||
| an Abort message. The general expectation is that these will NOT be | an Abort message. The general expectation is that these will NOT be | |||
| processed. | processed. | |||
| skipping to change at page 21, line 21 ¶ | skipping to change at page 21, line 24 ¶ | |||
| C=Critical, R=Repeatable | C=Critical, R=Repeatable | |||
| The elective Bad-CSM-Option Option indicates that the sender is | The elective Bad-CSM-Option Option indicates that the sender is | |||
| unable to process the CSM option identified by its option number, | unable to process the CSM option identified by its option number, | |||
| e.g. when it is critical and the option number is unknown by the | e.g. when it is critical and the option number is unknown by the | |||
| sender, or when there is parameter problem with the value of an | sender, or when there is parameter problem with the value of an | |||
| elective option. More detailed information SHOULD be included as a | elective option. More detailed information SHOULD be included as a | |||
| diagnostic payload. | diagnostic payload. | |||
| One reason for an sender to generate an Abort message is a general | For CoAP over UDP, messages which contain syntax violations are | |||
| syntax error in the byte-stream received. No specific option has | processed as message format errors. As described in Sections 4.2 and | |||
| been defined for this, as the details of that syntax error are best | 4.3 of [RFC7252], such messages are rejected by sending a matching | |||
| left to a diagnostic payload. | Reset message and otherwise ignoring the message. | |||
| 4.7. Signaling examples | For CoAP over reliable transports, the recipient rejects such | |||
| messages by sending an Abort message and otherwise ignoring the | ||||
| message. No specific option has been defined for the Abort message | ||||
| in this case, as the details are best left to a diagnostic payload. | ||||
| 5.7. Signaling examples | ||||
| An encoded example of a Ping message with a non-empty token is shown | An encoded example of a Ping message with a non-empty token is shown | |||
| in Figure 14. | in Figure 14. | |||
| 0 1 2 | 0 1 2 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | 0x01 | 0xe2 | 0x42 | | | 0x01 | 0xe2 | 0x42 | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 22, line 18 ¶ | skipping to change at page 22, line 21 ¶ | |||
| | 0x01 | 0xe3 | 0x42 | | | 0x01 | 0xe3 | 0x42 | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Len = 0 -------> 0x01 | Len = 0 -------> 0x01 | |||
| TKL = 1 ___/ | TKL = 1 ___/ | |||
| Code = 7.03 Pong --> 0xe3 | Code = 7.03 Pong --> 0xe3 | |||
| Token = 0x42 | Token = 0x42 | |||
| Figure 15: Pong Message Example | Figure 15: Pong Message Example | |||
| 5. Block-wise Transfer and Reliable Transports | 6. Block-wise Transfer and Reliable Transports | |||
| The message size restrictions defined in Section 4.6 of CoAP | The message size restrictions defined in Section 4.6 of CoAP | |||
| [RFC7252] to avoid IP fragmentation are not necessary when CoAP is | [RFC7252] to avoid IP fragmentation are not necessary when CoAP is | |||
| used over a reliable transport. While this suggests that the Block- | used over a reliable transport. While this suggests that the Block- | |||
| wise transfer protocol [RFC7959] is also no longer needed, it remains | wise transfer protocol [RFC7959] is also no longer needed, it remains | |||
| applicable for a number of cases: | applicable for a number of cases: | |||
| o large messages, such as firmware downloads, may cause undesired | o large messages, such as firmware downloads, may cause undesired | |||
| head-of-line blocking when a single TCP connection is used | head-of-line blocking when a single TCP connection is used | |||
| skipping to change at page 22, line 50 ¶ | skipping to change at page 23, line 6 ¶ | |||
| value in [RFC7959]. | value in [RFC7959]. | |||
| In control usage, a BERT option is interpreted in the same way as the | In control usage, a BERT option is interpreted in the same way as the | |||
| equivalent Option with SZX == 6, except that it also indicates the | equivalent Option with SZX == 6, except that it also indicates the | |||
| capability to process BERT blocks. As with the basic Block protocol, | capability to process BERT blocks. As with the basic Block protocol, | |||
| the recipient of a CoAP request with a BERT option in control usage | the recipient of a CoAP request with a BERT option in control usage | |||
| is allowed to respond with a different SZX value, e.g. to send a non- | is allowed to respond with a different SZX value, e.g. to send a non- | |||
| BERT block instead. | BERT block instead. | |||
| In descriptive usage, a BERT Option is interpreted in the same way as | In descriptive usage, a BERT Option is interpreted in the same way as | |||
| the equivalent Option with SZX == 6, except that the payload is | the equivalent Option with SZX == 6, except that the payload is also | |||
| allowed to contain a multiple of 1024 bytes (non-final BERT block) or | allowed to contain a multiple of 1024 bytes (non-final BERT block) or | |||
| more than 1024 bytes (final BERT block). | more than 1024 bytes (final BERT block). | |||
| The recipient of a non-final BERT block (M=1) conceptually partitions | The recipient of a non-final BERT block (M=1) conceptually partitions | |||
| the payload into a sequence of 1024-byte blocks and acts exactly as | the payload into a sequence of 1024-byte blocks and acts exactly as | |||
| if it had received this sequence in conjunction with block numbers | if it had received this sequence in conjunction with block numbers | |||
| starting at, and sequentially increasing from, the block number given | starting at, and sequentially increasing from, the block number given | |||
| in the Block Option. In other words, the entire BERT block is | in the Block Option. In other words, the entire BERT block is | |||
| positioned at the byte position that results from multiplying the | positioned at the byte position that results from multiplying the | |||
| block number with 1024. The position of further blocks to be | block number with 1024. The position of further blocks to be | |||
| skipping to change at page 23, line 26 ¶ | skipping to change at page 23, line 31 ¶ | |||
| As with SZX == 6, the recipient of a final BERT block (M=0) simply | As with SZX == 6, the recipient of a final BERT block (M=0) simply | |||
| appends the payload at the byte position that is indicated by the | appends the payload at the byte position that is indicated by the | |||
| block number multiplied with 1024. | block number multiplied with 1024. | |||
| The following examples illustrate BERT options. A value of SZX == 7 | The following examples illustrate BERT options. A value of SZX == 7 | |||
| is labeled as "BERT" or as "BERT(nnn)" to indicate a payload of size | is labeled as "BERT" or as "BERT(nnn)" to indicate a payload of size | |||
| nnn. | nnn. | |||
| In all these examples, a Block Option is decomposed to indicate the | In all these examples, a Block Option is decomposed to indicate the | |||
| kind of Block Option (1 or 2) followed by a colon, the block number | kind of Block Option (1 or 2) followed by a colon, the block number | |||
| (NUM), more bit (M), and block size exponent (2**(SZX+4)) separated | (NUM), more bit (M), and block size (2**(SZX+4)) separated by | |||
| by slashes. E.g., a Block2 Option value of 33 would be shown as | slashes. E.g., a Block2 Option value of 33 would be shown as | |||
| 2:2/0/32), or a Block1 Option value of 59 would be shown as | 2:2/0/32), or a Block1 Option value of 59 would be shown as | |||
| 1:3/1/128. | 1:3/1/128. | |||
| 5.1. Example: GET with BERT Blocks | 6.1. Example: GET with BERT Blocks | |||
| Figure 16 shows a GET request with a response that is split into | Figure 16 shows a GET request with a response that is split into | |||
| three BERT blocks. The first response contains 3072 bytes of | three BERT blocks. The first response contains 3072 bytes of | |||
| payload; the second, 5120; and the third, 4711. Note how the block | payload; the second, 5120; and the third, 4711. Note how the block | |||
| number increments to move the position inside the response body | number increments to move the position inside the response body | |||
| forward. | forward. | |||
| CoAP Client CoAP Server | CoAP Client CoAP Server | |||
| | | | | | | |||
| | GET, /status ------> | | | GET, /status ------> | | |||
| skipping to change at page 24, line 21 ¶ | skipping to change at page 24, line 21 ¶ | |||
| | GET, /status, 2:3/0/BERT ------> | | | GET, /status, 2:3/0/BERT ------> | | |||
| | | | | | | |||
| | <------ 2.05 Content, 2:3/1/BERT(5120) | | | <------ 2.05 Content, 2:3/1/BERT(5120) | | |||
| | | | | | | |||
| | GET, /status, 2:8/0/BERT ------> | | | GET, /status, 2:8/0/BERT ------> | | |||
| | | | | | | |||
| | <------ 2.05 Content, 2:8/0/BERT(4711) | | | <------ 2.05 Content, 2:8/0/BERT(4711) | | |||
| Figure 16: GET with BERT blocks | Figure 16: GET with BERT blocks | |||
| 5.2. Example: PUT with BERT Blocks | 6.2. Example: PUT with BERT Blocks | |||
| Figure 17 demonstrates a PUT exchange with BERT blocks. | Figure 17 demonstrates a PUT exchange with BERT blocks. | |||
| CoAP Client CoAP Server | CoAP Client CoAP Server | |||
| | | | | | | |||
| | PUT, /options, 1:0/1/BERT(8192) ------> | | | PUT, /options, 1:0/1/BERT(8192) ------> | | |||
| | | | | | | |||
| | <------ 2.31 Continue, 1:0/1/BERT | | | <------ 2.31 Continue, 1:0/1/BERT | | |||
| | | | | | | |||
| | PUT, /options, 1:8/1/BERT(16384) ------> | | | PUT, /options, 1:8/1/BERT(16384) ------> | | |||
| | | | | | | |||
| | <------ 2.31 Continue, 1:8/1/BERT | | | <------ 2.31 Continue, 1:8/1/BERT | | |||
| | | | | | | |||
| | PUT, /options, 1:24/0/BERT(5683) ------> | | | PUT, /options, 1:24/0/BERT(5683) ------> | | |||
| | | | | | | |||
| | <------ 2.04 Changed, 1:24/0/BERT | | | <------ 2.04 Changed, 1:24/0/BERT | | |||
| | | | | | | |||
| Figure 17: PUT with BERT blocks | Figure 17: PUT with BERT blocks | |||
| 6. CoAP over Reliable Transport URIs | 7. CoAP over Reliable Transport URIs | |||
| CoAP over UDP [RFC7252] defines the "coap" and "coaps" URI schemes. | CoAP over UDP [RFC7252] defines the "coap" and "coaps" URI schemes. | |||
| This document introduces four additional URI schemes for identifying | This document introduces four additional URI schemes for identifying | |||
| CoAP resources and providing a means of locating the resource: | CoAP resources and providing a means of locating the resource: | |||
| o the "coap+tcp" URI scheme for CoAP over TCP | o the "coap+tcp" URI scheme for CoAP over TCP | |||
| o the "coaps+tcp" URI scheme for CoAP over TCP secured by TLS | o the "coaps+tcp" URI scheme for CoAP over TCP secured by TLS | |||
| o the "coap+ws" URI scheme for CoAP over WebSockets | o the "coap+ws" URI scheme for CoAP over WebSockets | |||
| o the "coaps+ws" URI scheme for CoAP over WebSockets secured by TLS | o the "coaps+ws" URI scheme for CoAP over WebSockets secured by TLS | |||
| Resources made available via these schemes have no shared identity | Resources made available via these schemes have no shared identity | |||
| even if their resource identifiers indicate the same authority (the | even if their resource identifiers indicate the same authority (the | |||
| same host listening to the same TCP port). They are distinct | same host listening to the same TCP port). They are hosted in | |||
| namespaces and are considered to be distinct origin servers. | distinct namespaces because each URI scheme implies a distinct origin | |||
| server. | ||||
| The syntax for the URI schemes in this section are specified using | The syntax for the URI schemes in this section are specified using | |||
| Augmented Backus-Naur Form (ABNF) [RFC5234]. The definitions of | Augmented Backus-Naur Form (ABNF) [RFC5234]. The definitions of | |||
| "host", "port", "path-abempty", and "query" are adopted from | "host", "port", "path-abempty", and "query" are adopted from | |||
| [RFC3986]. | [RFC3986]. | |||
| Section 8 (Multicast CoAP) in [RFC7252] is not applicable to these | Section 8 (Multicast CoAP) in [RFC7252] is not applicable to these | |||
| schemes. | schemes. | |||
| 6.1. coap+tcp URI scheme | 7.1. coap+tcp URI scheme | |||
| The "coap+tcp" URI scheme identifies CoAP resources that are intended | The "coap+tcp" URI scheme identifies CoAP resources that are intended | |||
| to be accessible using CoAP over TCP. | to be accessible using CoAP over TCP. | |||
| coap+tcp-URI = | coap+tcp-URI = | |||
| "coap+tcp:" "//" host [ ":" port ] path-abempty [ "?" query ] | "coap+tcp:" "//" host [ ":" port ] path-abempty [ "?" query ] | |||
| The syntax defined in Section 6.1 of [RFC7252] applies to this URI | The syntax defined in Section 6.1 of [RFC7252] applies to this URI | |||
| scheme with the following changes: | scheme with the following changes: | |||
| skipping to change at page 25, line 41 ¶ | skipping to change at page 25, line 42 ¶ | |||
| server is located. (If it is empty or not given, then the default | server is located. (If it is empty or not given, then the default | |||
| port 5683 is assumed, as with UDP.) | port 5683 is assumed, as with UDP.) | |||
| Encoding considerations: The scheme encoding conforms to the | Encoding considerations: The scheme encoding conforms to the | |||
| encoding rules established for URIs in [RFC3986]. | encoding rules established for URIs in [RFC3986]. | |||
| Interoperability considerations: None. | Interoperability considerations: None. | |||
| Security considerations: See Section 11.1 of [RFC7252]. | Security considerations: See Section 11.1 of [RFC7252]. | |||
| 6.2. coaps+tcp URI scheme | 7.2. coaps+tcp URI scheme | |||
| The "coaps+tcp" URI scheme identifies CoAP resources that are | The "coaps+tcp" URI scheme identifies CoAP resources that are | |||
| intended to be accessible using CoAP over TCP secured with TLS. | intended to be accessible using CoAP over TCP secured with TLS. | |||
| coaps+tcp-URI = | coaps+tcp-URI = | |||
| "coaps+tcp:" "//" host [ ":" port ] path-abempty [ "?" query ] | "coaps+tcp:" "//" host [ ":" port ] path-abempty [ "?" query ] | |||
| The syntax defined in Section 6.2 of [RFC7252] applies to this URI | The syntax defined in Section 6.2 of [RFC7252] applies to this URI | |||
| scheme, with the following changes: | scheme, with the following changes: | |||
| skipping to change at page 26, line 19 ¶ | skipping to change at page 26, line 19 ¶ | |||
| o If a TLS server does not support the Application-Layer Protocol | o If a TLS server does not support the Application-Layer Protocol | |||
| Negotiation Extension (ALPN) [RFC7301] or wishes to accommodate | Negotiation Extension (ALPN) [RFC7301] or wishes to accommodate | |||
| TLS clients that do not support ALPN, it MAY offer a coaps+tcp | TLS clients that do not support ALPN, it MAY offer a coaps+tcp | |||
| endpoint on TCP port 5684. This endpoint MAY also be ALPN | endpoint on TCP port 5684. This endpoint MAY also be ALPN | |||
| enabled. A TLS server MAY offer coaps+tcp endpoints on ports | enabled. A TLS server MAY offer coaps+tcp endpoints on ports | |||
| other than TCP port 5684, which MUST be ALPN enabled. | other than TCP port 5684, which MUST be ALPN enabled. | |||
| o For TCP ports other than port 5684, the TLS client MUST use the | o For TCP ports other than port 5684, the TLS client MUST use the | |||
| ALPN extension to advertise the "coap" protocol identifier (see | ALPN extension to advertise the "coap" protocol identifier (see | |||
| Section 9.7) in the list of protocols in its ClientHello. If the | Section 10.7) in the list of protocols in its ClientHello. If the | |||
| TCP server selects and returns the "coap" protocol identifier | TCP server selects and returns the "coap" protocol identifier | |||
| using the ALPN extension in its ServerHello, then the connection | using the ALPN extension in its ServerHello, then the connection | |||
| succeeds. If the TLS server either does not negotiate the ALPN | succeeds. If the TLS server either does not negotiate the ALPN | |||
| extension or returns a no_application_protocol alert, the TLS | extension or returns a no_application_protocol alert, the TLS | |||
| client MUST close the connection. | client MUST close the connection. | |||
| o For TCP port 5684, a TLS client MAY use the ALPN extension to | o For TCP port 5684, a TLS client MAY use the ALPN extension to | |||
| advertise the "coap" protocol identifier in the list of protocols | advertise the "coap" protocol identifier in the list of protocols | |||
| in its ClientHello. If the TLS server selects and returns the | in its ClientHello. If the TLS server selects and returns the | |||
| "coap" protocol identifier using the ALPN extension in its | "coap" protocol identifier using the ALPN extension in its | |||
| skipping to change at page 26, line 46 ¶ | skipping to change at page 26, line 46 ¶ | |||
| extension to negotiate the protocol, then coaps+tcp is implicitly | extension to negotiate the protocol, then coaps+tcp is implicitly | |||
| selected. | selected. | |||
| Encoding considerations: The scheme encoding conforms to the | Encoding considerations: The scheme encoding conforms to the | |||
| encoding rules established for URIs in [RFC3986]. | encoding rules established for URIs in [RFC3986]. | |||
| Interoperability considerations: None. | Interoperability considerations: None. | |||
| Security considerations: See Section 11.1 of [RFC7252]. | Security considerations: See Section 11.1 of [RFC7252]. | |||
| 6.3. coap+ws URI scheme | 7.3. coap+ws URI scheme | |||
| The "coap+ws" URI scheme identifies CoAP resources that are intended | The "coap+ws" URI scheme identifies CoAP resources that are intended | |||
| to be accessible using CoAP over WebSockets. | to be accessible using CoAP over WebSockets. | |||
| coap-ws-URI = | coap-ws-URI = | |||
| "coap+ws:" "//" host [ ":" port ] path-abempty [ "?" query ] | "coap+ws:" "//" host [ ":" port ] path-abempty [ "?" query ] | |||
| The port component is OPTIONAL. The default is port 80. | The port subcomponent is OPTIONAL. The default is port 80. | |||
| The WebSocket endpoint is identified by a "ws" URI that is composed | The WebSocket endpoint is identified by a "ws" URI that is composed | |||
| of the authority part of the "coap+ws" URI and the well-known path | of the authority part of the "coap+ws" URI and the well-known path | |||
| "/.well-known/coap" [RFC5785]. The path and query parts of a | "/.well-known/coap" [RFC5785]. The path and query parts of a | |||
| "coap+ws" URI identify a resource within the specified endpoint which | "coap+ws" URI identify a resource within the specified endpoint which | |||
| can be operated on by the methods defined by CoAP: | can be operated on by the methods defined by CoAP: | |||
| coap+ws://example.org/sensors/temperature?u=Cel | coap+ws://example.org/sensors/temperature?u=Cel | |||
| \______ ______/\___________ ___________/ | \______ ______/\___________ ___________/ | |||
| \/ \/ | \/ \/ | |||
| skipping to change at page 27, line 29 ¶ | skipping to change at page 27, line 29 ¶ | |||
| Figure 18: The "coap+ws" URI Scheme | Figure 18: The "coap+ws" URI Scheme | |||
| Encoding considerations: The scheme encoding conforms to the | Encoding considerations: The scheme encoding conforms to the | |||
| encoding rules established for URIs in [RFC3986]. | encoding rules established for URIs in [RFC3986]. | |||
| Interoperability considerations: None. | Interoperability considerations: None. | |||
| Security considerations: See Section 11.1 of [RFC7252]. | Security considerations: See Section 11.1 of [RFC7252]. | |||
| 6.4. coaps+ws URI scheme | 7.4. coaps+ws URI scheme | |||
| The "coaps+ws" URI scheme identifies CoAP resources that are intended | The "coaps+ws" URI scheme identifies CoAP resources that are intended | |||
| to be accessible using CoAP over WebSockets secured by TLS. | to be accessible using CoAP over WebSockets secured by TLS. | |||
| coaps-ws-URI = | coaps-ws-URI = | |||
| "coaps+ws:" "//" host [ ":" port ] path-abempty [ "?" query ] | "coaps+ws:" "//" host [ ":" port ] path-abempty [ "?" query ] | |||
| The port component is OPTIONAL. The default is port 443. | The port subcomponent is OPTIONAL. The default is port 443. | |||
| The WebSocket endpoint is identified by a "wss" URI that is composed | The WebSocket endpoint is identified by a "wss" URI that is composed | |||
| of the authority part of the "coaps+ws" URI and the well-known path | of the authority part of the "coaps+ws" URI and the well-known path | |||
| "/.well-known/coap" [RFC5785]. The path and query parts of a | "/.well-known/coap" [RFC5785]. The path and query parts of a | |||
| "coaps+ws" URI identify a resource within the specified endpoint | "coaps+ws" URI identify a resource within the specified endpoint | |||
| which can be operated on by the methods defined by CoAP. | which can be operated on by the methods defined by CoAP. | |||
| coaps+ws://example.org/sensors/temperature?u=Cel | coaps+ws://example.org/sensors/temperature?u=Cel | |||
| \______ ______/\___________ ___________/ | \______ ______/\___________ ___________/ | |||
| \/ \/ | \/ \/ | |||
| Uri-Path: "sensors" | Uri-Path: "sensors" | |||
| wss://example.org/.well-known/coap Uri-Path: "temperature" | wss://example.org/.well-known/coap Uri-Path: "temperature" | |||
| Uri-Query: "u=Cel" | Uri-Query: "u=Cel" | |||
| Figure 19: The "coaps+ws" URI Scheme | Figure 19: The "coaps+ws" URI Scheme | |||
| Encoding considerations: The scheme encoding conforms to the | Encoding considerations: The scheme encoding conforms to the | |||
| encoding rules established for URIs in [RFC3986]. | encoding rules established for URIs in [RFC3986]. | |||
| Interoperability considerations: None. | Interoperability considerations: None. | |||
| Security considerations: See Section 11.1 of [RFC7252]. | Security considerations: See Section 11.1 of [RFC7252]. | |||
| 6.5. Uri-Host and Uri-Port Options | 7.5. Uri-Host and Uri-Port Options | |||
| CoAP over reliable transports maintains the property from | CoAP over reliable transports maintains the property from | |||
| Section 5.10.1 of [RFC7252]: | Section 5.10.1 of [RFC7252]: | |||
| The default values for the Uri-Host and Uri-Port Options are | The default values for the Uri-Host and Uri-Port Options are | |||
| sufficient for requests to most servers. | sufficient for requests to most servers. | |||
| Unless otherwise noted, the default value of the Uri-Host Option is | Unless otherwise noted, the default value of the Uri-Host Option is | |||
| the IP literal representing the destination IP address of the request | the IP literal representing the destination IP address of the request | |||
| message. The default value of the Uri-Port Option is the destination | message. The default value of the Uri-Port Option is the destination | |||
| skipping to change at page 28, line 34 ¶ | skipping to change at page 28, line 34 ¶ | |||
| For CoAP over TLS, these default values are the same unless Server | For CoAP over TLS, these default values are the same unless Server | |||
| Name Indication (SNI) [RFC6066] is negotiated. In this case, the | Name Indication (SNI) [RFC6066] is negotiated. In this case, the | |||
| default value of the Uri-Host Option in requests from the TLS client | default value of the Uri-Host Option in requests from the TLS client | |||
| to the TLS server is the SNI host. | to the TLS server is the SNI host. | |||
| For CoAP over WebSockets, the default value of the Uri-Host Option in | For CoAP over WebSockets, the default value of the Uri-Host Option in | |||
| requests from the WebSocket client to the WebSocket server is | requests from the WebSocket client to the WebSocket server is | |||
| indicated by the Host header field from the WebSocket handshake. | indicated by the Host header field from the WebSocket handshake. | |||
| 6.6. Decomposing URIs into Options | 7.6. Decomposing URIs into Options | |||
| The steps are the same as specified in Section 6.4 of [RFC7252] with | The steps are the same as specified in Section 6.4 of [RFC7252] with | |||
| the following changes: | minor changes. | |||
| This step from [RFC7252]: | ||||
| 3. If |url| does not have a <scheme> component whose value, when | 3. If |url| does not have a <scheme> component whose value, when | |||
| converted to ASCII lowercase, is "coap" or "coaps", then fail | converted to ASCII lowercase, is "coap" or "coaps", then fail | |||
| this algorithm. | this algorithm. | |||
| If |url| does not have a <scheme> component whose value, when | is updated to: | |||
| converted to ASCII lowercase, is "coap+tcp", "coaps+tcp", "coap+ws", | ||||
| or "coaps+ws" then fail this algorithm. | 3. If |url| does not have a <scheme> component whose value, when | |||
| converted to ASCII lowercase, is "coap+tcp", "coaps+tcp", | ||||
| "coap+ws", or "coaps+ws", then fail this algorithm. | ||||
| This step from [RFC7252]: | ||||
| 7. If |port| does not equal the request's destination UDP port, | 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|. | include a Uri-Port Option and let that option's value be |port|. | |||
| If |port| does not equal the request's destination TCP port, include | is updated to: | |||
| a Uri-Port Option and let that option's value be |port|. | ||||
| 6.7. Composing URIs from Options | 7. If |port| does not equal the request's destination TCP port, | |||
| include a Uri-Port Option and let that option's value be |port|. | ||||
| 7.7. Composing URIs from Options | ||||
| The steps are the same as specified in Section 6.5 of [RFC7252] with | The steps are the same as specified in Section 6.5 of [RFC7252] with | |||
| the following changes: | minor changes. | |||
| This step from [RFC7252]: | ||||
| 1. If the request is secured using DTLS, let |url| be the string | 1. If the request is secured using DTLS, let |url| be the string | |||
| "coaps://". Otherwise, let |url| be the string "coap://". | "coaps://". Otherwise, let |url| be the string "coap://". | |||
| For CoAP over TCP, if the request is secured using TLS, let |url| be | is updated to: | |||
| the string "coaps+tcp://". Otherwise, let |url| be the string | ||||
| "coap+tcp://". For CoAP over WebSockets, if the request is secured | 1. For CoAP over TCP, if the request is secured using TLS, let |url| | |||
| using TLS, let |url| be the string "coaps+ws://". Otherwise, | be the string "coaps+tcp://". Otherwise, let |url| be the string | |||
| let |url| be the string "coap+ws://". | "coap+tcp://". For CoAP over WebSockets, if the request is | |||
| secured using TLS, let |url| be the string "coaps+ws://". | ||||
| Otherwise, let |url| be the string "coap+ws://". | ||||
| This step from [RFC7252]: | ||||
| 4. If the request includes a Uri-Port Option, let |port| be that | 4. If the request includes a Uri-Port Option, let |port| be that | |||
| option's value. Otherwise, let |port| be the request's | option's value. Otherwise, let |port| be the request's | |||
| destination UDP port. | destination UDP port. | |||
| If the request includes a Uri-Port Option, let |port| be that | is updated to: | |||
| option's value. Otherwise, let |port| be the request's destination | ||||
| TCP port. | ||||
| 7. Securing CoAP | 4. If the request includes a Uri-Port Option, let |port| be that | |||
| option's value. Otherwise, let |port| be the request's | ||||
| destination TCP port. | ||||
| 8. Securing CoAP | ||||
| Security Challenges for the Internet of Things [SecurityChallenges] | Security Challenges for the Internet of Things [SecurityChallenges] | |||
| recommends: | recommends: | |||
| ... it is essential that IoT protocol suites specify a mandatory | ... it is essential that IoT protocol suites specify a mandatory | |||
| to implement but optional to use security solution. This will | to implement but optional to use security solution. This will | |||
| ensure security is available in all implementations, but | ensure security is available in all implementations, but | |||
| configurable to use when not necessary (e.g., in closed | configurable to use when not necessary (e.g., in closed | |||
| environment). ... even if those features stretch the capabilities | environment). ... even if those features stretch the capabilities | |||
| of such devices. | of such devices. | |||
| A security solution MUST be implemented to protect CoAP over reliable | A security solution MUST be implemented to protect CoAP over reliable | |||
| transports and MUST be enabled by default. This document defines the | transports and MUST be enabled by default. This document defines the | |||
| TLS binding, but alternative solutions at different layers in the | TLS binding, but alternative solutions at different layers in the | |||
| protocol stack MAY be used to protect CoAP over reliable transports | protocol stack MAY be used to protect CoAP over reliable transports | |||
| when appropriate. Note that there is ongoing work to support a data | when appropriate. Note that there is ongoing work to support a data | |||
| object-based security model for CoAP that is independent of transport | object-based security model for CoAP that is independent of transport | |||
| (see [I-D.ietf-core-object-security]). | (see [I-D.ietf-core-object-security]). | |||
| 7.1. TLS binding for CoAP over TCP | 8.1. TLS binding for CoAP over TCP | |||
| The TLS usage guidance in [RFC7925] applies. | The TLS usage guidance in [RFC7925] applies. | |||
| During the provisioning phase, a CoAP device is provided with the | During the provisioning phase, a CoAP device is provided with the | |||
| security information that it needs, including keying materials, | security information that it needs, including keying materials, | |||
| access control lists, and authorization servers. At the end of the | access control lists, and authorization servers. At the end of the | |||
| provisioning phase, the device will be in one of four security modes: | provisioning phase, the device will be in one of four security modes: | |||
| NoSec: TLS is disabled. | NoSec: TLS is disabled. | |||
| skipping to change at page 30, line 30 ¶ | skipping to change at page 30, line 47 ¶ | |||
| scheme and the TCP CoAP default port. The system is secured only by | scheme and the TCP CoAP default port. The system is secured only by | |||
| keeping attackers from being able to send or receive packets from the | keeping attackers from being able to send or receive packets from the | |||
| network with the CoAP nodes. | network with the CoAP nodes. | |||
| "PreSharedKey", "RawPublicKey", or "Certificate" is mandatory-to- | "PreSharedKey", "RawPublicKey", or "Certificate" is mandatory-to- | |||
| implement for the TLS binding depending on the credential type used | implement for the TLS binding depending on the credential type used | |||
| with the device. These security modes are achieved using TLS and are | with the device. These security modes are achieved using TLS and are | |||
| indicated by the "coaps+tcp" scheme and TLS-secured CoAP default | indicated by the "coaps+tcp" scheme and TLS-secured CoAP default | |||
| port. | port. | |||
| 7.2. TLS usage for CoAP over WebSockets | 8.2. TLS usage for CoAP over WebSockets | |||
| A CoAP client requesting a resource identified by a "coaps+ws" URI | A CoAP client requesting a resource identified by a "coaps+ws" URI | |||
| negotiates a secure WebSocket connection to a WebSocket server | negotiates a secure WebSocket connection to a WebSocket server | |||
| endpoint with a "wss" URI. This is described in Section 6.4. | endpoint with a "wss" URI. This is described in Section 7.4. | |||
| The client MUST perform a TLS handshake after opening the connection | The client MUST perform a TLS handshake after opening the connection | |||
| to the server. The guidance in Section 4.1 of [RFC6455] applies. | to the server. The guidance in Section 4.1 of [RFC6455] applies. | |||
| When a CoAP server exposes resources identified by a "coaps+ws" URI, | When a CoAP server exposes resources identified by a "coaps+ws" URI, | |||
| the guidance in Section 4.4 of [RFC7925] applies towards mandatory- | the guidance in Section 4.4 of [RFC7925] applies towards mandatory- | |||
| to-implement TLS functionality for certificates. For the server-side | to-implement TLS functionality for certificates. For the server-side | |||
| requirements in accepting incoming connections over a HTTPS (HTTP- | requirements in accepting incoming connections over a HTTPS (HTTP- | |||
| over-TLS) port, the guidance in Section 4.2 of [RFC6455] applies. | over-TLS) port, the guidance in Section 4.2 of [RFC6455] applies. | |||
| 8. Security Considerations | 9. Security Considerations | |||
| The security considerations of [RFC7252] apply. For CoAP over | The security considerations of [RFC7252] apply. For CoAP over | |||
| WebSockets and CoAP over TLS-secured WebSockets, the security | WebSockets and CoAP over TLS-secured WebSockets, the security | |||
| considerations of [RFC6455] also apply. | considerations of [RFC6455] also apply. | |||
| 8.1. Signaling Messages | 9.1. Signaling Messages | |||
| o The guidance given by an Alternative-Address Option cannot be | The guidance given by an Alternative-Address Option cannot be | |||
| followed blindly. In particular, a peer MUST NOT assume that a | followed blindly. In particular, a peer MUST NOT assume that a | |||
| successful connection to the Alternative-Address inherits all the | successful connection to the Alternative-Address inherits all the | |||
| security properties of the current connection. | security properties of the current connection. | |||
| 9. IANA Considerations | 10. IANA Considerations | |||
| 9.1. Signaling Codes | 10.1. Signaling Codes | |||
| IANA is requested to create a third sub-registry for values of the | IANA is requested to create a third sub-registry for values of the | |||
| Code field in the CoAP header (Section 12.1 of [RFC7252]). The name | Code field in the CoAP header (Section 12.1 of [RFC7252]). The name | |||
| of this sub-registry is "CoAP Signaling Codes". | of this sub-registry is "CoAP Signaling Codes". | |||
| Each entry in the sub-registry must include the Signaling Code in the | Each entry in the sub-registry must include the Signaling Code in the | |||
| range 7.00-7.31, its name, and a reference to its documentation. | range 7.00-7.31, its name, and a reference to its documentation. | |||
| Initial entries in this sub-registry are as follows: | Initial entries in this sub-registry are as follows: | |||
| skipping to change at page 31, line 46 ¶ | skipping to change at page 32, line 26 ¶ | |||
| | 7.05 | Abort | [RFCthis] | | | 7.05 | Abort | [RFCthis] | | |||
| +------+---------+-----------+ | +------+---------+-----------+ | |||
| Table 1: CoAP Signal Codes | Table 1: CoAP Signal Codes | |||
| All other Signaling Codes are Unassigned. | All other Signaling Codes are Unassigned. | |||
| The IANA policy for future additions to this sub-registry is "IETF | The IANA policy for future additions to this sub-registry is "IETF | |||
| Review or IESG Approval" as described in [RFC5226]. | Review or IESG Approval" as described in [RFC5226]. | |||
| 9.2. CoAP Signaling Option Numbers Registry | 10.2. CoAP Signaling Option Numbers Registry | |||
| IANA is requested to create a sub-registry for Options Numbers used | IANA is requested to create a sub-registry for Options Numbers used | |||
| in CoAP signaling options within the "CoRE Parameters" registry. The | in CoAP signaling options within the "CoRE Parameters" registry. The | |||
| name of this sub-registry is "CoAP Signaling Option Numbers". | name of this sub-registry is "CoAP Signaling Option Numbers". | |||
| Each entry in the sub-registry must include one or more of the codes | Each entry in the sub-registry must include one or more of the codes | |||
| in the Signaling Codes subregistry (Section 9.1), the option number, | in the Signaling Codes subregistry (Section 10.1), the option number, | |||
| the name of the option, and a reference to the option's | the name of the option, and a reference to the option's | |||
| documentation. | documentation. | |||
| Initial entries in this sub-registry are as follows: | Initial entries in this sub-registry are as follows: | |||
| +------------+--------+---------------------+-----------+ | +------------+--------+---------------------+-----------+ | |||
| | Applies to | Number | Name | Reference | | | Applies to | Number | Name | Reference | | |||
| +------------+--------+---------------------+-----------+ | +------------+--------+---------------------+-----------+ | |||
| | 7.01 | 2 | Max-Message-Size | [RFCthis] | | | 7.01 | 2 | Max-Message-Size | [RFCthis] | | |||
| | | | | | | | | | | | | |||
| skipping to change at page 32, line 47 ¶ | skipping to change at page 33, line 40 ¶ | |||
| o Whether the option is critical or elective, as determined by the | o Whether the option is critical or elective, as determined by the | |||
| Option Number. | Option Number. | |||
| o Whether the option is repeatable. | o Whether the option is repeatable. | |||
| o The format and length of the option's value. | o The format and length of the option's value. | |||
| o The base value for the option, if any. | o The base value for the option, if any. | |||
| 9.3. Service Name and Port Number Registration | 10.3. Service Name and Port Number Registration | |||
| IANA is requested to assign the port number 5683 and the service name | IANA is requested to assign the port number 5683 and the service name | |||
| "coap+tcp", in accordance with [RFC6335]. | "coap+tcp", in accordance with [RFC6335]. | |||
| Service Name. | Service Name. | |||
| coap+tcp | coap+tcp | |||
| Transport Protocol. | Transport Protocol. | |||
| tcp | tcp | |||
| Assignee. | Assignee. | |||
| IESG <iesg@ietf.org> | IESG <iesg@ietf.org> | |||
| Contact. | Contact. | |||
| IETF Chair <chair@ietf.org> | IETF Chair <chair@ietf.org> | |||
| Description. | Description. | |||
| Constrained Application Protocol (CoAP) | Constrained Application Protocol (CoAP) | |||
| Reference. | Reference. | |||
| [RFCthis] | [RFCthis] | |||
| Port Number. | Port Number. | |||
| 5683 | 5683 | |||
| 9.4. Secure Service Name and Port Number Registration | 10.4. Secure Service Name and Port Number Registration | |||
| IANA is requested to assign the port number 5684 and the service name | IANA is requested to assign the port number 5684 and the service name | |||
| "coaps+tcp", in accordance with [RFC6335]. The port number is | "coaps+tcp", in accordance with [RFC6335]. The port number is | |||
| requested to address the exceptional case of TLS implementations that | requested to address the exceptional case of TLS implementations that | |||
| do not support the "Application-Layer Protocol Negotiation Extension" | do not support the "Application-Layer Protocol Negotiation Extension" | |||
| [RFC7301]. | [RFC7301]. | |||
| Service Name. | Service Name. | |||
| coaps+tcp | coaps+tcp | |||
| skipping to change at page 34, line 5 ¶ | skipping to change at page 34, line 46 ¶ | |||
| Description. | Description. | |||
| Constrained Application Protocol (CoAP) | Constrained Application Protocol (CoAP) | |||
| Reference. | Reference. | |||
| [RFC7301], [RFCthis] | [RFC7301], [RFCthis] | |||
| Port Number. | Port Number. | |||
| 5684 | 5684 | |||
| 9.5. URI Scheme Registration | 10.5. URI Scheme Registration | |||
| URI schemes are registered within the "Uniform Resource Identifier | URI schemes are registered within the "Uniform Resource Identifier | |||
| (URI) Schemes" registry maintained at | (URI) Schemes" registry maintained at | |||
| http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml . | http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml . | |||
| 9.5.1. coap+tcp | 10.5.1. coap+tcp | |||
| IANA is requested to register the Uniform Resource Identifier (URI) | IANA is requested to register the Uniform Resource Identifier (URI) | |||
| scheme "coap+tcp". This registration request complies with | scheme "coap+tcp". This registration request complies with | |||
| [RFC7595]. | [RFC7595]. | |||
| Scheme name: | Scheme name: | |||
| coap+tcp | coap+tcp | |||
| Status: | Status: | |||
| Permanent | Permanent | |||
| skipping to change at page 34, line 34 ¶ | skipping to change at page 35, line 28 ¶ | |||
| The scheme is used by CoAP endpoints to access CoAP resources | The scheme is used by CoAP endpoints to access CoAP resources | |||
| using TCP. | using TCP. | |||
| Contact: | Contact: | |||
| IETF chair <chair@ietf.org> | IETF chair <chair@ietf.org> | |||
| Change controller: | Change controller: | |||
| IESG <iesg@ietf.org> | IESG <iesg@ietf.org> | |||
| Reference: | Reference: | |||
| Section 6.1 in [RFCthis] | Section 7.1 in [RFCthis] | |||
| 9.5.2. coaps+tcp | 10.5.2. coaps+tcp | |||
| IANA is requested to register the Uniform Resource Identifier (URI) | IANA is requested to register the Uniform Resource Identifier (URI) | |||
| scheme "coaps+tcp". This registration request complies with | scheme "coaps+tcp". This registration request complies with | |||
| [RFC7595]. | [RFC7595]. | |||
| Scheme name: | Scheme name: | |||
| coaps+tcp | coaps+tcp | |||
| Status: | Status: | |||
| Permanent | Permanent | |||
| skipping to change at page 35, line 4 ¶ | skipping to change at page 35, line 47 ¶ | |||
| coaps+tcp | coaps+tcp | |||
| Status: | Status: | |||
| Permanent | Permanent | |||
| Applications/protocols that use this scheme name: | Applications/protocols that use this scheme name: | |||
| The scheme is used by CoAP endpoints to access CoAP resources | The scheme is used by CoAP endpoints to access CoAP resources | |||
| using TLS. | using TLS. | |||
| Contact: | Contact: | |||
| IETF chair <chair@ietf.org> | IETF chair <chair@ietf.org> | |||
| Change controller: | Change controller: | |||
| IESG <iesg@ietf.org> | IESG <iesg@ietf.org> | |||
| Reference: | Reference: | |||
| Section 6.2 in [RFCthis] | ||||
| 9.5.3. coap+ws | Section 7.2 in [RFCthis] | |||
| 10.5.3. coap+ws | ||||
| IANA is requested to register the Uniform Resource Identifier (URI) | IANA is requested to register the Uniform Resource Identifier (URI) | |||
| scheme "coap+ws". This registration request complies with [RFC7595]. | scheme "coap+ws". This registration request complies with [RFC7595]. | |||
| Scheme name: | Scheme name: | |||
| coap+ws | coap+ws | |||
| Status: | Status: | |||
| Permanent | Permanent | |||
| skipping to change at page 35, line 35 ¶ | skipping to change at page 36, line 29 ¶ | |||
| The scheme is used by CoAP endpoints to access CoAP resources | The scheme is used by CoAP endpoints to access CoAP resources | |||
| using the WebSocket protocol. | using the WebSocket protocol. | |||
| Contact: | Contact: | |||
| IETF chair <chair@ietf.org> | IETF chair <chair@ietf.org> | |||
| Change controller: | Change controller: | |||
| IESG <iesg@ietf.org> | IESG <iesg@ietf.org> | |||
| Reference: | Reference: | |||
| Section 6.3 in [RFCthis] | Section 7.3 in [RFCthis] | |||
| 9.5.4. coaps+ws | 10.5.4. coaps+ws | |||
| IANA is requested to register the Uniform Resource Identifier (URI) | IANA is requested to register the Uniform Resource Identifier (URI) | |||
| scheme "coaps+ws". This registration request complies with | scheme "coaps+ws". This registration request complies with | |||
| [RFC7595]. | [RFC7595]. | |||
| Scheme name: | Scheme name: | |||
| coaps+ws | coaps+ws | |||
| Status: | Status: | |||
| Permanent | Permanent | |||
| skipping to change at page 36, line 12 ¶ | skipping to change at page 37, line 6 ¶ | |||
| The scheme is used by CoAP endpoints to access CoAP resources | The scheme is used by CoAP endpoints to access CoAP resources | |||
| using the WebSocket protocol secured with TLS. | using the WebSocket protocol secured with TLS. | |||
| Contact: | Contact: | |||
| IETF chair <chair@ietf.org> | IETF chair <chair@ietf.org> | |||
| Change controller: | Change controller: | |||
| IESG <iesg@ietf.org> | IESG <iesg@ietf.org> | |||
| References: | References: | |||
| Section 6.4 in [RFCthis] | Section 7.4 in [RFCthis] | |||
| 9.6. Well-Known URI Suffix Registration | 10.6. Well-Known URI Suffix Registration | |||
| IANA is requested to register the 'coap' well-known URI in the "Well- | IANA is requested to register the 'coap' well-known URI in the "Well- | |||
| Known URIs" registry. This registration request complies with | Known URIs" registry. This registration request complies with | |||
| [RFC5785]: | [RFC5785]: | |||
| URI Suffix. | URI Suffix. | |||
| coap | coap | |||
| Change controller. | Change controller. | |||
| IETF | IETF | |||
| Specification document(s). | Specification document(s). | |||
| [RFCthis] | [RFCthis] | |||
| Related information. | Related information. | |||
| None. | None. | |||
| 9.7. ALPN Protocol Identifier | 10.7. ALPN Protocol Identifier | |||
| IANA is requested to assign the following value in the registry | IANA is requested to assign the following value in the registry | |||
| "Application Layer Protocol Negotiation (ALPN) Protocol IDs" created | "Application Layer Protocol Negotiation (ALPN) Protocol IDs" created | |||
| by [RFC7301]. The "coap" string identifies CoAP when used over TLS. | by [RFC7301]. The "coap" string identifies CoAP when used over TLS. | |||
| Protocol. | Protocol. | |||
| CoAP | CoAP | |||
| Identification Sequence. | Identification Sequence. | |||
| 0x63 0x6f 0x61 0x70 ("coap") | 0x63 0x6f 0x61 0x70 ("coap") | |||
| Reference. | Reference. | |||
| [RFCthis] | [RFCthis] | |||
| 9.8. WebSocket Subprotocol Registration | 10.8. WebSocket Subprotocol Registration | |||
| IANA is requested to register the WebSocket CoAP subprotocol under | IANA is requested to register the WebSocket CoAP subprotocol under | |||
| the "WebSocket Subprotocol Name Registry": | the "WebSocket Subprotocol Name Registry": | |||
| Subprotocol Identifier. | Subprotocol Identifier. | |||
| coap | coap | |||
| Subprotocol Common Name. | Subprotocol Common Name. | |||
| Constrained Application Protocol (CoAP) | Constrained Application Protocol (CoAP) | |||
| Subprotocol Definition. | Subprotocol Definition. | |||
| [RFCthis] | [RFCthis] | |||
| 10. References | 11. References | |||
| 10.1. Normative References | 11.1. Normative References | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <http://www.rfc-editor.org/info/rfc793>. | <http://www.rfc-editor.org/info/rfc793>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <http://www.rfc-editor.org/info/rfc2119>. | <http://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 38, line 35 ¶ | skipping to change at page 39, line 26 ¶ | |||
| Application Protocol (CoAP)", RFC 7641, | Application Protocol (CoAP)", RFC 7641, | |||
| DOI 10.17487/RFC7641, September 2015, | DOI 10.17487/RFC7641, September 2015, | |||
| <http://www.rfc-editor.org/info/rfc7641>. | <http://www.rfc-editor.org/info/rfc7641>. | |||
| [RFC7925] Tschofenig, H., Ed. and T. Fossati, "Transport Layer | [RFC7925] Tschofenig, H., Ed. and T. Fossati, "Transport Layer | |||
| Security (TLS) / Datagram Transport Layer Security (DTLS) | Security (TLS) / Datagram Transport Layer Security (DTLS) | |||
| Profiles for the Internet of Things", RFC 7925, | Profiles for the Internet of Things", RFC 7925, | |||
| DOI 10.17487/RFC7925, July 2016, | DOI 10.17487/RFC7925, July 2016, | |||
| <http://www.rfc-editor.org/info/rfc7925>. | <http://www.rfc-editor.org/info/rfc7925>. | |||
| 10.2. Informative References | 11.2. Informative References | |||
| [HomeGateway] | [HomeGateway] | |||
| Eggert, L., "An experimental study of home gateway | Eggert, L., "An experimental study of home gateway | |||
| characteristics", Proceedings of the 10th annual | characteristics", Proceedings of the 10th annual | |||
| conference on Internet measurement , 2010. | conference on Internet measurement , 2010. | |||
| [I-D.ietf-core-cocoa] | [I-D.ietf-core-cocoa] | |||
| Bormann, C., Betzler, A., Gomez, C., and I. Demirkol, | Bormann, C., Betzler, A., Gomez, C., and I. Demirkol, | |||
| "CoAP Simple Congestion Control/Advanced", draft-ietf- | "CoAP Simple Congestion Control/Advanced", draft-ietf- | |||
| core-cocoa-00 (work in progress), October 2016. | core-cocoa-00 (work in progress), October 2016. | |||
| skipping to change at page 39, line 31 ¶ | skipping to change at page 40, line 21 ¶ | |||
| Cheshire, "Internet Assigned Numbers Authority (IANA) | Cheshire, "Internet Assigned Numbers Authority (IANA) | |||
| Procedures for the Management of the Service Name and | Procedures for the Management of the Service Name and | |||
| Transport Protocol Port Number Registry", BCP 165, | Transport Protocol Port Number Registry", BCP 165, | |||
| RFC 6335, DOI 10.17487/RFC6335, August 2011, | RFC 6335, DOI 10.17487/RFC6335, August 2011, | |||
| <http://www.rfc-editor.org/info/rfc6335>. | <http://www.rfc-editor.org/info/rfc6335>. | |||
| [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer | [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer | |||
| Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, | Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, | |||
| January 2012, <http://www.rfc-editor.org/info/rfc6347>. | January 2012, <http://www.rfc-editor.org/info/rfc6347>. | |||
| [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | ||||
| DOI 10.17487/RFC6454, December 2011, | ||||
| <http://www.rfc-editor.org/info/rfc6454>. | ||||
| [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
| <http://www.rfc-editor.org/info/rfc7230>. | <http://www.rfc-editor.org/info/rfc7230>. | |||
| [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in | [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in | |||
| the Constrained Application Protocol (CoAP)", RFC 7959, | the Constrained Application Protocol (CoAP)", RFC 7959, | |||
| DOI 10.17487/RFC7959, August 2016, | DOI 10.17487/RFC7959, August 2016, | |||
| <http://www.rfc-editor.org/info/rfc7959>. | <http://www.rfc-editor.org/info/rfc7959>. | |||
| [SecurityChallenges] | [SecurityChallenges] | |||
| Polk, T. and S. Turner, "Security Challenges for the | Polk, T. and S. Turner, "Security Challenges for the | |||
| Internet of Things", Interconnecting Smart Objects with | Internet of Things", Interconnecting Smart Objects with | |||
| the Internet / IAB Workshop , February 2011, | the Internet / IAB Workshop , February 2011, | |||
| <http://www.iab.org/wp-content/IAB-uploads/2011/03/ | <http://www.iab.org/wp-content/IAB-uploads/2011/03/ | |||
| Turner.pdf>. | Turner.pdf>. | |||
| Appendix A. Updates to RFC7641 Observing Resources in the Constrained | Appendix A. Updates to RFC 7641 Observing Resources in the Constrained | |||
| Application Protocol (CoAP) | Application Protocol (CoAP) | |||
| In this appendix, "client" and "server" refer to the CoAP client and | In this appendix, "client" and "server" refer to the CoAP client and | |||
| CoAP server. | CoAP server. | |||
| A.1. Notifications and Reordering | A.1. Notifications and Reordering | |||
| When using the Observe Option with CoAP over UDP, notifications from | When using the Observe Option with CoAP over UDP, notifications from | |||
| the server set the option value to an increasing sequence number for | the server set the option value to an increasing sequence number for | |||
| reordering detection on the client since messages can arrive in a | reordering detection on the client since messages can arrive in a | |||
| skipping to change at page 40, line 38 ¶ | skipping to change at page 41, line 23 ¶ | |||
| alive and wishes to receive further notifications. A reset message | alive and wishes to receive further notifications. A reset message | |||
| indicates that the client does not recognize the token which causes | indicates that the client does not recognize the token which causes | |||
| the server to remove the associated entry from the list of observers. | the server to remove the associated entry from the list of observers. | |||
| Since TCP eliminates the need for the message layer to support | Since TCP eliminates the need for the message layer to support | |||
| reliability, CoAP over reliable transports does not support | reliability, CoAP over reliable transports does not support | |||
| confirmable or non-confirmable message types. All notifications are | confirmable or non-confirmable message types. All notifications are | |||
| delivered reliably to the client with positive acknowledgement of | delivered reliably to the client with positive acknowledgement of | |||
| receipt occurring at the TCP level. If the client does not recognize | receipt occurring at the TCP level. If the client does not recognize | |||
| the token in a notification, it MAY immediately abort the connection | the token in a notification, it MAY immediately abort the connection | |||
| (see Section 4.6). | (see Section 5.6). | |||
| A.3. Freshness | A.3. Freshness | |||
| For CoAP over UDP, if a client does not receive a notification for | For CoAP over UDP, if a client does not receive a notification for | |||
| some time, it MAY send a new GET request with the same token as the | some time, it MAY send a new GET request with the same token as the | |||
| original request to re-register its interest in a resource and verify | original request to re-register its interest in a resource and verify | |||
| that the server is still responsive. For CoAP over reliable | that the server is still responsive. For CoAP over reliable | |||
| transports, it is more efficient to check the health of the | transports, it is more efficient to check the health of the | |||
| connection (and all its active observations) by sending a CoAP Ping | connection (and all its active observations) by sending a CoAP Ping | |||
| Signaling message (Section 4.4) rather than individual requests to | Signaling message (Section 5.4) rather than individual requests to | |||
| confirm active observations. | confirm active observations. | |||
| A.4. Cancellation | A.4. Cancellation | |||
| For CoAP over UDP, a client that is no longer interested in receiving | For CoAP over UDP, a client that is no longer interested in receiving | |||
| notifications can "forget" the observation and respond to the next | notifications can "forget" the observation and respond to the next | |||
| notification from the server with a reset message to cancel the | notification from the server with a reset message to cancel the | |||
| observation. | observation. | |||
| For CoAP over reliable transports, a client MUST explicitly | For CoAP over reliable transports, a client MUST explicitly | |||
| skipping to change at page 41, line 26 ¶ | skipping to change at page 42, line 10 ¶ | |||
| If the client observes one or more resources over a reliable | If the client observes one or more resources over a reliable | |||
| transport, then the CoAP server (or intermediary in the role of the | transport, then the CoAP server (or intermediary in the role of the | |||
| CoAP server) MUST remove all entries associated with the client | CoAP server) MUST remove all entries associated with the client | |||
| endpoint from the lists of observers when the connection is either | endpoint from the lists of observers when the connection is either | |||
| closed or times out. | closed or times out. | |||
| Appendix B. CoAP over WebSocket Examples | Appendix B. CoAP over WebSocket Examples | |||
| This section gives examples for the first two configurations | This section gives examples for the first two configurations | |||
| discussed in Section 3. | discussed in Section 4. | |||
| An example of the process followed by a CoAP client to retrieve the | An example of the process followed by a CoAP client to retrieve the | |||
| representation of a resource identified by a "coap+ws" URI might be | representation of a resource identified by a "coap+ws" URI might be | |||
| as follows. Figure 20 below illustrates the WebSocket and CoAP | as follows. Figure 20 below illustrates the WebSocket and CoAP | |||
| messages exchanged in detail. | messages exchanged in detail. | |||
| 1. The CoAP client obtains the URI <coap+ws://example.org/sensors/ | 1. The CoAP client obtains the URI <coap+ws://example.org/sensors/ | |||
| temperature?u=Cel>, for example, from a resource representation | temperature?u=Cel>, for example, from a resource representation | |||
| that it retrieved previously. | that it retrieved previously. | |||
| skipping to change at page 43, line 7 ¶ | skipping to change at page 44, line 7 ¶ | |||
| +--------->| Close frame (opcode=%x8, FIN=1, MASK=1) | +--------->| Close frame (opcode=%x8, FIN=1, MASK=1) | |||
| | | | | | | |||
| |<---------+ Close frame (opcode=%x8, FIN=1, MASK=0) | |<---------+ Close frame (opcode=%x8, FIN=1, MASK=0) | |||
| | | | | | | |||
| Figure 20: A CoAP client retrieves the representation of a resource | Figure 20: A CoAP client retrieves the representation of a resource | |||
| identified by a "coap+ws" URI | identified by a "coap+ws" URI | |||
| Figure 21 shows how a CoAP client uses a CoAP forward proxy with a | Figure 21 shows how a CoAP client uses a CoAP forward proxy with a | |||
| WebSocket endpoint to retrieve the representation of the resource | WebSocket endpoint to retrieve the representation of the resource | |||
| "coap://[2001:DB8::1]/". The use of the forward proxy and the | "coap://[2001:db8::1]/". The use of the forward proxy and the | |||
| address of the WebSocket endpoint are determined by the client from | address of the WebSocket endpoint are determined by the client from | |||
| local configuration rules. The request URI is specified in the | local configuration rules. The request URI is specified in the | |||
| Proxy-Uri Option. Since the request URI uses the "coap" URI scheme, | Proxy-Uri Option. Since the request URI uses the "coap" URI scheme, | |||
| the proxy fulfills the request by issuing a Confirmable GET request | the proxy fulfills the request by issuing a Confirmable GET request | |||
| over UDP to the CoAP server and returning the response over the | over UDP to the CoAP server and returning the response over the | |||
| WebSocket connection to the client. | WebSocket connection to the client. | |||
| CoAP CoAP CoAP | CoAP CoAP CoAP | |||
| Client Proxy Server | Client Proxy Server | |||
| (WebSocket (WebSocket (UDP | (WebSocket (WebSocket (UDP | |||
| Client) Server) Endpoint) | Client) Server) Endpoint) | |||
| | | | | | | | | |||
| +--------->| | Binary frame (opcode=%x2, FIN=1, MASK=1) | +--------->| | Binary frame (opcode=%x2, FIN=1, MASK=1) | |||
| | | | +------------------------------------+ | | | | +------------------------------------+ | |||
| | | | | GET | | | | | | GET | | |||
| | | | | Token: 0x7d | | | | | | Token: 0x7d | | |||
| | | | | Proxy-Uri: "coap://[2001:DB8::1]/" | | | | | | Proxy-Uri: "coap://[2001:db8::1]/" | | |||
| | | | +------------------------------------+ | | | | +------------------------------------+ | |||
| | | | | | | | | |||
| | +--------->| CoAP message (Ver=1, T=Con, MID=0x8f54) | | +--------->| CoAP message (Ver=1, T=Con, MID=0x8f54) | |||
| | | | +------------------------------------+ | | | | +------------------------------------+ | |||
| | | | | GET | | | | | | GET | | |||
| | | | | Token: 0x0a15 | | | | | | Token: 0x0a15 | | |||
| | | | +------------------------------------+ | | | | +------------------------------------+ | |||
| | | | | | | | | |||
| | |<---------+ CoAP message (Ver=1, T=Ack, MID=0x8f54) | | |<---------+ CoAP message (Ver=1, T=Ack, MID=0x8f54) | |||
| | | | +------------------------------------+ | | | | +------------------------------------+ | |||
| skipping to change at page 44, line 9 ¶ | skipping to change at page 45, line 9 ¶ | |||
| | | | +------------------------------------+ | | | | +------------------------------------+ | |||
| | | | | | | | | |||
| Figure 21: A CoAP client retrieves the representation of a resource | Figure 21: A CoAP client retrieves the representation of a resource | |||
| identified by a "coap" URI via a WebSockets-enabled CoAP proxy | identified by a "coap" URI via a WebSockets-enabled CoAP proxy | |||
| Appendix C. Change Log | Appendix C. Change Log | |||
| The RFC Editor is requested to remove this section at publication. | The RFC Editor is requested to remove this section at publication. | |||
| C.1. Since draft-core-coap-tcp-tls-02 | C.1. Since draft-ietf-core-coap-tcp-tls-02 | |||
| Merged draft-savolainen-core-coap-websockets-07 Merged draft-bormann- | Merged draft-savolainen-core-coap-websockets-07 Merged draft-bormann- | |||
| core-block-bert-01 Merged draft-bormann-core-coap-sig-02 | core-block-bert-01 Merged draft-bormann-core-coap-sig-02 | |||
| C.2. Since draft-core-coap-tcp-tls-03 | C.2. Since draft-ietf-core-coap-tcp-tls-03 | |||
| Editorial updates | Editorial updates | |||
| Added mandatory exchange of Capabilities and Settings messages after | Added mandatory exchange of Capabilities and Settings messages after | |||
| connecting | connecting | |||
| Added support for coaps+tcp port 5684 and more details on | Added support for coaps+tcp port 5684 and more details on | |||
| Application-Layer Protocol Negotiation (ALPN) | Application-Layer Protocol Negotiation (ALPN) | |||
| Added guidance on CoAP Signaling Ping-Pong versus WebSocket Ping-Pong | Added guidance on CoAP Signaling Ping-Pong versus WebSocket Ping-Pong | |||
| Updated references and requirements for TLS security considerations | Updated references and requirements for TLS security considerations | |||
| C.3. Since draft-core-coap-tcp-tls-04 | C.3. Since draft-ietf-core-coap-tcp-tls-04 | |||
| Updated references | Updated references | |||
| Added Appendix: Updates to RFC7641 Observing Resources in the | Added Appendix: Updates to RFC7641 Observing Resources in the | |||
| Constrained Application Protocol (CoAP) | Constrained Application Protocol (CoAP) | |||
| Updated Capability and Settings Message (CSM) exchange in the Opening | Updated Capability and Settings Message (CSM) exchange in the Opening | |||
| Handshake to allow initiator to send messages before receiving | Handshake to allow initiator to send messages before receiving | |||
| acceptor CSM | acceptor CSM | |||
| C.4. Since draft-core-coap-tcp-tls-05 | C.4. Since draft-ietf-core-coap-tcp-tls-05 | |||
| Addressed feedback from Working Group Last Call | Addressed feedback from Working Group Last Call | |||
| Added Securing CoAP section and informative reference to OSCOAP | Added Securing CoAP section and informative reference to OSCOAP | |||
| Removed the Server-Name and Bad-Server-Name Options | Removed the Server-Name and Bad-Server-Name Options | |||
| Clarified the Capability and Settings Message (CSM) exchange | Clarified the Capability and Settings Message (CSM) exchange | |||
| Updated Pong response requirements | Updated Pong response requirements | |||
| Added Connection Initiator and Connection Acceptor terminology where | Added Connection Initiator and Connection Acceptor terminology where | |||
| appropriate | appropriate | |||
| Updated LWM2M 1.0 informative reference | Updated LWM2M 1.0 informative reference | |||
| C.5. Since draft-ietf-core-coap-tcp-tls-06 | ||||
| Addressed feedback from second Working Group Last Call | ||||
| Acknowledgements | Acknowledgements | |||
| We would like to thank Stephen Berard, Geoffrey Cristallo, Olivier | We would like to thank Stephen Berard, Geoffrey Cristallo, Olivier | |||
| Delaby, Christian Groves, Nadir Javed, Michael Koster, Matthias | Delaby, Esko Dijk, Christian Groves, Nadir Javed, Michael Koster, | |||
| Kovatsch, Achim Kraus, David Navarro, Szymon Sasin, Goran Selander, | Matthias Kovatsch, Achim Kraus, David Navarro, Szymon Sasin, Goran | |||
| Zach Shelby, Andrew Summers, Julien Vermillard, and Gengyu Wei for | Selander, Zach Shelby, Andrew Summers, Julien Vermillard, and Gengyu | |||
| their feedback. | Wei for their feedback. | |||
| Contributors | Contributors | |||
| Matthias Kovatsch | Matthias Kovatsch | |||
| Siemens AG | Siemens AG | |||
| Otto-Hahn-Ring 6 | Otto-Hahn-Ring 6 | |||
| Munich D-81739 | Munich D-81739 | |||
| Phone: +49-173-5288856 | Phone: +49-173-5288856 | |||
| EMail: matthias.kovatsch@siemens.com | EMail: matthias.kovatsch@siemens.com | |||
| End of changes. 137 change blocks. | ||||
| 234 lines changed or deleted | 260 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||