<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-asilvas-http-push-assets-00" category="exp">

  <front>
    <title abbrev="Push-Assets">Push-Assets Header Field</title>

    <author initials="A." surname="Silvas" fullname="Aaron Silvas">
      <organization>GoDaddy</organization>
      <address>
        <email>asilvas@godaddy.com</email>
      </address>
    </author>

    <date year="2016" month="June" day="26"/>

    <area>General</area>

    <keyword>Internet-Draft</keyword>
    <keyword>Push</keyword>

    <abstract>

    <t>Push-Assets is a header field that provides the necessary client state in order for
    servers to utilize HTTP/2 Server Push with confidence in knowing
    what resources SHOULD or SHOULD NOT be sent, reducing waste, and ultimately providing an
    improved user experience. This document will provide an overview of Push-Assets requirements,
    and describes any implementation concerns.</t>

    </abstract>

  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>As described in <xref target="HighPerformance"/>, transfer sizes and resource counts continue to
increase. While network conditions continue to improve, resulting in lower latencies and increased
bandwidth, HTTP/1.1 (<xref target="RFC7230"/> and <xref target="RFC7231"/>) fails to address the
underlying problem of resource dependencies and the resulting "waterfall" of blocked requests.</t>

<t>HTTP/2 <xref target="RFC7540"/> aims to address some of these problems, by way of Streams and
Multiplexing, combined with HTTP/2 Server Push <xref target="RFC7540"/>. A ruthless combination,
addressing "head-of-line blocking" through Multiplexing, and optimistic pre-loading by way of
Server Push.</t>

<t>Where <spanx style="verb">Server Push</spanx> begins to fall short is around client state, leaving
it up to servers to leverage existing HTTP State Management Mechanism <xref target="RFC6265"/> with
Cookies, which are not purpose built to solve the problem of resource dependency state. This lack of
client state can result in HTTP/2 <xref target="RFC7540"/> <spanx style="verb">RST_STREAM</spanx>,
where-in in-flight <spanx style="verb">Server Push</spanx> Streams will be cancelled, incurring client
and server waste.</t>

<t>This document aims to address resource dependency state by looking to Caching <xref target="RFC7234"/>
familiar with existing HTTP/1.1 requests (see <xref target="RFC7230"/> and <xref target="RFC7231"/>). By
pulling this state data into the request, servers are able to intelligently and
responsibly <spanx style="verb">Server Push</spanx> only missing or outdated resource.</t>


<section anchor="Terminology" title="Terminology">

<t>In this document, the key words “MUST”, “MUST NOT”, “REQUIRED”,
“SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”,
and “OPTIONAL” are to be interpreted as described in BCP 14, RFC 2119
<xref target="RFC2119"/> and indicate requirement levels for compliant implementations.</t>

<t>This document uses the Augmented BNF defined in <xref target="RFC5234"/>.</t>

</section>
</section>


<section anchor="understanding-the-problem" title="Understanding The Problem">

<figure align="center" anchor="xml_problem">
<preamble>Here we can begin to see the problem with vanilla HTTP/2 <xref target="RFC7540"/>
  Server Push without client state management.</preamble>

