<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="2"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="std" docName="draft-ietf-netconf-restconf-notif-03"
     ipr="trust200902">
	 
  <front>
    <title abbrev="Restconf-Notif">Restconf and HTTP Transport for Event Notifications</title>

    <author fullname="Eric Voit" initials="E." surname="Voit">
      <organization>Cisco Systems</organization>

      <address>
        <email>evoit@cisco.com</email>
      </address>
    </author>

	<author fullname="Ambika Prasad Tripathy" initials="A" surname="Tripathy">
      <organization>Cisco Systems</organization>
      <address>
         <email>ambtripa@cisco.com</email>
      </address>
    </author>

    <author fullname="Einar Nilsen-Nygaard" initials="E"
            surname="Nilsen-Nygaard">
      <organization>Cisco Systems</organization>

      <address>
         <email>einarnn@cisco.com</email>
      </address>
    </author>

    <author fullname="Alexander Clemm" initials="A" surname="Clemm">
        <organization>Huawei</organization>
        <address>
            <email>ludwig@clemm.org</email>
        </address>
    </author>	
	
    <author fullname="Alberto Gonzalez Prieto" initials="A"
        surname="Gonzalez Prieto">
        <organization>VMWare</organization>
        <address>
            <email>agonzalezpri@vmware.com</email>
        </address>
    </author>

	<author fullname="Andy Bierman" initials="A"
            surname="Bierman">
      <organization>YumaWorks</organization>
      <address>
         <email>andy@yumaworks.com</email>
      </address>
    </author>
	
    <date day="4" month="August" year="2017"/>

    <area>Operations &amp; Management</area>

    <workgroup>NETCONF</workgroup>

    <keyword>Draft</keyword>

    <abstract>
        <t>This document defines Restconf, HTTP2, and HTTP1.1 bindings for the transport of Subscription requests and corresponding push updates. Being subscribed may be either publisher defined event streams or nodes/subtrees of YANG Datastores.</t>
    </abstract>
  </front>

  <middle> 
    <section title="Introduction">
      <t>Mechanisms to support Event subscription and push are defined in <xref target="sn"/>. Enhancements to <xref target="sn"/> which enable YANG Datastore subscription and push are defined in <xref target="yang-push"/>. This document provides a transport specification for these protocols over Restconf and HTTP.  Driving these requirements is <xref target="RFC7923"/>.</t>

      <t>The streaming of notifications encapsulating the resulting information push can be done with either HTTP1.1 and HTTP2.  When using HTTP2 <xref target="RFC7540"/> benefits which can be realized include:</t>

      <t><list style="symbols">
          <t>Elimination of head-of-line blocking</t>

          <t>Weighting and proportional dequeuing of Events from different subscriptions</t>

          <t>Explicit precedence in subscriptions so that events from one subscription must be sent before another dequeues</t>
        </list>
		</t>
    </section>

    <section title="Terminology">
      <t>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 <xref target="RFC2119">RFC 2119</xref>.</t>

      <t>The following terms use the defintions from <xref target="sn"/>: configured subscription, dynamic subscription, event notification, publisher, receiver, subscriber, and subscription.</t>

    </section>

    <section title="Solution">
      <t>Subscribing to event streams is defined in  <xref target="sn"/>, YANG Datastore subscription is defined in <xref target="yang-push"/>. This section specifies transport mechanisms applicable to both.</t>

      <section title="Dynamic YANG Subscription with RESTCONF control">
          <t>Dynamic Subscriptions for both <xref target="sn"/> and its <xref target="yang-push"/> augmentations are configured and managed via signaling messages transported over <xref target="RFC8040"/>. These interactions will be accomplished via a Restconf POST into RPCs located on the Publisher.  HTTP responses codes will indicate the results of the interaction with the Publisher.  An HTTP status code of 200 is the proper response to a successful &lt;establish-subscription&gt; RPC call.  The successful &lt;establish-subscription&gt; will result in a HTTP message with returned subscription URI on a logically separate mechanism than was used for the original Restconf POST.  This mechanism is via a parallel TCP connection in the case of HTTP 1.x, or in the case of HTTP2 via a separate HTTP stream within the HTTP connection.  When a being returned by the Publisher, failure will be indicated by error codes transported in payload.</t>

          <t>Once established, the resulting stream of notification messages are then delivered via SSE for HTTP1.1 and via HTTP Data for HTTP2.</t>
		  
		  <section title="Call Flow for HTTP2">
            <t>Requests to [sn] or [yang-push] augmented RPCs are sent on one or more HTTP2 streams indicated by (a) in Figure 2.  Notification messages related to a single subscription are pushed on a unique logical channel (b).  In the case below, a newly established subscription has its associated messages pushed over HTTP2 stream (7).</t>
            <figure title="Dynamic with HTTP2"
				anchor="dyn-http2"
				align="center">
			<artwork height="30" xml:space="preserve"><![CDATA[
+------------+                                 +------------+
| Subscriber |                                 | Publisher  |
|HTTP2 Stream|                                 |HTTP2 Stream|
|  (a)  (b)  |                                 |  (a)  (b)  |
+------------+                                 +------------+
    | Restconf POST (RPC:establish-subscription)   |
    |--------------------------------------------->|
    |                             HTTP 200 OK (URI)|
    |<---------------------------------------------|
    |   (7)HTTP POST (URI)                             (7)
    |    |--------------------------------------------->|
    |    |                                   HTTP 200 OK|
    |    |<---------------------------------------------|
    |    |                       HTTP Data (event-notif)|
    |    |<---------------------------------------------|
    | Restconf POST (RPC:modify-subscription)      |    |
    |--------------------------------------------->|    |
    |    |                              HTTP 200 OK|    |
    |<---------------------------------------------|    |
    |    |             HTTP Data (subscription-modified)|
    |    |<---------------------------------------------|
    |    |                       HTTP Data (event-notif)|
    |    |<---------------------------------------------|
    | Restconf POST (RPC:delete-subscription)      |    |
    |--------------------------------------------->|    |
    |    |                              HTTP 200 OK|    |
    |<---------------------------------------------|    |
    |    |                  HTTP Headers (end of stream)|
    |   (/7)<-----------------------------------------(/7)
    |]]></artwork>
            </figure>	
          </section>

		  <section title="Call flow for HTTP1.1">
		    <t>Requests to [yang-push] RPCs are sent on the TCP connection indicated by (a).  Notification messages are pushed on a separate connection (b).  This connection (b) will be used for all notification messages across all subscriptions.</t>
		  
            <figure title="Dynamic with HTTP1.1"
				anchor="dyn-http11"
				align="center">
			  <artwork height="29" xml:space="preserve"><![CDATA[
+--------------+                             +--------------+
|  Subscriber  |                             |   Publisher  |
|TCP connection|                             |TCP connection|
|  (a)  (b)    |                             |    (a)  (b)  |
+--------------+                             +--------------+
    | Restconf POST (RPC:establish-subscription)   |
    |--------------------------------------------->|
    |                             HTTP 200 OK (URI)|
    |<---------------------------------------------|
    |    |HTTP GET (URI)                                |
    |    |--------------------------------------------->|
    |    |                                   HTTP 200 OK|
    |    |<---------------------------------------------|
    |    |                             SSE (event-notif)|
    |    |<---------------------------------------------|
    | Restconf POST (RPC:modify-subscription)      |    |
    |--------------------------------------------->|    |
    |    |                              HTTP 200 OK|    |
    |<---------------------------------------------|    |
    |    |                   SSE (subscription-modified)|
    |    |<---------------------------------------------|
    |    |                             SSE (event-notif)|
    |    |<---------------------------------------------|
    | Restconf POST (RPC:delete-subscription)      |    |
    |--------------------------------------------->|    |
    |    |                              HTTP 200 OK|    |
    |<---------------------------------------------|    |
    |    |                                              |
    |    |]]></artwork>
            </figure>	
          </section>		
		
          <section title="Configured Subscription over HTTP2">
            <t>With a Configured Subscription, all information needed to establish a secure relationship with that Receiver is available on the Publisher. With this information, the Publisher will establish a secure transport connection with the Receiver and then begin pushing notification messages to the Receiver. Since Restconf might not exist on the Receiver, it is not desirable to require that subscribed content be pushed with any dependency on Restconf. Nor is there value which Restconf provides on top of HTTP. Therefore in place of Restconf, a TLS secured HTTP2 Client connection must be established with an HTTP2 Server located on the Receiver. Notification messages will then be sent as part of an extended HTTP POST to the Receiver.</t>

            <t>POST messages will be addressed to HTTP augmentation code on the Receiver capable of accepting and responding to state change notifications and subscribed content notification messages. The first POST message must be a subscription-started notification. Notifications which include any subscribed content must not be sent until the receipt of an HTTP 200 OK for this initial notification. The 200 OK will indicate that the Receiver is ready for the delivery of subscribed content. At this point a Subscription must be allocated its own HTTP2 stream. Figure 4 depicts this message flow.</t>

            <figure title="Configured over HTTP2"
				anchor="conf-HTTP2"
				align="center">
			  <artwork height="15" xml:space="preserve"><![CDATA[
+------------+                                 +------------+
|  Receiver  |                                 | Publisher  |
|HTTP2 Stream|                                 |HTTP2 Stream|
|  (a)  (b)  |                                 |  (a)  (b)  |
+------------+                                 +------------+
    |    HTTP Post Headers, Data (sub-start, SubID)|
    |<---------------------------------------------|
    | HTTP 200 OK                                  |
    |--------------------------------------------->|
    |    |         HTTP Post Headers, Data (event-notif)|
    |    |<---------------------------------------------|
    |    |                       HTTP Data (event-notif)|
    |    |<---------------------------------------------|
    |    |                     HTTP Data (sub-terminate)|
    |    |<---------------------------------------------|
    |    |HTTP 200 OK                                   |
    |    |--------------------------------------------->|]]></artwork>
            </figure>

            <t>As the HTTP2 transport is available to the Receiver, the Publisher should:</t>

            <t><list style="symbols">
              <t>take any subscription-priority and copy it into the HTTP2 stream priority, and</t>

              <t>take a subscription-dependency if it has been provided and map the HTTP2 stream for the parent subscription into the HTTP2 stream dependency.</t>
            </list></t>
          </section>
      </section>

      <section title="Subscription Multiplexing">
        <t>It is possible that updates across subscriptions might be delivered in a different sequence than the encapsulated records were generated. Reasons for this might include (but are not limited to):</t>

        <t><list style="symbols">
		
		    <t>generation of event records on different line cards</t>
			
            <t>replay of pushed information, and</t>

            <t>temporary loss of transport connectivity, with update buffering and different dequeuing priorities per Subscription</t>

            <t>population, marshalling and bundling across independent Subscription Updates, and</t>
			
          </list></t>
		  
		  <t>Therefore each notification message will include a timestamp to provide a Receiver with its best information indicating when a particular record was generated.  Use of this timestamp can give an indication of the state of objects at a Publisher.  This is especially important when state-entangled information is received across different subscriptions.  Note that use of notification message timestamps may not indicate a the exact time of occurrence.  So when state-entangled updates have inconsistent object values and temporally close timestamps, a Receiver might consider performing a GET to validate the current state of a Publisher.</t>
		  
      </section>
	</section>
	  
    <section title="Encoded Subscription and Notification Message Examples">

      <section title="Restconf Subscription and Events over HTTP1.1">
          <t>Subscribers can dynamically learn whether a RESTCONF server supports various types of Event or Yang datastore subscription capabilities. This is done by issuing an HTTP request OPTIONS, HEAD, or GET on the stream. Some examples building upon the Call flow for HTTP1.1 from Section 3.2.2 are:</t>

          <figure>
            <artwork><![CDATA[GET /restconf/data/ietf-restconf-monitoring:restconf-state/
         streams/stream=yang-push HTTP/1.1
Host: example.com
Accept: application/yang.data+xml ]]></artwork>
          </figure>

          <t>If the server supports it, it may respond</t>

          <figure>
            <artwork><![CDATA[HTTP/1.1 200 OK
Content-Type: application/yang.api+xml
<stream xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring">
            <name>yang-push</name>
            <description>Yang push stream</description>
            <access>
               <encoding>xml</encoding>
               <location>https://example.com/streams/yang-push-xml
               </location>
            </access>
            <access>
               <encoding>json</encoding>
               <location>https://example.com/streams/yang-push-json
               </location>
            </access>
         </stream>
]]></artwork>
          </figure>

          <t>If the server does not support any form of subscription, it may respond</t>

          <figure>
            <artwork><![CDATA[HTTP/1.1 404 Not Found
Date: Mon, 25 Apr 2012 11:10:30 GMT
Server: example-server
]]></artwork>
          </figure>

          <t>Subscribers can determine the URL to receive updates by sending an HTTP GET as a request for the "location" leaf with the stream list entry. The stream to use for may be selected from the Event Stream list provided in the capabilities exchange. Note that different encodings are supporting using different Event Stream locations. For example, the Subscriber might send the following request:</t>

          <figure>
            <artwork><![CDATA[GET /restconf/data/ietf-restconf-monitoring:restconf-state/
         streams/stream=yang-push/access=xml/location HTTP/1.1
Host: example.com
Accept: application/yang.data+xml
]]></artwork>
          </figure>

          <t>The Publisher might send the following response:</t>

          <figure>
            <artwork><![CDATA[HTTP/1.1 200 OK
Content-Type: application/yang.api+xml
   <location
        xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring">
        https://example.com/streams/yang-push-xml
   </location>
]]></artwork>
          </figure>

          <t>To subscribe and start receiving updates, the subscriber can then send an HTTP GET request for the URL returned by the Publisher in the request above. The accept header must be "text/event-stream". The Publisher uses the Server Sent Events <xref target="W3C-20150203"/> transport strategy to push filtered events from the event stream.</t>

          <t>The Publisher MUST support individual parameters within the POST request body for all the parameters of a subscription. The only exception is the encoding, which is embedded in the URI. An example of this is:</t>

          <figure>
            <artwork><![CDATA[// subtree filter = /foo
// periodic updates, every 5 seconds
POST /restconf/operations/ietf-event-notifications:
     establish-subscription HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "ietf-event-notifications:input" : {
          "stream": "push-data"
          "period" : 5,
          "xpath-filter" : "/ex:foo[starts-with('bar'.'some']"
        }
      }
]]></artwork>
          </figure>

          <t>Should the publisher not support the requested subscription, it may reply:</t>

          <figure>
            <artwork><![CDATA[HTTP/1.1 501 Not Implemented
Date: Mon, 23 Apr 2012 17:11:00 GMT
Server: example-server
Content-Type: application/yang.errors+xml
    <errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
       <error>
           <error-type>application</error-type>
           <error-tag>operation-not-supported</error-tag>
           <error-severity>error</error-severity>
           <error-message>Xpath filters not supported</error-message>
           <error-info>
               <supported-subscription xmlns="urn:ietf:params:xml:ns:
                   netconf:datastore-push:1.0">
                   <subtree-filter/>
               </supported-subscription>
           </error-info>
       </error>
     </errors>

with an equivalent JSON encoding representation of:

HTTP/1.1 501 Not Implemented
Date: Mon, 23 Apr 2012 17:11:00 GMT
Server: example-server
Content-Type: application/yang.errors+json
      {
        "ietf-restconf:errors": {
          "error": {
            "error-type": "protocol",
            "error-tag": "operation-not-supported",
            "error-message": "Xpath filters not supported."
            "error-info": {
               "datastore-push:supported-subscription": {
                     "subtree-filter": [null]
                 }
            }
          }
        }
      }
]]></artwork>
          </figure>

          <t>The following is an example of a pushed content for the Subscription above. It contains a subtree with root foo that contains a leaf called bar:</t>

          <figure>
            <artwork><![CDATA[XML encoding representation:
  <?xml version="1.0" encoding="UTF-8"?>  
  <notification xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
     <subscription-id xmlns="urn:ietf:params:xml:ns:restconf:
         datastore-push:1.0">
           my-sub
     </subscription-id>
     <eventTime>2015-03-09T19:14:56.233Z</eventTime>
     <datastore-contents xmlns="urn:ietf:params:xml:ns:restconf:
        datastore-push:1.0">
        <foo xmlns="http://example.com/yang-push/1.0">
          <bar>some_string</bar>
        </foo>
     </datastore-contents>
  </notification>
]]></artwork>
          </figure>

          <t>Or with the equivalent YANG over JSON encoding representation as defined in <xref target="RFC7951"/>:</t>

          <figure>
            <artwork><![CDATA[{
  "ietf-restconf:notification": {
    "datastore-push:subscription-id": "my-sub",
    "eventTime": "2015-03-09T19:14:56.233Z",
    "datastore-push:datastore-contents": {
      "example-mod:foo": { "bar": "some_string" }
    }
  }
}
]]></artwork>
          </figure>

          <t>To modify a Subscription, the subscriber issues another POST request on the provided URI using the same subscription-id as in the original request. For example, to modify the update period to 10 seconds, the subscriber may send:</t>

          <figure>
            <artwork><![CDATA[POST /restconf/operations/ietf-event-notifications:
      modify-subscription HTTP/1.1
      Host: example.com
      Content-Type: application/yang-data+json

      {
        "ietf-event-notifications:input" : {
          "subscription-id": 100,
          "period" : 10
        }
      }]]></artwork>
          </figure>

          <t>To delete a Subscription, the Subscriber issues a DELETE request on the provided URI using the same subscription-id as in the original request</t>
      </section>

      <section title="Event Notification over HTTP2">
          <t>The basic encoding will look as below. It will consists of a JSON representation wrapped in an HTTP2 header.</t>

          <figure>
            <artwork><![CDATA[HyperText Transfer Protocol 2
      Stream: HEADERS, Stream ID: 5
      Header: :method: POST
      Stream: HEADERS, Stream ID: 5

{
  "ietf-yangpush:notification": {
    "datastore-push:subscription-id": "my-sub",
    "eventTime": "2015-03-09T19:14:56.233Z",
    "datastore-push:datastore-contents": {
      "foo": { "bar": "some_string" }
    }
  }
}
]]></artwork>
          </figure>

      </section>
    </section>

    <section title="Security Considerations">
      <t>Subscriptions could be used to intentionally or accidentally overload the resources of a Publisher. For this reason, it is important that the Publisher has the ability to prioritize the establishment and push of notification messages where there is the potential for resource exhaust. In addition, a server needs to be able to suspend existing Subscriptions when needed. When this occurs, the subscription status must be updated accordingly and the Receivers notified.</t>

      <t>A Subscription could be used to attempt retrieve information for which a Receiver has no authorized access. Therefore it is important that data pushed via a Subscription is authorized equivalently with regular data retrieval operations. Data being pushed to a Receiver needs therefore to be filtered accordingly, just like if the data were being retrieved on-demand. The Netconf Authorization Control Model <xref target="RFC6536"/> applies even though the transport is not NETCONF.</t>

      <t>One or more Publishers of Configured Subscriptions could be used to overwhelm a Receiver which doesn't even support Subscriptions.  There are two protections here.  First, notification messages for Configured Subscriptions MUST only be transmittable over encrypted transports.  Clients which do not want pushed content need only terminate or refuse any transport sessions from the Publisher.  Second, the HTTP transport augmentation on the Receiver must send an HTTP 200 OK to a subscription started notification before the Publisher starts streaming any subscribed content.</t>

      <t>One or more Publishers could overwhelm a Receiver which is unable to control or handle the volume of Event Notifications received.  In deployments where this might be a concern, HTTP2 transport such as HTTP2) should be selected.</t>

    </section>

    <section title="Acknowledgments">
      <t>We wish to acknowledge the helpful contributions, comments, and suggestions that were received from: Susan Hares, Tim Jenkins, Balazs Lengyel, Kent Watsen, Michael Scharf, and Guangying Zheng.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119"?>

      <?rfc include="reference.RFC.6520"?>

      <?rfc include="reference.RFC.6536"?>

      <?rfc include="reference.RFC.7540"?>

      <?rfc include="reference.RFC.8040"?>

      <reference anchor="sn"  target="https://datatracker.ietf.org/doc/draft-ietf-netconf-subscribed-notifications/">
        <front>
          <title>Subscribing to Event Notifications</title>

          <author fullname="Eric Voit" initials="E" surname="Voit">
            <organization>Cisco</organization>
          </author>

          <author fullname="Alexander Clemm" initials="A" surname="Clemm">
            <organization>Huawei</organization>
          </author>
          
		  <author fullname="Alberto Gonzalez Prieto" initials="A"
                  surname="Gonzalez Prieto">
            <organization>Cisco</organization>
          </author>
		  
          <author fullname="Ambika Prasad Tripathy" initials="A"
                  surname="Prasad Tripathy">
            <organization>Cisco</organization>
          </author>

          <author fullname="Einar Nilsen-Nygaard" initials="E"
                  surname="Nilsen-Nygaard">
            <organization>Cisco</organization>
          </author>
		  
          <date day="23" month="February" year="2017"/>
        </front>
      </reference>

    </references>

    <references title="Informative References">
	
   	  <?rfc include="reference.RFC.7951"?>
	  
      <?rfc include="reference.RFC.7923"?>
	  
	  <?rfc include="reference.RFC.8071"?>

	  <reference anchor="yang-push"
                 target="https://datatracker.ietf.org/doc/draft-ietf-netconf-yang-push/">
        <front>
          <title>Subscribing to YANG datastore push updates</title>

          <author fullname="Alexander Clemm" initials="A" surname="Clemm">
            <organization>Huawei</organization>
          </author>

          <author fullname="Eric Voit" initials="E" surname="Voit">
            <organization>Cisco</organization>
          </author>
		  
          <author fullname="Alberto Gonzalez Prieto" initials="A"
                  surname="Gonzalez Prieto">
            <organization>VMWare</organization>
          </author>

          <author fullname="Ambika Prasad Tripathy" initials="A"
                  surname="Prasad Tripathy">
            <organization>Cisco</organization>
          </author>

          <author fullname="Einar Nilsen-Nygaard" initials="E"
                  surname="Nilsen-Nygaard">
            <organization>Cisco</organization>
          </author>
		  
		  <author fullname="Andy Bierman" initials="A"
                  surname="Bierman">
            <organization>YumaWorks</organization>
          </author>
		  
          <author fullname="B Lengyel" initials="B"
                  surname="Lengyel">
            <organization>Ericsson</organization>
          </author>

          <date day="1" month="March" year="2017"/>
        </front>
      </reference>
	
	
      <reference anchor="W3C-20150203"
                 target="https://www.w3.org/TR/2015/REC-eventsource-20150203/">
        <front>
          <title>Server-Sent Events, World Wide Web Consortium CR
          CR-eventsource-20121211</title>

          <author fullname="I Hickson">
            <organization/>
          </author>

          <date month="February" year="2015"/>
        </front>
      </reference>
	  
	  <reference anchor="GRPC" target="https://grpc.io/">
        <front>
          <title>RPC framework that runs over HTTP2</title>

          <author fullname="Google">
            <organization/>
          </author>

          <date month="August" year="2017"/>
        </front>
      </reference>

    </references>

    <section title="End-to-End Deployment Guidance">
      <t>Several technologies are expected to be seen within a deployment to achieve security and ease-of-use requirements. These are not necessary for an implementation of this specification, but will be useful to consider when considering the operational context.</t>

      <section title="Call Home">
        <t>Implementations should include the ability to transparently incorporate 'call home' <xref target="RFC8071"/> so that secure TLS connections can originate from the desired device.</t>

      </section>

      <section title="TLS Heartbeat">
        <t>HTTP sessions might not quickly allow a Subscriber to recognize when the communication path has been lost from the Publisher. To recognize this, it is possible for a Receiver to establish a TLS heartbeat <xref target="RFC6520"/>. In the case where a TLS heartbeat is included, it should be sent just from Receiver to Publisher. Loss of the heartbeat should result in any Subscription related TCP sessions between those endpoints being torn down.  The subscription can then attempt to re-establish. </t>

      </section>
    </section>

    <section title="RESTCONF over GRPC">

    <t>An initial goal for this document was to support <xref target="GRPC"/> transport seamlessly without any mapping or extra layering.  However there is an incompatibility of RESTCONF and GRPC.  RESTCONF uses HTTP GET, and GRPC uses HTTP2's POST rather than GET.  As GET is used across RESTCONF for things like capabilities exchange, a seamless mapping depends on specification changes outside the scope of this document.   If/when GRPC supports GET, or RESTCONF is updated to support POST, this should be revisited.  It is hoped that the resulting fix will be transparent to this document.</t>

    </section>
	
	<section title="Changes between revisions">
      <t>(To be removed by RFC editor prior to publication)</t>

	  <t>v01 - v03</t>
	  	<t><list style="symbols">
			<t>Terminoology aligned with draft-voit-netconf-notification-messages.</t>
			<t>Tweaks to wording/capitalization/format.</t>
		</list>
	  </t>
	  
	  <t>v01 - v02</t>
	  <t><list style="symbols">
			<t>Removed sections now redundant with [sn] and [yang-push] such as:  mechanisms for subscription maintenance, terminology definitions, stream discovery.</t>
			<t>3rd party subscriptions are out-of-scope.</t>
			<t>SSE only used with Restconf and HTTP1.1 Dynamic Subscriptions</t>
			<t>Timeframes for event tagging are self-defined.</t>
			<t>Clean-up of wording, references to terminology, section numbers.</t>
		</list>
	  </t>
	  
	  <t>v00 - v01</t>
	  <t><list style="symbols">
			<t>Removed the ability for more than one subscription to go to a single HTTP2 stream.</t>
			<t>Updated call flows.  Extensively.</t>
			<t>SSE only used with Restconf and HTTP1.1 Dynamic Subscriptions</t>
			<t>HTTP is not used to determine that a Receiver has gone silent and is not Receiving Event Notifications</t>
			<t>Many clean-ups of wording and terminology</t>
		</list>
	  </t>
	  
	</section>
  </back>
</rfc>
