CoRE Working Group                                             K. Hartke
Internet-Draft                                   Universitaet Bremen TZI
Intended status: Standards Track                               Z. Shelby
Expires: September 16, 2011                                    Sensinode
                                                          March 15, 2011


                      Observing Resources in CoAP
                       draft-ietf-core-observe-02

Abstract

   CoAP is a RESTful application protocol for constrained nodes and
   networks.  The state of a resource on a CoAP server can change over
   time.  This specification provides a simple extension for CoAP that
   gives clients the ability to observe such changes.

Status of this Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at http://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on September 16, 2011.

Copyright Notice

   Copyright (c) 2011 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.



Hartke & Shelby        Expires September 16, 2011               [Page 1]


Internet-Draft         Observing Resources in CoAP            March 2011


Table of Contents

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
   2.  Overview . . . . . . . . . . . . . . . . . . . . . . . . . . .  3
   3.  Observation Relationships  . . . . . . . . . . . . . . . . . .  5
     3.1.  Establishment  . . . . . . . . . . . . . . . . . . . . . .  5
     3.2.  Maintenance  . . . . . . . . . . . . . . . . . . . . . . .  6
     3.3.  Termination  . . . . . . . . . . . . . . . . . . . . . . .  6
   4.  Notifications  . . . . . . . . . . . . . . . . . . . . . . . .  7
     4.1.  Strategies . . . . . . . . . . . . . . . . . . . . . . . .  8
     4.2.  Retransmission . . . . . . . . . . . . . . . . . . . . . .  8
     4.3.  Reordering . . . . . . . . . . . . . . . . . . . . . . . .  9
     4.4.  Caching  . . . . . . . . . . . . . . . . . . . . . . . . . 10
   5.  Observe Option . . . . . . . . . . . . . . . . . . . . . . . . 10
   6.  Interactions with other CoAP features  . . . . . . . . . . . . 11
     6.1.  Request Methods  . . . . . . . . . . . . . . . . . . . . . 11
     6.2.  Block-wise Transfers . . . . . . . . . . . . . . . . . . . 11
     6.3.  Resource Discovery . . . . . . . . . . . . . . . . . . . . 12
   7.  Security Considerations  . . . . . . . . . . . . . . . . . . . 12
   8.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 13
   9.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 13
   10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 13
     10.1. Normative References . . . . . . . . . . . . . . . . . . . 13
     10.2. Informative References . . . . . . . . . . . . . . . . . . 14
   Appendix A.  Examples  . . . . . . . . . . . . . . . . . . . . . . 15
     A.1.  Proxying . . . . . . . . . . . . . . . . . . . . . . . . . 16
   Appendix B.  Changelog . . . . . . . . . . . . . . . . . . . . . . 18
   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 19























Hartke & Shelby        Expires September 16, 2011               [Page 2]


Internet-Draft         Observing Resources in CoAP            March 2011


1.  Introduction

   CoAP [I-D.ietf-core-coap] is an Application Protocol for Constrained
   Nodes/Networks.  It is intended to provide RESTful services [REST]
   not unlike HTTP [RFC2616], while reducing the complexity of
   implementation as well as the size of packets exchanged in order to
   make these services useful in a highly constrained network of
   themselves highly constrained nodes.

   The state of a resource on a CoAP server can change over time.  We
   want to give CoAP clients the ability to observe this change.
   However, existing approaches from the HTTP world, such as repeated
   polling or long-polls, generate significant complexity and/or
   overhead and thus are less applicable in the constrained CoAP world.
   Instead, a much simpler mechanism is provided to solve the basic
   problem of resource observation.  Note that there is no intention for
   this mechanism to solve the full set of problems that the existing
   HTTP solutions solve, or to replace publish/subscribe networks that
   solve a much more general problem [RFC5989].

   This specification describes an architecture and a protocol design
   that realizes the well-known subject/observer design pattern within
   the REST-based environment of CoAP.

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in [RFC2119].

   Where arithmetic is explained, this document uses the notation
   familiar from the programming language C, except that the operator
   "^" stands for exponentiation.