<artwork align="left"><![CDATA[

+----------------------------+-------------------------+
| Client                     | Server                  |
+----------------------------+-------------------------+
| [         TCP+TLS+HTTP/2 Negotiation             ]   |
|                            |                         |
| GET /A.html       =======> |                         |
|                   <======= | PUSH_PROMISE GET /A1.js |
|                   <======= | PUSH_PROMISE GET /AB.js |
|                   <======= | GET /A.html             |
|                   <======= | GET /A1.js              |
|                   <======= | GET /AB.js              |
| [Page Complete]            |                         |
|                            |                         |
| [Navigate to "/B"]         |                         |
|                            |                         |
| GET /B.html       =======> |                         |
|                   <======= | PUSH_PROMISE GET /B1.js |
|                   <======= | PUSH_PROMISE GET /AB.js | (Server doesn't know Client has this)
|                   <======= | GET /B.html             |
|                   <======= | GET /B1.js              |
| RST_STREAM /AB.js =======> | (Hault transfer)        |
|                   <======= | GET /AB.js              | (Cancelled pre-flight, may be fully
|                            |                         | transferred before RST_STREAM
| [Page Complete]            |                         | received)
+----------------------------+-------------------------+

]]></artwork>

<postamble>While in some situations cookie-based management will address the above, ultimately it'll vary
depending on the complexity of the origin, including but not limited to the number of assets and the frequency
of change.</postamble>
</figure>

<figure align="center" anchor="xml_solution">
<preamble>With <spanx style="verb">Push-Assets</spanx> enabled both client and server adhere to a
  strict dependency state contract.</preamble>

<artwork align="left"><![CDATA[

+----------------------------+-------------------------+
| Client                     | Server                  |
+----------------------------+-------------------------+
| [         TCP+TLS+HTTP/2 Negotiation             ]   |
|                            |                         |
| GET /A.html       =======> |                         |
|                   <======= | PUSH_PROMISE GET /A1.js |
|                   <======= | PUSH_PROMISE GET /AB.js |
|                   <======= | GET /A.html             |
|                   <======= | GET /A1.js              |
|                   <======= | GET /AB.js              |
| [Page Complete]            |                         |
|                            |                         |
| [Navigate to "/B"]         |                         |
|                            |                         |
| GET /B.html       =======> |                         |
|                   <======= | PUSH_PROMISE GET /B1.js |
|                   <======= | GET /B.html             |
|                   <======= | GET /B1.js              |
| [Page Complete]            |                         |
+----------------------------+-------------------------+

]]></artwork>

<postamble>Avoiding needless waste, the benefits of <spanx style="verb">Push-Assets</spanx> far
outweighs the additional header data needed to track client state.</postamble>
</figure>

</section>


<section anchor="push-assets-use-cases" title="Push Assets Use Cases">

<section anchor="first-load-experience" title="First Load Experience">

  <t>Often the most import visit to a site is the first.
  <spanx style="verb">Push-Assets</spanx> provides the necessary client
  state for the server to confidently know which resources are missing
  or outdated.</t>

</section>

<section anchor="subsequent-load-experience" title="Subsequent Load Experience">

  <t>As users navigate to previously visited resources, or new resources where some shared
  resources have been cached, <spanx style="verb">Push-Assets</spanx> provides the
  necessary client state to make efficient use of
  <spanx style="verb">Server Push</spanx>, only sending what resources the
  client does not already have.</t>

</section>

<section anchor="proxy-optimization" title="Proxy Optimization">

<figure align="center" anchor="xml_proxies">
<preamble>On one end of the spectrum of proxies lies your server proxies,
with CDN's on the other end.</preamble>

<artwork align="left"><![CDATA[

[Client] <==[CDN]<=======================[Proxy]<==[Origin]

]]></artwork>

<postamble></postamble>
</figure>

  <t>With <spanx style="verb">Push-Assets</spanx> providing efficient communication
  between two points, this may lend to potential benefits between Proxies and their
  Origin server as well. While the Proxy nearest your Client SHOULD support
  <spanx style="verb">Push-Assets</spanx> for best results, it MAY elect not to also
  leverage <spanx style="verb">Push-Assets</spanx> between the Proxy and Origin.</t>
  
  <t>For proxies with caching nearest to Client (namely CDN's), they may further
  benefit from <spanx style="verb">Push-Assets</spanx> by way of efficient
  use of <spanx style="verb">Server Push</spanx>.</t>

</section>

<section anchor="non-browser-clients" title="Non-Browser Clients">

  <t>By enabling <spanx style="verb">Push-Assets</spanx> between any two points,
  <spanx style="verb">Server Push</spanx> can be used to reduce waste and provide
  improved performance. The greater the shared resources, the greater the potential
  benefits.</t>

</section>

<section anchor="alternative-content-types" title="Alternative Content Types">

  <t>With <spanx style="verb">Push-Assets</spanx> being nothing more than an HTTP
  Header, extending the benefits to other Content Type's <xref target="RFC2045"/>
  is entirely up to the Client and Server. Consider circumstances where you
  retrieve a JSON resource, which signals relationships with other resources.
  <spanx style="verb">Push-Assets</spanx> reduces waste and enables better user
  experiences irrespective of Content-Type.</t>

</section>

</section>



<section anchor="push-assets-header" title="Push-Assets Header">

<figure><artwork><![CDATA[
Push-Assets = [*][Asset-Key=Caching-Headers][;Asset-Key=Caching-Headers]
]]></artwork></figure>

  <t>A request header field SHALL be sent by the client when requesting the
  server to support <spanx style="verb">Push-Assets</spanx>.</t>

  <t>Comprised of zero or more resources addressed by their
  <spanx style="verb">Asset-Key</spanx>.</t>
  
  <t>An <spanx style="verb">Asset-Key</spanx> is the name of the resource uniquely identifiable by the
  resource or matching resources.</t>
  
<section anchor="caching-headers" title="Caching Headers">

<figure><artwork><![CDATA[
Push-Assets = Asset-Key=[etag(etag-value),][last-modified(date)][no-push]
]]></artwork></figure>

  <t>Caching MAY include an <spanx style="verb">etag</spanx>, and/or <spanx style="verb">last-modified</spanx>, or
  <spanx style="verb">no-push</spanx>. This provides necessary client state of dependencies to server.</t>

</section>
  
<section anchor="empty-cache-request" title="Empty Cache Request">

<figure><artwork><![CDATA[
Push-Assets = *
]]></artwork></figure>

<t>Where <spanx style="verb">*</spanx> informs server to <spanx style="verb">Server Push</spanx>
all push-enabled dependencies, if <spanx style="verb">Push-Assets</spanx> is enabled. Servers MUST push all
missing or outdated push-enabled resources.</t>

</section>

</section>

<section anchor="push-asset-key-header" title="Push-Asset-Key Header">

<figure><artwork><![CDATA[
Push-Asset-Key = Asset-Key
]]></artwork></figure>

  <t>A <spanx style="verb">PUSH_PROMISE</spanx> response Header field MAY be sent to inform the client
  that the resource should be tracked as a <spanx style="verb">Push-Asset</spanx>.</t>

  <t>The <spanx style="verb">Asset-Key</spanx> MUST be stored in the header field as an MD5
  representation of the desired Key.</t>

  <t>Unlike the <spanx style="verb">Asset-Key</spanx> in a request, the
  <spanx style="verb">Push-Asset-Key</spanx> header field corresponds to the Key
  of the <spanx style="verb">PUSH_PROMISE</spanx> response.</t>

<section anchor="push-asset-key-named" title="Named Key">

<figure><artwork><![CDATA[
Push-Asset-Key = core-bundle.js
]]></artwork></figure>

<t>By naming a resource, you MAY share that resource across multiple resources, and
MAY change the URI <xref target="RFC3986"/> as necessary without resulting in wasted requests.</t>

</section>

<section anchor="push-asset-key-uri" title="Key from URI Path">

<figure><artwork><![CDATA[
Push-Asset-Key = $
]]></artwork></figure>

<t>Where <spanx style="verb">$</spanx> is reserved as a short-hand for the client to recognize the key
as the URI Path <xref target="RFC3986"/>, and MUST NOT include the query string.</t>

<t>Example URI Path <xref target="RFC3986"/> of <spanx style="verb">/my/resource?some=thing</spanx>
would by keyed as <spanx style="verb">/my/resource</spanx>.</t>

<t>If there are more than one cached resources on the client for a given
<spanx style="verb">Push-Asset-Key</spanx>, the client MUST treat the most recent Key as the
current version.</t>

</section>

</section>

<section anchor="push-asset-match-header" title="Push-Asset-Match Header">

<figure><artwork><![CDATA[
Push-Asset-Match = Asset-Path[;Asset-Path]
]]></artwork></figure>

  <t>An OPTIONAL <spanx style="verb">PUSH_PROMISE</spanx> response header field.</t>

  <t>An Asset-Match supports the lexical matching of the URI Path <xref target="RFC3986"/>, and MAY end with reserved
  wildcard <spanx style="verb">*</spanx> to indicate matching all requests "equal or greater than" the URI Path.
  While one or more Asset-Path's may be provided, they SHOULD be consistent between requests to avoid any caching
  proxies from serving varying responses. Usage of Vary header field (Section 7.1.4 of <xref target="RFC3986"/>)
  MAY be applied with <spanx style="verb">Push-Asset-Match</spanx> to permit varying responses, but SHOULD NOT
  be used in most scenarios to avoid unnecessary complexity.</t>

<section anchor="push-asset-match-partial" title="Match Similar Requests">

<figure><artwork><![CDATA[
Push-Asset-Match = /some-path/*
]]></artwork></figure>

<t>Where all requests with URI Path <xref target="RFC3986"/> greater than or equal to
<spanx style="verb">/some-path/</spanx> will be matched.</t>

</section>

<section anchor="push-asset-match-all" title="Match All Requests">

<figure><artwork><![CDATA[
Push-Asset-Match = *
]]></artwork></figure>

<t><spanx style="verb">*</spanx> is reserved to indicate "match all requests". This is
the equivalent of <spanx style="verb">/*</spanx>, matching all from root.</t>

</section>

</section>


<section anchor="responsible-usage" title="Responsible Usage">

  <t>State management can be simple for simple origins, but complex for complex origins. Following is
  a set of usage scenarios and suggested tactics to combat unnecessary waste.</t>

  <section anchor="frequently-changing-paths" title="Frequently Changing Paths">

    <t>Not uncommon amongst websites are changes to the URI Path <xref target="RFC3986"/> of a resource
    when contents change. For these assets, utilizing the default Push-Asset-Key of
    <spanx style="verb">$</spanx> MAY result in excessive waste by way of the client sending state of
    matching resources that are no longer applicable.</t>
    
    <t>An effective measure is to leverage a uniquely named Push-Asset-Key, enabling the client and server
    to understand that the resource has effectively been renamed.</t>
    
  </section>

  <section anchor="excessive-matching" title="Excessive Matching">
  
    <t>Leveraging the power of the <spanx style="verb">Push-Asset-Match</spanx> header field MAY greatly
    improve the efficiency of resources shared amongst many resources. If used excessively where-in many
    requests do not depend on the matched resource MAY lead to waste, as the state of matching
    resources are sent via <spanx style="verb">Push-Assets</spanx> header field.</t>
  
    <t>The server MAY improve effectiveness by way of highly specific <spanx style="verb">Push-Asset-Match</spanx>
    definitions, breaking an origin into multiple sub-paths to permit parts an Origin to operate without negative
    affect from other parts of Origin. For example, <spanx style="verb">/some-path/</spanx> does NOT
    need to use the same shared resources as <spanx style="verb">/some-other-path/</spanx>, as they MAY NOT know
    about one another.</t>
    
    <t>In cases where even with highly specific <spanx style="verb">Push-Asset-Match</spanx> do not
    address excessive matching, the client MAY track historical false positives where-in matching resources
    are not served from requested resources, and MAY determine a threshold from which the client MAY
    elect NOT to send alongside <spanx style="verb">Push-Assets</spanx> requests.</t>
  
  </section>

  <section anchor="varying-content-types" title="Varying Content Types">
  
    <t>With <spanx style="verb">Push-Assets</spanx> not being specific to html resources, clients MUST NOT
    match resources across requests with varying Content Type's <xref target="RFC2045"/>.</t>
    
    <t>If a server has enabled <spanx style="verb">Push-Assets</spanx> for more than one Content Type,
    the client MUST only notify the server of matching resources that were from the same Content Type of
    the parent resource.</t>
    
    <t>As an example, "/home.html" with a dependent resource that matches all URI Paths, MUST NOT be sent
    via <spanx style="verb">Push-Assets</spanx> when making a request for "/file.js" as the parent
    resources differ in Content Type.</t>
  
  </section>

</section>


  </middle>

  <back>

  <references title='Normative References'>



<reference  anchor='RFC2119' target='http://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor='RFC5234' target='http://www.rfc-editor.org/info/rfc5234'>
<front>
<title>Augmented BNF for Syntax Specifications: ABNF</title>
<author initials='D.' surname='Crocker' fullname='D. Crocker' role='editor'><organization /></author>
<author initials='P.' surname='Overell' fullname='P. Overell'><organization /></author>
<date year='2008' month='January' />
<abstract><t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='68'/>
<seriesInfo name='RFC' value='5234'/>
<seriesInfo name='DOI' value='10.17487/RFC5234'/>
</reference>



<reference  anchor='RFC7540' target='http://www.rfc-editor.org/info/rfc7540'>
<front>
<title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
<author initials='M.' surname='Belshe' fullname='M. Belshe'><organization /></author>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='M.' surname='Thomson' fullname='M. Thomson' role='editor'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t><t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t></abstract>
</front>
<seriesInfo name='RFC' value='7540'/>
<seriesInfo name='DOI' value='10.17487/RFC7540'/>
</reference>


<reference  anchor='RFC7234' target='http://www.rfc-editor.org/info/rfc7234'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Caching</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='M.' surname='Nottingham' fullname='M. Nottingham' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t></abstract>
</front>
<seriesInfo name='RFC' value='7234'/>
<seriesInfo name='DOI' value='10.17487/RFC7234'/>
</reference>


<reference  anchor='RFC7231' target='http://www.rfc-editor.org/info/rfc7231'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t></abstract>
</front>
<seriesInfo name='RFC' value='7231'/>
<seriesInfo name='DOI' value='10.17487/RFC7231'/>
</reference>


<reference  anchor='RFC3986' target='http://www.rfc-editor.org/info/rfc3986'>
<front>
<title>Uniform Resource Identifier (URI): Generic Syntax</title>
<author initials='T.' surname='Berners-Lee' fullname='T. Berners-Lee'><organization /></author>
<author initials='R.' surname='Fielding' fullname='R. Fielding'><organization /></author>
<author initials='L.' surname='Masinter' fullname='L. Masinter'><organization /></author>
<date year='2005' month='January' />
<abstract><t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='66'/>
<seriesInfo name='RFC' value='3986'/>
<seriesInfo name='DOI' value='10.17487/RFC3986'/>
</reference>


<reference  anchor='RFC7230' target='http://www.rfc-editor.org/info/rfc7230'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the &quot;http&quot; and &quot;https&quot; Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='7230'/>
<seriesInfo name='DOI' value='10.17487/RFC7230'/>
</reference>



    </references>

    <references title='Informative References'>



<reference  anchor='RFC6265' target='http://www.rfc-editor.org/info/rfc6265'>
<front>
<title>HTTP State Management Mechanism</title>
<author initials='A.' surname='Barth' fullname='A. Barth'><organization /></author>
<date year='2011' month='April' />
<abstract><t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol.  Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet.  This document obsoletes RFC 2965.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6265'/>
<seriesInfo name='DOI' value='10.17487/RFC6265'/>
</reference>


<reference  anchor='RFC2045' target='http://www.rfc-editor.org/info/rfc2045'>
<front>
<title>Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title>
<author initials='N.' surname='Freed' fullname='N. Freed'><organization /></author>
<author initials='N.' surname='Borenstein' fullname='N. Borenstein'><organization /></author>
<date year='1996' month='November' />
<abstract><t>This initial document specifies the various headers used to describe the structure of MIME messages.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='2045'/>
<seriesInfo name='DOI' value='10.17487/RFC2045'/>
</reference>


<reference anchor="HighPerformance" >
  <front>
    <title>High Performance Browser Networking</title>
    <author initials="I." surname="Grigorik" fullname="Ilya Grigorik">
      <organization></organization>
    </author>
    <date year="2013" month="September"/>
  </front>
</reference>


  </references>




  </back>
</rfc>
