<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.24 (Ruby 3.0.5) -->
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc editing="no"?>
<?rfc tocompact="yes"?>
<?rfc iprnotified="no"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-alto-new-transport-09" category="std" consensus="true" tocDepth="3" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="ALTO TIPS">The ALTO Transport Information Publication Service</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-alto-new-transport-09"/>
    <author initials="R." surname="Schott" fullname="Roland Schott">
      <organization>Deutsche Telekom</organization>
      <address>
        <postal>
          <street>Ida-Rhodes-Straße 2</street>
          <city>Darmstadt</city>
          <code>64295</code>
          <country>Germany</country>
        </postal>
        <email>Roland.Schott@telekom.de</email>
      </address>
    </author>
    <author initials="Y. R." surname="Yang" fullname="Yang Richard Yang">
      <organization>Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <code>CT</code>
          <country>USA</country>
        </postal>
        <email>yry@cs.yale.edu</email>
      </address>
    </author>
    <author initials="K." surname="Gao" fullname="Kai Gao">
      <organization>Sichuan University</organization>
      <address>
        <postal>
          <street>No.24 South Section 1, Yihuan Road</street>
          <city>Chengdu</city>
          <code>610000</code>
          <country>China</country>
        </postal>
        <email>kaigao@scu.edu.cn</email>
      </address>
    </author>
    <author initials="L." surname="Delwiche" fullname="Lauren Delwiche">
      <organization>Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <code>3408</code>
          <country>USA</country>
        </postal>
        <email>lauren.delwiche@yale.edu</email>
      </address>
    </author>
    <author initials="L." surname="Keller" fullname="Lachlan Keller">
      <organization>Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <code>3408</code>
          <country>USA</country>
        </postal>
        <email>lachlan.keller@yale.edu</email>
      </address>
    </author>
    <date/>
    <area>Transport Area</area>
    <workgroup>ALTO</workgroup>
    <abstract>
      <t>The ALTO Protocol (RFC 7285) leverages HTTP/1.x and is designed for the simple,
sequential request-reply use case, in which an ALTO client requests a
sequence of information resources, and the server responds with the complete
content of each resource one at a time.</t>
      <t>ALTO incremental updates using Server-Sent Events (SSE) (RFC 8895) defines a
multiplexing protocol on top of HTTP/1.x, so that an ALTO server can
incrementally push resource updates to clients whenever monitored network
information resources change, allowing the clients to monitor multiple resources
at the same time. However, HTTP/2 and later versions already support concurrent,
non-blocking transport of multiple streams in the same HTTP connection.</t>
      <t>To take advantage of newer HTTP features, this document introduces the ALTO