2.  Overview

   In the subject/observer design pattern, an object, called the
   subject, maintains a list of interested parties, called observers,
   and notifies them automatically when a predefined condition, event or
   state change occurs.  The subject provides a way for observers to
   register themselves with the subject.  This pattern supports a clean
   separation between components, such as data storage and user
   interface.









Hartke & Shelby        Expires September 16, 2011               [Page 3]


Internet-Draft         Observing Resources in CoAP            March 2011


   Observer           Subject
      |                  |
      |     Register     |
      +----------------->|
      |                  |
      |   Notification   |
      |<-----------------+
      |                  |
      |   Notification   |
      |<-----------------+
      |                  |
      |   Notification   |
      |<-----------------+
      |                  |

                 Figure 1: Subject/Observer Design Pattern

   The design pattern is realized in CoAP as follows:

   Subject:  In the context of CoAP, the subject is a resource located
      at some CoAP server.  The state of the resource may change over
      time, ranging from infrequent updates to continuous state
      transformations.

   Observer:  The observer is a CoAP client that is interested in the
      current state of the resource at any given time.

   Observation Relationship:  A client registers itself with a resource
      by sending a modified GET request to the server.  The request
      causes the server to establish an observation relationship between
      the client and the resource.  The response to the GET request
      supplies the client with a representation of the current resource
      state.

   Notification:  Whenever the state of a resource changes, the server
      notifies each client that has an observation relationship to that
      resource.  The notification is an additional response to the GET
      request; it supplies the client with a representation of the new
      resource state.  The response echoes the token specified in the
      request, so the client can easily correlate notifications.

   Figure 2 shows an example of a CoAP client establishing an
   observation relationship to a resource on a CoAP server and being
   notified, once upon registration and then whenever the state of the
   resource changes.  The request to establish an observation
   relationship and all notifications are identified by the new Observe
   Option defined in this document.




Hartke & Shelby        Expires September 16, 2011               [Page 4]


Internet-Draft         Observing Resources in CoAP            March 2011


   Client              Server
      |                  |
      | GET /temperature |
      |  Observe: 0      |  (establish observation relationship)
      |    Token: 0x4a   |
      +----------------->|
      |                  |
      |   2.05 Content   |
      |  Observe: 12     |  (initial notification of current state)
      |    Token: 0x4a   |
      |  Payload: 22.9 C |
      |<-----------------+
      |                  |
      |   2.05 Content   |
      |  Observe: 44     |  (notification upon state change)
      |    Token: 0x4a   |
      |  Payload: 22.8 C |
      |<-----------------+
      |                  |
      |   2.05 Content   |
      |  Observe: 60     |  (notification upon state change)
      |    Token: 0x4a   |
      |  Payload: 23.1 C |
      |<-----------------+
      |                  |

                  Figure 2: Observing a Resource in CoAP


3.  Observation Relationships

3.1.  Establishment

   A client registers itself with a resource by performing a GET request
   that includes an Observe Option.  (See Section 5 for the option
   definition.)  When a server receives such a request, it services the
   request like a GET request without this option and, if the resulting
   response indicates success, establishes an observation relationship
   between the client and the target resource.

   The token specified by the client in the GET request will be echoed
   by the server in the initial response and in all notifications sent
   to the client as part of the observation relationship.  The server
   will also include an Observe Option in each response/notification to
   indicate that the observation relationship was successfully
   established.  (See Section 4 for the details of notifications.)

   A server that is unable or unwilling to establish an observation



Hartke & Shelby        Expires September 16, 2011               [Page 5]


Internet-Draft         Observing Resources in CoAP            March 2011


   relationship between a client and a resource MUST silently ignore the
   Observe Option and process the GET request as usual.  The resulting
   response will not include an Observe Option, implying that no
   observation relationship was established.

