diff options
Diffstat (limited to 'doc/rfc/rfc8323.txt')
| -rw-r--r-- | doc/rfc/rfc8323.txt | 3027 | 
1 files changed, 3027 insertions, 0 deletions
| diff --git a/doc/rfc/rfc8323.txt b/doc/rfc/rfc8323.txt new file mode 100644 index 0000000..e64612a --- /dev/null +++ b/doc/rfc/rfc8323.txt @@ -0,0 +1,3027 @@ + + + + + + +Internet Engineering Task Force (IETF)                        C. Bormann +Request for Comments: 8323                       Universitaet Bremen TZI +Updates: 7641, 7959                                             S. Lemay +Category: Standards Track                             Zebra Technologies +ISSN: 2070-1721                                            H. Tschofenig +                                                                ARM Ltd. +                                                               K. Hartke +                                                 Universitaet Bremen TZI +                                                           B. Silverajan +                                        Tampere University of Technology +                                                          B. Raymor, Ed. +                                                           February 2018 + + + CoAP (Constrained Application Protocol) over TCP, TLS, and WebSockets + +Abstract + +   The Constrained Application Protocol (CoAP), although inspired by +   HTTP, was designed to use UDP instead of TCP.  The message layer of +   CoAP over UDP includes support for reliable delivery, simple +   congestion control, and flow control. + +   Some environments benefit from the availability of CoAP carried over +   reliable transports such as TCP or Transport Layer Security (TLS). +   This document outlines the changes required to use CoAP over TCP, +   TLS, and WebSockets transports.  It also formally updates RFC 7641 +   for use with these transports and RFC 7959 to enable the use of +   larger messages over a reliable transport. + +Status of This Memo + +   This is an Internet Standards Track document. + +   This document is a product of the Internet Engineering Task Force +   (IETF).  It represents the consensus of the IETF community.  It has +   received public review and has been approved for publication by the +   Internet Engineering Steering Group (IESG).  Further information on +   Internet Standards is available in Section 2 of RFC 7841. + +   Information about the current status of this document, any errata, +   and how to provide feedback on it may be obtained at +   https://www.rfc-editor.org/info/rfc8323. + + + + + + + + +Bormann, et al.              Standards Track                    [Page 1] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +Copyright Notice + +   Copyright (c) 2018 IETF Trust and the persons identified as the +   document authors.  All rights reserved. + +   This document is subject to BCP 78 and the IETF Trust's Legal +   Provisions Relating to IETF Documents +   (https://trustee.ietf.org/license-info) in effect on the date of +   publication of this document.  Please review these documents +   carefully, as they describe your rights and restrictions with respect +   to this document.  Code Components extracted from this document must +   include Simplified BSD License text as described in Section 4.e of +   the Trust Legal Provisions and are provided without warranty as +   described in the Simplified BSD License. + +Table of Contents + +   1. Introduction ....................................................3 +   2. Conventions and Terminology .....................................6 +   3. CoAP over TCP ...................................................7 +      3.1. Messaging Model ............................................7 +      3.2. Message Format .............................................9 +      3.3. Message Transmission ......................................11 +      3.4. Connection Health .........................................12 +   4. CoAP over WebSockets ...........................................13 +      4.1. Opening Handshake .........................................15 +      4.2. Message Format ............................................15 +      4.3. Message Transmission ......................................16 +      4.4. Connection Health .........................................17 +   5. Signaling ......................................................17 +      5.1. Signaling Codes ...........................................17 +      5.2. Signaling Option Numbers ..................................18 +      5.3. Capabilities and Settings Messages (CSMs) .................18 +      5.4. Ping and Pong Messages ....................................20 +      5.5. Release Messages ..........................................21 +      5.6. Abort Messages ............................................23 +      5.7. Signaling Examples ........................................24 +   6. Block-Wise Transfer and Reliable Transports ....................25 +      6.1. Example: GET with BERT Blocks .............................27 +      6.2. Example: PUT with BERT Blocks .............................27 +   7. Observing Resources over Reliable Transports ...................28 +      7.1. Notifications and Reordering ..............................28 +      7.2. Transmission and Acknowledgments ..........................28 +      7.3. Freshness .................................................28 +      7.4. Cancellation ..............................................29 + + + + + + +Bormann, et al.              Standards Track                    [Page 2] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   8. CoAP over Reliable Transport URIs ..............................29 +      8.1. coap+tcp URI Scheme .......................................30 +      8.2. coaps+tcp URI Scheme ......................................31 +      8.3. coap+ws URI Scheme ........................................32 +      8.4. coaps+ws URI Scheme .......................................33 +      8.5. Uri-Host and Uri-Port Options .............................33 +      8.6. Decomposing URIs into Options .............................34 +      8.7. Composing URIs from Options ...............................35 +   9. Securing CoAP ..................................................35 +      9.1. TLS Binding for CoAP over TCP .............................36 +      9.2. TLS Usage for CoAP over WebSockets ........................37 +   10. Security Considerations .......................................37 +      10.1. Signaling Messages .......................................37 +   11. IANA Considerations ...........................................38 +      11.1. Signaling Codes ..........................................38 +      11.2. CoAP Signaling Option Numbers Registry ...................38 +      11.3. Service Name and Port Number Registration ................40 +      11.4. Secure Service Name and Port Number Registration .........40 +      11.5. URI Scheme Registration ..................................41 +      11.6. Well-Known URI Suffix Registration .......................43 +      11.7. ALPN Protocol Identifier .................................44 +      11.8. WebSocket Subprotocol Registration .......................44 +      11.9. CoAP Option Numbers Registry .............................44 +   12. References ....................................................45 +      12.1. Normative References .....................................45 +      12.2. Informative References ...................................47 +   Appendix A. Examples of CoAP over WebSockets ......................49 +   Acknowledgments ...................................................52 +   Contributors ......................................................52 +   Authors' Addresses ................................................53 + +1.  Introduction + +   The Constrained Application Protocol (CoAP) [RFC7252] was designed +   for Internet of Things (IoT) deployments, assuming that UDP [RFC768] +   can be used unimpeded as can the Datagram Transport Layer Security +   (DTLS) protocol [RFC6347] over UDP.  The use of CoAP over UDP is +   focused on simplicity, has a low code footprint, and has a small +   over-the-wire message size. + +   The primary reason for introducing CoAP over TCP [RFC793] and TLS +   [RFC5246] is that some networks do not forward UDP packets.  Complete +   blocking of UDP happens in between about 2% and 4% of terrestrial +   access networks, according to [EK2016].  UDP impairment is especially +   concentrated in enterprise networks and networks in geographic +   regions with otherwise challenged connectivity.  Some networks also + + + + + +Bormann, et al.              Standards Track                    [Page 3] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   rate-limit UDP traffic, as reported in [BK2015], and deployment +   investigations related to the standardization of Quick UDP Internet +   Connections (QUIC) revealed numbers around 0.3% [SW2016]. + +   The introduction of CoAP over TCP also leads to some additional +   effects that may be desirable in a specific deployment: + +   o  Where NATs are present along the communication path, CoAP over TCP +      leads to different NAT traversal behavior than CoAP over UDP. +      NATs often calculate expiration timers based on the +      transport-layer protocol being used by application protocols. +      Many NATs maintain TCP-based NAT bindings for longer periods based +      on the assumption that a transport-layer protocol, such as TCP, +      offers additional information about the session lifecycle.  UDP, +      on the other hand, does not provide such information to a NAT and +      timeouts tend to be much shorter [HomeGateway].  According to +      [HomeGateway], the mean for TCP and UDP NAT binding timeouts is +      386 minutes (TCP) and 160 seconds (UDP).  Shorter timeout values +      require keepalive messages to be sent more frequently.  Hence, the +      use of CoAP over TCP requires less-frequent transmission of +      keepalive messages. + +   o  TCP utilizes mechanisms for congestion control and flow control +      that are more sophisticated than the default mechanisms provided +      by CoAP over UDP; these TCP mechanisms are useful for the transfer +      of larger payloads.  (However, work is ongoing to add advanced +      congestion control to CoAP over UDP as well; see [CoCoA].) + +   Note that the use of CoAP over UDP (and CoAP over DTLS over UDP) is +   still the recommended transport for use in constrained node networks, +   particularly when used in concert with block-wise transfer.  CoAP +   over TCP is applicable for those cases where the networking +   infrastructure leaves no other choice.  The use of CoAP over TCP +   leads to a larger code size, more round trips, increased RAM +   requirements, and larger packet sizes.  Developers implementing CoAP +   over TCP are encouraged to consult [TCP-in-IoT] for guidance on +   low-footprint TCP implementations for IoT devices. + +   Standards based on CoAP, such as Lightweight Machine to Machine +   [LWM2M], currently use CoAP over UDP as a transport; adding support +   for CoAP over TCP enables them to address the issues above for +   specific deployments and to protect investments in existing CoAP +   implementations and deployments. + +   Although HTTP/2 could also potentially address the need for +   enterprise firewall traversal, there would be additional costs and +   delays introduced by such a transition from CoAP to HTTP/2. +   Currently, there are also fewer HTTP/2 implementations available for + + + +Bormann, et al.              Standards Track                    [Page 4] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   constrained devices in comparison to CoAP.  Since CoAP also supports +   group communication using IP-layer multicast and unreliable +   communication, IoT devices would have to support HTTP/2 in addition +   to CoAP. + +   Furthermore, CoAP may be integrated into a web environment where the +   front end uses CoAP over UDP from IoT devices to a cloud +   infrastructure and 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 UDP-based IoT device. + +   Finally, CoAP applications running inside a web browser may be +   without access to connectivity other than HTTP.  In this case, the +   WebSocket Protocol [RFC6455] may be used to transport CoAP requests +   and responses, as opposed to cross-proxying them via HTTP to an +   HTTP-to-CoAP cross-proxy.  This preserves the functionality of CoAP +   without translation -- in particular, the Observe Option [RFC7641]. + +   To address the above-mentioned deployment requirements, this document +   defines how to transport CoAP over TCP, CoAP over TLS, and CoAP over +   WebSockets.  For these cases, the reliability offered by the +   transport protocol subsumes the reliability functions of the message +   layer used for CoAP over UDP.  (Note that for both a reliable +   transport and the message layer for CoAP over UDP, the reliability +   offered is per transport hop: where proxies -- see Sections 5.7 and +   10 of [RFC7252] -- are involved, that layer's reliability function +   does not extend end to end.)  Figure 1 illustrates the layering: + +     +--------------------------------+ +     |          Application           | +     +--------------------------------+ +     +--------------------------------+ +     |  Requests/Responses/Signaling  |  CoAP (RFC 7252) / This Document +     |--------------------------------| +     |        Message Framing         |  This Document +     +--------------------------------+ +     |      Reliable Transport        | +     +--------------------------------+ + +            Figure 1: Layering of CoAP over Reliable Transports + +   This document specifies how to access resources using CoAP requests +   and responses over the TCP, TLS, and WebSocket protocols.  This +   allows connectivity-limited applications to obtain end-to-end CoAP +   connectivity either (1) by communicating CoAP directly with a CoAP +   server accessible over a TCP, TLS, or WebSocket connection or (2) via +   a CoAP intermediary that proxies CoAP requests and responses between +   different transports, such as between WebSockets and UDP. + + + +Bormann, et al.              Standards Track                    [Page 5] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Section 7 updates [RFC7641] ("Observing Resources in the Constrained +   Application Protocol (CoAP)") for use with CoAP over reliable +   transports.  [RFC7641] is an extension to CoAP that enables CoAP +   clients to "observe" a resource on a CoAP server.  (The CoAP client +   retrieves a representation of a resource and registers to be notified +   by the CoAP server when the representation is updated.) + +2.  Conventions and Terminology + +   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", +   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and +   "OPTIONAL" in this document are to be interpreted as described in +   BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all +   capitals, as shown here. + +   This document assumes that readers are familiar with the terms and +   concepts that are used in [RFC6455], [RFC7252], [RFC7641], and +   [RFC7959]. + +   The term "reliable transport" is used only to refer to transport +   protocols, such as TCP, that provide reliable and ordered delivery of +   a byte stream. + +   Block-wise Extension for Reliable Transport (BERT): +      Extends [RFC7959] to enable the use of larger messages over a +      reliable transport. + +   BERT Option: +      A Block1 or Block2 option that includes an SZX (block size) +      value of 7. + +   BERT Block: +      The payload of a CoAP message that is affected by a BERT Option in +      descriptive usage (see Section 2.1 of [RFC7959]). + +   Transport Connection: +      Underlying reliable byte-stream connection, as directly provided +      by TCP or indirectly provided via TLS or WebSockets. + +   Connection: +      Transport Connection, unless explicitly qualified otherwise. + + + + + + + + + + +Bormann, et al.              Standards Track                    [Page 6] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Connection Initiator: +      The peer that opens a Transport Connection, i.e., the TCP active +      opener, TLS client, or WebSocket client. + +   Connection Acceptor: +      The peer that accepts the Transport Connection opened by the other +      peer, i.e., the TCP passive opener, TLS server, or WebSocket +      server. + +3.  CoAP over TCP + +   The request/response interaction model of CoAP over TCP is the same +   as CoAP over UDP.  The primary differences are in the message layer. +   The message layer of CoAP over UDP supports optional reliability by +   defining four types of messages: Confirmable, Non-confirmable, +   Acknowledgment, and Reset.  In addition, messages include a +   Message ID to relate Acknowledgments to Confirmable messages and to +   detect duplicate messages. + +   Management of the transport connections is left to the application, +   i.e., the present specification does not describe how an application +   decides to open a connection or to reopen another one in the presence +   of failures (or what it would deem to be a failure; see also +   Section 5.4).  In particular, the Connection Initiator need not be +   the client of the first request placed on the connection.  Some +   implementations will want to implement dynamic connection management +   similar to the technique described in Section 6 of [RFC7230] for +   HTTP: opening a connection when the first client request is ready to +   be sent, reusing that connection for subsequent messages until no +   more messages are sent for a certain time period and no requests are +   outstanding (possibly with a configurable idle time), and then +   starting a release process (orderly shutdown) (see Section 5.5).  In +   implementations of this kind, connection releases or aborts may not +   be indicated as errors to the application but may simply be handled +   by automatic reconnection once the need arises again.  Other +   implementations may be based on configured connections that are kept +   open continuously and lead to management system notifications on +   release or abort.  The protocol defined in the present specification +   is intended to work with either model (or other, application-specific +   connection management models). + +3.1.  Messaging Model + +   Conceptually, CoAP over TCP replaces most of the message layer of +   CoAP over UDP with a framing mechanism on top of the byte stream +   provided by TCP/TLS, conveying the length information for each +   message that, on datagram transports, is provided by the UDP/DTLS +   datagram layer. + + + +Bormann, et al.              Standards Track                    [Page 7] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   TCP ensures reliable message transmission, so the message layer of +   CoAP over TCP is not required to support Acknowledgment messages or +   to detect duplicate messages.  As a result, both the Type and +   Message ID fields are no longer required and are removed from the +   message format for CoAP over TCP. + +   Figure 2 illustrates the difference between CoAP over UDP and CoAP +   over reliable transports.  The removed Type and Message ID fields are +   indicated by dashes. + +      CoAP Client       CoAP Server     CoAP Client       CoAP Server +          |                    |            |                    | +          |   CON [0xbc90]     |            | (-------) [------] | +          | GET /temperature   |            | GET /temperature   | +          |   (Token 0x71)     |            |   (Token 0x71)     | +          +------------------->|            +------------------->| +          |                    |            |                    | +          |   ACK [0xbc90]     |            | (-------) [------] | +          |   2.05 Content     |            |   2.05 Content     | +          |   (Token 0x71)     |            |   (Token 0x71)     | +          |     "22.5 C"       |            |     "22.5 C"       | +          |<-------------------+            |<-------------------+ +          |                    |            |                    | + +              CoAP over UDP                   CoAP over reliable +                                                  transports + +     Figure 2: Comparison between CoAP over Unreliable Transports and +                       CoAP over Reliable Transports + + + + + + + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                    [Page 8] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +3.2.  Message Format + +   The CoAP message format defined in [RFC7252], as shown in Figure 3, +   relies on the datagram transport (UDP, or DTLS over UDP) for keeping +   the individual messages separate and for providing length +   information. + +    0                   1                   2                   3 +    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |Ver| T |  TKL  |      Code     |          Message ID           | +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |   Token (if any, TKL bytes) ... +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |   Options (if any) ... +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |1 1 1 1 1 1 1 1|    Payload (if any) ... +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +           Figure 3: CoAP Message Format as Defined in RFC 7252 + +   The message format for CoAP over TCP is very similar to the format +   specified for CoAP over UDP.  The differences are as follows: + +   o  Since the underlying TCP connection provides retransmissions and +      deduplication, there is no need for the reliability mechanisms +      provided by CoAP over UDP.  The Type (T) and Message ID fields in +      the CoAP message header are elided. + +   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 +      TCP does not include a version number.  CoAP is defined in +      [RFC7252] with a version number of 1.  At this time, there is no +      known reason to support version numbers different from 1.  If +      version negotiation needs to be addressed in the future, +      Capabilities and Settings Messages (CSMs) (see Section 5.3) have +      been specifically designed to enable such a potential feature. + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                    [Page 9] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   o  In a stream-oriented transport protocol such as TCP, a form of +      message delimitation is needed.  For this purpose, CoAP over TCP +      introduces a length field with variable size.  Figure 4 shows the +      adjusted CoAP message format with a modified structure for the +      fixed header (first 4 bytes of the header for CoAP over UDP), +      which includes the length information of variable size. + +    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 +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |  Len  |  TKL  | Extended Length (if any, as chosen by Len) ... +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |      Code     | Token (if any, TKL bytes) ... +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |  Options (if any) ... +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |1 1 1 1 1 1 1 1|    Payload (if any) ... +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +               Figure 4: CoAP Frame for Reliable Transports + +   Length (Len):  4-bit unsigned integer.  A value between 0 and 12 +      inclusive indicates the length of the message in bytes, starting +      with the first bit of the Options field.  Three values are +      reserved for special constructs: + +      13:  An 8-bit unsigned integer (Extended Length) follows the +         initial byte and indicates the length of options/payload +         minus 13. + +      14:  A 16-bit unsigned integer (Extended Length) in network byte +         order follows the initial byte and indicates the length of +         options/payload minus 269. + +      15:  A 32-bit unsigned integer (Extended Length) in network byte +         order follows the initial byte and indicates the length of +         options/payload minus 65805. + +   The encoding of the Length field is modeled after the Option Length +   field of the CoAP Options (see Section 3.1 of [RFC7252]). + +   For simplicity, a Payload Marker (0xFF) is shown in Figure 4; the +   Payload Marker indicates the start of the optional payload and is +   absent for zero-length payloads (see Section 3 of [RFC7252]).  (If +   present, the Payload Marker is included in the message length, which +   counts from the start of the Options field to the end of the Payload +   field.) + + + + +Bormann, et al.              Standards Track                   [Page 10] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   For example, a CoAP message just containing a 2.03 code with the +   Token 7f and no options or payload is encoded as shown in Figure 5. + +    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 +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +   |      0x01     |      0x43     |      0x7f     | +   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +    Len   =    0 ------>  0x01 +    TKL   =    1 ___/ +    Code  =  2.03     --> 0x43 +    Token =               0x7f + +             Figure 5: CoAP Message with No Options or Payload + +   The semantics of the other CoAP header fields are left unchanged. + +3.3.  Message Transmission + +   Once a Transport Connection is established, each endpoint MUST send a +   CSM (see Section 5.3) as its first message on the connection.  This +   message establishes the initial settings and capabilities for the +   endpoint, such as maximum message size or support for block-wise +   transfers.  The absence of options in the CSM indicates that base +   values are assumed. + +   To avoid a deadlock, the Connection Initiator MUST NOT wait for the +   Connection Acceptor to send its initial CSM before sending its own +   initial CSM.  Conversely, the Connection Acceptor MAY wait for the +   Connection Initiator to send its initial CSM before sending its own +   initial CSM. + +   To avoid unnecessary latency, a Connection Initiator MAY send +   additional messages after its initial CSM without waiting to receive +   the Connection Acceptor's CSM; however, it is important to note that +   the Connection Acceptor's CSM might indicate capabilities that impact +   how the Connection Initiator is expected to communicate with the +   Connection Acceptor.  For example, the Connection Acceptor's CSM +   could indicate a Max-Message-Size Option (see Section 5.3.1) that is +   smaller than the base value (1152) in order to limit both buffering +   requirements and head-of-line blocking. + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 11] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Endpoints MUST treat a missing or invalid CSM as a connection error +   and abort the connection (see Section 5.6). + +   CoAP requests and responses are exchanged asynchronously over the +   Transport Connection.  A CoAP client can send multiple requests +   without waiting for a response, and the CoAP server can return +   responses in any order.  Responses MUST be returned over the same +   connection as the originating request.  Each concurrent request is +   differentiated by its Token, which is scoped locally to the +   connection. + +   The Transport Connection is bidirectional, so requests can be sent by +   both the entity that established the connection (Connection +   Initiator) and the remote host (Connection Acceptor).  If one side +   does not implement a CoAP server, an error response MUST be returned +   for all CoAP requests from the other side.  The simplest approach is +   to always return 5.01 (Not Implemented).  A more elaborate mock +   server could also return 4.xx responses such as 4.04 (Not Found) or +   4.02 (Bad Option) where appropriate. + +   Retransmission and deduplication of messages are provided by TCP. + +3.4.  Connection Health + +   Empty messages (Code 0.00) can always be sent and MUST be ignored by +   the recipient.  This provides a basic keepalive function that can +   refresh NAT bindings. + +   If a CoAP client does not receive any response for some time after +   sending a CoAP request (or, similarly, when a client observes a +   resource and it does not receive any notification for some time), it +   can send a CoAP Ping Signaling message (see Section 5.4) to test the +   Transport Connection and verify that the CoAP server is responsive. + +   When the underlying Transport Connection is closed or reset, the +   signaling state and any observation state (see Section 7.4) +   associated with the connection are removed.  Messages that are +   in flight may or may not be lost. + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 12] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +4.  CoAP over WebSockets + +   CoAP over WebSockets is intentionally similar to CoAP over TCP; +   therefore, this section only specifies the differences between the +   transports. + +   CoAP over WebSockets can be used in a number of configurations.  The +   most basic configuration is a CoAP client retrieving or updating a +   CoAP resource located on a CoAP server that exposes a WebSocket +   endpoint (see Figure 6).  The CoAP client acts as the WebSocket +   client, establishes a WebSocket connection, and sends a CoAP request, +   to which the CoAP server returns a CoAP response.  The WebSocket +   connection can be used for any number of requests. + +            ___________                            ___________ +           |           |                          |           | +           |          _|___      requests      ___|_          | +           |   CoAP  /  \  \  ------------->  /  /  \  CoAP   | +           |  Client \__/__/  <-------------  \__\__/ Server  | +           |           |         responses        |           | +           |___________|                          |___________| +                   WebSocket  =============>  WebSocket +                     Client     Connection     Server + +       Figure 6: CoAP Client (WebSocket Client) Accesses CoAP Server +                            (WebSocket Server) + +   The challenge with this configuration is how to identify a resource +   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 +   through a web browser), the client can connect to any WebSocket +   endpoint.  Sections 8.3 and 8.4 define new URI schemes that enable +   the client to identify both a WebSocket endpoint and the path and +   query of the CoAP resource within that endpoint. + + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 13] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Another possible configuration is to set up a CoAP forward proxy at +   the WebSocket endpoint.  Depending on what transports are available +   to the proxy, it could forward the request to a CoAP server with a +   CoAP UDP endpoint (Figure 7), an SMS endpoint (a.k.a. mobile phone), +   or even another WebSocket endpoint.  The CoAP client specifies the +   resource to be updated or retrieved in the Proxy-Uri Option. + +     ___________                ___________                ___________ +    |           |              |           |              |           | +    |          _|___        ___|_         _|___        ___|_          | +    |   CoAP  /  \  \ ---> /  /  \ CoAP  /  \  \ ---> /  /  \  CoAP   | +    |  Client \__/__/ <--- \__\__/ Proxy \__/__/ <--- \__\__/ Server  | +    |           |              |           |              |           | +    |___________|              |___________|              |___________| +            WebSocket ===> WebSocket      UDP            UDP +              Client        Server      Client          Server + +       Figure 7: CoAP Client (WebSocket Client) Accesses CoAP Server +       (UDP Server) via a CoAP Proxy (WebSocket Server / UDP Client) + +   A third possible configuration is a CoAP server running inside a web +   browser (Figure 8).  The web browser initially connects to a +   WebSocket endpoint and is then reachable through the WebSocket +   server.  When no connection exists, the CoAP server is unreachable. +   Because the WebSocket server is the only way to reach the CoAP +   server, the CoAP proxy should be a reverse-proxy. + +     ___________                ___________                ___________ +    |           |              |           |              |           | +    |          _|___        ___|_         _|___        ___|_          | +    |   CoAP  /  \  \ ---> /  /  \ CoAP  /  /  \ ---> /  \  \  CoAP   | +    |  Client \__/__/ <--- \__\__/ Proxy \__\__/ <--- \__/__/ Server  | +    |           |              |           |              |           | +    |___________|              |___________|              |___________| +               UDP            UDP      WebSocket <=== WebSocket +             Client          Server      Server        Client + +    Figure 8: CoAP Client (UDP Client) Accesses CoAP Server (WebSocket +         Client) via a CoAP Proxy (UDP Server / WebSocket Server) + +   Further configurations are possible, including those where a +   WebSocket connection is established through an HTTP proxy. + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 14] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +4.1.  Opening Handshake + +   Before CoAP requests and responses are exchanged, a WebSocket +   connection is established as defined in Section 4 of [RFC6455]. +   Figure 9 shows an example. + +   The WebSocket client MUST include the subprotocol name "coap" in the +   list of protocols; this indicates support for the protocol defined in +   this document. + +   The WebSocket client includes the hostname of the WebSocket server in +   the Host header field of its handshake as per [RFC6455].  The Host +   header field also indicates the default value of the Uri-Host Option +   in requests from the WebSocket client to the WebSocket server. + +            GET /.well-known/coap HTTP/1.1 +            Host: example.org +            Upgrade: websocket +            Connection: Upgrade +            Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +            Sec-WebSocket-Protocol: coap +            Sec-WebSocket-Version: 13 + +            HTTP/1.1 101 Switching Protocols +            Upgrade: websocket +            Connection: Upgrade +            Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +            Sec-WebSocket-Protocol: coap + +                 Figure 9: Example of an Opening Handshake + +4.2.  Message Format + +   Once a WebSocket connection is established, CoAP requests and +   responses can be exchanged as WebSocket messages.  Since CoAP uses a +   binary message format, the messages are transmitted in binary data +   frames as specified in Sections 5 and 6 of [RFC6455]. + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 15] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   The message format shown in Figure 10 is the same as the message +   format for CoAP over TCP (see Section 3.2), with one change: the +   Length (Len) field MUST be set to zero, because the WebSocket frame +   contains the length. + +      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 +     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +     | Len=0 |  TKL  |      Code     |    Token (TKL bytes) ... +     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +     |   Options (if any) ... +     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +     |1 1 1 1 1 1 1 1|    Payload (if any) ... +     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +              Figure 10: CoAP Message Format over WebSockets + +   As with CoAP over TCP, the message format for CoAP over WebSockets +   eliminates the Version field defined in CoAP over UDP.  If CoAP +   version negotiation is required in the future, CoAP over WebSockets +   can address the requirement by defining a new subprotocol identifier +   that is negotiated during the opening handshake. + +   Requests and responses can be fragmented as specified in Section 5.4 +   of [RFC6455], though typically they are sent unfragmented, as they +   tend to be small and fully buffered before transmission.  The +   WebSocket Protocol does not provide means for multiplexing.  If it is +   not desirable for a large message to monopolize the connection, +   requests and responses can be transferred in a block-wise fashion as +   defined in [RFC7959]. + +4.3.  Message Transmission + +   As with CoAP over TCP, each endpoint MUST send a CSM (see +   Section 5.3) as its first message on the WebSocket connection. + +   CoAP requests and responses are exchanged asynchronously over the +   WebSocket connection.  A CoAP client can send multiple requests +   without waiting for a response, and the CoAP server can return +   responses in any order.  Responses MUST be returned over the same +   connection as the originating request.  Each concurrent request is +   differentiated by its Token, which is scoped locally to the +   connection. + +   The connection is bidirectional, so requests can be sent by both the +   entity that established the connection and the remote host. + + + + + +Bormann, et al.              Standards Track                   [Page 16] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   As with CoAP over TCP, retransmission and deduplication of messages +   are provided by the WebSocket Protocol.  CoAP over WebSockets +   therefore does not make a distinction between Confirmable messages +   and Non-confirmable messages and does not provide Acknowledgment or +   Reset messages. + +4.4.  Connection Health + +   As with CoAP over TCP, a CoAP client can test the health of the +   connection for CoAP over WebSockets by sending a CoAP Ping Signaling +   message (Section 5.4).  To ensure that redundant maintenance traffic +   is not transmitted, WebSocket Ping and unsolicited Pong frames +   (Section 5.5 of [RFC6455]) SHOULD NOT be used. + +5.  Signaling + +   Signaling messages are specifically introduced only for CoAP over +   reliable transports to allow peers to: + +   o  Learn related characteristics, such as maximum message size for +      the connection. + +   o  Shut down the connection in an orderly fashion. + +   o  Provide diagnostic information when terminating a connection in +      response to a serious error condition. + +   Signaling is a third basic kind of message in CoAP, after requests +   and responses.  Signaling messages share a common structure with the +   existing CoAP messages.  There are a code, a Token, options, and an +   optional payload. + +   (See Section 3 of [RFC7252] for the overall structure of the message +   format, option format, and option value formats.) + +5.1.  Signaling Codes + +   A code in the 7.00-7.31 range indicates a Signaling message.  Values +   in this range are assigned by the "CoAP Signaling Codes" subregistry +   (see Section 11.1). + +   For each message, there are a sender and a peer receiving the +   message. + +   Payloads in Signaling messages are diagnostic payloads as defined in +   Section 5.5.2 of [RFC7252], unless otherwise defined by a Signaling +   message option. + + + + +Bormann, et al.              Standards Track                   [Page 17] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +5.2.  Signaling Option Numbers + +   Option Numbers for Signaling messages are specific to the message +   code.  They do not share the number space with CoAP options for +   request/response messages or with Signaling messages using other +   codes. + +   Option Numbers are assigned by the "CoAP Signaling Option Numbers" +   subregistry (see Section 11.2). + +   Signaling Options are elective or critical as defined in +   Section 5.4.1 of [RFC7252].  If a Signaling Option is critical and +   not understood by the receiver, it MUST abort the connection (see +   Section 5.6).  If the option is understood but cannot be processed, +   the option documents the behavior. + +5.3.  Capabilities and Settings Messages (CSMs) + +   CSMs are used for two purposes: + +   o  Each capability option indicates one capability of the sender to +      the recipient. + +   o  Each setting option indicates a setting that will be applied by +      the sender. + +   One CSM MUST be sent by each endpoint at the start of the Transport +   Connection.  Additional CSMs MAY be sent at any other time by either +   endpoint over the lifetime of the connection. + +   Both capability options and setting options are cumulative.  A CSM +   does not invalidate a previously sent capability indication or +   setting even if 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 override a previous value for the same option.  The +   option defines how to handle this case if needed. + +   Base values are listed below for CSM options.  These are the values +   for the capability and settings before any CSMs send a modified +   value. + +   These are not default values (as defined in Section 5.4.4 in +   [RFC7252]) for the option.  Default values apply on a per-message +   basis and are thus reset when the value is not present in a +   given CSM. + +   CSMs are indicated by the 7.01 (CSM) code; see Table 1 +   (Section 11.1). + + + +Bormann, et al.              Standards Track                   [Page 18] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +5.3.1.  Max-Message-Size Capability Option + +   The sender can use the elective Max-Message-Size Option to indicate +   the maximum size of a message in bytes that it can receive.  The +   message size indicated includes the entire message, starting from the +   first byte of the message header and ending at the end of the message +   payload. + +   (Note that there is no relationship of the message size to the +   overall request or response body size that may be achievable in +   block-wise transfer.  For example, the exchange depicted in Figure 13 +   (Section 6.1) can be performed if the CoAP client indicates a value +   of around 6000 bytes for the Max-Message-Size Option, even though the +   total body size transferred to the client is 3072 + 5120 + 4711 = +   12903 bytes.) + +   +---+---+---+---------+------------------+--------+--------+--------+ +   | # | C | R | Applies | Name             | Format | Length | Base   | +   |   |   |   | to      |                  |        |        | Value  | +   +---+---+---+---------+------------------+--------+--------+--------+ +   | 2 |   |   | CSM     | Max-Message-Size |   uint |    0-4 | 1152   | +   +---+---+---+---------+------------------+--------+--------+--------+ + +                         C=Critical, R=Repeatable + +   As per Section 4.6 of [RFC7252], the base value (and the value used +   when this option is not implemented) is 1152. + +   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 +   base value. + +5.3.2.  Block-Wise-Transfer Capability Option + +   +---+---+---+---------+------------------+--------+--------+--------+ +   | # | C | R | Applies | Name             | Format | Length | Base   | +   |   |   |   | to      |                  |        |        | Value  | +   +---+---+---+---------+------------------+--------+--------+--------+ +   | 4 |   |   | CSM     | Block-Wise-      |  empty |      0 | (none) | +   |   |   |   |         | Transfer         |        |        |        | +   +---+---+---+---------+------------------+--------+--------+--------+ + +                         C=Critical, R=Repeatable + +   A sender can use the elective Block-Wise-Transfer Option to indicate +   that it supports the block-wise transfer protocol [RFC7959]. + + + + + +Bormann, et al.              Standards Track                   [Page 19] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   If the option is not given, the peer has no information about whether +   block-wise transfers are supported by the sender or not.  An +   implementation wishing to offer block-wise transfers to its peer +   therefore needs to indicate so via the Block-Wise-Transfer Option. + +   If a Max-Message-Size Option is indicated with a value that is +   greater than 1152 (in the same CSM or a different CSM), the +   Block-Wise-Transfer Option also indicates support for BERT (see +   Section 6).  Subsequently, if the Max-Message-Size Option is +   indicated with a value equal to or less than 1152, BERT support is no +   longer indicated.  (Note that the indication of BERT support does not +   oblige either peer to actually choose to make use of BERT.) + +   Implementation note: When indicating a value of the Max-Message-Size +   Option with an intention to enable BERT, the indicating +   implementation may want to (1) choose a particular BERT block size it +   wants to encourage and (2) add a delta for the header and any options +   that may also need to be included in the message with a BERT block of +   that size.  Section 4.6 of [RFC7252] adds 128 bytes to a maximum +   block size of 1024 to arrive at a default message size of 1152.  A +   BERT-enabled implementation may want to indicate a BERT block size of +   2048 or a higher multiple of 1024 and at the same time be more +   generous with the size of the header and options added (say, 256 or +   512).  However, adding 1024 or more to the base BERT block size may +   encourage the peer implementation to vary the BERT block size based +   on the size of the options included; this type of scenario might make +   it harder to establish interoperability. + +5.4.  Ping and Pong Messages + +   In CoAP over reliable transports, Empty messages (Code 0.00) can +   always be sent and MUST be ignored by the recipient.  This provides a +   basic keepalive function.  In contrast, Ping and Pong messages are a +   bidirectional exchange. + +   Upon receipt of a Ping message, the receiver MUST return a Pong +   message with an identical Token in response.  Unless the Ping carries +   an option with delaying semantics such as the Custody Option, it +   SHOULD respond as soon as practical.  As with all Signaling messages, +   the recipient of a Ping or Pong message MUST ignore elective options +   it does not understand. + +   Ping and Pong messages are indicated by the 7.02 code (Ping) and +   the 7.03 code (Pong). + + + + + + + +Bormann, et al.              Standards Track                   [Page 20] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Note that, as with similar mechanisms defined in [RFC6455] and +   [RFC7540], the present specification does not define any specific +   maximum time that the sender of a Ping message has to allow when +   waiting for a Pong reply.  Any limitations on patience for this reply +   are a matter of the application making use of these messages, as is +   any approach to recover from a failure to respond in time. + +5.4.1.  Custody Option + +   +---+---+---+----------+----------------+--------+--------+---------+ +   | # | C | R | Applies  | Name           | Format | Length | Base    | +   |   |   |   | to       |                |        |        | Value   | +   +---+---+---+----------+----------------+--------+--------+---------+ +   | 2 |   |   | Ping,    | Custody        |  empty |      0 | (none)  | +   |   |   |   | Pong     |                |        |        |         | +   +---+---+---+----------+----------------+--------+--------+---------+ + +                         C=Critical, R=Repeatable + +   When responding to a Ping message, the receiver can include an +   elective Custody Option in the Pong message.  This option indicates +   that the application has processed all the request/response messages +   received prior to the Ping message on the current connection.  (Note +   that there is no definition of specific application semantics for +   "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 +   this indication.) + +   A sender can also include an elective Custody Option in a Ping +   message to explicitly request the inclusion of an elective Custody +   Option in the corresponding Pong message.  In that case, the receiver +   SHOULD delay its Pong message until it finishes processing all the +   request/response messages received prior to the Ping message on the +   current connection. + +5.5.  Release Messages + +   A Release message indicates that the sender does not want to continue +   maintaining the Transport Connection and opts for an orderly +   shutdown, but wants to leave it to the peer to actually start closing +   the connection.  The 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 Release message by closing the +   Transport Connection.  (In case that does not happen, the sender of +   the release may want to implement a timeout mechanism if getting rid +   of the connection is actually important to it.) + + + + +Bormann, et al.              Standards Track                   [Page 21] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Messages may be in flight or responses outstanding when the sender +   decides to send a Release message (which is one reason the sender had +   decided to wait before closing the connection).  The peer responding +   to the Release message SHOULD delay the closing of the connection +   until it has responded to all requests received by it before the +   Release message.  It also MAY wait for the responses to its own +   requests. + +   It is NOT RECOMMENDED for the sender of a Release message to continue +   sending requests on the connection it already indicated to be +   released: the peer might close the connection at any time and miss +   those requests.  The peer is not obligated to check for this +   condition, though. + +   Release messages are indicated by the 7.04 code (Release). + +   Release messages can indicate one or more reasons using elective +   options.  The following options are defined: + +   +---+---+---+---------+------------------+--------+--------+--------+ +   | # | C | R | Applies | Name             | Format | Length | Base   | +   |   |   |   | to      |                  |        |        | Value  | +   +---+---+---+---------+------------------+--------+--------+--------+ +   | 2 |   | x | Release | Alternative-     | string |  1-255 | (none) | +   |   |   |   |         | Address          |        |        |        | +   +---+---+---+---------+------------------+--------+--------+--------+ + +                         C=Critical, R=Repeatable + +   The elective Alternative-Address Option requests the peer to instead +   open a connection of the same scheme as the present connection to the +   alternative transport address given.  Its value is in the form +   "authority" as defined in Section 3.2 of [RFC3986].  (Existing state +   related to the connection is not transferred from the present +   connection to the new connection.) + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 22] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   The Alternative-Address Option is a repeatable option as defined in +   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    | +   |   |   |   | to      |                 |        |        | Value   | +   +---+---+---+---------+-----------------+--------+--------+---------+ +   | 4 |   |   | Release | Hold-Off        |   uint |    0-3 | (none)  | +   +---+---+---+---------+-----------------+--------+--------+---------+ + +                         C=Critical, R=Repeatable + +   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 +   the value. + +5.6.  Abort Messages + +   An Abort message indicates that the sender is unable to continue +   maintaining the Transport Connection and cannot even wait for an +   orderly release.  The sender shuts down the connection immediately +   after the Abort message (and may or may not wait for a Release +   message, Abort message, or connection shutdown in the inverse +   direction).  A diagnostic payload (see Section 5.5.2 of [RFC7252]) +   SHOULD be included in the Abort message.  Messages may be in flight +   or responses outstanding when the sender decides to send an Abort +   message.  The general expectation is that these will NOT be +   processed. + +   Abort messages are indicated by the 7.05 code (Abort). + +   Abort messages can indicate one or more reasons using elective +   options.  The following option is defined: + +   +---+---+---+---------+-----------------+--------+--------+---------+ +   | # | C | R | Applies | Name            | Format | Length | Base    | +   |   |   |   | to      |                 |        |        | Value   | +   +---+---+---+---------+-----------------+--------+--------+---------+ +   | 2 |   |   | Abort   | Bad-CSM-Option  |   uint |    0-2 | (none)  | +   +---+---+---+---------+-----------------+--------+--------+---------+ + +                         C=Critical, R=Repeatable + + + + + + + +Bormann, et al.              Standards Track                   [Page 23] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Bad-CSM-Option, which is elective, indicates that the sender is +   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 +   sender, or when there is a parameter problem with the value of an +   elective option.  More detailed information SHOULD be included as a +   diagnostic payload. + +   For CoAP over UDP, messages that contain syntax violations are +   processed as message format errors.  As described in Sections 4.2 and +   4.3 of [RFC7252], such messages are rejected by sending a matching +   Reset message and otherwise ignoring the message. + +   For CoAP over reliable transports, the recipient rejects such +   messages by sending an Abort message and otherwise ignoring (not +   processing) 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 +   in Figure 11. + +       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 +      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +      |      0x01     |      0xe2     |      0x42     | +      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +       Len   =    0 -------> 0x01 +       TKL   =    1 ___/ +       Code  = 7.02 Ping --> 0xe2 +       Token =               0x42 + +                      Figure 11: Ping Message Example + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 24] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   An encoded example of the corresponding Pong message is shown in +   Figure 12. + +       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 +      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +      |      0x01     |      0xe3     |      0x42     | +      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +       Len   =    0 -------> 0x01 +       TKL   =    1 ___/ +       Code  = 7.03 Pong --> 0xe3 +       Token =               0x42 + +                      Figure 12: Pong Message Example + +6.  Block-Wise Transfer and Reliable Transports + +   The message size restrictions defined in Section 4.6 of [RFC7252] to +   avoid IP fragmentation are not necessary when CoAP is used over a +   reliable transport.  While this suggests that the block-wise transfer +   protocol [RFC7959] is also no longer needed, it remains applicable +   for a number of cases: + +   o  Large messages, such as firmware downloads, may cause undesired +      head-of-line blocking when a single transport connection is used. + +   o  A UDP-to-TCP gateway may simply not have the context to convert a +      message with a Block Option into the equivalent exchange without +      any use of a Block Option (it would need to convert the entire +      block-wise exchange from start to end into a single exchange). + +   BERT extends the block-wise transfer protocol to enable the use of +   larger messages over a reliable transport. + +   The use of this new extension is signaled by sending Block1 or Block2 +   Options with SZX == 7 (a "BERT Option").  SZX == 7 is a reserved +   value in [RFC7959]. + +   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 +   capability to process BERT blocks.  As with the basic block-wise +   transfer protocol, 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-BERT block instead. + + + + + + +Bormann, et al.              Standards Track                   [Page 25] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   In descriptive usage, a BERT Option is interpreted in the same way as +   the equivalent Option with SZX == 6, except that the payload is also +   allowed to contain multiple blocks.  For non-final BERT blocks, the +   payload is always a multiple of 1024 bytes.  For final BERT blocks, +   the payload is a multiple (possibly 0) of 1024 bytes plus a partial +   block of less than 1024 bytes. + +   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 +   if it had received this sequence in conjunction with block numbers +   starting at, and sequentially increasing from, the block number given +   in the Block Option.  In other words, the entire BERT block is +   positioned at the byte position that results from multiplying the +   block number by 1024.  The position of further blocks to be +   transferred is indicated by incrementing the block number by the +   number of elements in this sequence (i.e., the size of the payload +   divided by 1024 bytes). + +   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 +   block number multiplied by 1024. + +   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 nnn. + +   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 +   (NUM), the more bit (M), and the block size (2**(SZX + 4)) separated +   by slashes.  For example, 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 +   1:3/1/128. + + + + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 26] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +6.1.  Example: GET with BERT Blocks + +   Figure 13 shows a GET request with a response that is split into +   three BERT blocks.  The first response contains 3072 bytes of +   payload; the second, 5120; and the third, 4711.  Note how the block +   number increments to move the position inside the response body +   forward. + +   CoAP Client                             CoAP Server +     |                                            | +     | GET, /status                       ------> | +     |                                            | +     | <------   2.05 Content, 2:0/1/BERT(3072)   | +     |                                            | +     | GET, /status, 2:3/0/BERT           ------> | +     |                                            | +     | <------   2.05 Content, 2:3/1/BERT(5120)   | +     |                                            | +     | GET, /status, 2:8/0/BERT          ------>  | +     |                                            | +     | <------   2.05 Content, 2:8/0/BERT(4711)   | + +                      Figure 13: GET with BERT Blocks + +6.2.  Example: PUT with BERT Blocks + +   Figure 14 demonstrates a PUT exchange with BERT blocks. + +   CoAP Client                             CoAP Server +     |                                             | +     | PUT, /options, 1:0/1/BERT(8192)     ------> | +     |                                             | +     | <------   2.31 Continue, 1:0/1/BERT         | +     |                                             | +     | PUT, /options, 1:8/1/BERT(16384)    ------> | +     |                                             | +     | <------   2.31 Continue, 1:8/1/BERT         | +     |                                             | +     | PUT, /options, 1:24/0/BERT(5683)    ------> | +     |                                             | +     | <------   2.04 Changed, 1:24/0/BERT         | +     |                                             | + +                      Figure 14: PUT with BERT Blocks + + + + + + + +Bormann, et al.              Standards Track                   [Page 27] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +7.  Observing Resources over Reliable Transports + +   This section describes how the procedures defined in [RFC7641] for +   observing resources over CoAP are applied (and modified, as needed) +   for reliable transports.  In this section, "client" and "server" +   refer to the CoAP client and CoAP server. + +7.1.  Notifications and Reordering + +   When using the Observe Option [RFC7641] with CoAP over UDP, +   notifications from the server set the option value to an increasing +   sequence number for reordering detection on the client, since +   messages can arrive in a different order than they were sent.  This +   sequence number is not required for CoAP over reliable transports, +   since TCP ensures reliable and ordered delivery of messages.  The +   value of the Observe Option in 2.xx notifications MAY be empty on +   transmission and MUST be ignored on reception. + +   Implementation note: This means that a proxy from a reordering +   transport to a reliable (in-order) transport (such as a UDP-to-TCP +   proxy) needs to process the Observe Option in notifications according +   to the rules in Section 3.4 of [RFC7641]. + +7.2.  Transmission and Acknowledgments + +   For CoAP over UDP, server notifications to the client can be +   Confirmable or Non-confirmable.  A Confirmable message requires the +   client to respond with either an Acknowledgment message or a Reset +   message.  An Acknowledgment message indicates that the client is +   alive and wishes to receive further notifications.  A Reset message +   indicates that the client does not recognize the Token; this causes +   the server to remove the associated entry from the list of observers. + +   Since TCP eliminates the need for the message layer to support +   reliability, CoAP over reliable transports does not support +   Confirmable or Non-confirmable message types.  All notifications are +   delivered reliably to the client with positive acknowledgment of +   receipt occurring at the TCP level.  If the client does not recognize +   the Token in a notification, it MAY immediately abort the connection +   (see Section 5.6). + +7.3.  Freshness + +   For CoAP over UDP, if a client does not receive a notification for +   some time, it can send a new GET request with the same Token as the +   original request to re-register its interest in a resource and verify +   that the server is still responsive.  For CoAP over reliable +   transports, it is more efficient to check the health of the + + + +Bormann, et al.              Standards Track                   [Page 28] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   connection (and all its active observations) by sending a single CoAP +   Ping Signaling message (Section 5.4) rather than individual requests +   to confirm each active observation.  (Note that such a Ping/Pong only +   confirms a single hop: a proxy is not obligated or expected to react +   to a Ping by checking all its own registered interests or all the +   connections, if any, underlying them.  A proxy MAY maintain its own +   schedule for confirming the interests that it relies on being +   registered toward the origin server; however, it is generally +   inadvisable for a proxy to generate a large number of outgoing checks +   based on a single incoming check.) + +7.4.  Cancellation + +   For CoAP over UDP, a client that is no longer interested in receiving +   notifications can "forget" the observation and respond to the next +   notification from the server with a Reset message to cancel the +   observation. + +   For CoAP over reliable transports, a client MUST explicitly +   deregister by issuing a GET request that has the Token field set to +   the Token of the observation to be canceled and includes an Observe +   Option with the value set to 1 (deregister). + +   If the client observes one or more resources over a reliable +   transport, then the CoAP server (or intermediary in the role of the +   CoAP server) MUST remove all entries associated with the client +   endpoint from the lists of observers when the connection either +   times out or is closed. + +8.  CoAP over Reliable Transport URIs + +   CoAP over UDP [RFC7252] defines the "coap" and "coaps" URI schemes. +   This document introduces four additional URI schemes for identifying +   CoAP resources and providing a means of locating the resource: + +   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 "coap+ws" URI scheme for CoAP over WebSockets. + +   o  The "coaps+ws" URI scheme for CoAP over WebSockets secured by TLS. + +   Resources made available via these schemes have no shared identity +   even if their resource identifiers indicate the same authority (the +   same host listening to the same TCP port).  They are hosted in +   distinct namespaces because each URI scheme implies a distinct origin +   server. + + + +Bormann, et al.              Standards Track                   [Page 29] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   In this section, the syntax for the URI schemes is specified using +   the Augmented Backus-Naur Form (ABNF) [RFC5234].  The definitions of +   "host", "port", "path-abempty", and "query" are adopted from +   [RFC3986]. + +   Section 8 ("Multicast CoAP") in [RFC7252] is not applicable to these +   schemes. + +   As with the "coap" and "coaps" schemes defined in [RFC7252], all URI +   schemes defined in this section also support the path prefix +   "/.well-known/" as defined by [RFC5785] for "well-known locations" in +   the namespace of a host.  This enables discovery as per Section 7 of +   [RFC7252]. + +8.1.  coap+tcp URI Scheme + +   The "coap+tcp" URI scheme identifies CoAP resources that are intended +   to be accessible using CoAP over TCP. + +     coap-tcp-URI = "coap+tcp:" "//" host [ ":" port ] +       path-abempty [ "?" query ] + +   The syntax defined in Section 6.1 of [RFC7252] applies to this URI +   scheme, with the following change: + +   o  The port subcomponent indicates the TCP port at which the CoAP +      Connection Acceptor is located.  (If it is empty or not given, +      then the default port 5683 is assumed, as with UDP.) + +   Encoding considerations:  The scheme encoding conforms to the +      encoding rules established for URIs in [RFC3986]. + +   Interoperability considerations:  None. + +   Security considerations:  See Section 11.1 of [RFC7252]. + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 30] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +8.2.  coaps+tcp URI Scheme + +   The "coaps+tcp" URI scheme identifies CoAP resources that are +   intended to be accessible using CoAP over TCP secured with TLS. + +     coaps-tcp-URI = "coaps+tcp:" "//" host [ ":" port ] +       path-abempty [ "?" query ] + +   The syntax defined in Section 6.2 of [RFC7252] applies to this URI +   scheme, with the following changes: + +   o  The port subcomponent indicates the TCP port at which the TLS +      server for the CoAP Connection Acceptor is located.  If it is +      empty or not given, then the default port 5684 is assumed. + +   o  If a TLS server does not support the Application-Layer Protocol +      Negotiation (ALPN) extension [RFC7301] or wishes to accommodate +      TLS clients that do not support ALPN, it MAY offer a coaps+tcp +      endpoint on TCP port 5684.  This endpoint MAY also be ALPN +      enabled.  A TLS server MAY offer coaps+tcp endpoints on ports +      other than TCP port 5684, which MUST be ALPN enabled. + +   o  For TCP ports other than port 5684, the TLS client MUST use the +      ALPN extension to advertise the "coap" protocol identifier (see +      Section 11.7) in the list of protocols in its ClientHello.  If the +      TCP server selects and returns the "coap" protocol identifier +      using the ALPN extension in its ServerHello, then the connection +      succeeds.  If the TLS server either does not negotiate the ALPN +      extension or returns a no_application_protocol alert, the TLS +      client MUST close the connection. + +   o  For TCP port 5684, a TLS client MAY use the ALPN extension to +      advertise the "coap" protocol identifier in the list of protocols +      in its ClientHello.  If the TLS server selects and returns the +      "coap" protocol identifier using the ALPN extension in its +      ServerHello, then the connection succeeds.  If the TLS server +      returns a no_application_protocol alert, then the TLS client MUST +      close the connection.  If the TLS server does not negotiate the +      ALPN extension, then coaps+tcp is implicitly selected. + +   o  For TCP port 5684, if the TLS client does not use the ALPN +      extension to negotiate the protocol, then coaps+tcp is implicitly +      selected. + + + + + + + + +Bormann, et al.              Standards Track                   [Page 31] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Encoding considerations:  The scheme encoding conforms to the +      encoding rules established for URIs in [RFC3986]. + +   Interoperability considerations:  None. + +   Security considerations:  See Section 11.1 of [RFC7252]. + +8.3.  coap+ws URI Scheme + +   The "coap+ws" URI scheme identifies CoAP resources that are intended +   to be accessible using CoAP over WebSockets. + +     coap-ws-URI = "coap+ws:" "//" host [ ":" port ] +       path-abempty [ "?" query ] + +   The port subcomponent is OPTIONAL.  The default is port 80. + +   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 +   "/.well-known/coap" [RFC5785] [RFC8307].  Within the endpoint +   specified in a "coap+ws" URI, the path and query parts of the URI +   identify a resource that can be operated on by the methods defined +   by CoAP: + +             coap+ws://example.org/sensors/temperature?u=Cel +                  \______  ______/\___________  ___________/ +                         \/                   \/ +                                            Uri-Path: "sensors" +       ws://example.org/.well-known/coap    Uri-Path: "temperature" +                                            Uri-Query: "u=Cel" + +                    Figure 15: The "coap+ws" URI Scheme + +   Encoding considerations:  The scheme encoding conforms to the +      encoding rules established for URIs in [RFC3986]. + +   Interoperability considerations:  None. + +   Security considerations:  See Section 11.1 of [RFC7252]. + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 32] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +8.4.  coaps+ws URI Scheme + +   The "coaps+ws" URI scheme identifies CoAP resources that are intended +   to be accessible using CoAP over WebSockets secured by TLS. + +     coaps-ws-URI = "coaps+ws:" "//" host [ ":" port ] +       path-abempty [ "?" query ] + +   The port subcomponent is OPTIONAL.  The default is port 443. + +   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 +   "/.well-known/coap" [RFC5785] [RFC8307].  Within the endpoint +   specified in a "coaps+ws" URI, the path and query parts of the URI +   identify a resource that can be operated on by the methods defined +   by CoAP: + +             coaps+ws://example.org/sensors/temperature?u=Cel +                   \______  ______/\___________  ___________/ +                          \/                   \/ +                                            Uri-Path: "sensors" +       wss://example.org/.well-known/coap   Uri-Path: "temperature" +                                            Uri-Query: "u=Cel" + +                   Figure 16: The "coaps+ws" URI Scheme + +   Encoding considerations:  The scheme encoding conforms to the +      encoding rules established for URIs in [RFC3986]. + +   Interoperability considerations:  None. + +   Security considerations:  See Section 11.1 of [RFC7252]. + +8.5.  Uri-Host and Uri-Port Options + +   CoAP over reliable transports maintains the property from +   Section 5.10.1 of [RFC7252]: + +      The default values for the Uri-Host and Uri-Port Options are +      sufficient for requests to most servers. + +   Unless otherwise noted, the default value of the Uri-Host Option is +   the IP literal representing the destination IP address of the request +   message.  The default value of the Uri-Port Option is the destination +   TCP port. + + + + + + +Bormann, et al.              Standards Track                   [Page 33] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   For CoAP over TLS, these default values are the same, unless Server +   Name Indication (SNI) [RFC6066] is negotiated.  In this case, the +   default value of the Uri-Host Option in requests from the TLS client +   to the TLS server is the SNI host. + +   For CoAP over WebSockets, the default value of the Uri-Host Option in +   requests from the WebSocket client to the WebSocket server is +   indicated by the Host header field from the WebSocket handshake. + +8.6.  Decomposing URIs into Options + +   The steps are the same as those specified in Section 6.4 of +   [RFC7252], with minor changes: + +   This step from [RFC7252]: + +   3.  If |url| does not have a <scheme> component whose value, when +       converted to ASCII lowercase, is "coap" or "coaps", then fail +       this algorithm. + +   is updated to: + +   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, +       include a Uri-Port Option and let that option's value be |port|. + +   is updated to: + +   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|. + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 34] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +8.7.  Composing URIs from Options + +   The steps are the same as those specified in Section 6.5 of +   [RFC7252], with minor changes: + +   This step from [RFC7252]: + +   1.  If the request is secured using DTLS, let |url| be the string +       "coaps://".  Otherwise, let |url| be the string "coap://". + +   is updated to: + +   1.  For CoAP over TCP, if the request is secured using TLS, let |url| +       be the string "coaps+tcp://".  Otherwise, let |url| be the string +       "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 +       option's value.  Otherwise, let |port| be the request's +       destination UDP port. + +   is updated to: + +   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. + +9.  Securing CoAP + +   "Security Challenges For the Internet Of Things" [SecurityChallenges] +   recommends the following: + +      ... it is essential that IoT protocol suites specify a mandatory +      to implement but optional to use security solution.  This will +      ensure security is available in all implementations, but +      configurable to use when not necessary (e.g., in closed +      environment). ... even if those features stretch the capabilities +      of such devices. + +   A security solution MUST be implemented to protect CoAP over reliable +   transports and MUST be enabled by default.  This document defines the +   TLS binding, but alternative solutions at different layers in the +   protocol stack MAY be used to protect CoAP over reliable transports + + + + + +Bormann, et al.              Standards Track                   [Page 35] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   when appropriate.  Note that there is ongoing work to support a data- +   object-based security model for CoAP that is independent of transport +   (see [OSCORE]). + +9.1.  TLS Binding for CoAP over TCP + +   The TLS usage guidance in [RFC7925] applies, including the guidance +   about cipher suites in that document that are derived from the +   mandatory-to-implement cipher suites defined in [RFC7252]. + +   This guidance assumes implementation in a constrained device or for +   communication with a constrained device.  However, CoAP over TCP/TLS +   has a wider applicability.  It may, for example, be implemented on a +   gateway or on a device that is less constrained (such as a smart +   phone or a tablet), for communication with a peer that is likewise +   less constrained, or within a back-end environment that only +   communicates with constrained devices via proxies.  As an exception +   to the previous paragraph, in this case, the recommendations in +   [RFC7525] are more appropriate. + +   Since the guidance offered in [RFC7925] differs from the guidance +   offered in [RFC7525] in terms of algorithms and credential types, it +   is assumed that an implementation of CoAP over TCP/TLS that needs to +   support both cases implements the recommendations offered by both +   specifications. + +   During the provisioning phase, a CoAP device is provided with the +   security information that it needs, including keying materials, +   access control lists, and authorization servers.  At the end of the +   provisioning phase, the device will be in one of four security modes: + +   NoSec:  TLS is disabled. + +   PreSharedKey:  TLS is enabled.  The guidance in Section 4.2 of +      [RFC7925] applies. + +   RawPublicKey:  TLS is enabled.  The guidance in Section 4.3 of +      [RFC7925] applies. + +   Certificate:  TLS is enabled.  The guidance in Section 4.4 of +      [RFC7925] applies. + +   The "NoSec" mode is optional to implement.  The system simply sends +   the packets over normal TCP; this is indicated by the "coap+tcp" +   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 +   network with the CoAP nodes. + + + + +Bormann, et al.              Standards Track                   [Page 36] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   "PreSharedKey", "RawPublicKey", or "Certificate" is mandatory to +   implement for the TLS binding, depending on the credential type used +   with the device.  These security modes are achieved using TLS and +   are indicated by the "coaps+tcp" scheme and TLS-secured CoAP +   default port. + +9.2.  TLS Usage for CoAP over WebSockets + +   A CoAP client requesting a resource identified by a "coaps+ws" URI +   negotiates a secure WebSocket connection to a WebSocket server +   endpoint with a "wss" URI.  This is described in Section 8.4. + +   The client MUST perform a TLS handshake after opening the connection +   to the server.  The guidance in Section 4.1 of [RFC6455] applies. +   When a CoAP server exposes resources identified by a "coaps+ws" URI, +   the guidance in Section 4.4 of [RFC7925] applies towards mandatory- +   to-implement TLS functionality for certificates.  For the server-side +   requirements for accepting incoming connections over an HTTPS +   (HTTP over TLS) port, the guidance in Section 4.2 of [RFC6455] +   applies. + +   Note that the guidance above formally inherits the mandatory-to- +   implement cipher suites defined in [RFC5246].  However, modern +   browsers usually implement cipher suites that are more recent; these +   cipher suites are then automatically picked up via the JavaScript +   WebSocket API.  WebSocket servers that provide secure CoAP over +   WebSockets for the browser use case will need to follow the browser +   preferences and MUST follow [RFC7525]. + +10.  Security Considerations + +   The security considerations of [RFC7252] apply.  For CoAP over +   WebSockets and CoAP over TLS-secured WebSockets, the security +   considerations of [RFC6455] also apply. + +10.1.  Signaling Messages + +   The guidance given by an Alternative-Address Option cannot be +   followed blindly.  In particular, a peer MUST NOT assume that a +   successful connection to the Alternative-Address inherits all the +   security properties of the current connection. + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 37] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +11.  IANA Considerations + +11.1.  Signaling Codes + +   IANA has created a third subregistry for values of the Code field in +   the CoAP header (Section 12.1 of [RFC7252]).  The name of this +   subregistry is "CoAP Signaling Codes". + +   Each entry in the subregistry must include the Signaling Code in the +   range 7.00-7.31, its name, and a reference to its documentation. + +   Initial entries in this subregistry are as follows: + +                      +------+---------+-----------+ +                      | Code | Name    | Reference | +                      +------+---------+-----------+ +                      | 7.01 | CSM     | RFC 8323  | +                      |      |         |           | +                      | 7.02 | Ping    | RFC 8323  | +                      |      |         |           | +                      | 7.03 | Pong    | RFC 8323  | +                      |      |         |           | +                      | 7.04 | Release | RFC 8323  | +                      |      |         |           | +                      | 7.05 | Abort   | RFC 8323  | +                      +------+---------+-----------+ + +                       Table 1: CoAP Signaling Codes + +   All other Signaling Codes are Unassigned. + +   The IANA policy for future additions to this subregistry is +   "IETF Review" or "IESG Approval" as described in [RFC8126]. + +11.2.  CoAP Signaling Option Numbers Registry + +   IANA has created a subregistry for Option Numbers used in CoAP +   Signaling Options within the "Constrained RESTful Environments (CoRE) +   Parameters" registry.  The name of this subregistry is "CoAP +   Signaling Option Numbers". + +   Each entry in the subregistry must include one or more of the codes +   in the "CoAP Signaling Codes" subregistry (Section 11.1), the number +   for the Option, the name of the Option, and a reference to the +   Option's documentation. + + + + + + +Bormann, et al.              Standards Track                   [Page 38] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Initial entries in this subregistry are as follows: + +         +------------+--------+---------------------+-----------+ +         | Applies to | Number | Name                | Reference | +         +------------+--------+---------------------+-----------+ +         | 7.01       |      2 | Max-Message-Size    |  RFC 8323 | +         |            |        |                     |           | +         | 7.01       |      4 | Block-Wise-Transfer |  RFC 8323 | +         |            |        |                     |           | +         | 7.02, 7.03 |      2 | Custody             |  RFC 8323 | +         |            |        |                     |           | +         | 7.04       |      2 | Alternative-Address |  RFC 8323 | +         |            |        |                     |           | +         | 7.04       |      4 | Hold-Off            |  RFC 8323 | +         |            |        |                     |           | +         | 7.05       |      2 | Bad-CSM-Option      |  RFC 8323 | +         +------------+--------+---------------------+-----------+ + +                   Table 2: CoAP Signaling Option Codes + +   The IANA policy for future additions to this subregistry is based on +   number ranges for the option numbers, analogous to the policy defined +   in Section 12.2 of [RFC7252].  (The policy is analogous rather than +   identical because the structure of this subregistry includes an +   additional column ("Applies to"); however, the value of this column +   has no influence on the policy.) + +   The documentation for a Signaling Option Number should specify the +   semantics of an option with that number, including the following +   properties: + +   o  Whether the option is critical or elective, as determined by the +      Option Number. + +   o  Whether the option is repeatable. + +   o  The format and length of the option's value. + +   o  The base value for the option, if any. + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 39] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +11.3.  Service Name and Port Number Registration + +   IANA has assigned the port number 5683 and the service name "coap", +   in accordance with [RFC6335]. + +   Service Name: +      coap + +   Transport Protocol: +      tcp + +   Assignee: +      IESG <iesg@ietf.org> + +   Contact: +      IETF Chair <chair@ietf.org> + +   Description: +      Constrained Application Protocol (CoAP) + +   Reference: +      RFC 8323 + +   Port Number: +      5683 + +11.4.  Secure Service Name and Port Number Registration + +   IANA has assigned the port number 5684 and the service name "coaps", +   in accordance with [RFC6335].  The port number is to address the +   exceptional case of TLS implementations that do not support the ALPN +   extension [RFC7301]. + +   Service Name: +      coaps + +   Transport Protocol: +      tcp + +   Assignee: +      IESG <iesg@ietf.org> + +   Contact: +      IETF Chair <chair@ietf.org> + +   Description: +      Constrained Application Protocol (CoAP) + + + + +Bormann, et al.              Standards Track                   [Page 40] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Reference: +      [RFC7301], RFC 8323 + +   Port Number: +      5684 + +11.5.  URI Scheme Registration + +   URI schemes are registered within the "Uniform Resource Identifier +   (URI) Schemes" registry maintained at [IANA.uri-schemes]. + +   Note: The following has been added as a note for each of the URI +   schemes defined in this document: + +      CoAP registers different URI schemes for accessing CoAP resources +      via different protocols.  This approach runs counter to the WWW +      principle that a URI identifies a resource and that multiple URIs +      for identifying the same resource should be avoided +      <https://www.w3.org/TR/webarch/#avoid-uri-aliases>. + +   This is not a problem for many of the usage scenarios envisioned for +   CoAP over reliable transports; additional URI schemes can be +   introduced to address additional usage scenarios (as being prepared, +   for example, in [Multi-Transport-URIs] and [CoAP-Alt-Transports]). + +11.5.1.  coap+tcp + +   IANA has registered the URI scheme "coap+tcp".  This registration +   request complies with [RFC7595]. + +   Scheme name: +      coap+tcp + +   Status: +      Permanent + +   Applications/protocols that use this scheme name: +      The scheme is used by CoAP endpoints to access CoAP resources +      using TCP. + +   Contact: +      IETF Chair <chair@ietf.org> + +   Change controller: +      IESG <iesg@ietf.org> + +   Reference: +      Section 8.1 in RFC 8323 + + + +Bormann, et al.              Standards Track                   [Page 41] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +11.5.2.  coaps+tcp + +   IANA has registered the URI scheme "coaps+tcp".  This registration +   request complies with [RFC7595]. + +   Scheme name: +      coaps+tcp + +   Status: +      Permanent + +   Applications/protocols that use this scheme name: +      The scheme is used by CoAP endpoints to access CoAP resources +      using TLS. + +   Contact: +      IETF Chair <chair@ietf.org> + +   Change controller: +      IESG <iesg@ietf.org> + +   Reference: +      Section 8.2 in RFC 8323 + +11.5.3.  coap+ws + +   IANA has registered the URI scheme "coap+ws".  This registration +   request complies with [RFC7595]. + +   Scheme name: +      coap+ws + +   Status: +      Permanent + +   Applications/protocols that use this scheme name: +      The scheme is used by CoAP endpoints to access CoAP resources +      using the WebSocket Protocol. + +   Contact: +      IETF Chair <chair@ietf.org> + +   Change controller: +      IESG <iesg@ietf.org> + +   Reference: +      Section 8.3 in RFC 8323 + + + + +Bormann, et al.              Standards Track                   [Page 42] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +11.5.4.  coaps+ws + +   IANA has registered the URI scheme "coaps+ws".  This registration +   request complies with [RFC7595]. + +   Scheme name: +      coaps+ws + +   Status: +      Permanent + +   Applications/protocols that use this scheme name: +      The scheme is used by CoAP endpoints to access CoAP resources +      using the WebSocket Protocol secured with TLS. + +   Contact: +      IETF Chair <chair@ietf.org> + +   Change controller: +      IESG <iesg@ietf.org> + +   References: +      Section 8.4 in RFC 8323 + +11.6.  Well-Known URI Suffix Registration + +   IANA has registered "coap" in the "Well-Known URIs" registry.  This +   registration request complies with [RFC5785]. + +   URI suffix: +      coap + +   Change controller: +      IETF + +   Specification document(s): +      RFC 8323 + +   Related information: +      None. + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 43] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +11.7.  ALPN Protocol Identifier + +   IANA has assigned the following value in the "Application-Layer +   Protocol Negotiation (ALPN) Protocol IDs" registry created by +   [RFC7301].  The "coap" string identifies CoAP when used over TLS. + +   Protocol: +      CoAP + +   Identification Sequence: +      0x63 0x6f 0x61 0x70 ("coap") + +   Reference: +      RFC 8323 + +11.8.  WebSocket Subprotocol Registration + +   IANA has registered the WebSocket CoAP subprotocol in the "WebSocket +   Subprotocol Name Registry": + +   Subprotocol Identifier: +      coap + +   Subprotocol Common Name: +      Constrained Application Protocol (CoAP) + +   Subprotocol Definition: +      RFC 8323 + +11.9.  CoAP Option Numbers Registry + +   IANA has added this document as a reference for the following entries +   registered by [RFC7959] in the "CoAP Option Numbers" subregistry +   defined by [RFC7252]: + +                 +--------+--------+--------------------+ +                 | Number | Name   | Reference          | +                 +--------+--------+--------------------+ +                 | 23     | Block2 | RFC 7959, RFC 8323 | +                 |        |        |                    | +                 | 27     | Block1 | RFC 7959, RFC 8323 | +                 +--------+--------+--------------------+ + +                       Table 3: CoAP Option Numbers + + + + + + + +Bormann, et al.              Standards Track                   [Page 44] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +12.  References + +12.1.  Normative References + +   [RFC793]   Postel, J., "Transmission Control Protocol", STD 7, +              RFC 793, DOI 10.17487/RFC0793, September 1981, +              <https://www.rfc-editor.org/info/rfc793>. + +   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate +              Requirement Levels", BCP 14, RFC 2119, +              DOI 10.17487/RFC2119, March 1997, +              <https://www.rfc-editor.org/info/rfc2119>. + +   [RFC3986]  Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform +              Resource Identifier (URI): Generic Syntax", STD 66, +              RFC 3986, DOI 10.17487/RFC3986, January 2005, +              <https://www.rfc-editor.org/info/rfc3986>. + +   [RFC5234]  Crocker, D., Ed., and P. Overell, "Augmented BNF for +              Syntax Specifications: ABNF", STD 68, RFC 5234, +              DOI 10.17487/RFC5234, January 2008, +              <https://www.rfc-editor.org/info/rfc5234>. + +   [RFC5246]  Dierks, T. and E. Rescorla, "The Transport Layer Security +              (TLS) Protocol Version 1.2", RFC 5246, +              DOI 10.17487/RFC5246, August 2008, +              <https://www.rfc-editor.org/info/rfc5246>. + +   [RFC5785]  Nottingham, M. and E. Hammer-Lahav, "Defining Well-Known +              Uniform Resource Identifiers (URIs)", RFC 5785, +              DOI 10.17487/RFC5785, April 2010, +              <https://www.rfc-editor.org/info/rfc5785>. + +   [RFC6066]  Eastlake 3rd, D., "Transport Layer Security (TLS) +              Extensions: Extension Definitions", RFC 6066, +              DOI 10.17487/RFC6066, January 2011, +              <https://www.rfc-editor.org/info/rfc6066>. + +   [RFC6455]  Fette, I. and A. Melnikov, "The WebSocket Protocol", +              RFC 6455, DOI 10.17487/RFC6455, December 2011, +              <https://www.rfc-editor.org/info/rfc6455>. + +   [RFC7252]  Shelby, Z., Hartke, K., and C. Bormann, "The Constrained +              Application Protocol (CoAP)", RFC 7252, +              DOI 10.17487/RFC7252, June 2014, +              <https://www.rfc-editor.org/info/rfc7252>. + + + + + +Bormann, et al.              Standards Track                   [Page 45] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   [RFC7301]  Friedl, S., Popov, A., Langley, A., and E. Stephan, +              "Transport Layer Security (TLS) Application-Layer Protocol +              Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, +              July 2014, <https://www.rfc-editor.org/info/rfc7301>. + +   [RFC7525]  Sheffer, Y., Holz, R., and P. Saint-Andre, +              "Recommendations for Secure Use of Transport Layer +              Security (TLS) and Datagram Transport Layer Security +              (DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, +              May 2015, <https://www.rfc-editor.org/info/rfc7525>. + +   [RFC7595]  Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines +              and Registration Procedures for URI Schemes", BCP 35, +              RFC 7595, DOI 10.17487/RFC7595, June 2015, +              <https://www.rfc-editor.org/info/rfc7595>. + +   [RFC7641]  Hartke, K., "Observing Resources in the Constrained +              Application Protocol (CoAP)", RFC 7641, +              DOI 10.17487/RFC7641, September 2015, +              <https://www.rfc-editor.org/info/rfc7641>. + +   [RFC7925]  Tschofenig, H., Ed., and T. Fossati, "Transport Layer +              Security (TLS) / Datagram Transport Layer Security (DTLS) +              Profiles for the Internet of Things", RFC 7925, +              DOI 10.17487/RFC7925, July 2016, +              <https://www.rfc-editor.org/info/rfc7925>. + +   [RFC7959]  Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in +              the Constrained Application Protocol (CoAP)", RFC 7959, +              DOI 10.17487/RFC7959, August 2016, +              <https://www.rfc-editor.org/info/rfc7959>. + +   [RFC8126]  Cotton, M., Leiba, B., and T. Narten, "Guidelines for +              Writing an IANA Considerations Section in RFCs", BCP 26, +              RFC 8126, DOI 10.17487/RFC8126, June 2017, +              <https://www.rfc-editor.org/info/rfc8126>. + +   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in +              RFC 2119 Key Words", BCP 14, RFC 8174, +              DOI 10.17487/RFC8174, May 2017, +              <https://www.rfc-editor.org/info/rfc8174>. + +   [RFC8307]  Bormann, C., "Well-Known URIs for the WebSocket Protocol", +              RFC 8307, DOI 10.17487/RFC8307, January 2018, +              <https://www.rfc-editor.org/info/rfc8307>. + + + + + + +Bormann, et al.              Standards Track                   [Page 46] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +12.2.  Informative References + +   [BK2015]   Byrne, C. and J. Kleberg, "Advisory Guidelines for UDP +              Deployment", Work in Progress, draft-byrne-opsec-udp- +              advisory-00, July 2015. + +   [CoAP-Alt-Transports] +              Silverajan, B. and T. Savolainen, "CoAP Communication with +              Alternative Transports", Work in Progress, +              draft-silverajan-core-coap-alternative-transports-10, +              July 2017. + +   [CoCoA]    Bormann, C., Betzler, A., Gomez, C., and I. Demirkol, +              "CoAP Simple Congestion Control/Advanced", Work in +              Progress, draft-ietf-core-cocoa-02, October 2017. + +   [EK2016]   Edeline, K., Kuehlewind, M., Trammell, B., Aben, E., and +              B. Donnet, "Using UDP for Internet Transport Evolution", +              arXiv preprint 1612.07816, December 2016, +              <https://arxiv.org/abs/1612.07816>. + +   [HomeGateway] +              Haetoenen, S., Nyrhinen, A., Eggert, L., Strowes, S., +              Sarolahti, P., and N. Kojo, "An experimental study of home +              gateway characteristics", Proceedings of the 10th ACM +              SIGCOMM conference on Internet measurement, +              DOI 10.1145/1879141.1879174, November 2010. + +   [IANA.uri-schemes] +              IANA, "Uniform Resource Identifier (URI) Schemes", +              <https://www.iana.org/assignments/uri-schemes>. + +   [LWM2M]    Open Mobile Alliance, "Lightweight Machine to Machine +              Technical Specification Version 1.0", February 2017, +              <http://www.openmobilealliance.org/release/LightweightM2M/ +              V1_0-20170208-A/ +              OMA-TS-LightweightM2M-V1_0-20170208-A.pdf>. + +   [Multi-Transport-URIs] +              Thaler, D., "Using URIs With Multiple Transport Stacks", +              Work in Progress, draft-thaler-appsawg-multi-transport- +              uris-01, July 2017. + +   [OSCORE]   Selander, G., Mattsson, J., Palombini, F., and L. Seitz, +              "Object Security for Constrained RESTful Environments +              (OSCORE)", Work in Progress, draft-ietf-core-object- +              security-08, January 2018. + + + + +Bormann, et al.              Standards Track                   [Page 47] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   [RFC768]   Postel, J., "User Datagram Protocol", STD 6, RFC 768, +              DOI 10.17487/RFC0768, August 1980, +              <https://www.rfc-editor.org/info/rfc768>. + +   [RFC6335]  Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. +              Cheshire, "Internet Assigned Numbers Authority (IANA) +              Procedures for the Management of the Service Name and +              Transport Protocol Port Number Registry", BCP 165, +              RFC 6335, DOI 10.17487/RFC6335, August 2011, +              <https://www.rfc-editor.org/info/rfc6335>. + +   [RFC6347]  Rescorla, E. and N. Modadugu, "Datagram Transport Layer +              Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, +              January 2012, <https://www.rfc-editor.org/info/rfc6347>. + +   [RFC7230]  Fielding, R., Ed., and J. Reschke, Ed., "Hypertext +              Transfer Protocol (HTTP/1.1): Message Syntax and Routing", +              RFC 7230, DOI 10.17487/RFC7230, June 2014, +              <https://www.rfc-editor.org/info/rfc7230>. + +   [RFC7540]  Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext +              Transfer Protocol Version 2 (HTTP/2)", RFC 7540, +              DOI 10.17487/RFC7540, May 2015, +              <https://www.rfc-editor.org/info/rfc7540>. + +   [SecurityChallenges] +              Polk, T. and S. Turner, "Security Challenges For the +              Internet Of Things", Interconnecting Smart Objects with +              the Internet / IAB Workshop, February 2011, +              <https://www.iab.org/wp-content/IAB-uploads/2011/03/ +              Turner.pdf>. + +   [SW2016]   Swett, I., "QUIC Deployment Experience @Google", IETF 96 +              Proceedings, Berlin, Germany, July 2016, +              <https://www.ietf.org/proceedings/96/slides/ +              slides-96-quic-3.pdf>. + +   [TCP-in-IoT] +              Gomez, C., Crowcroft, J., and M. Scharf, "TCP Usage +              Guidance in the Internet of Things (IoT)", Work in +              Progress, draft-ietf-lwig-tcp-constrained-node- +              networks-01, October 2017. + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 48] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +Appendix A.  Examples of CoAP over WebSockets + +   This appendix gives examples for the first two configurations +   discussed in Section 4. + +   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 +   as follows.  Figure 17 below illustrates the WebSocket and CoAP +   messages exchanged in detail. + +   1.  The CoAP client obtains the URI +       <coap+ws://example.org/sensors/temperature?u=Cel>, for example, +       from a resource representation that it retrieved previously. + +   2.  The CoAP client establishes a WebSocket connection to the +       endpoint URI composed of the authority "example.org" and the +       well-known path "/.well-known/coap", +       <ws://example.org/.well-known/coap>. + +   3.  CSMs (Section 5.3) are exchanged (not shown). + +   4.  The CoAP client sends a single-frame, masked, binary message +       containing a CoAP request.  The request indicates the target +       resource with the Uri-Path ("sensors", "temperature") and +       Uri-Query ("u=Cel") Options. + +   5.  The CoAP client waits for the server to return a response. + +   6.  The CoAP client uses the connection for further requests, or the +       connection is closed. + + + + + + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 49] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +      CoAP        CoAP +     Client      Server +   (WebSocket  (WebSocket +     Client)     Server) + +        |          | +        |          | +        +=========>|  GET /.well-known/coap HTTP/1.1 +        |          |  Host: example.org +        |          |  Upgrade: websocket +        |          |  Connection: Upgrade +        |          |  Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +        |          |  Sec-WebSocket-Protocol: coap +        |          |  Sec-WebSocket-Version: 13 +        |          | +        |<=========+  HTTP/1.1 101 Switching Protocols +        |          |  Upgrade: websocket +        |          |  Connection: Upgrade +        |          |  Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +        |          |  Sec-WebSocket-Protocol: coap +        :          : +        :<-------->:  Exchange of CSMs (not shown) +        |          | +        +--------->|  Binary frame (opcode=%x2, FIN=1, MASK=1) +        |          |    +-------------------------+ +        |          |    | GET                     | +        |          |    | Token: 0x53             | +        |          |    | Uri-Path: "sensors"     | +        |          |    | Uri-Path: "temperature" | +        |          |    | Uri-Query: "u=Cel"      | +        |          |    +-------------------------+ +        |          | +        |<---------+  Binary frame (opcode=%x2, FIN=1, MASK=0) +        |          |    +-------------------------+ +        |          |    | 2.05 Content            | +        |          |    | Token: 0x53             | +        |          |    | Payload: "22.3 Cel"     | +        |          |    +-------------------------+ +        :          : +        :          : +        +--------->|  Close frame (opcode=%x8, FIN=1, MASK=1) +        |          | +        |<---------+  Close frame (opcode=%x8, FIN=1, MASK=0) +        |          | + +    Figure 17: A CoAP Client Retrieves the Representation of a Resource +                       Identified by a "coap+ws" URI + + + + +Bormann, et al.              Standards Track                   [Page 50] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Figure 18 shows how a CoAP client uses a CoAP forward proxy with a +   WebSocket endpoint to retrieve the representation of the resource +   "coap://[2001:db8::1]/".  The use of the forward proxy and the +   address of the WebSocket endpoint are determined by the client from +   local configuration rules.  The request URI is specified in the +   Proxy-Uri Option.  Since the request URI uses the "coap" URI scheme, +   the proxy fulfills the request by issuing a Confirmable GET request +   over UDP to the CoAP server and returning the response over the +   WebSocket connection to the client. + +     CoAP        CoAP       CoAP +    Client      Proxy      Server +  (WebSocket  (WebSocket    (UDP +    Client)     Server)   Endpoint) + +       |          |          | +       +--------->|          |  Binary frame (opcode=%x2, FIN=1, MASK=1) +       |          |          |    +------------------------------------+ +       |          |          |    | GET                                | +       |          |          |    | Token: 0x7d                        | +       |          |          |    | Proxy-Uri: "coap://[2001:db8::1]/" | +       |          |          |    +------------------------------------+ +       |          |          | +       |          +--------->|  CoAP message (Ver=1, T=Con, MID=0x8f54) +       |          |          |    +------------------------------------+ +       |          |          |    | GET                                | +       |          |          |    | Token: 0x0a15                      | +       |          |          |    +------------------------------------+ +       |          |          | +       |          |<---------+  CoAP message (Ver=1, T=Ack, MID=0x8f54) +       |          |          |    +------------------------------------+ +       |          |          |    | 2.05 Content                       | +       |          |          |    | Token: 0x0a15                      | +       |          |          |    | Payload: "ready"                   | +       |          |          |    +------------------------------------+ +       |          |          | +       |<---------+          |  Binary frame (opcode=%x2, FIN=1, MASK=0) +       |          |          |    +------------------------------------+ +       |          |          |    | 2.05 Content                       | +       |          |          |    | Token: 0x7d                        | +       |          |          |    | Payload: "ready"                   | +       |          |          |    +------------------------------------+ +       |          |          | + +    Figure 18: A CoAP Client Retrieves the Representation of a Resource +       Identified by a "coap" URI via a WebSocket-Enabled CoAP Proxy + + + + + +Bormann, et al.              Standards Track                   [Page 51] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +Acknowledgments + +   We would like to thank Stephen Berard, Geoffrey Cristallo, Olivier +   Delaby, Esko Dijk, Christian Groves, Nadir Javed, Michael Koster, +   Achim Kraus, David Navarro, Szymon Sasin, Goeran Selander, Zach +   Shelby, Andrew Summers, Julien Vermillard, and Gengyu Wei for their +   feedback. + +   Last Call reviews from Yoshifumi Nishida, Mark Nottingham, and Meral +   Shirazipour as well as several IESG reviewers provided extensive +   comments; from the IESG, we would like to specifically call out Ben +   Campbell, Mirja Kuehlewind, Eric Rescorla, Adam Roach, and the +   responsible AD Alexey Melnikov. + +Contributors + +   Matthias Kovatsch +   Siemens AG +   Otto-Hahn-Ring 6 +   Munich  D-81739 +   Germany + +   Phone: +49-173-5288856 +   Email: matthias.kovatsch@siemens.com + + +   Teemu Savolainen +   Nokia Technologies +   Hatanpaan valtatie 30 +   Tampere  FI-33100 +   Finland + +   Email: teemu.savolainen@nokia.com + + +   Valik Solorzano Barboza +   Zebra Technologies +   820 W. Jackson Blvd. Suite 700 +   Chicago, IL  60607 +   United States of America + +   Phone: +1-847-634-6700 +   Email: vsolorzanobarboza@zebra.com + + + + + + + + +Bormann, et al.              Standards Track                   [Page 52] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +Authors' Addresses + +   Carsten Bormann +   Universitaet Bremen TZI +   Postfach 330440 +   Bremen  D-28359 +   Germany + +   Phone: +49-421-218-63921 +   Email: cabo@tzi.org + + +   Simon Lemay +   Zebra Technologies +   820 W. Jackson Blvd. Suite 700 +   Chicago, IL  60607 +   United States of America + +   Phone: +1-847-634-6700 +   Email: slemay@zebra.com + + +   Hannes Tschofenig +   ARM Ltd. +   110 Fulbourn Road +   Cambridge  CB1 9NJ +   United Kingdom + +   Email: Hannes.tschofenig@gmx.net +   URI:   http://www.tschofenig.priv.at + + +   Klaus Hartke +   Universitaet Bremen TZI +   Postfach 330440 +   Bremen  D-28359 +   Germany + +   Phone: +49-421-218-63905 +   Email: hartke@tzi.org + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 53] + +RFC 8323         TCP/TLS/WebSockets Transports for CoAP    February 2018 + + +   Bilhanan Silverajan +   Tampere University of Technology +   Korkeakoulunkatu 10 +   Tampere  FI-33720 +   Finland + +   Email: bilhanan.silverajan@tut.fi + + +   Brian Raymor (editor) + +   Email: brianraymor@hotmail.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Bormann, et al.              Standards Track                   [Page 54] + |