Transport Information Publication Service (TIPS). TIPS uses an incremental
RESTful design to give an ALTO client the new capability to explicitly,
concurrently (non-blocking) request (pull) specific incremental updates using
native HTTP/2 or HTTP/3, while still functioning for HTTP/1.x. TIPS also
provides for an ALTO server to concurrently push specific incremental updates
using native HTTP/2 or HTTP/3 server push.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Application-Layer Traffic Optimization Working Group mailing list (alto@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/alto/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/ietf-wg-alto/draft-ietf-alto-new-transport"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>Application-Layer Traffic Optimization (ALTO) provides means for network
applications to obtain network status information. So far, two transport
protocols have been designed:</t>
      <ol spacing="normal" type="1"><li>The ALTO base protocol <xref target="RFC7285"/>, which is designed for the simple use case
in which an ALTO client requests a network information resource, and the
server sends the complete content of the requested information (if any)
resource to the client.</li>
        <li>ALTO incremental updates using Server-Sent Events (ALTO/SSE) <xref target="RFC8895"/>,
which is designed for an ALTO client to indicate to the server that it wants
to receive updates for a set of resources, and the server can then
concurrently, and incrementally push updates to that client whenever
monitored resources change.</li>
      </ol>
      <t>Both protocols are designed for HTTP/1.x <xref target="RFC9112"/> and, ideally, they should
be able to automatically take advantage of newer HTTP versions such as HTTP/2
<xref target="RFC9113"/> and HTTP/3 <xref target="RFC9114"/>. However, there are issues with both
protocols when higher HTTP versions are used. First, consider the ALTO base
protocol, which is designed to transfer only complete information resources.
Hence, a client can run the base protocol on top of HTTP/2 or HTTP/3 to request
multiple information resources concurrently, in concurrent streams, but each
request must be for a complete information resource: there is no capability of
transferring incremental updates. Hence, there can be large overhead when the
client already has an information resource and then there are small changes to
the resource. Next, consider ALTO/SSE. Although ALTO/SSE can transfer
incremental updates, it introduces a customized multiplexing protocol on top of
HTTP, assuming a total-order message channel from the server to the client. The
multiplexing design does not provide naming (i.e., providing resource
identifier) to individual incremental updates. Hence, the design cannot use
concurrent per-stream server push or non-blocking per-stream client pull,
available in HTTP/2 and HTTP/3, because both cases require the resource
identifier. Additionally, ALTO/SSE is a push-only protocol, which denies the
client flexibility in choosing how and when it receives updates.</t>
      <t>This document introduces a new ALTO service called the Transport Information
Publication Service (TIPS). TIPS uses an incremental RESTful design to provide
an ALTO client with a new capability to explicitly, concurrently (non-blocking)
request (pull) specific incremental updates using native HTTP/2 or HTTP/3, while
still functioning for HTTP/1.x. TIPS also provides an ALTO server to
concurrently push specific incremental updates using native HTTP/2 or HTTP/3
server push. Specifically, this document specifies the following:</t>
      <ul spacing="normal">
        <li>Extensions to the ALTO protocol to allow dynamic subscription and efficient
uniform update delivery of an incrementally changing network information
resource.</li>
        <li>A new resource type that specifies the TIPS updates graph model for a
resource.</li>
        <li>URI patterns to fetch the snapshots or incremental updates.</li>
      </ul>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/><xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
      </section>
      <section anchor="notations">
        <name>Notations</name>
        <t>This document uses the same syntax and notations as introduced in Section 8.2 of
<xref target="RFC7285"/> to specify the extensions to existing ALTO resources and services.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>TIPS Overview</name>
      <section anchor="requirements">
        <name>Transport Requirements</name>
        <t>Current ALTO protocol and its extensions support two transport mechanisms:
First, a client can direct request an ALTO resource and obtain a complete
snapshot of that ALTO resource, as specified in the base protocol <xref target="RFC7285"/>;
Second, a client can subscribe to incremental changes of one or multiple ALTO
resources using the incremental update extension <xref target="RFC8895"/>, and a server pushes
the updates to the client through a WebSocket connection.</t>
        <t>However, the current transport mechanisms are not optimized for storing,
transmitting, and processing (incremental) updates of ALTO information
resources. Specifically, the new transport mechanism must satisfy the following
requirements:</t>
        <dl>
          <dt>Incremental updates:</dt>
          <dd>
            <t>Incremental updates can reduce both the data storage on an ALTO server and the
transmission time of the updates, especially when the change of an ALTO
resource is minor. The base protocol does not support incremental updates and
the current incremental update mechanism in <xref target="RFC8895"/> has limitations (as
discussed below).</t>
          </dd>
          <dt>Concurrent, non-blocking update transmission:</dt>
          <dd>
            <t>When a client needs to receive and apply multiple incremental updates, it is
desired to transmit the updates concurrently to fully utilize the bandwidth
and to reduce head-of-line blocking. The ALTO incremental update extension
<xref target="RFC8895"/>, unfortunately, does not satisfy this requirement -- even though
the updates can be multiplexed by the server to avoid head-of-line blocking
between multiple resources, the updates are delivered sequentially and can
suffer from head-of-line blocking inside the connection, for example, when
there is a packet loss.</t>
          </dd>
          <dt>Prefetching updates:</dt>
          <dd>
            <t>Prefetching updates can reduce the time to send the request, making it
possible to achieve sub-RTT transmission of ALTO incremental updates. In
<xref target="RFC8895"/>, this requirement is fulfilled using server-sent event (SSE) and
is still desired in the ALTO new transport.</t>
          </dd>
          <dt>Backward compatibility:</dt>
          <dd>
            <t>While some of the previous requirements are offered by HTTP/2 <xref target="RFC9113"/> and
HTTP/3 <xref target="RFC9114"/>, it is desired that the ALTO new transport mechanism can
work with HTTP/1.x as many development tools and current ALTO implementations
are based on HTTP/1.x.</t>
          </dd>
        </dl>
        <t>The ALTO new transport specified in this document satisfies all the design
requirements and hence improves the efficiency of continuous dissemination of
ALTO information. The key idea is to introduce a unified data model to describe
the changes (snapshots and incremental updates) of an ALTO resource, referred to
as a TIPS view. Along with the data model, this document also specifies a
unified naming for the snapshots and incremental updates, independent of the
HTTP version. Thus, these updates can be concurrently requested. Prefetching is
realized using long polling in HTTP/1.1 and using long polling or server push in
higher HTTP versions.</t>
      </section>
      <section anchor="terminology">
        <name>TIPS Terminology</name>
        <t>This document uses the following terms:</t>
        <dl>
          <dt>Transport Information Publication Service (TIPS):</dt>
          <dd>
            <t>Is a new type of ALTO service, as specified in this document, to enable a
uniform transport mechanism for updates of an incrementally changing ALTO
network information resource.</t>
          </dd>
          <dt>Network information resource:</dt>
          <dd>
            <t>Is a piece of retrievable information about network state, per <xref target="RFC7285"/>.</t>
          </dd>
          <dt>TIPS view (tv):</dt>
          <dd>
            <t>Is defined in this document to be the container of incremental transport
information about the network information resource. Though the TIPS view may
include other transport information, it has two basic components: updates
graph (ug) and receiver set (rs).</t>
          </dd>
          <dt>Updates graph (ug):</dt>
          <dd>
            <t>Is a directed, acyclic graph whose nodes represent the set of versions of an
information resource, and edges the set of update items to compute these
versions. An ALTO map service (e.g., Cost Map, Network Map) may need only a
single updates graph. A dynamic network information service (e.g., Filtered
Cost Map) may create an updates graph (within a new TIPS view) for each unique
request.</t>
          </dd>
          <dt>Version:</dt>
          <dd>
            <t>Represents a historical content of an information resource. For an information
resource, each version is associated with and uniquely identified by a
monotonically and consecutively increased sequence number. We use the term
"version s" to refer to the version associated with sequence number s.</t>
          </dd>
          <dt>Start sequence number (start-seq):</dt>
          <dd>
            <t>Is the smallest non-zero sequence number in an updates graph.</t>
          </dd>
          <dt>End sequence number (end-seq):</dt>
          <dd>
            <t>Is the largest sequence number in an updates graph.</t>
          </dd>
          <dt>Snapshot:</dt>
          <dd>
            <t>Is a full replacement of a resource and is contained within an updates graph.</t>
          </dd>
          <dt>Incremental update:</dt>
          <dd>
            <t>Is a partial replacement of a resource contained within an updates graph,
codified in this document as a JSON Merge Patch or JSON Patch. An incremental
update is mandatory if the source version (i) and target version (j) are
consecutive, i.e., i + 1 = j, and optional or a shortcut otherwise. Mandatory
incremental updates are always in an updates graph, while optional/shortcut
incremental updates may or may not be included in an updates graph.</t>
          </dd>
          <dt>Update item:</dt>
          <dd>
            <t>Refers to the content on an edge of the updates graph, which can be either a
snapshot or incremental update. An update item can be considered as a pair
(op, data) where op denotes whether the item is an incremental update or a
snapshot, and data is the content of the item.</t>
          </dd>
          <dt>ID#i-#j:</dt>
          <dd>
            <t>Denotes the update item on a specific edge in the updates graph to transition
from version i to version j, where i and j are the sequence numbers of the
source node and the target node of the edge, respectively.</t>
          </dd>
          <dt>Receiver set (rs):</dt>
          <dd>
            <t>Contains the set of clients who have requested to receive server push updates.</t>
          </dd>
        </dl>
        <figure anchor="fig-overview">
          <name>Overview of ALTO TIPS</name>
          <artwork type="drawing" align="center"><![CDATA[
                                   +-------------+
    +-----------+ +--------------+ |  Dynamic    | +-----------+
    |  Routing  | | Provisioning | |  Network    | | External  |
    | Protocols | |    Policy    | | Information | | Interface |
    +-----------+ +--------------+ +-------------+ +-----------+
          |              |                |              |
+----------------------------------------------------------------------+
| ALTO Server                                                          |
| +------------------------------------------------------------------+ |
| |                                              Network Information | |
| | +-------------+                         +-------------+          | |
| | | Information |                         | Information |          | |
| | | Resource #1 |                         | Resource #2 |          | |
| | +-------------+                         +-------------+          | |
| +-----|--------------------------------------/-------\-------------+ |
|       |                                     /         \              |
| +-----|------------------------------------/-----------\-----------+ |
| |     |       Transport Information       /             \          | |
| | +--------+                     +--------+        +--------+      | |
| | |  tv1   |----+          +-----|  tv2   |        |  tv3   |---+  | |
| | +--------+    |          |     +--------+        +--------+   |  | |
| |     |         |          |           |             |          |  | |
| | +--------+ +--------+ +--------+ +--------+ +--------+ +--------+| |
| | | tv1/ug | | tv1/rs | | tv2/ug | | tv2/rs | | tv3/ug | | tv3/rs || |
| | +--------+ +--------+ +--------+ +--------+ +--------+ +--------+| |
| +----|\---------/\---------|---------/---------------|-------------+ |
|      | \       /  \        |        /                |               |
+------|--\-----/----\-------|-------/-----------------|---------------+
       |   \   /      \      |      /                  |
       |    +-/-----+  \     |     /                   |
       |     /       \  \    |    /  A single          |   A single
     ==|====/==     ==\==\===|===/== HTTP/2 or /3    ==|== HTTP/1.x
       |   /           \  \  |  /    connection        |   connection
   +----------+       +----------+                 +----------+
   | Client 1 |       | Client 2 |                 | Client 3 |
   +----------+       +----------+                 +----------+

tvi   = TIPS view i
tvi/ug = incremental updates graph associated with tvi
tvi/rs = receiver set of tvi (for server push)
]]></artwork>
        </figure>
        <t><xref target="fig-overview"/> shows an example illustrating an overview of the ALTO TIPS
service. The server provides the TIPS service of two information resources (#1
and #2) where we assume #1 is an ALTO map service, and #2 is a filterable
service. There are 3 ALTO clients (Client 1, Client 2, and Client 3) that are
connected to the ALTO server. Each client maintains a single HTTP connection
with the ALTO server and uses the TIPS view to retrieve updates. Specifically, a
TIPS view (tv1) is created for the map service #1, and is shared by multiple
clients. For the filtering service #2, two different TIPS view (tv2 and tv3) are
created upon different client requests.</t>
      </section>
    </section>
    <section anchor="tips-updates-graph">
      <name>TIPS Updates Graph</name>
      <t>In order to provide incremental updates for a resource, an ALTO server creates
an updates graph, which is a directed, acyclic graph that contains a sequence of
incremental updates and snapshots (collectively called update items) of a
network information resource.</t>
      <section anchor="data-model">
        <name>Basic Data Model of Updates Graph</name>
        <t>For each resource (e.g., a cost map, a network map), the incremental updates and
snapshots can be represented using the following directed acyclic graph model,
where the server maps base resource IDs to incremental update IDs that are
assigned sequentially (i.e., incremented by 1 each time):</t>
        <ul spacing="normal">
          <li>Each node in the graph is a version of the resource, where a tag identifies
content of the version (tag is valid only within the scope of resource).
Version 0 is reserved as the initial state (empty/null).</li>
          <li>Each edge is an update item. In particular, edge from i to j is the update
item to transit from version i to version j.</li>
          <li>Version is path independent (different paths arrive at the same version/node
has the same content)</li>
        </ul>
        <t>A concrete example is as shown in <xref target="fig-ug"/>. There are 7 nodes in the graph,
representing 7 different versions of the resource. Edges in the figure represent
the updates from the source version to the target version. Thick lines represent
mandatory incremental updates (e.g., ID103-104), dotted lines represent optional
incremental updates (e.g., ID103-105), and thin lines represent snapshots (e.g.,
ID0-103). Note that node content is path independent: the content of node v can
be obtained by applying the updates from any path that ends at v. For example,
assume the latest version is 105 and a client already has version 103. The
target version 105 can either be directly fetched as a snapshot, computed
incrementally by applying the incremental updates between 103 and 104, then 104
and 105, or if the optional update from 103 to 105 exists, computed
incrementally by taking the "shortcut" path from 103 and 105.</t>
        <figure anchor="fig-ug">
          <name>TIPS Model Example</name>
          <artwork type="drawing" align="center"><![CDATA[
                                                        +======+
                                                  ------|  0   |
                                                 /      +======+
                                        ID0-101 /        |   |
                                              |/__       |   |
                                       +======+          |   |
                  tag: 109783421097 -> | 101  |          |   |
                                       +======+          |   |
                               ID101-102  ||             |   |
                                          \/             |   |
                                       +======+          |   |
                  tag: 123566431234 -> | 102  |          |   |
                                       +======+          |   |
                               ID102-103  ||             |   |
                                          \/             |   |
                                       +======+          /   |
                  tag: 123400881080 -> | 103  |<--------/    |
   +---------------+                   +======+ ID0-103      |
   | Base Resource |   =====>  ID103-104  ||    ..           |
   +---------------+                      \/     ..          |
                                       +======+  ..          |
                  tag: 123566452654 -> | 104  |  .. ID103    |
                                       +======+  .. -105     |
                               ID104-105  ||     ..          | ID0-105
                                          \/   |._           /
                                       +======+             /
                  tag: 123567838392 -> | 105  |<-----------/
                                       +======+
                               ID105-106  ||
                                          \/
                                       +======+
                  tag: 123566470983 -> | 106  |
                                       +======+
]]></artwork>
        </figure>
      </section>
      <section anchor="schema">
        <name>Resource Location Schema</name>
        <t>Update items are exposed as HTTP resources and the URLs of these items, which we
can resource location schema, follow specific patterns. To access each
individual update in an updates graph, consider the model represented as a
"virtual" file system (adjacency list), contained within the root of a TIPS view
URI (see <xref target="open-resp"/> for the definition of tips-view-uri). For example,
assuming that the update graph of a TIPS view is as shown in <xref target="fig-ug"/>, the
location schema of this TIPS view will have the format as in <xref target="fig-ug-schema"/>.</t>
        <figure anchor="fig-ug-schema">
          <name>Location Schema Example</name>
          <artwork type="drawing" align="center"><![CDATA[
  <tips-view-uri>  // relative URI to a TIPS view
    |_ ug    // updates graph
    |  |_ 0
    |  |  |_ 101    // full 101 snapshot
    |  |  |_ 103
    |  |  \_ 105
    |  |_ 101
    |  |  \_ 102    // 101 -> 102 incremental update
    |  |_ 102
    |  |  \_ 103
    |  |_ 103
    |  |  |_ 104
    |  |  \_ 105    // optional shortcut 103 -> 105 incr. update
    |  |_ 104
    |  |  \_ 105
    |  \_ 105
    |     \_ 106
    |_ push         // server push metadata
    |  \_ ...
    \_ meta         // TIPS view meta
       \_ ...
]]></artwork>
        </figure>
        <t>TIPS uses this directory schema to generate template URIs which allow
clients to construct the location of incremental updates after receiving the
tips-view-uri path from the server. The generic template for the location of the
update item on the edge from node i to node j in the updates graph is:</t>
        <artwork><![CDATA[
    <tips-view-uri>/ug/<i>/<j>
]]></artwork>
        <t>Due to the sequential nature of the update item IDs, a client can long poll a
future update that does not yet exist (e.g., the incremental update from 106 to
107) by constructing the URI for the next edge that will be added, starting from
the sequence number of the current last node (denoted as end-seq) in the graph
to the next sequential node (with the sequence number of end-seq + 1):</t>
        <artwork><![CDATA[
    GET /<tips-view-uri>/ug/<end-seq>/<end-seq + 1>
]]></artwork>
      </section>
      <section anchor="updates-graph-modification-invariants">
        <name>Updates Graph Modification Invariants</name>
        <t>A server may change its updates graph (to compact, to add nodes,
etc.), but it must ensure that any resource state that it makes
available is reachable by clients, either directly via a snapshot
(that is, relative to 0) or indirectly by requesting an earlier
snapshot and a contiguous set of incremental updates.  Additionally,
to allow clients to proactively construct URIs for future update
items, the ID of each added node in the updates graph must increment
contiguously by 1.  More specifically, the updates graph MUST satisfy
the following invariants:</t>
        <ul spacing="normal">
          <li>Continuity: At any time, let ns denote the smallest non-zero version (i.e.,
start-seq) in the update graph and ne denote the latest version (i.e.,
end-seq). Then any version in between ns and ne must also exist. This implies
that the incremental update from ni to ni + 1 exists for any ns &lt;= ni &lt;= ne,
and all versions in the update graph (except 0) is an integer interval
<tt>[ns, ne]</tt>.</li>
          <li>Feasibility: Let ns denote the start-seq in the update graph. The server must
provide a snapshot of ns and, in other words, there is always a direct link
to ns in the update graph.</li>
          <li>"Right shift" only: Assume a server provides versions in <tt>[n1, n2]</tt> at time t
and versions in <tt>[n1', n2']</tt> at time t'. If t' &gt; t, then n1' &gt;= n1 and n2' &gt;=
n2.</li>
        </ul>
        <t>For example, consider the case that a server compacts a resource's updates graph
to conserve space, using the example model in <xref target="data-model"/>. Assume at time 0,
the server provides the versions <tt>{101, 102, 103, 104, 105, 106}</tt>. At time 1,
both <tt>{103, 104, 105, 106}</tt> and <tt>{105, 106}</tt> are valid sets. However, <tt>{102,
103, 104, 105, 106}</tt> and <tt>{104, 105, 106}</tt> are not valid sets as there is no
snapshot to version 102 or 104 in the update graph. Thus, there is a risk that
the right content of version 102 (in the first example) or 104 (in the second
example) cannot be obtained by a client that does not have the previous version
101 or 103, respectively.</t>
      </section>
    </section>
    <section anchor="workflow">
      <name>TIPS High Level Workflow</name>
      <section anchor="workflow-overview">
        <name>Workflow Overview</name>
        <t>There are two ways a client can receive updates for a resource:</t>
        <ol spacing="normal" type="1"><li>Client Pull (see <xref target="pull"/>);</li>
          <li>Server Push (see <xref target="push"/>).</li>
        </ol>
        <t>At a high level, an ALTO client first uses the TIPS service to indicate the
information resource(s) that the client wants to monitor. For each requested
resource, the server returns a JSON object that contains a URI, which points to
the root of a TIPS view, and a summary of the current view, which contains, at
the minimum, the start-seq and end-seq of the update graph and a
server-recommended edge to consume first.</t>
        <t>In the simplest use case, for client pull, the TIPS view summary provides enough
information for the client to continuously pull each additional update,
following the workflow in <xref target="fig-workflow-pull"/>.</t>
        <figure anchor="fig-workflow-pull">
          <name>ALTO TIPS Workflow Supporting Client Pull</name>
          <artwork type="drawing" align="center"><![CDATA[
Client                                  TIPS
  o                                       .
  | Open persistent HTTP connection       .
  |-------------------------------------->|
  |                                       .
  | POST to create/receive a TIPS view    .
  |           for resource 1              .
  | ------------------------------------> |
  | <tips-view-uri1>, <tips-view-summary> .
  |<------------------------------------- |
  |                                       .
  | GET /<tips-view-uri1>/ug/<i>/<j>      .
  | --------------------------------------|
  | content on edge i to j                .
  |<--------------------------------------|
  |                                       .
  | GET /<tips-view-uri1>/ug/<j>/<j+1>    .
  | ------------------------------------->|
  |                                       .
  |                                       .
  | content on edge j to j+1              .
  |<--------------------------------------|
  |                                       .
  | DELETE TIPS view for resource 1       .
  |-------------------------------------> |
  |                                       .
  | Close HTTP connection                 .
  |-------------------------------------->|
  o
]]></artwork>
        </figure>
        <t>Note: in <xref target="fig-workflow-pull"/>, the update item at
<tt>/&lt;tips-view-uri1&gt;/ug/&lt;j&gt;/&lt;j+1&gt;</tt> may not yet exist, so the server holds the
request until the update becomes available (long polling).</t>
        <t>A client that prefers server push can use the workflow as shown in
<xref target="fig-workflow-push"/>. In this case, the client indicate for server push when it
creates the TIPS view. Future updates are pushed to the client as soon as they
become available.</t>
        <figure anchor="fig-workflow-push">
          <name>ALTO TIPS Workflow Supporting Server Push</name>
          <artwork type="drawing" align="center"><![CDATA[
Client                                  TIPS
  o                                       .
  | Open persistent HTTP connection       .
  |-------------------------------------->|
  |                                       .
  | POST to create/receive a TIPS view    .
  |      for resource 1 and add           .
  |      self to receiver set             .
  | ------------------------------------> |
  | <tips-view-uri1>, <tips-view-summary> .
  |<------------------------------------- |
  |                                       .
  | PUSH <tips-view-uri1>/ug/<i>/<j>      .
  | <-------------------------------------|
  |                                       .
  | PUSH <tips-view-uri1>/ug/<j>/<j+1>    .
  | <-------------------------------------|
  |                                       .
  | PUT to remove self from receiver      .
  |      set of resource 1                .
  |-------------------------------------> |
  |                                       .
  | Close HTTP connection                 .
  |-------------------------------------->|
  o
]]></artwork>
        </figure>
      </section>
      <section anchor="tips-with-different-http-versions">
        <name>TIPS with Different HTTP Versions</name>
        <t>The HTTP version of a "https" connection uses is negotiated between client and
server using the TLS ALPN extension, as specified in Section 3.1 of <xref target="RFC9113"/>
for HTTP/2 and Section 3.1 of <xref target="RFC9114"/> for HTTP/3. For a "http" connection,
the explicit announcement of HTTP/2 or HTTP/3 support by the server is outside
the scope of this document.</t>
        <t>While TIPS is designed to take advantage of newer HTTP features like
server push and substreams for concurrent fetch, TIPS still functions
with HTTP/1.x for client pull defined in <xref target="pull"/>, with the
limitation that it cannot cancel any outstanding requests or fetch
resources concurrently over the same connection due to the blocking
nature of HTTP/1.x requests.  Additionally, because HTTP/1.x does not
support server push, the use of TIPS with server push defined in
<xref target="push"/> is not available if a client connects to an ALTO server
with HTTP/1.x. If a client only capable of HTTP/1.x desires to concurrently
monitor multiple resources at the same time, it must open multiple connections,
one for each resource, so that an outstanding long-poll request can be issued
for each resource to monitor for new updates. For HTTP/2 and /3, because of
substreams, multiple resources can be monitored simultaneously.</t>
      </section>
    </section>
    <section anchor="ird">
      <name>TIPS Information Resource Directory (IRD) Announcement</name>
      <t>To announce a TIPS information resource in the information resource directory
(IRD), an ALTO server MUST specify the "media-type", "capabilities" and "uses"
as follows.</t>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>The media type of the Transport Information Publication Service resource is
"application/alto-tips+json".</t>
      </section>
      <section anchor="capabilities">
        <name>Capabilities</name>
        <t>The capabilities field of TIPS is modeled on that defined in
Section 6.3 of <xref target="RFC8895"/>.</t>
        <t>Specifically, the capabilities are defined as an object of type
TIPSCapabilities:</t>
        <artwork><![CDATA[
     object {
       IncrementalUpdateMediaTypes incremental-change-media-types;
       Boolean                     support-server-push;
     } TIPSCapabilities;

     object-map {
        ResourceID -> String;
     } IncrementalUpdateMediaTypes;
]]></artwork>
        <t>with fields:</t>
        <dl>
          <dt>incremental-change-media-types:</dt>
          <dd>
            <t>If a TIPS can provide updates with incremental changes for a
resource, the "incremental-change-media-types" field has an entry
for that resource-id, and the value is the supported media types
of the incremental change separated by commas.  For the
implementation of this specification, this will be "application/
merge-patch+json", "application/json-patch+json", or "application/
merge-patch+json,application/json-patch+json".  Future extensions
may define other types of incremental changes.
</t>
            <t>When choosing the media types to encode incremental updates for a
resource, the server MUST consider the limitations of the
encoding.  For example, when a JSON merge patch specifies that the
value of a field is null, its semantics are that the field is
removed from the target and hence the field is no longer defined
(i.e., undefined).  This, however, may not be the intended result
for the resource, when null and undefined have different semantics
for the resource.  In such a case, the server MUST choose JSON
patch over JSON merge patch if JSON patch is indicated as a
capability of the TIPS.  If the server does not support JSON patch
to handle such a case, the server then needs to send a full
replacement.</t>
          </dd>
          <dt>support-server-push:</dt>
          <dd>
            <t>The "support-server-push" field specifies whether the given TIPS
supports server push.  If the "support-server-push" field is TRUE,
this TIPS will allow a client to start or stop server push.  If
the field is FALSE or not present, this TIPS does not provide
server push.</t>
          </dd>
        </dl>
      </section>
      <section anchor="uses">
        <name>Uses</name>
        <t>The "uses" attribute MUST be an array with the resource-ids of every
network information resource for which this TIPS can provide service.</t>
        <t>This set may be any subset of the ALTO server's network information resources
and may include resources defined in linked IRDs. However, it is RECOMMENDED
that the ALTO server selects a set that is closed under the resource dependency
relationship. That is, if a TIPS' "uses" set includes resource R1 and resource
R1 depends on ("uses") resource R0, then the TIPS' "uses" set SHOULD include R0
as well as R1. For example, if a TIPS provides a TIPS view for a cost map, it
SHOULD also provide a TIPS view for the network map upon which that cost map
depends.</t>
        <t>If the set is not closed, at least one resource R1 in the "uses" field of a TIPS
depends on another resource R0 which is not in the "uses" field of the same
TIPS. Thus, a client cannot receive incremental updates for R0 from the same
TIPS service. If the client observes in an update of R1 that the version tag for
R0 has changed, it must make a request to retrieve the full content of R0, which
is likely to be less efficient than receiving the incremental updates of R0.</t>
      </section>
      <section anchor="example">
        <name>Example</name>
        <t>Extending the IRD example in Section 8.1 of <xref target="RFC8895"/>, below is the IRD of an
ALTO server supporting ALTO base protocol, ALTO/SSE, and ALTO TIPS.</t>
        <artwork><![CDATA[
    "my-network-map": {
      "uri": "https://alto.example.com/networkmap",
      "media-type": "application/alto-networkmap+json"
    },
    "my-routingcost-map": {
      "uri": "https://alto.example.com/costmap/routingcost",
      "media-type": "application/alto-costmap+json",
      "uses": ["my-networkmap"],
      "capabilities": {
        "cost-type-names": ["num-routingcost"]
      }
    },
    "my-hopcount-map": {
      "uri": "https://alto.example.com/costmap/hopcount",
      "media-type": "application/alto-costmap+json",
      "uses": ["my-networkmap"],
      "capabilities": {
        "cost-type-names": ["num-hopcount"]
      }
    },

    "my-simple-filtered-cost-map": {
      "uri": "https://alto.example.com/costmap/filtered/simple",
      "media-type": "application/alto-costmap+json",
      "accepts": "application/alto-costmapfilter+json",
      "uses": ["my-networkmap"],
      "capabilities": {
        "cost-type-names": ["num-routingcost", "num-hopcount"],
        "cost-constraints": false
      }
    },

    "update-my-costs-tips": {
      "uri": "https://alto.example.com/updates-new/costs",
      "media-type": "application/alto-tips+json",
      "accepts": "application/alto-tipsparams+json",
      "uses": [
          "my-network-map",
          "my-routingcost-map",
          "my-hopcount-map",
          "my-simple-filtered-cost-map"
      ],
      "capabilities": {
        "incremental-change-media-types": {
          "my-network-map": "application/json-patch+json",
          "my-routingcost-map": "application/merge-patch+json",
          "my-hopcount-map": "application/merge-patch+json",
          "my-simple-filtered-cost-map": "application/merge-patch+json"
        },
        "support-server-push": true
      }
    }
]]></artwork>
        <t>Note that it is straightforward for an ALTO sever to run HTTP/2 and
support concurrent retrieval of multiple resources such as "my-
network-map" and "my-routingcost-map" using multiple HTTP/2 streams.</t>
        <t>The resource "update-my-costs-tips" provides an ALTO TIPS based
connection, and this is indicated by the media-type "application/
alto-tips+json".</t>
      </section>
    </section>
    <section anchor="tips-openclose">
      <name>TIPS Open/Close</name>
      <t>Upon request, a server sends a TIPS view to a client.  This TIPS view
may be created at the time of the request or may already exist
(either because another client has an active connection to a TIPS
view for the same requested network resource or because the server
perpetually maintains a TIPS view for an often-requested resource).
The server MAY keep track of which clients have an active connection
to each TIPS view to determine whether or not it should delete a TIPS
view and its corresponding updates graph and associated data.</t>
      <section anchor="open-req">
        <name>Open Request</name>
        <t>An ALTO client requests that the server provide a TIPS view for a given resource
by sending an HTTP POST body with the media type
"application/alto-tipsparams+json". That body contains a JSON object of type
TIPSReq, where:</t>
        <artwork><![CDATA[
    object {
       ResourceID   resource-id;
       [JSONString  tag;]
       [Object      input;]
       [Boolean     server-push;]
    } TIPSReq;
]]></artwork>
        <t>with the following fields:</t>
        <dl>
          <dt>resource-id:</dt>
          <dd>
            <t>The resource-id of an ALTO resource and MUST be in the TIPS' "uses" list
(<xref target="ird"/>). If a client does not support all incremental methods from the set
announced in the server's capabilities, the client MUST NOT use the TIPS
service.</t>
          </dd>
          <dt>tag:</dt>
          <dd>
            <t>If the resource-id is a GET-mode resource with a version tag (or
"vtag"), as defined in Section 10.3 of <xref target="RFC7285"/>, and the ALTO
client has previously retrieved a version of that resource from
ALTO, the ALTO client MAY set the "tag" field to the tag part of
the client's version of that resource.  The server MAY use the tag
when calculating a recommended starting edge for the client to
consume.  Note that the client MUST support all incremental
methods from the set announced in the server's capabilities for
this resource.</t>
          </dd>
          <dt>input:</dt>
          <dd>
            <t>If the resource is a POST-mode service that requires input, the
ALTO client MUST set the "input" field to a JSON object with the
parameters that the resource expects.</t>
          </dd>
          <dt>server-push:</dt>
          <dd>
            <t>Set to TRUE if a client desires to receive updates via server
push.  If the value is FALSE or not present, the client does not
accept server push updates.  See <xref target="push"/> for detailed
specifications.</t>
          </dd>
        </dl>
      </section>
      <section anchor="open-resp">
        <name>Open Response</name>
        <t>The response to a valid request MUST be a JSON object of type
AddTIPSResponse, denoted as media type "application/alto-tips+json":</t>
        <artwork><![CDATA[
    object {
      JSONString        tips-view-uri;
      TIPSViewSummary   tips-view-summary;
    } AddTIPSResponse;

    object {
      UpdatesGraphSummary   updates-graph-summary;
      [Boolean              server-push;]
    } TIPSViewSummary;

    object {
      JSONNumber       start-seq;
      JSONNumber       end-seq;
      StartEdgeRec     start-edge-rec;
    } UpdatesGraphSummary;

    object {
      JSONNumber       seq-i;
      JSONNumber       seq-j;
    } StartEdgeRec;
]]></artwork>
        <t>with the following fields:</t>
        <dl>
          <dt>tips-view-uri:</dt>
          <dd>
            <t>Relative URI to the TIPS view of a network resource, which MUST be
unique per connection, and is de-aliased by the server to refer to
the actual location of the TIPS view which may be shared by other
clients.</t>
          </dd>
          <dt/>
          <dd>
            <t>When creating the URI for the TIPS view, TIPS MUST NOT use other
properties of an HTTP request, such as cookies or the client's IP
address, to determine the TIPS view.  Furthermore, TIPS MUST NOT
reuse a URI for a different object in the same connection.</t>
          </dd>
          <dt/>
          <dd>
            <t>It is expected that there is an internal mechanism to map a tips-
view-uri to the TIPS view to be accessed.  For example, TIPS may
assign a unique, internal state id to each TIPS view instance.
However, the exact mechanism is left to the TIPS provider.</t>
          </dd>
          <dt>tips-view-summary:</dt>
          <dd>
            <t>Contains both an updates-graph-summary and an optional server-push
boolean value which is set to TRUE if and only if the client
indicates server push.
</t>
            <t>The updates-graph-summary field contains the starting sequence
number (start-seq) of the updates graph and the last sequence
number (end-seq) that is currently available, along with a
recommended edge to consume (start-edge-rec).  How the server
calculates the recommended edge depends on the implementation.
Ideally, if the client does not provide a version tag, the server
should recommend the edge of the latest snapshot available.  If
the client does provide a version tag, the server should calculate
the cumulative size of the incremental updates available from that
version onward and compare it to the size of the complete resource
snapshot.  If the snapshot is bigger, the server should recommend
the first incremental update edge starting from client's tagged
version.  Else, the server should recommend the latest snapshot
edge.  If the client indicates server push, the recommended edge
will be the first content pushed.</t>
          </dd>
        </dl>
        <t>If the request has any errors, the TIPS service MUST return an HTTP
"400 Bad Request" to the ALTO client; the body of the response
follows the generic ALTO error response format specified in
Section 8.5.2 of <xref target="RFC7285"/>.  Hence, an example ALTO error response
has the format:</t>
        <artwork><![CDATA[
    HTTP/1.1 400 Bad Request
    Content-Length: 131
    Content-Type: application/alto-error+json
    Connection: close

    {
        "meta":{
            "code":  "E_INVALID_FIELD_VALUE",
            "field": "resource-id",
            "value": "my-network-map/#"
        }
    }
]]></artwork>
        <t>Note that "field" and "value" are optional fields.  If the "value"
field exists, the "field" field MUST exist.</t>
        <ul spacing="normal">
          <li>If the TIPS request does not have a "resource-id" field, the error
code of the error message MUST be <tt>E_MISSING_FIELD</tt> and the "field"
field SHOULD be "resource-id".  The TIPS service MUST NOT create
any TIPS view.</li>
          <li>If the "resource-id" field is invalid or is not associated with
the TIPS, the error code of the error message MUST be
<tt>E_INVALID_FIELD_VALUE</tt>.  The "field" field SHOULD be the full path
of the "resource-id" field, and the "value" field SHOULD be the
invalid resource-id.</li>
          <li>If the resource is a POST-mode service that requires input, the
client MUST set the "input" field to a JSON object with the
parameters that that resource expects.  If the "input" field is
missing or invalid, TIPS MUST return the same error response that
resource would return for missing or invalid input (see
<xref target="RFC7285"/>).</li>
        </ul>
      </section>
      <section anchor="open-example">
        <name>Open Example</name>
        <t>For simplicity, assume that the ALTO server is using the Basic
authentication.  If a client with username "client1" and password
"helloalto" wants to create a TIPS view of an ALTO Cost Map resource
with resource ID "my-routingcost-map", it can send the following
request:</t>
        <artwork><![CDATA[
    POST /tips HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-tips+json, application/alto-error+json
    Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K
    Content-Type: application/alto-tipsparams+json
    Content-Length: 41

    {
      "resource-id": "my-routingcost-map"
    }
]]></artwork>
        <t>If the operation is successful, the ALTO server returns the following
message:</t>
        <artwork><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 291

    {
        "tips-view-uri": "/tips/2718281828459",
        "tips-view-summary": {
          "updates-graph-summary": {
            "start-seq": 101,
            "end-seq": 106,
            "start-edge-rec" : {
              "seq-i": 0,
              "seq-j": 105
            }
          },
          "server-push": false
        }
    }
]]></artwork>
      </section>
      <section anchor="close-req">
        <name>Close Request</name>
        <t>An ALTO client can indicate it no longer desires to pull/receive updates for a