3.2.  Maintenance

   A client MAY refresh an observation relationship at any time.  (For
   example, when it didn't receive a notification for some time, it is
   not clear whether the resource never changed or the server rebooted
   and lost its state -- this is similar to the keep-alive problem of
   transport protocols, see e.g. the discussion in [RFC1122].)  However,
   it is RECOMMENDED that the client does not refresh the relationship
   for the time specified in the Max-Age Option of the most recent
   notification received, including the initial response.

   A client refreshes an observation relationship simply by repeating
   the GET request with the Observe Option.  When a server receives such
   a repeated request (i.e. a GET request from a client for which an
   observation relationship already exists), it MUST NOT establish a
   second relationship but replace or update the existing one.  If a GET
   request does not include an Observe Option, the server MUST end any
   relationship that may exist between the client and the target
   resource.

   The exact rules for determining if two requests relate to the same
   observation relationship are as follows:

   o  The request URI of the two requests MUST match.

   o  The sources of the two requests MUST match.  How this is
      determined depends on the security mode used (see Section 10 of
      [I-D.ietf-core-coap]): With NoSec, the IP address and port number
      of the request sources must match.  With other security modes, in
      addition to the IP address and UDP port number matching, the
      requests must have the same security context.

   o  The Message IDs and any Token Options in the two requests MUST NOT
      be taken into account.

3.3.  Termination

   The observation relationship between a client and a resource ends
   when one of the following conditions occurs:

   o  The server sends a notification response with an error response
      code (4.xx or 5.xx).




Hartke & Shelby        Expires September 16, 2011               [Page 6]


Internet-Draft         Observing Resources in CoAP            March 2011


   o  The client rejects a confirmable notification with a RST message.

   o  The last attempt of transmitting a confirmable notification to the
      client times out.  (In this case, the server MAY also end all
      other observation relationships that the client has.)

   A client MAY terminate an observation relationship by performing one
   of the following actions:

   o  The client rejects a confirmable notification with a RST message.

   o  The client performs a GET request on the resource without an
      Observe Option.


4.  Notifications

   When an observation relationship is established between a client and
   a resource, the client is notified of resource state changes by
   additional responses sent in reply to the GET request to the client.
   Each such notification response MUST include an Observe Option and
   echo the token specified by the client in the request.  The order in
   which observers are notified about a state change is not defined; the
   server is free to use any method to determine the order.

   A notification SHOULD have a 2.05 (Content) or 2.03 (Valid) response
   code.  However, in the event that the state of a resource is changed
   in a way that would cause a basic GET request to return an error (for
   example, when the resource is deleted), the server SHOULD notify the
   client by sending a notification with an appropriate error code and
   MUST end the observation relationship.

   The representation format (i.e. the media type) used in any
   notification resulting from an observation relationship MUST be the
   same format used in the initial response to the GET request.  If the
   server is unable to continue sending notifications in this format, it
   SHOULD send a 5.00 (Internal Server Error) notification response and
   MUST end the observation relationship.

   A notification can be sent confirmable or non-confirmable.  A server
   can employ different strategies for notifying a client; see
   Section 4.1 below.  The objective is that the state observed by the
   client eventually becomes consistent with the actual state of the
   resource.

   If a client does not recognize the token in a confirmable
   notification, it MUST NOT acknowledge the message and SHOULD reject
   the message with a RST message (in which case the server MUST end the



Hartke & Shelby        Expires September 16, 2011               [Page 7]


Internet-Draft         Observing Resources in CoAP            March 2011


   observation).  Otherwise, the client MUST acknowledge the message
   with an ACK message as usual.  See Section 4.2 for details on the
   retransmission of confirmable messages.

   Note that notifications may arrive in a different order than sent by
   the server due to network latency.  If a notification arrives before
   the initial response to a request, the client can take the
   notification as initial response in place of the actual initial
   response.  The client must be prepared to receive notifications after
   an error notification or after the client has requested the server to
   end the observation relationship.  See Section 4.3 for further
   details on message reordering.

   Notifications MAY be cached by CoAP end-points under the same
   conditions as with all responses.  This is detailed in Section 4.4.

4.1.  Strategies

   The objective when notifying clients of state changes is that the
   state observed by the client eventually becomes consistent with the
   actual state of the resource.  This allows the server some liberties
   in how it sends notifications, as long as it works towards this
   objective.

   A notification can be sent confirmable or non-confirmable.  The
   message type used is typically application-dependent and MAY be
   determined by the server for each notification individually.  For
   example, for resources that change in a somewhat predictable or
   regular fashion, notifications can be sent in non-confirmable
   messages.  For resources that change infrequently, notifications can
   be sent in confirmable messages.  The server can combine these two
   approaches depending on the frequency of state changes and the
   importance of individual notifications.

   A server MAY choose to omit notifying a client of a state change if
   it knows that it will send another notification soon (e.g., when the
   state is changing frequently or maybe even continuously).  Similarly,
   it MAY choose to notify a client about the same state change more
   than once.  For example, when state changes occur in bursts, the
   server can omit some notifications, send others in non-confirmable
   messages, and make sure that the client observes the latest state
   change by repeating the last notification in a confirmable message
   when the burst is over.

4.2.  Retransmission

   According to the core CoAP protocol, confirmable messages are
   retransmitted in exponentially increasing intervals for a certain



Hartke & Shelby        Expires September 16, 2011               [Page 8]


Internet-Draft         Observing Resources in CoAP            March 2011


   number of attempts until they are acknowledged by the client.  In the
   context of observing a resource, it is undesirable to continue
   transmitting the representation of a resource state when the state
   changed in the meantime.  There are many reasons why a client might
   not acknowledge a confirmable message, ranging from short
   interruptions in the network to a permanent failure of the client.

   When a server is retransmitting a confirmable message with a
   notification, is waiting for an acknowledgement, and wants to notify
   the client of a state change using a new confirmable message, it MUST
   stop retransmitting the old notification and MUST attempt to transmit
   the new notification with the number of attempts remaining from the
   old notification.  When the last attempt to retransmit a confirmable
   message with a notification for a resource times out, the observation
   relationship is ended.

4.3.  Reordering

   Messages with notifications can arrive in a different order than they
   were sent.  Since the objective is eventual consistency, a client can
   safely discard a notification that arrives later than a newer
   notification.

   For this purpose, the server keeps a single 16-bit unsigned integer
   variable.  The variable is incremented approximately every second,
   wrapping around every 2^16 seconds (roughly 18.2 hours).  The server
   MUST include the current value of the variable as the value of the
   Observe Option each time it sends a notification.  The server MUST
   NOT send two notifications with the same value of the variable that
   pertain to the same resource to the same client.

   A client MAY discard a notification as outdated (not fresh) under the
   following condition:

      (V1 - V2) % (2^16) < (2^15)    and    T2 < (T1 + (2^14))

   where T1 is a client-local timestamp of the latest valid notification
   received for this resource (in seconds), T2 a client-local timestamp
   of the current notification, V1 the value of the Observe Option of
   the latest valid notification received, and V2 the value of the
   Observe Option of the current notification.  The first condition
   essentially verifies that V2 > V1 holds in 16-bit sequence number
   arithmetic [RFC1982].  The second condition checks that the time
   expired between the two incoming messages is not so large that the
   sequence number might have wrapped around and the first check is
   therefore invalid (but is not needed any more, because reordering is
   not expected to occur on the order of 2^14 seconds).  Note that the
   constants of 2^14 and 2^15 are non-critical, as is the even speed of



Hartke & Shelby        Expires September 16, 2011               [Page 9]


Internet-Draft         Observing Resources in CoAP            March 2011


   the clocks involved; e.g., the second check can be implemented by
   marking a response as fresh on reception and downgrading all
   responses periodically every, say, 2^13 seconds; once it has been
   downgraded twice, it no longer participates in freshness checks.