specific network resource by "deleting" the TIPS view using the returned
tips-view-uri and the HTTP DELETE method. Whether or not the server actually
deletes the TIPS view is implementation dependent. For example, an ALTO server
may maintain a set of clients that subscribe to the TIPS view of a resource: a
client that deletes the view is removed from the set, and the TIPS view is only
removed when the dependent set becomes empty. See other potential
implementations in <xref target="shared-tips-view"/>. The DELETE request MUST have the
following format:</t>
        <artwork><![CDATA[
    DELETE /<tips-view-uri>
]]></artwork>
        <t>The response to a valid request must be 200 if success, and the
corresponding error code if there is any error.</t>
        <t>If the connection between the client and TIPS provider is severed
without a DELETE request having been sent, the server MUST treat it
as if the client had sent a DELETE request because the TIPS view is,
at least from the client view, per-session based.</t>
      </section>
    </section>
    <section anchor="pull">
      <name>TIPS Data Transfers - Client Pull</name>
      <t>TIPS allows an ALTO client to retrieve the content of an update item
from the updates graph, with an update item defined as the content
(incremental update or snapshot) on an edge in the updates graph.</t>
      <section anchor="request">
        <name>Request</name>
        <t>The client sends an HTTP GET request, where the media type of an
update item resource MUST be the same as the "media-type" field of
the update item on the specified edge in the updates graph.</t>
        <t>For example, if the client wants to query the content of the first