4.4.  Caching

   As notifications are just additional responses to a GET request, the
   same rules on caching apply as to all responses: CoAP end-points MAY
   cache the responses and thereby reduce the response time and network
   bandwidth consumption.  Both the freshness model and the validation
   model are supported.

   When a response is fresh in the cache, GET requests can be satisfied
   without contacting the origin server.  This is particularly useful
   when the cache is located at an CoAP intermediary such as a proxy or
   reverse proxy.  (Note that the freshness of the stored response is
   determined by its Max-Age Option, not the existence of an observation
   relationship.  So a request can cause the end-point to refresh cache
   and observation relationship even while having an relationship.)

   When an end-point has one or more responses stored, it can use the
   ETag Option to give the origin server an opportunity to select a
   stored response to be used.  The end-point SHOULD add an ETag Option
   specifying the entity-tag of each stored response that is applicable.
   It MUST keep those responses in the cache until it terminates the
   observation relationship or sends a GET request with a new set of
   entity-tags.  When the observed resource changes its state and the
   origin server is about to send a 2.05 (Content) notification, then,
   whenever that notification has an entity-tag in the set of entity-
   tags specified by the client, it sends a 2.03 (Valid) response with
   an appropriate ETag Option instead.  The server MUST NOT assume that
   the recipient has any response stored other than those identified by
   the entity-tags in the most recent request.


5.  Observe Option

         +-----+----------+---------+--------+--------+---------+
         | No. | C/E      | Name    | Format | Length | Default |
         +-----+----------+---------+--------+--------+---------+
         |  10 | Elective | Observe | uint   | 0-2 B  | (none)  |
         +-----+----------+---------+--------+--------+---------+

                           Table 1: New Options

   The Observe Option, when present, modifies the GET method so it does
   not only retrieve a representation of the current state of the



Hartke & Shelby        Expires September 16, 2011              [Page 10]


Internet-Draft         Observing Resources in CoAP            March 2011


   resource identified by the request URI once, but also lets the server
   notify the client of changes to the resource state.

   In a response, the Observe Option indicates that an observation
   relationship has been established.  The option's value is a sequence
   number that can be used for reordering detection (see Section 4.3).
   The value is encoded as a variable-length unsigned integer (see
   Appendix A of [I-D.ietf-core-coap]).

   Since the Observe Option is elective, a GET request that includes the
   Observe Option will automatically fall back to a basic GET request if
   the server does not support observations.


6.  Interactions with other CoAP features

6.1.  Request Methods

   If a client has an observation relationship with a resource and
   performs a POST, PUT or DELETE request on that resource, the request
   MUST NOT affect the observation relationship.  However, since such a
   request can affect the observed resource, it can cause the server to
   send a notification with a resource state representation or end the
   observation relationship with an error notification (e.g., when a
   DELETE request is successful and an observed resource no longer
   exists).

   Note that a client cannot perform a GET request on a resource to
   retrieve a representation of the current resource state without
   affecting an existing observation relationship to that resource: the
   client is already notified by the server with a fresh representation
   whenever the state changes.  If the client wants to make sure that is
   has a fresh representation and wants to continue being notified, it
   should refresh the observation relationship (see Section 3.2).  If
   the client wants to make sure it has a fresh representation and does
   not want to continue being notified, it should perform a GET request
   without an Observe Option (see Section 3.3).

6.2.  Block-wise Transfers

   Resources that are the subject of an observation relationship may be
   larger than can be comfortably processed or transferred in one CoAP
   message.  CoAP provides a block-wise transfer mechanism to address
   this problem [I-D.ietf-core-block].  The following rules apply to the
   combination of block-wise transfers with notifications:

   o  As with basic GET transfers, the client can indicate its desired
      block size in a Block option in the GET request.  If the server



Hartke & Shelby        Expires September 16, 2011              [Page 11]


Internet-Draft         Observing Resources in CoAP            March 2011


      supports block-wise transfers, it SHOULD take note of the block
      size not just for the initial response but also for further
      notifications in this observation relationship.

   o  Notification responses can make use of the Block option.  The
      client SHOULD use the Observe option value from the last block.
      All blocks in a notification response SHOULD also carry an ETag
      option to ensure they are reassembled correctly.

6.3.  Resource Discovery

   Clients can discover resources that are interesting to observe using
   CoRE Resource Discovery [I-D.ietf-core-link-format].  Links with the
   "obs" attribute indicate resources that MUST support the mechanism in
   this document and are RECOMMENDED to change their state at least once
   in a while.

   The "obs" attribute is used as a flag, and thus it has no value
   component.  The attribute MUST NOT appear more than once in a link.


7.  Security Considerations

   The security considerations of the base protocol [I-D.ietf-core-coap]
   apply.

   Note that the considerations about amplification attacks are somewhat
   amplified in an observation relationship.  In NoSec mode, a server
   MUST therefore strictly limit the number of messages generated from
   an observation relationship that it sends between receiving packets
   that confirm the actual interest of the recipient in the data; i.e.,
   any notifications sent in Non-Confirmable messages MUST be
   interspersed with Confirmable messages.  (An Attacker may still spoof
   the acknowledgements if the Confirmable messages are sufficiently
   predictable.)

   As with any protocol that creates state, attackers may attempt to
   exhaust the resources that the server has available for maintaining
   observation relationships.  Servers MAY want to access-control this
   creation of state.  As degraded behavior, the server can always fall
   back to a basic GET request (without an Observe option) if it is
   unwilling or unable to establish the observation relationship,
   including if resources for state are exhausted or nearing exhaustion.

   Intermediaries MUST be careful to ensure that notifications cannot be
   employed to create a loop.  A simple way to break any loops is to
   employ caches for forwarding notifications in intermediaries.




Hartke & Shelby        Expires September 16, 2011              [Page 12]


Internet-Draft         Observing Resources in CoAP            March 2011


8.  IANA Considerations

   The following entry is added to the CoAP Option Numbers registry:

                     +--------+---------+-----------+
                     | Number | Name    | Reference |
                     +--------+---------+-----------+
                     |     10 | Observe | [RFCXXXX] |
                     +--------+---------+-----------+

                     Table 2: New CoAP Option Numbers

   The following entry is added to the CoRE Link Format Attribute
   registry:

                           +------+-----------+
                           | Name | Reference |
                           +------+-----------+
                           | obs  | [RFCXXXX] |
                           +------+-----------+

                 Table 3: New CoRE Link Format Attributes


9.  Acknowledgements

   Carsten Bormann was an original author of this draft and is
   acknowledged for significant contribution to this document.

   Thanks to Daniele Alessandrelli, Peter Bigot, Angelo Castellani,
   Gilbert Clark, Esko Dijk, Brian Frank and Salvatore Loreto for
   helpful comments and discussions that have shaped the document.

   Klaus Hartke was funded by the Klaus Tschira Foundation.


10.  References

10.1.  Normative References

   [I-D.ietf-core-block]
              Shelby, Z. and C. Bormann, "Blockwise transfers in CoAP",
              draft-ietf-core-block-02 (work in progress), March 2011.

   [I-D.ietf-core-coap]
              Shelby, Z., Hartke, K., Bormann, C., and B. Frank,
              "Constrained Application Protocol (CoAP)",
              draft-ietf-core-coap-05 (work in progress), March 2011.



Hartke & Shelby        Expires September 16, 2011              [Page 13]


Internet-Draft         Observing Resources in CoAP            March 2011


   [I-D.ietf-core-link-format]
              Shelby, Z., "CoRE Link Format",
              draft-ietf-core-link-format-03 (work in progress),
              March 2011.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119, March 1997.

10.2.  Informative References

   [REST]     Fielding, R., "Architectural Styles and the Design of
              Network-based Software Architectures", 2000, <http://
              www.ics.uci.edu/~fielding/pubs/dissertation/top.htm>.

   [RFC1122]  Braden, R., "Requirements for Internet Hosts -
              Communication Layers", STD 3, RFC 1122, October 1989.

   [RFC1982]  Elz, R. and R. Bush, "Serial Number Arithmetic", RFC 1982,
              August 1996.

   [RFC2616]  Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
              Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
              Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.

   [RFC5989]  Roach, A., "A SIP Event Package for Subscribing to Changes
              to an HTTP Resource", RFC 5989, October 2010.

