update item (0 -&gt; 101) whose media type is "application/alto-
costmap+json", it must set the "Accept" header to "application/alto-
costmap+json, application/alto-error+json" in the request.</t>
        <t>The GET request MUST have the following format:</t>
        <artwork><![CDATA[
    GET /<tips-view-uri>/ug/<i>/<j>
]]></artwork>
        <t>For example, if the client wants to query the content of the first
update item (0 -&gt; 101), it will send a request to
"/tips/2718281828459/ug/0/101".</t>
      </section>
      <section anchor="response">
        <name>Response</name>
        <t>If the request is valid (<tt>ug/&lt;i&gt;/&lt;j&gt;</tt> exists), the response is encoded
as a JSON object whose data format is indicated by the media type.</t>
        <t>It is possible that a client conducts proactive fetching of future updates, by
long polling updates that have not been listed in the directory yet. For
long-poll prefetch, the client must have indicated the media type which may
appear. It is RECOMMENDED that the server allows for at least the prefetch of
<tt>&lt;end-seq&gt; -&gt; &lt;end-seq + 1&gt;</tt></t>
        <t>Hence, the server processing logic SHOULD be:</t>
        <ul spacing="normal">
          <li>If <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> exists: return content using encoding.</li>
          <li>Else if <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> pre-fetch is acceptable: put request in a
backlog queue.</li>
          <li>Else: return error.</li>
        </ul>
        <t>It is RECOMMENDED that the server uses the following HTTP codes to
indicate errors, with the media type "application/alto-error+json",
regarding update item requests.</t>
        <ul spacing="normal">
          <li>404 (Not Found): if the requested TIPS view does not exist or is
closed.</li>
          <li>410 (Gone): if an update has a seq that is smaller than the start-
seq.</li>
          <li>415 (Unsupported Media Type): if the media type(s) accepted by the
client does not include the media type of the update chosen by the
server.</li>
          <li>425 (Too Early): if the seq exceeds the server prefetch window</li>
          <li>429 (Too Many Requests): when the number of pending (long-poll)
requests exceeds server threshold.  Server may indicate when to
re-try the request in the "Re-Try After" headers.</li>
        </ul>
      </section>
      <section anchor="example-1">
        <name>Example</name>
        <t>Assume the client wants to get the contents of the update item on
edge 0 to 101.  The request is:</t>
        <artwork><![CDATA[
    GET /tips/2718281828459/ug/0/101 HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-costmap+json, application/alto-error+json
]]></artwork>
        <t>And the response will be:</t>
        <artwork><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/alto-costmap+json
    Content-Length: 50

    { ... full replacement of my-routingcost-map ... }
]]></artwork>
      </section>
      <section anchor="new-next-edge-recommendation">
        <name>New Next Edge Recommendation</name>
        <t>While intended TIPS usage is for the client to recieve a recommended