Hartke & Shelby        Expires September 16, 2011              [Page 14]


Internet-Draft         Observing Resources in CoAP            March 2011


Appendix A.  Examples

   Client  Server
      |      |
      |      |
      +----->|     Header: GET (T=CON, Code=1, MID=0x1633)
      | GET  |      Token: 0x4a
      |      |        Uri: coap://sensor.example/temperature
      |      |    Observe: 0
      |      |
      |      |
      |<-----+     Header: 2.05 Content (T=ACK, Code=69, MID=0x1633)
      | 2.05 |      Token: 0x4a
      |      |    Observe: 27
      |      |    Payload: "22.9 C"
      |      |
      |      |
      |<-----+     Header: 2.05 Content (T=NON, Code=69, MID=0x7b50)
      | 2.05 |      Token: 0x4a
      |      |    Observe: 28
      |      |    Payload: "22.8 C"
      |      |
      |      |
      |<-----+     Header: 2.05 Content (T=NON, Code=69, MID=0x7b51)
      | 2.05 |      Token: 0x4a
      |      |    Observe: 29
      |      |    Payload: "22.5 C"
      |      |

      Figure 3: Simple observation with non-confirmable notifications





















Hartke & Shelby        Expires September 16, 2011              [Page 15]


Internet-Draft         Observing Resources in CoAP            March 2011


A.1.  Proxying

Client  Proxy  Server
   |      |      |
   |      |      |
   |      +----->|     Header: GET (T=CON, Code=1, MID=0x5fb8)
   |      | GET  |      Token: 0x1a
   |      |      |        Uri: coap://sensor.example/status
   |      |      |    Observe: 0
   |      |      |
   |      |      |
   |      |<-----+     Header: 2.05 Content (T=ACK, Code=69, MID=0x5fb8)
   |      | 2.05 |      Token: 0x1a
   |      |      |    Observe: 42
   |      |      |    Max-Age: 120 sec
   |      |      |    Payload: "ready"
   |      |      |
   |      |      |
   +----->|      |     Header: GET (T=CON, Code=1, MID=0x1633)
   | GET  |      |      Token: 0x9a
   |      |      |  Proxy-Uri: coap://sensor.example/status
   |      |      |
   |      |      |
   |<-----+      |     Header: 2.05 Content (T=ACK, Code=69, MID=0x1633)
   | 2.05 |      |      Token: 0x9a
   |      |      |    Max-Age: 113 sec
   |      |      |    Payload: "ready"
   |      |      |
   |      |      |
   |      |<-----+     Header: 2.05 Content (T=NON, Code=69, MID=0x5fc0)
   |      | 2.05 |      Token: 0x1a
   |      |      |    Observe: 1780
   |      |      |    Max-Age: 120 sec
   |      |      |    Payload: "busy"
   |      |      |
   |      |      |
   +----->|      |     Header: GET (T=CON, Code=1, MID=0x1634)
   | GET  |      |      Token: 0x9b
   |      |      |  Proxy-Uri: coap://sensor.example/status
   |      |      |
   |      |      |
   |<-----+      |     Header: 2.05 Content (T=ACK, Code=69, MID=0x1634)
   | 2.05 |      |      Token: 0x9b
   |      |      |    Max-Age: 89 sec
   |      |      |    Payload: "busy"
   |      |      |

    Figure 4: A proxy observes a resource to keep its cache up to date



Hartke & Shelby        Expires September 16, 2011              [Page 16]


Internet-Draft         Observing Resources in CoAP            March 2011