starting edge in the TIPS summary, consume that edge, then construct
all future URIs by incrementing the sequence count by 1, there may be
cases in which the client needs to request a new next edge to
consume.  For example, if a client has an open TIPS view yet has not
polled in a while, the client may requests the next logical
incremental URI but the server has compacted the updates graph so it
no longer exists.  Thus, the client must request a new next edge to
consume based on its current version of the resource.</t>
        <section anchor="request-1">
          <name>Request</name>
          <t>An ALTO client requests that the server provide a next edge
recommendation for a given TIPS view by sending an HTTP POST request
with the media type "application/alto-tipsparams+json".  The URI has
the form:</t>
          <artwork><![CDATA[
    POST /<tips-view-uri>/ug
]]></artwork>
          <t>The POST body have the following form, where providing the version
tag of the resource the client already has is optional:</t>
          <artwork><![CDATA[
    object {
        [JSONString  tag;]
    } TIPSNextEdgeReq;
]]></artwork>
        </section>
        <section anchor="response-1">
          <name>Response</name>
          <t>The response to a valid request MUST be a JSON object of type
UpdatesGraphSummary (defined in <xref target="open-resp"/> but reproduced below as well),
denoted as media type "application/alto-tips+json":</t>
          <artwork><![CDATA[
    object {
      JSONNumber       start-seq;
      JSONNumber       end-seq;
      StartEdgeRec     start-edge-rec;
    } UpdatesGraphSummary;

    object {
      JSONNumber       seq-i;
      JSONNumber       seq-j;
    } StartEdgeRec;
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="push">
      <name>TIPS Data Transfer - Server Push</name>
      <t>TIPS allows an ALTO client to receive an update item pushed by the
ALTO server.</t>
      <t>If a client registers for server push, it should not request updates
via pull to avoid receiving the same information twice, unless the
client does not receive the expected updates (see <xref target="client-processing"/>).</t>
      <section anchor="manage-server-push">
        <name>Manage Server Push</name>
        <t>A client starts to receive server push when it is added to the
receiver set.  A client can read the status of the push state and
remove itself from the receiver set to stop server push.</t>
        <section anchor="start-server-push">
          <name>Start Server Push</name>
          <t>A client can add itself explicitly to the receiver set or add itself
to the receiver set when requesting the TIPS view.  Before a client
starts receiving server push for a TIPS view, it MUST enable server
push in HTTP, i.e., following Section 8.4 of <xref target="RFC9113"/> for HTTP/2 and
Section 4.6 of <xref target="RFC9114"/> for HTTP/3.  If the client does not enable
HTTP server push, the ALTO server MUST return an ALTO error with the
<tt>E_INVALID_FIELD_VALUE</tt> code and set the "field" to "server-push".</t>
          <t>Explicit add: A client can explicitly add itself in the receiver set
by using the HTTP PUT method with media type "application/alto-
tipsparams+json", where the client may optionally specify a starting
edge (next-edge) from which it would like to receive updates:</t>
          <artwork><![CDATA[
    PUT /<tips-view-uri>/push

    object {
      Boolean     server-push;
      [NextEdge    next-edge;]
    } PushState;

    object {
      JSONNumber       seq-i;
      JSONNumber       seq-j;
    } NextEdge;
]]></artwork>
          <t>with the following fields:</t>
          <dl>
            <dt>server-push:</dt>
            <dd>
              <t>Set to true if the client desires to receive server push updates.</t>
            </dd>
            <dt>next-edge:</dt>
            <dd>
              <t>Optional field to request a starting edge to be pushed if the
client has pulled the updates graph directory and has calculated
the path it desires to take.  The server MAY push this edge first
if available.</t>
            </dd>
          </dl>
          <t>Short cut add: When requesting a TIPS view, an ALTO client can start
server push by setting the option "server-push" field to be true
using the HTTP POST method defined in <xref target="open-req"/>.</t>
          <t>Example of a client requesting a TIPS view and starting server push:</t>
          <artwork><![CDATA[
    Client -> server request

    HEADERS
      - END_STREAM
      + END_HEADERS
        :method = POST
        :scheme = https
        :path = /tips
        host = alto.example.com
        accept = application/alto-error+json,
                      application/alto-tips+json
        content-type = application/alto-tips+json
        content-length = 67

    DATA
      - END_STREAM
      {
        "resource-id": "my-routingcost-map",
        "server-push": true
      }

    Server -> client response:

    HEADERS
      - END_STREAM
      + END_HEADERS
        :status = 200
        content-type = application/alto-tips+json
        content-length = 196

    DATA
      - END_STREAM
      {
        "tips-view-uri": "/tips/2718281828459",
        "tips-view-summary": {
          "updates-graph-summary": {
            "start-seq": 101,
            "end-seq": 106,
            "start-edge-rec" : {
              "seq-i": 0,
              "seq-j": 105
            }
          },
          "server-push": true
        }
      }
]]></artwork>
        </section>
        <section anchor="read-push-state">
          <name>Read Push State</name>
          <t>A client can use the HTTP GET method, with accept header set to
"application/alto-tipsparams+json" to check the status of server push.</t>
          <artwork><![CDATA[
    GET /<tips-view-uri>/push
]]></artwork>
          <t>Example:</t>
          <artwork><![CDATA[
    Client -> server request

    HEADERS
      - END_STREAM
      + END_HEADERS
        :method = GET
        :scheme = https
        :path = /tips/2718281828459/push
        host = alto.example.com
        accept = application/alto-error+json,
                      application/alto-tipsparams+json

    Server -> client response:

    HEADERS
      - END_STREAM
      + END_HEADERS
        :status = 200
        content-type = application/alto-tipsparams+json
        content-length = 519

    DATA
      - END_STREAM
      {
        "server-push": true
      }
]]></artwork>
        </section>
        <section anchor="stop-push">
          <name>Stop Push</name>
          <t>A client can stop receiving server push updates either explicitly or
implicitly.</t>
          <dl>
            <dt>Explicit stop:</dt>
            <dd>
              <t>A client stops push by using the HTTP PUT method to <tt>/&lt;tips-view- uri&gt;/push</tt>,
with content type "application/alto-tipsparams+json" and setting server-push
to FALSE:</t>
            </dd>
            <dt>Implicit stop:</dt>
            <dd>
              <t>There are two ways. First, TIPS view is connection ephemeral: the close of
connection or stream for the TIPS view deletes the TIPS view from the view
of the client.
</t>
              <t>Second, the client sends a DELETE <tt>/&lt;tips-view-uri&gt;</tt> request, indicating it
no longer is interested in the resource, which also deletes the
client from the push receiver set if present.</t>
            </dd>
          </dl>
          <t>Note that a client may choose to explicitly stop server push for a
resource, but may not delete the TIPS view so that it can switch
seamlessly from server push to client pull in the case that the
server push frequency is undesirable, without having to request a new
TIPS view.</t>
          <t>Example of explicit stop:</t>
          <artwork><![CDATA[
    Client -> server request

    HEADERS
      - END_STREAM
      + END_HEADERS
        :method = PUT
        :scheme = https
        :path = /tips/2718281828459/push
        host = alto.example.com
        accept = application/alto-error+json
        content-type = application/alto-tipsparams+json
        content-length = 69

    DATA
      - END_STREAM
      {
        "server-push": false
      }

    Server-> client response

    HEADERS
      - END_STREAM
      + END_HEADERS
        :status = 200
]]></artwork>
        </section>
      </section>
      <section anchor="scheduling-server-push-updates">
        <name>Scheduling Server Push Updates</name>
        <t>The objective of the server is to push the latest version to the
client using the lowest cost (sum of size) of the updates.  Hence, it
is RECOMMENDED that the server computes the push path using the
following algorithm, upon each event computing a push:</t>
        <ul spacing="normal">
          <li>Compute client current version (nc). During initialization, if the TIPS view
request has a tag, find that version; otherwise nc = 0</li>
          <li>Compute the shortest path from the current version to the latest version, nc,
n1, ... ne (latest version). Note that the shortest path may not involve the
tagged version and instead follow the edge from 0 to the latest snapshot.</li>
          <li>push <tt>/&lt;tips-view-uri&gt;/ug/nc/n1</tt></li>
        </ul>
        <t>Note</t>
        <ul spacing="normal">
          <li>Initialization: If the client specifically requests a starting
edge to be pushed, the server MAY start with that edge even if it
is not the shortest path.</li>
          <li>Push state: the server MUST maintain the last entry pushed to the
client (and hence per client, per connection state) and schedule
next update push accordingly.</li>
          <li>Push management: The client MUST NOT cancel (<tt>RST_STREAM</tt>) a
<tt>PUSH_PROMISE</tt> to avoid complex server state management.</li>
        </ul>
      </section>
      <section anchor="examples">
        <name>Examples</name>
        <t>Using the example updates graph in <xref target="data-model"/>, a client can wait on
the server for incremental push, where the server first sends
<tt>PUSH_PROMISE</tt>:</t>
        <artwork><![CDATA[
    Server -> client PUSH_PROMISE in current stream:

    PUSH_PROMISE
      - END_STREAM
        Promised Stream 4
        HEADER BLOCK
        :method = GET
        :scheme = https
        :path = /tips/2718281828459/ug/0/101
        host = alto.example.com
        accept = application/alto-error+json,
                      application/alto-costmap+json

    Server -> client content Stream 4:

    HEADERS
      + END_STREAM
      + END_HEADERS
        :status = 200
        content-type = application/alto-costmap+json
        content-length = 539

    DATA
      + END_STREAM
      {
        "meta" : {
          "dependent-vtags" : [{
              "resource-id": "my-network-map",
              "tag": "da65eca2eb7a10ce8b059740b0b2e3f8eb1d4785"
            }],
          "cost-type" : {
            "cost-mode"  : "numerical",
            "cost-metric": "routingcost"
          },
          "vtag": {
            "resource-id" : "my-routingcost-map",
            "tag" : "3ee2cb7e8d63d9fab71b9b34cbf764436315542e"
          }
        },
        "cost-map" : {
          "PID1": { "PID1": 1,  "PID2": 5,  "PID3": 10 },
          "PID2": { "PID1": 5,  "PID2": 1,  "PID3": 15 },
          "PID3": { "PID1": 20, "PID2": 15  }
        }
    }

    Server -> client PUSH_PROMISE in current stream:

    PUSH_PROMISE
      - END_STREAM
        Promised Stream 6
        HEADER BLOCK
        :method = GET
        :scheme = https
        :path = /tips/2718281828459/ug/101/102
        host = alto.example.com
        accept = application/alto-error+json,
                      application/merge-patch+json

    Server -> client content Stream 6

    HEADERS
      + END_STREAM
      + END_HEADERS
        :status = 200
        content-type = application/merge-patch+json
        content-length = 7

    DATA
      + END_STREAM
      {
        "meta": {
            "vtag": {
              "tag": "c0ce023b8678a7b9ec00324673b98e54656d1f6d"
            }
        },
        "cost-map": {
          "PID1": {
            "PID2": 9
          },
          "PID3": {
            "PID1": null,
            "PID3": 1
          }
        }
      }
]]></artwork>
      </section>
      <section anchor="server-push-stream-management">
        <name>Server Push Stream Management</name>
        <t>The server push MUST satisfy the following requirements:</t>
        <ul spacing="normal">
          <li>
            <tt>PUSH_PROMISE</tt> frames MUST be sent in stream <tt>SID_tq</tt> to serialize and allow
the client to know the push order;</li>
          <li>Each <tt>PUSH_PROMISE</tt> frame chooses a new server-selected stream ID, and the
stream is closed after push.</li>
        </ul>
      </section>
    </section>
    <section anchor="operation-and-processing-considerations">
      <name>Operation and Processing Considerations</name>
      <section anchor="load-balancing">
        <name>Considerations for Load Balancing</name>
        <t>TIPS allow clients to make concurrent pulls of the incremental
updates potentially through different HTTP connections.  As a
consequence, it introduces additional complexities when the ALTO
server is being load balanced -- a feature widely used to build
scalable and fault-tolerant web services.  For example, a request may
be incorrectly processed if the following two conditions both hold:</t>
        <ul spacing="normal">
          <li>the backend servers are stateful, i.e., the TIPS view is created
and stored only on a single server;</li>
          <li>the ALTO server is using layer-4 load balancing, i.e., the
requests are distributed based on the TCP 5-tuple.</li>
        </ul>
        <t>Thus, additional considerations are required to enable correct load
balancing for TIPS, including:</t>
        <ul spacing="normal">
          <li>Use a stateless architecture: One solution is to follow the
stateless computing pattern: states about the TIPS view are not
maintained by the backend servers but are stored in a distributed
database.  Thus, concurrent requests to the same TIPS view can be
processed on arbitrary stateless backend servers, which all
fetches data from the same database.</li>
          <li>Configure the load balancers properly: In case when the backend
servers are stateful, the load balancers must be properly
configured to guarantee that requests of the same TIPS view always
arrive at the same server.  For example, an operator or a provider
of an ALTO server may configure layer-7 load balancers that
distribute requests based on URL or cookies.</li>
        </ul>
      </section>
      <section anchor="considerations-for-choosing-updates">
        <name>Considerations for Choosing Updates</name>
        <t>When implementing TIPS, a developer should be cognizant of the
effects of update schedule, which includes both the choice of timing
(i.e., when/what to trigger an update on the updates graph) and the
choice of message format (i.e., given an update, send a full
replacement or an incremental change).  In particular, the update
schedule can have effects on both the overhead and the freshness of
information.  To minimize overhead, developers may choose to batch a
sequence of updates for resources that frequently change by
cumulative updates or a full replacement after a while.  Developers
should be cognizant that batching reduces the freshness of
information and should also consider the effect of such delays on
client behaviors.</t>
        <t>For incremental updates, this design allows both JSON patch and JSON
merge patch for incremental changes.  JSON merge patch is clearly
superior to JSON patch for describing incremental changes to cost
maps, endpoint costs, and endpoint properties.  For these data
structures, JSON merge patch is more space efficient, as well as
simpler to apply.  There is no advantage allowing a server to use
JSON patch for those resources.</t>
        <t>The case is not as clear for incremental changes to network maps.</t>
        <t>First, consider small changes, such as moving a prefix from one PID
to another.  JSON patch could encode that as a simple insertion and
deletion, while JSON merge patch would have to replace the entire
array of prefixes for both PIDs.  On the other hand, to process a
JSON patch update, the ALTO client would have to retain the indexes
of the prefixes for each PID.  Logically, the prefixes in a PID are
an unordered set, not an array; aside from handling updates, a client
has no need to retain the array indexes of the prefixes.  Hence, to
take advantage of JSON patch for network maps, ALTO clients would
have to retain additional, otherwise unnecessary, data.</t>
        <t>Second, consider more involved changes, such as removing half of the
prefixes from a PID.  JSON merge patch would send a new array for
that PID, while JSON patch would have to send a list of remove
operations and delete the prefix one by one.</t>
        <t>Therefore, each TIPS instance may choose to encode the updates using
JSON merge patch or JSON patch based on the type of changes in
network maps.</t>
      </section>
      <section anchor="considerations-for-cross-resource-dependency-scheduling">
        <name>Considerations for Cross-Resource Dependency Scheduling</name>
        <t>Dependent ALTO resources result in cross-resource dependencies in
TIPS.  Consider the following pair of resources, where my-cost-map
(C) is dependent on my-network-map (N).  The updates graph for each
resource is shown, along with links in between the respective updates
graphs to show dependency:</t>
        <figure anchor="fig-cross">
          <name>Example Dependency Model</name>
          <artwork type="drawing" align="center"><![CDATA[
                       +---+   +---+   +---+   +---+   +---+
  my-network-map (N)   | 0 |-->|89 |-->|90 |-->|91 |-->|92 |
                       +---+   +---+   +---+   +---+   +---+
                                 |   \       \       \
                                 |    \       \       \
                       +---+   +---+   +---+   +---+   +---+
  my-cost-map (C)      | 0 |-->|101|-->|102|-->|103|-->|104|
                       +---+   +---+   +---+   +---+   +---+
                        |_______________________|
]]></artwork>
        </figure>
        <t>In <xref target="fig-cross"/>, the cost-map versions 101 and 102 (denoted as C101 and C102)
are dependent on the network-map version 89 (denoted as N89). The cost-map
version 103 (C103) is dependent on the network-map version 90 (N90), and so on.</t>
        <t>In pull-mode, a client can decide the order in which to receive the updates.</t>
        <t>In push-mode, the server must decide.  Pushing order may affect how
fast the client can build a consistent view and how long the client
needs to buffer the update.</t>
        <ul spacing="normal">
          <li>Example 1: The server pushes N89, N90, N91, C101, C102 in that
order.  The client either gets no consistent view of the resources
or it has to buffer N90 and N91.</li>
          <li>Example 2: The server pushes C101, C102, C103, N89.  The client
either gets no consistent view or it has to buffer C103.</li>
        </ul>
        <t>Therefore, the server is RECOMMENDED to push updates in the ascending
order of the smallest dependent tag, e.g., {C101, C102, N89} before
{C103, N90}</t>
      </section>
      <section anchor="client-processing">
        <name>Considerations for Client Processing Updates</name>
        <t>In general, when an ALTO client receives a full replacement for a
resource, the ALTO client should replace the current version with the
new version.  When an ALTO client receives an incremental update for
a resource, the ALTO client should apply those updates to the current
version of the resource.</t>
        <t>However, because resources can depend on other resources (e.g., cost
maps depend on network maps), an ALTO client MUST NOT use a dependent
resource if the resource on which it depends has changed.  There are
at least two ways an ALTO client can do that.  The following
paragraphs illustrate these techniques by referring to network and
cost map messages, although these techniques apply to any dependent
resources.</t>
        <t>Note that when a network map changes, the server SHOULD send the
network map update message before sending the updates for the
dependent cost maps.</t>
        <t>One approach is for the ALTO client to save the network map update
message in a buffer and continue to use the previous network map and
the associated cost maps until the ALTO client receives the update
messages for all dependent cost maps.  The ALTO client then applies
all network and cost map updates atomically.</t>
        <t>Alternatively, the ALTO client MAY update the network map
immediately.  In this case, the cost maps using the network map
become invalid because they are inconsistent with the current network
map; hence, the ALTO client MUST mark each such dependent cost map as
temporarily invalid and MUST NOT use each such cost map until the
ALTO client receives a cost map update indicating that it is based on
the new network map version tag.</t>
        <t>When implementing server push, the server SHOULD send updates for
dependent resource (i.e., the cost maps in the preceding example) in
a timely fashion.  However, if the ALTO client does not receive the
expected updates, a simple recovery method is that the ALTO client
uses client pull to request the missing update.  The ALTO client MAY
retain the version tag of the last version of any tagged resources
and search those version tags when identifying the new updates to
pull.  Although not as efficient as possible, this recovery method is
simple and reliable.</t>
        <t>Though a server SHOULD send update items sequentially, it is possible
that a client receives the update items out of order (in the case of
a retransmitted update item or a result of concurrent fetch).  The
client MUST buffer the update items if they arrive out of order and
then apply them sequentially (based upon the sequence numbers) due to
the operation of JSON merge patch and JSON patch.</t>
      </section>
      <section anchor="considerations-for-updates-to-filtered-cost-maps">
        <name>Considerations for Updates to Filtered Cost Maps</name>
        <t>If TIPS provides updates to a Filtered Cost Map that allows
constraint tests, then an ALTO client MAY request updates to a
Filtered Cost Map request with a constraint test.  In this case, when
a cost changes, the updates graph MUST have an update if the new
value satisfies the test.  If the new value does not, whether there
is an update depends on whether the previous value satisfied the
test.  If it did not, the updates graph SHOULD NOT have an update.
But if the previous value did, then the updates graph MUST add an
update with a "null" value to inform the ALTO client that this cost
no longer satisfies the criteria.</t>
        <t>TIPS can avoid having to handle such a complicated behavior by
offering TIPS only for Filtered Cost Maps that do not allow
constraint tests.</t>
      </section>
      <section anchor="considerations-for-updates-to-ordinal-mode-costs">
        <name>Considerations for Updates to Ordinal Mode Costs</name>
        <t>For an ordinal mode cost map, a change to a single cost point may
require updating many other costs.  As an extreme example, suppose
the lowest cost changes to the highest cost.  For a numerical mode
cost map, only that one cost changes.  But for an ordinal mode cost
map, every cost might change.  While this document allows TIPS to
offer incremental updates for ordinal mode cost maps, TIPS
implementors should be aware that incremental updates for ordinal
costs are more complicated than for numerical costs, and that small
changes of the original cost value may result in large updates.</t>
        <t>A TIPS implementation can avoid this complication by only offering
full replacements as updates in the updates graph for ordinal cost
maps.</t>
      </section>
      <section anchor="shared-tips-view">
        <name>Considerations for Managing Shared TIPS Views</name>
        <t>From a client's point of view, it sees only one copy of the TIPS view
for any resource.  However, on the server side, there are different
implementation options, especially for common resources (e.g.,
network map or cost map) that may be frequently queried by many
clients.  Some potential options are listed below:</t>
        <ul spacing="normal">
          <li>An ALTO server creates one TIPS view of the common resource for
each client.  When the client deletes the view, the server deletes
the view in the server storage.</li>
          <li>
            <t>An ALTO server maintains one copy of the TIPS view for each common
resource and all clients requesting the same resources use the
same copy.  There are two ways to manage the storage for the
shared copy:  </t>
            <ul spacing="normal">
              <li>the ALTO server maintains the set of clients that subscribe to
the TIPS view, and only removes the view from the storage when
the set becomes empty.</li>
              <li>the TIPS view is never removed from the storage.</li>
            </ul>
          </li>
        </ul>
        <t>Developers may choose different implementation options depending on
criteria such as request frequency, available resources of the ALTO
server, the ability to scale, and programming complexity.</t>
      </section>
      <section anchor="considerations-for-offering-shortcut-incremental-updates">
        <name>Considerations for Offering Shortcut Incremental Updates</name>
        <t>Besides the mandatory stepwise incremental updates (from i to i+1),
an ALTO server may optionally offer shortcut incremental updates, or
simple shortcuts, between two non-consecutive versions i and i+k (k &gt;
1).  Such shortcuts offer alternative paths in the update graph and
can potentially speed up the transmission and processing of
incremental updates, leading to faster synchronization of ALTO
information, especially when the client has limited bandwidth and
computation.  However, implementors of an ALTO server must be aware
that:</t>
        <ol spacing="normal" type="1"><li>Optional shortcuts may increase the size of the update graph, in
the worst case being the square of the number of updates (i.e.,
when a shortcut is offered for each version to all future
versions).</li>
          <li>Optional shortcuts require additional storage on the ALTO server.</li>
          <li>Optional shortcuts may reduce concurrency when the updates do not
overlap, e.g., when the updates apply to different parts of an
ALTO resource.  In such a case, the total size of the original
updates is close to the size of the shortcut, but the original
updates can be transmitted concurrently while the shortcut is
transmitted in a single connection.</li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations (Section 15 of <xref target="RFC7285"/>) of the base
protocol fully apply to this extension.  For example, the same
authenticity and integrity considerations (Section 15.1 of <xref target="RFC7285"/>)
still fully apply; the same considerations for the privacy of ALTO
users (Section 15.4 of <xref target="RFC7285"/>) also still fully apply.</t>
      <t>The additional services (addition of update read service and update
push service) provided by this extension extend the attack surface
described in Section 15.1.1 of <xref target="RFC7285"/>.  Below, we discuss the
additional risks and their remedies.</t>
      <section anchor="tips-denial-of-service-attacks">
        <name>TIPS: Denial-of-Service Attacks</name>
        <t>Allowing TIPS views enables a new class of Denial-of-Service attacks.
In particular, For the TIPS server, an ALTO client or clients might
create an unreasonable number of TIPS views.</t>
        <t>To avoid these attacks on the TIPS server, the server SHOULD choose
to limit the number of active views and reject new requests when that
threshold is reached.  TIPS allows predictive fetching and the server
SHOULD also choose to limit the number of pending requests.  In these
cases, the server SHOULD return the HTTP status "429 Too many
requests".</t>
        <t>It is important to note that the preceding approaches are not the
only possibilities.  For example, it may be possible for TIPS to use
somewhat more clever logic involving IP reputation, rate-limiting,
and compartmentalization of the overall threshold into smaller
thresholds that apply to subsets of potential clients.</t>
      </section>
      <section anchor="alto-client-update-overloading-or-instability">
        <name>ALTO Client: Update Overloading or Instability</name>
        <t>The availability of continuous updates, when the client indicates
receiving server push, can also cause overload for an ALTO client, in
particular, an ALTO client with limited processing capabilities.  The
current design does not include any flow control mechanisms for the
client to reduce the update rates from the server.  Under
overloading, the client MAY choose to remove the information
resources with high update rates.</t>
        <t>Also, under overloading, the client may no longer be able to detect
whether information is still fresh or has become stale.  In such a
case, the client should be careful in how it uses the information to
avoid stability or efficiency issues.</t>
      </section>
      <section anchor="spoofed-uri">
        <name>Spoofed URI</name>
        <t>An outside party that can read the TIPS response or that can observe
TIPS requests can obtain the TIPS view URI and use that to send
fraudulent "DELETE" requests, thus disabling the service for the
valid ALTO client.  This can be avoided by encrypting the requests
and responses (Section 15 of <xref target="RFC7285"/>).</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following media types following the
same process in <xref target="RFC7285"/>:</t>
      <ul spacing="normal">
        <li>application/alto-tips+json: as described in <xref target="open-resp"/>;</li>
        <li>application/alto-tipsparams+json: as described in <xref target="open-req"/>;</li>
      </ul>
      <section anchor="applicationalto-tipsjson-media-type">
        <name>application/alto-tips+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>alto-tips+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>Encoding considerations are identical to those specified for the
"application/json" media type. See <xref target="RFC8259"/>.</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>Security considerations relating to the generation and consumption of ALTO
Protocol messages are discussed in Section 10 of <xref target="RFC8895"/> and Section 15 of
<xref target="RFC7285"/>.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies format of conforming messages and the interpretation
thereof.</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="open-resp"/> of this document.</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/>
            </t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>This document uses the media type to refer to protocol messages and thus
 does not require a file extension.</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
          </dd>
        </dl>
      </section>
      <section anchor="applicationalto-tipsparamsjson-media-type">
        <name>application/alto-tipsparams+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>alto-tipsparams+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>Encoding considerations are identical to those specified for the
 "application/json" media type. See <xref target="RFC8259"/>.</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>Security considerations relating to the generation and consumption of ALTO
Protocol messages are discussed in Section 10 of <xref target="RFC8895"/> and Section 15 of
<xref target="RFC7285"/>.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies format of conforming messages and the interpretation
thereof.</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="open-req"/> of this document.</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/>
            </t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>This document uses the media type to refer to protocol messages and thus
 does not require a file extension.</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors of this document would also like to thank Mark Nottingham and
Spencer Dawkins for providing invaluable reviews of earlier versions of this
document, Adrian Farrel, Qin Wu, and Jordi Ros Giralt for their continuous
feedback, and Russ White, Donald Eastlake, Martin Thomson, Bernard Adoba,
Spencer Dawkins and Sheng Jiang for their last call reviews of this document.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <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="RFC7285">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Protocol</title>
            <author fullname="R. Alimi" initials="R." role="editor" surname="Alimi">
              <organization/>
            </author>
            <author fullname="R. Penno" initials="R." role="editor" surname="Penno">
              <organization/>
            </author>
            <author fullname="Y. Yang" initials="Y." role="editor" surname="Yang">
              <organization/>
            </author>
            <author fullname="S. Kiesel" initials="S." surname="Kiesel">
              <organization/>
            </author>
            <author fullname="S. Previdi" initials="S." surname="Previdi">
              <organization/>
            </author>
            <author fullname="W. Roome" initials="W." surname="Roome">
              <organization/>
            </author>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov">
              <organization/>
            </author>
            <author fullname="R. Woundy" initials="R." surname="Woundy">
              <organization/>
            </author>
            <date month="September" year="2014"/>
            <abstract>
              <t>Applications using the Internet already have access to some topology information of Internet Service Provider (ISP) networks.  For example, views to Internet routing tables at Looking Glass servers are available and can be practically downloaded to many network application clients.  What is missing is knowledge of the underlying network topologies from the point of view of ISPs.  In other words, what an ISP prefers in terms of traffic optimization -- and a way to distribute it.</t>
              <t>The Application-Layer Traffic Optimization (ALTO) services defined in this document provide network information (e.g., basic network location structure and preferences of network paths) with the goal of modifying network resource consumption patterns while maintaining or improving application performance.  The basic information of ALTO is based on abstract maps of a network.  These maps provide a simplified view, yet enough information about a network for applications to effectively utilize them.  Additional services are built on top of the maps.</t>
              <t>This document describes a protocol implementing the ALTO services. Although the ALTO services would primarily be provided by ISPs, other entities, such as content service providers, could also provide ALTO services.  Applications that could use the ALTO services are those that have a choice to which end points to connect.  Examples of such applications are peer-to-peer (P2P) and content delivery networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7285"/>
          <seriesInfo name="DOI" value="10.17487/RFC7285"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray">
              <organization/>
            </author>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8895">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Incremental Updates Using Server-Sent Events (SSE)</title>
            <author fullname="W. Roome" initials="W." surname="Roome">
              <organization/>
            </author>
            <author fullname="Y. Yang" initials="Y." surname="Yang">
              <organization/>
            </author>
            <date month="November" year="2020"/>
            <abstract>
              <t>The Application-Layer Traffic Optimization (ALTO) protocol (RFC 7285) provides network-related information, called network information resources, to client applications so that clients can make informed decisions in utilizing network resources. This document presents a mechanism to allow an ALTO server to push updates to ALTO clients to achieve two benefits: (1) updates can be incremental, in that if only a small section of an information resource changes, the ALTO server can send just the changes and (2) updates can be immediate, in that the ALTO server can send updates as soon as they are available.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8895"/>
          <seriesInfo name="DOI" value="10.17487/RFC8895"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns. </t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <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 latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment.  This document describes a mapping of HTTP semantics over QUIC.  This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC9205">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
              <t>This document obsoletes RFC 3205.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="56"/>
          <seriesInfo name="RFC" value="9205"/>
          <seriesInfo name="DOI" value="10.17487/RFC9205"/>
        </reference>
      </references>
    </references>
    <section anchor="high-level-service-model">
      <name>High-level Service Model</name>
      <t>Conceptually, the TIPS system consists of 3 types of resources:</t>
      <ul spacing="normal">
        <li>(R1) TIPS frontend to manage (create/delete) TIPS views.</li>
        <li>(R2) TIPS view directory, which provides metadata (e.g., references) about the
network resource data.</li>
        <li>(R3) The actual network resource data, encoded as complete ALTO network
resources (e.g., cost map, network map) or incremental updates.</li>
      </ul>
      <figure anchor="fig-service-model">
        <name>Service Model</name>
        <artwork type="drawing" align="center"><![CDATA[
                      +------------------------------------------------+
                      |                                                |
 +------+             |R1: Frontend/Open  R2: Directory/Meta  R3: Data |
 |      | "iget" base |     +-----+           +-----+         +-----+  |
 |      | resource 1  |     |     |           |     |         |     |  |
 |      |-------------|---->|     |           |     |         |     |  |
 |      | incremental |     |     |           |     |-------->|     |  |
 |      | transfer    |     |     |           |     |         |     |  |
 |      | resource    |     |     |           |     |         |     |  |
 |      |<------------|-----|     |           +-----+         +-----+  |
 |Client|             |     |     |                                    |
 |      | "iget" base |     |     |                                    |
 |      | resource 2  |     |     |           +-----+         +-----+  |
 |      |-------------|---->|     |           |     |         |     |  |
 |      | incremental |     |     |           |     |         |     |  |
 |      | transfer    |     |     |           |     | ------->|     |  |
 |      | resource    |     |     |           |     |         |     |  |
 |      |<------------|-----|     |           |     |         |     |  |
 +------+             |     +-----+           +-----+         +-----+  |
                      |                                                |
                      +------------------------------------------------+
]]></artwork>
      </figure>
      <t>Design Point: Component Resource Location</t>
      <ul spacing="normal">
        <li>Design 1 (Single): all 3 types at the same, single server (accessed via
relative reference)</li>
        <li>Design 2 (Flexible): all 3 types can be at their own server (accessed via
absolute reference)</li>
        <li>Design 3 (Dir + Data): R2 and R3 must remain together, though R1 might not be
on the same server</li>
      </ul>
      <t>This document specifies Design 1 (keeping R1, R2, and R3 on the same server) in
order to simplify session management, though at the expense of maximum load
balancing flexibility (see <xref target="load-balancing"/> for a discussion on load balancing
considerations). A future companion document may extend the protocol to support
Design 2 or Design 3.</t>
    </section>
    <section anchor="adherence-to-building-protocols-with-http">
      <name>Adherence to "Building Protocols with HTTP"</name>
      <t>This work adheres fully to <xref target="RFC9205"/> for the following reasons:</t>
      <ul spacing="normal">
        <li>TIPS does not "redefine, refine, or overlay the semantics of
generic protocol elements such as methods, status codes, or
existing header fields" and instead focuses on "protocol elements
that are specific to <tt>[the TIPS]</tt> application -- namely, <tt>[its]</tt> HTTP
resources" (Section 3.1 of <xref target="RFC9205"/>).</li>
        <li>There are no statically defined URI components (Section 3.2 of
<xref target="RFC9205"/>).</li>
        <li>No minimum version of HTTP is specified by TIPS which is
recommended (Section 4.1 of <xref target="RFC9205"/>).</li>
        <li>This work follows the advice that "When specifying examples of
protocol interactions, applications should document both the
request and response messages with complete header sections,
preferably in HTTP/1.1 format" (Section 4.1 of <xref target="RFC9205"/>).</li>
        <li>TIPS uses URI templates which is recommended (Section 4.2 of
<xref target="RFC9205"/>).</li>
        <li>TIPS follows the pattern that "a client will begin interacting
with a given application server by requesting an initial document
that contains information about that particular deployment,
potentially including links to other relevant resources.  Doing so
ensures that the deployment is as flexible as possible
(potentially spanning multiple servers), allows evolution, and
also gives the application the opportunity to tailor the
"discovery document" to the client" (Section 4.4.1 of <xref target="RFC9205"/>).</li>
        <li>TIPS uses existing HTTP schemes (Section 4.4.2 of <xref target="RFC9205"/>).</li>
        <li>TIPS defines its errors "to use the most applicable status code"
(Section 4.6 of <xref target="RFC9205"/>).</li>
        <li>TIPS does not "make assumptions about the relationship between
separate requests on a single transport connection; doing so
breaks many of the assumptions of HTTP as a stateless protocol and
will cause problems in interoperability, security, operability,
and evolution" (Section 4.11 of <xref target="RFC9205"/>).  The only relationship
between requests is that a client must make a request to first
discover where a TIPS view of resource will be served, which is
consistent with URI discovery in Section 4.4.1 of <xref target="RFC9205"/>.</li>
        <li>Section Section 4.14 of <xref target="RFC9205"/> of RFC 9205 notes that there are
quite a few caveats with using server push, mostly because of lack
of widespread support.  We, the authors, have considered these
factors and have still decided server push can be valuable in the
TIPS use case.</li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19a3fbRpLod/wKHPpDpGuSEiXLD3nsM4plJ9rxayV7c2Yn
c2KQBCXEJMAAoBSNrf0r98fcP3br2V0NgJLsZB5nd3VmYokEuqurq6vrXYPB
IJoWkzxZpPvxtExm9SBL69kgmdfFIE8vBnWZ5NWyKOvBPKnTqo7qrJ7Ds713
Z2l88PLdm/idPhEf5bOiXCR1VuTx29V4nk3495O0PM8maS9KxuMyPYeX+cWj
tye9CJ5JT4vycj+u6mk0hb/240+HB++eX0VRtiz347pcVfXO9vaj7Z0oKdNk
38x4AH9HF0X58bQsVst9AiiKqjrJpz8l8yKHsS7TKlpm+1EM45fZpOZP4nhS
LBZpXlf6d5bPM30+jtNpVmf56X6cF/BXXUz0C/i1WCwTPw58ME2X9dl+vIuj
LMu8qLNZlk7l3QrgLNOZm6e6XNg/G6NVq7H7BF6PklV9VpQI/QD+j1DCm8fD
+GRyVtQ1fcR7d1zMYdH2c1humsIwR9NkcHxWTNNqcAK7+f/+bxrv0AOTrAas
HyblAhA25Zcm8Nx+fP/ezqM9+XuV17g536Wws/klfViUgJjDdFVXEyCCd+k8
/Vgs6Jt0kWRzBWbIwPyx5geG0zQK1/HnIS7lz0l+ahaCf8bH2eQsKaf+O13M
3ih+WxbVMp3U8Ql9ZpbyOr2Iv0/O09ws5dm7cB3vTw78Gv6czNP4fZ6dp2UF
I9glXJaXf5xUw0t4YphOVw3I/zSMv0sKA/Wfksx9orD2XhfDnXvxSQF7CGdg
Qmdh1I//nJ2tkhyQlEx7BvpnZ2l+CjOZbRhtw08I/7OzLE/8Ck4AUThY9yI+
JtlpUvyxmqxwDcNJ3ljGyyFs4/wCxkjNWl4mqzLNw2++Gv/b9/d2tr9uC+YE
B5ANw/HHNXsBi/hTOp+nZbCEyRmQoP3in7MCAmP4kcAwC8iZT56neLKPXzzb
GY0eya8Pdh7uya8Pd/b004ejB/f014eP9IFHo9GO/3XX/wrPRplyYzfLo51t
eDMaDAZxMgZ8AJeJIsfHASvI3ObxBjwaIxib8TyFVSWnaRV//+7d263R8NcY
uUxWxcBOstM8ncYwSVzDGFW2WM7TflSlv6yAr2bJPC7x16oelOlyfhmvqjSe
JFXah22LL85gS2Esnnoyz+AVfb6KExllksbFLM7MtVKmVbEqJ2nVJ0BoYrhd
0hK/WRb5tIovMjhu+AUy0nlap9GkyGscH8ZKYUfcIDFcEHFSx0lcZ4t0GEUE
TJZPyhSvBljBaokXUgWww2VA91haDk5wrOfneHnEGycnzzcZY7gvm4CXGVwj
uITFal5nAMCv+OpSkQtrqIslgqIY7cMVAfAiHIIOWdEkySMDDKBwuaoM9Apc
XQgCYe3AQ3DL4kWRZ3VRwv7kaY0XZNSJxRjYbH4KWwLDFxcIKCFORoOBZZxY
F+NfjQBgQj8cOMZf/H1xgZP3eWk7tEMoNZQxnY0iB7TM4caeXsI9t6QLHLZm
sirhmNd9OBT5YDwvJh8JDnfHA6rc7HiIk0WFFOTmxslwnJw5LGzjO8Bn8hG2
dnqeAOZOiYpAmAFA6OFZmtTAWoCG6jMk5WKyQhTDqHVZTFeIl1pORXRr6Sbe
QHlmc0hiDRJ7hftp9i86fn7ybraay9FB7J7C2WweApwZYIXdXybjbA4cBZ9M
f13ChCB6XfYjjzMgiQ2LtU09QvHGcjWfb8bI5kAYmawn6ignDqFbVjCKtnb7
eEQJ49l8Hs9WOSEXd2amzwDtymqTeVVEQOLnGayNHmiQMpKohZoI+TrgIj5x
a4DTYXGYITO0RTadzkHAuAP7xLtIm/PpDm0qyJIHy6Vu2eBlcglvw9bOcPo3
SyDf7G+8mxsI9mbsFrNIYf9pSXqQEj8QHZFiXCdAj/I1IAyIq7JMC6S1Ip4l
cC7gCU/YkfKEKj6DKycep3DpKlsFNj0C5CpvHgPf9Dzk0ye5J66u+sJJ13Nk
x3cjujBv4rxuHV38wjFdHEv2oEqR6Vp+Gxt+i5/L4ACZHXMjm8Fol5s4lGNp
dWEYEOzszjD+Cp6Mr2wRYyZMIWMGTOFE3chqnsAC5pviFjuAlIyRS2d1fAFs
BaV1/LpMJynSqIJFA8ILtPz11xUwd/yTBA17NPjBDrZvuD2BIcAqx8dxPNNv
MnhA5bcFXIue5ECTCpHgLnjCGUoWV1cIC1zX0xTBQG6ZAuc+K1bzaTQGxjWe
E4JARylwUycE7LWc190D1QqJUMSKnUjn3OU59Zjrx/eursztAmAA8LiArKqA
svjGH8P6zJFCvMRn2elZa2p8Ec7EdBi/yMqq7iP6K1hj6Zg+HTc3VtcRq+Uc
z+CtIodVO9rvvGaH0fcozMDe6rbh9pcrvsXCw90QECzXI2qjs+SEi+75GhQF
p95/oHdoPx6vapKHIr00FqBoAxsSEr52SfuyC4CUvLB3VTGLFDMlns+Okwtb
ydjgIRAVMOk8KZFcYJvOQELg/UNOIwhTweEskXu1DZMesdxQSLUAopRDgGcn
YobELwxB3v/VEoAyDuA6c9C7V6dn7iM+sLKyqGNVfWQMRoIABAI6C7hYgF5u
kAUj3GCgDiDnBT4BAmkBQw+KEqFapFWFRwlXkadwGZfFIuBKAdPESyOUPUXe
mBYpblatdxuqSvj1RjZMh335FD9Q9ETwUE62jHJTmSI8soI137CrOiXgDCeE
02aElngJ/JqJ0N7jSOeBBGgeExpAmaYfJeegWxHvAbo2kqbKLeN0kuCdhwyB
Lr6KTk0G1GA336wOtnuK9p4iZz7n9jzDbUTgBnTImxwBBshYVlQqnSHK5STg
qTsrCrqlzooLgpGoOqv10qgc8lAPWyOKJiQOOmkKRU3ktClfJ53yafQ18mnc
lk+FUqLGBUn8NrleSo2vkVKjL5ZS1wmCIqVGt5ZSvWDXklCjL5NQrwcsshJq
fCLj6DVqd1rmEJ1jVogihnp6HD//FQSpSiVNdz85DoK3L74QTy/xNE/QflhN
ymxJO48Ul6KIi7uGAsIqz5BGZAmw0XO0WiDTbtAC3mjIM2mFbYHQymxDAvSA
qMHLcZfLlMWUcHlMe4LA0zJZnoHQMkWehldOe9j3x0fxMqlBhWQMzNJ6wsp9
lSdLEEVA3IM3u9gRqAJ34mM++GTojV/CglbASNnm8RFkGVgXyK69V+9P3vX6
/G/8+g39fvz8398fHT8/xN9Pvj94+dL9ok+cfP/m/Uv4PpLf/JvP3rx69fz1
Ib8Mn8aNj14d/LnHcl7vzdt3R29eH7zssUqbVZEjDLy+YMlj5HOAgGWZogid
kBQCWzwmeTr+9tnbeHSPJSW0Il1dscw7egBCU4T8hmciBsZ/khgHWkyaIOZi
uiCTZQbIQzG1QgnvAmQnuEIZia/hLiJtp8mkiIk4Pby6BPyzfSjXN3A4x8oI
XrWDPhzu4MVnVBlcLFPLJQ2aBrQPfLVCizwfAC/p4HTCFmnPmcTenONHQJGf
7hTy6xWtxbPLgDQ+3SnNn/DoM7mrwuNGojk8bkBTQ0ag2sGVjccnqxbVfiRS
ZiD6TWGqiVO7HC8KJBnRK70gFinNs2KV1OFLvHdy3KZqIlmrOT6OYCsKlO8D
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
LRwqhzvrKUe14CB6simWeRj9f3wcuAC9OgEA

-->

</rfc>