Client  Proxy  Server
   |      |      |
   |      |      |
   +----->|      |     Header: GET (T=CON, Code=1, MID=0x1633)
   | GET  |      |      Token: 0x6a
   |      |      |  Proxy-Uri: coap://sensor.example/status
   |      |      |    Observe: 0
   |      |      |
   |      |      |
   |<- - -+      |     Header: (T=ACK, Code=0, MID=0x1633)
   |      |      |
   |      |      |
   |      +----->|     Header: GET (T=CON, Code=1, MID=0xaf90)
   |      | GET  |      Token: 0xaa
   |      |      |        Uri: coap://sensor.example/status
   |      |      |    Observe: 0
   |      |      |
   |      |      |
   |      |<-----+     Header: 2.05 Content (T=ACK, Code=69, MID=0xaf90)
   |      | 2.05 |      Token: 0xaa
   |      |      |    Observe: 67
   |      |      |    Payload: "ready"
   |      |      |
   |      |      |
   |<-----+      |     Header: 2.05 Content (T=CON, Code=69, MID=0xaf94)
   | 2.05 |      |      Token: 0x6a
   |      |      |    Observe: 346
   |      |      |    Payload: "ready"
   |      |      |
   |      |      |
   +- - ->|      |     Header: (T=ACK, Code=0, MID=0xaf94)
   |      |      |
   |      |      |
   |      |<-----+     Header: 2.05 Content (T=CON, Code=69, MID=0x5a20)
   |      | 2.05 |      Token: 0xaa
   |      |      |    Observe: 1460
   |      |      |    Payload: "busy"
   |      |      |
   |      |      |
   |      +- - ->|     Header: (T=ACK, Code=0, MID=0x5a20)
   |      |      |
   |      |      |
   |<-----+      |     Header: 2.05 Content (T=CON, Code=69, MID=0xaf9b)
   | 2.05 |      |      Token: 0x6a
   |      |      |    Observe: 2011
   |      |      |    Payload: "busy"
   |      |      |
   |      |      |



Hartke & Shelby        Expires September 16, 2011              [Page 17]


Internet-Draft         Observing Resources in CoAP            March 2011


   +- - ->|      |     Header: (T=ACK, Code=0, MID=0xaf9b)
   |      |      |

          Figure 5: A client observes a resource through a proxy


Appendix B.  Changelog

   Changes from ietf-01 to ietf-02:

   o  Removed the requirement of periodic refreshing (#126).

   o  The new "Observe" Option replaces the "Lifetime" Option.

   o  New mechanism to detect message reordering.

   o  Changed 2.00 (OK) notifications to 2.05 (Content) notifications.

   Changes from ietf-00 to ietf-01:

   o  Changed terminology from "subscriptions" to "observation
      relationships" (#33).

   o  Changed the name of the option to "Lifetime".

   o  Clarified establishment of observation relationships.

   o  Clarified that an observation is only identified by the URI of the
      observed resource and the identity of the client (#66).

   o  Clarified rules for establishing observation relationships (#68).

   o  Clarified conditions under which an observation relationship is
      terminated.

   o  Added explanation on how clients can terminate an observation
      relationship before the lifetime ends (#34).

   o  Clarified that the overriding objective for notifications is
      eventual consistency of the actual and the observed state (#67).

   o  Specified how a server needs to deal with clients not
      acknowledging confirmable messages carrying notifications (#69).

   o  Added a mechanism to detect message reordering (#35).

   o  Added an explanation of how notifications can be cached,
      supporting both the freshness and the validation model (#39, #64).



Hartke & Shelby        Expires September 16, 2011              [Page 18]


Internet-Draft         Observing Resources in CoAP            March 2011


   o  Clarified that non-GET requests do not affect observation
      relationships, and that GET requests without "Lifetime" Option
      affecting relationships is by design (#65).

   o  Described interaction with block-wise transfers (#36).

   o  Added Resource Discovery section (#99).

   o  Added IANA Considerations.

   o  Added Security Considerations (#40).

   o  Added examples (#38).


Authors' Addresses

   Klaus Hartke
   Universitaet Bremen TZI
   Postfach 330440
   Bremen  D-28359
   Germany

   Phone: +49-421-218-63905
   Fax:   +49-421-218-7000
   Email: hartke@tzi.org


   Zach Shelby
   Sensinode
   Kidekuja 2
   Vuokatti  88600
   Finland

   Phone: +358407796297
   Email: zach@sensinode.com















Hartke & Shelby        Expires September 16, 2011              [Page 19]