<?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.6) -->
<?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-19" category="std" consensus="true" tocDepth="3" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="ALTO TIPS">The ALTO Transport Information Publication Service</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-alto-new-transport-19"/>
    <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="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="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.1 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.1.</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, the ALTO information
can be transported in two ways:</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.1 <xref target="RFC9112"/>, but HTTP/2 <xref target="RFC9113"/> and
HTTP/3 <xref target="RFC9114"/> can support HTTP/1.1 workflows. However, HTTP/2 and HTTP/3
provide features that can improve certain properties of ALTO and ALTO/SSE.</t>
      <ul spacing="normal">
        <li>First, consider the ALTO base protocol, which is designed to transfer only
complete information resources. A client can run the base protocol on top of
HTTP/2 or HTTP/3 to request multiple information resources in concurrent
streams, but each request must be for a complete information resource: there is
no capability for the server to transmit incremental updates. Hence, there can be a large
overhead when the client already has an information resource and then there are
small changes to the resource.</li>
        <li>Next, consider ALTO/SSE <xref target="RFC8895"/>. 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., a resource identifier)
to individual incremental updates. Such a design cannot use concurrent data
streams available in HTTP/2 and HTTP/3, because both cases require a resource
identifier. Additionally, ALTO/SSE is a push-only protocol, which denies the
client flexibility in choosing how and when it receives updates.</li>
      </ul>
      <t>To mitigate these concerns, 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 issue non-blocking requests for specific incremental updates using
native HTTP/2 or HTTP/3, while still functioning for HTTP/1.1.</t>
      <t>While ALTO/SSE <xref target="RFC8895"/> and TIPS both can transport incremental updates of
ALTO information resources to clients, they have different design goals. The
TIPS extension enables more scalable and robust distribution of incremental
updates, but is missing the session management and built-in server push
capabilities of ALTO/SSE. From the performance perspective, TIPS is optimizing
throughput by leveraging concurrent and out-of-order transport of data, while
ALTO/SSE is optimizing latency as new events can be immediately transferred to
the clients without waiting for another round of communication when there are
multiple updates. Thus, we do not see TIPS as a replacement but as a complement
of ALTO/SSE. One example of combining these two extensions is as shown in
<xref target="tips-sse"/>.</t>
      <t>Note that future extensions may leverage server push, a feature of HTTP/2
<xref target="RFC9113"/> and HTTP/3 <xref target="RFC9114"/>, as an alternative of SSE. We discuss why
this alternative design is not ready in <xref target="push"/>.</t>
      <t>Specifically, this document specifies:</t>
      <ul spacing="normal">
        <li>Extensions to the ALTO Protocol for dynamic subscription and efficient
uniform update delivery of an incrementally changing network information
resource.</li>
        <li>A new resource type that indicates the TIPS updates graph model for a
resource.</li>
        <li>URI patterns to fetch the snapshots or incremental updates.</li>
      </ul>
      <t>Some operational complexities that must be taken into consideration when
implementing this extension are discussed in <xref target="ops-considerations"/>, including
load balancing <xref target="load-balancing"/>, fetching and processing incremental updates
of dependent resources <xref target="cross-sched"/></t>
      <t><xref target="sec-bcp-http"/> discusses to what extent the TIPS design adheres to the Best
Current Practices for building protocols with HTTP <xref target="RFC9205"/>.</t>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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
<xref section="8.2" sectionFormat="of" 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>The ALTO Protocol and its extensions support two transport mechanisms:
First, a client can directly 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 Server Sent Events (SSE).</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>Long-polling updates:</dt>
          <dd>
            <t>Long-polling 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.1 as many development tools and current ALTO implementations
are based on HTTP/1.1.</t>
          </dd>
        </dl>
        <t>The ALTO new transport specified in this document satisfies all the design
requirements:</t>
        <ul spacing="normal">
          <li>This document reuses the data format introduced in <xref target="RFC8895"/> that enables
incremental updates using JSON patches or merge patches.</li>
          <li>This document introduce a unified data model to describe the changes
(snapshots and incremental updates) of an ALTO resource, referred to as a TIPS
view. In the data model, snapshots and incremental updates are indexed as
individual HTTP resources following a unified naming convention, independent
of the HTTP version. Thus, these updates can be concurrently requested and be
transferred in a non-blocking manner either by using multiple connections or
leveraging multiplexed data transfer offered by HTTP/2 or HTTP/3.</li>
          <li>The unified naming convention is based on a monotonically increasing sequence
number, making it possible for a client to construct the URL of a future
update and send a long-polling request.</li>
          <li>The unified naming convention is independent of the HTTP versions and can
operate atop HTTP/1.1, HTTP/2 or HTTP/3.</li>
        </ul>
        <t>This document assumes the deployment model discussed in  <xref target="sec-dep-model"/>.</t>
      </section>
      <section anchor="terminology">
        <name>TIPS Terminology</name>
        <t>In addition to the terms defined in <xref target="RFC7285"/>, 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. The TIPS view has one
basic component, updates graph (ug), but may include other transport
information.</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. This document uses 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 an 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>
        </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 |            | tv2/ug |                 | tv3/ug | | |
| | +--------+            +--------+                 +--------+ | |
| +----|----\----------------|-------------------------|--------+ |
|      |     \               |                         |          |
+------|------\--------------|-------------------------|----------+
       |       +------+      |                         |
       |               \     |                         |
   +----------+       +----------+                 +----------+
   | Client 1 |       | Client 2 |                 | Client 3 |
   +----------+       +----------+                 +----------+

tvi   = TIPS view i
tvi/ug = incremental updates graph associated with tvi
]]></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 #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.</t>
        <t>Each client 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 views (tv2 and tv3) are created upon
different client requests with different filter sets.</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 tracks the change of the resource maps with version 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 the
content of the version (a 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, the 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 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 base
version of the client is 103 as it serves as a base upon which incremental
updates can be applied. 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 to 105.</t>
        <figure anchor="fig-ug">
          <name>TIPS Model Example</name>
          <artwork type="drawing" align="center"><![CDATA[
                                                        +======+
                                                  ------|  0   |
                                                 /      +======+
                                        ID0-101 /        |   |
                                              |/__       |   |
                                       +======+          |   |
                       tag: 3421097 -> | 101  |          |   |
                                       +======+          |   |
                               ID101-102  ||             |   |
                                          \/             |   |
                                       +======+          |   |
                       tag: 6431234 -> | 102  |          |   |
                                       +======+          |   |
                               ID102-103  ||             |   |
                                          \/             |   |
                                       +======+          /   |
    +--------------+   tag: 0881080 -> | 103  |<--------/    |
    | Base Version |   =======>        +======+ ID0-103      |
    +--------------+             103-104  ||    ..           |
                                          \/     ..          |
                                       +======+  ..          |
                       tag: 6452654 -> | 104  |  .. ID103    |
                                       +======+  .. -105     |
                               ID104-105  ||     ..          | ID0-105
                                          \/   |._           /
                                       +======+             /
                       tag: 7838392 -> | 105  |<-----------/
                                       +======+
                               ID105-106  ||
                                          \/
                                       +======+
                       tag: 6470983 -> | 106  |
                                       +======+
]]></artwork>
        </figure>
      </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 <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14>
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 Workflow and Resource Location Schema</name>
      <section anchor="workflow-overview">
        <name>Workflow</name>
        <t>At a high level, an ALTO client first uses the TIPS service (denoted as TIPS-F
and F is for frontend) 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 (denoted as
TIPS-V), and a summary of the current view, which contains the information to
correctly interact with the current view. With the URI to the root of a TIPS
view, clients can construct URIs (see <xref target="schema"/>) to fetch incremental updates.</t>
        <t>An example workflow is shown in <xref target="fig-workflow-pull"/>. After the TIPS-F
service receives the request from the client to monitor the updates of an ALTO
resource, it creates a TIPS view service and returns the corresponding
information to the client. The URI points to that specific TIPS-V instance and
the summary contains the start-seq and end-seq of the update graph, and a
server-recommended edge to consume first, e.g., from i to j.</t>
        <t>An ALTO client can then continuously pull each additional update with the
information. For example, the client in <xref target="fig-workflow-pull"/> first fetches the
update from i to j, and then from j to j+1. Note that the update item at
<tt>&lt;tips-view-uri&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 server <bcp14>MAY</bcp14> close a TIPS view at any time, e.g., under high system load or due
to client inactivity. In the event that a TIPS view is closed, an edge request
will receive error code 404 in response, and the client will have to request a
new TIPS view URI.</t>
        <t>If resources allow, a server <bcp14>SHOULD</bcp14> avoid closing TIPS views that have active
polling edge requests or have recently served responses until clients have had a
reasonable interval to request the next update, unless guided by specific
control policies.</t>
        <figure anchor="fig-workflow-pull">
          <name>ALTO TIPS Workflow Supporting Client Pull</name>
          <artwork type="drawing" align="center"><![CDATA[
Client                                 TIPS-F           TIPS-V
  o                                       .                .
  | POST to create/receive a TIPS view    .  Create TIPS   .
  |           for resource 1              .      View      .
  |-------------------------------------> |.-.-.-.-.-.-.-> |
  | <tips-view-uri>, <tips-view-summary>  .                |
  | <-------------------------------------| <-.-.-.-.-.-.-.|
  |                                                        .
  | GET /<tips-view-path>/ug/<i>/<j>                       .
  |------------------------------------------------------> |
  | content on edge i to j                                 |
  | <------------------------------------------------------|
  |                                                        .
  | GET /<tips-view-path>/ug/<j>/<j+1>                     .
  |------------------------------------------------------> |
  .                                                        .
  .                                                        .
  | content on edge j to j+1                               |
  | <------------------------------------------------------|
  |                                                        .
  o                                                        .
                                                           .
                                         TIPS View Closed  o
]]></artwork>
        </figure>
      </section>
      <section anchor="schema">
        <name>Resource Location Schema</name>
        <t>The resource location schema defines how a client constructs URI to fetch
incremental updates.</t>
        <t>To access each 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-path>  // root path 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
    \_ ...
]]></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 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[
    <tips-view-uri>/ug/<end-seq>/<end-seq + 1>
]]></artwork>
        <t>Incremental updates of a TIPS view are read-only. Thus, they are fetched using
the HTTP GET method.</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 <bcp14>MUST</bcp14> 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="caps">
        <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>
        <figure anchor="tips-cap">
          <name>TIPSCapabilities</name>
          <artwork align="left"><![CDATA[
     object {
       IncrementalUpdateMediaTypes incremental-change-media-types;
     } TIPSCapabilities;

     object-map {
        ResourceID -> String;
     } IncrementalUpdateMediaTypes;
]]></artwork>
        </figure>
        <t>with field:</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 incremental changes, separated by commas. For the implementation of this
specification, this <bcp14>MUST</bcp14> be "application/merge-patch+json",
"application/json-patch+json", or
"application/merge-patch+json,application/json-patch+json", unless defined by
a future extension.
</t>
            <t>When choosing the media types to encode incremental updates for a
resource, the server <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> 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>
        </dl>
      </section>
      <section anchor="uses">
        <name>Uses</name>
        <t>The "uses" attribute <bcp14>MUST</bcp14> be an array with the resource-ids of every
network information resource for which this TIPS can provide service.</t>
        <t>This set <bcp14>MAY</bcp14> be any subset of the ALTO server's network information resources
and <bcp14>MAY</bcp14> include resources defined in linked IRDs. However, it is <bcp14>RECOMMENDED</bcp14>
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 request the full content of R0, which is likely to be
less efficient than receiving the incremental updates of R0.</t>
      </section>
      <section anchor="an-example">
        <name>An Example</name>
        <t>Extending the IRD example in Section 8.1 of <xref target="RFC8895"/>, <xref target="ex-ird"/> is the IRD of an
ALTO server supporting ALTO base protocol, ALTO/SSE, and ALTO TIPS.</t>
        <figure anchor="ex-ird">
          <name>Example of an ALTO Server Supporting ALTO Base Protocol, ALTO/SSE, and ALTO TIPS</name>
          <artwork align="left"><![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-network-map"],
      "capabilities": {
        "cost-type-names": ["num-routingcost"]
      }
    },
    "my-hopcount-map": {
      "uri": "https://alto.example.com/costmap/hopcount",
      "media-type": "application/alto-costmap+json",
      "uses": ["my-network-map"],
      "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-network-map"],
      "capabilities": {
        "cost-type-names": ["num-routingcost", "num-hopcount"],
        "cost-constraints": false
      }
    },
    "update-my-costs": {
      "uri": "https://alto.example.com/updates/costs",
      "media-type": "text/event-stream",
      "accepts": "application/alto-updatestreamparams+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"
        },
        "support-stream-control": true
      }
    },
    "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"
        }
      }
    },
    "tips-sse": {
      "uri": "https://alto.example.com/updates/tips",
      "media-type": "text/event-stream",
      "accepts": "application/alto-updatestreamparams+json",
      "uses": [ "update-my-costs-tips" ],
      "capabilities": {
        "incremental-change-media-types": {
          "update-my-costs-tips": "application/merge-patch+json"
        }
      }
    }
]]></artwork>
        </figure>
        <t>Note that it is straightforward for an ALTO server 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 service, and this is
indicated by the media-type "application/alto-tips+json".</t>
      </section>
    </section>
    <section anchor="tips-management">
      <name>TIPS Management</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 already created a TIPS view for the same requested network resource
or because the server perpetually maintains a TIPS view for an often-requested
resource).</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>
        <figure anchor="fig-open-req">
          <name>TIPSReq</name>
          <artwork align="left"><![CDATA[
    object {
       ResourceID   resource-id;
       [JSONString  tag;]
       [Object      input;]
    } TIPSReq;
]]></artwork>
        </figure>
        <t>with the following fields:</t>
        <dl>
          <dt>resource-id:</dt>
          <dd>
            <t>The resource-id of an ALTO resource and <bcp14>MUST</bcp14> 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 <bcp14>MUST NOT</bcp14> 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 <bcp14>MAY</bcp14> set the "tag" field to the tag part of
the client's version of that resource.  The server <bcp14>MAY</bcp14> use the tag
when calculating a recommended starting edge for the client to
consume.  Note that the client <bcp14>MUST</bcp14> 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 <bcp14>MUST</bcp14> set the "input" field to a JSON object with the
parameters that the resource expects.</t>
          </dd>
        </dl>
      </section>
      <section anchor="open-resp">
        <name>Open Response</name>
        <t>The response to a valid request <bcp14>MUST</bcp14> be a JSON object of type
AddTIPSResponse, denoted as media type "application/alto-tips+json":</t>
        <figure anchor="fig-open-resp">
          <name>AddTIPSResponse</name>
          <artwork align="left"><![CDATA[
    object {
      URI               tips-view-uri;
      TIPSViewSummary   tips-view-summary;
    } AddTIPSResponse;

    object {
      UpdatesGraphSummary   updates-graph-summary;
    } TIPSViewSummary;

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

    object {
      JSONNumber       seq-i;
      JSONNumber       seq-j;
    } StartEdgeRec;
]]></artwork>
        </figure>
        <t>with the following fields:</t>
        <dl>
          <dt>tips-view-uri:</dt>
          <dd>
            <t>URI to the requested TIPS view. The value of this field <bcp14>MUST</bcp14> have the
following format:
</t>
            <artwork><![CDATA[
    scheme "://" tips-view-host "/" tips-view-path

    tips-view-host = host [ ":" port]
    tips-view-path = path
]]></artwork>
            <t>where scheme <bcp14>MUST</bcp14> be "http" or "https" unless specified by a future
extension, and host, port and path are as specified in Sections 3.2.2, 3.2.3,
and 3.3 in <xref target="RFC3986"/>. An ALTO server <bcp14>SHOULD</bcp14> use the "https" scheme unless
the contents of the TIPS view are intended to be publicly accessible and does
not raise security concerns.</t>
            <t>A server <bcp14>MUST NOT</bcp14> use a URI for different TIPS views, either for different
resources or different request bodies to the same resource. URI generation is
implementation specific, for example, one may compute a Universally Unique
Identifier (UUID, <xref target="RFC4122"/>) or a hash value based on the request, and
append it to a base URL. For performance considerations, it is <bcp14>NOT
RECOMMENDED</bcp14> to use properties that are not included in the request body to
determine the URI of a TIPS view, such as cookies or the client's IP address,
which may result in duplicated TIPS views in cases such as mobile clients.
However, this is not mandatory as a server may intentionally use client
information to compute the TIPS view URI to provide service isolation between
clients.</t>
          </dd>
          <dt>tips-view-summary:</dt>
          <dd>
            <t>Contains an updates-graph-summary.
</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). If the client does NOT provide a version tag, the server
<bcp14>MUST</bcp14> recommend the edge of the latest snapshot available.
If the client does provide a version tag, the server <bcp14>MUST</bcp14> either recommend
the first incremental update edge starting from the client's tagged version
or the edge of the latest snapshot. Which edge is selected depends on the
implementation. For example, a server <bcp14>MAY</bcp14> 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 recommends the first incremental update edge starting from the
client's tagged version. Otherwise, the server recommends the latest snapshot
edge.</t>
          </dd>
        </dl>
        <t>If the request has any errors, the TIPS service <bcp14>MUST</bcp14> 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 shown in <xref target="ex-bad-request"/>.</t>
        <figure anchor="ex-bad-request">
          <name>ALTO Error Example</name>
          <artwork align="left"><![CDATA[
    HTTP/1.1 400 Bad Request
    Content-Length: 131
    Content-Type: application/alto-error+json

    {
        "meta":{
            "code":  "E_INVALID_FIELD_VALUE",
            "field": "resource-id",
            "value": "my-network-map/#"
        }
    }
]]></artwork>
        </figure>
        <t>Note that "field" and "value" are optional fields.  If the "value"
field exists, the "field" field <bcp14>MUST</bcp14> exist.</t>
        <ul spacing="normal">
          <li>If the TIPS request does not have a "resource-id" field, the error code of
the error message <bcp14>MUST</bcp14> be <tt>E_MISSING_FIELD</tt> and the "field" field, if
present, <bcp14>MUST</bcp14> be "resource-id". The TIPS service <bcp14>MUST NOT</bcp14> 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 <bcp14>MUST</bcp14> be <tt>E_INVALID_FIELD_VALUE</tt>. If present,
the "field" field <bcp14>MUST</bcp14> be the full path of the "resource-id" field, and the
"value" field <bcp14>MUST</bcp14> be the invalid resource-id.</li>
          <li>If the resource is a POST-mode service that requires input, the client <bcp14>MUST</bcp14>
set the "input" field to a JSON object with the parameters that that resource
expects. If the "input" field is missing or invalid, TIPS <bcp14>MUST</bcp14> return the
same error response that resource would return for missing or invalid input
(see <xref target="RFC7285"/>).</li>
        </ul>
        <t>Furthermore, it is <bcp14>RECOMMENDED</bcp14> that the server uses the following HTTP codes to
indicate other errors, with the media type "application/alto-error+json".</t>
        <ul spacing="normal">
          <li>429 (Too Many Requests): when the number of TIPS views open requests exceeds
the server threshold. The server <bcp14>MAY</bcp14> indicate when to re-try the request in
the "Re-Try After" headers.</li>
        </ul>
        <t>It is <bcp14>RECOMMENDED</bcp14> that the server provide the ALTO/SSE support for the TIPS
resource. Thus, the client can be notified of the version updates of all the
TIPS views that it monitors and make better cross-resource transport decisions
(see <xref target="cross-sched"/> for related considerations).</t>
      </section>
      <section anchor="open-example">
        <name>Open Example</name>
        <section anchor="basic-example">
          <name>Basic 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
request depicted in <xref target="ex-op"/>.</t>
          <figure anchor="ex-op">
            <name>Request Example of Opening a TIPS View</name>
            <artwork align="left"><![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>
          </figure>
          <t>If the operation is successful, the ALTO server returns the
message shown in <xref target="ex-op-rep"/>.</t>
          <figure anchor="ex-op-rep">
            <name>Response Example of Opening a TIPS View</name>
            <artwork align="left"><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 255

    {
      "tips-view-uri": "https://alto.example.com/tips/2718281828",
      "tips-view-summary": {
        "updates-graph-summary": {
          "start-seq": 101,
          "end-seq": 106,
          "start-edge-rec" : {
            "seq-i": 0,
            "seq-j": 105
          }
        }
      }
    }
]]></artwork>
          </figure>
        </section>
        <section anchor="example-using-digest-authentication">
          <name>Example using Digest Authentication</name>
          <t>Below is another example of the same query using Digest authentication, a
mandatory authentication method of ALTO servers as defined in <xref section="8.3.5" sectionFormat="of" target="RFC7285"/>. The content of the response is the same as in <xref target="ex-op-rep"/> and thus
omitted for simplicity.</t>
          <figure anchor="ex-op-digest">
            <name>Open Example with Digest Authentication</name>
            <artwork align="left"><![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"
    }

    HTTP/1.1 401 UNAUTHORIZED
    WWW-Authenticate: Digest
        realm="alto.example.com",
        qop="auth",
        algorithm="MD5",
        nonce="173b5aba4242409ee2ac3a4fd797f9d7",
        opaque="a237ff9ab865379a69d9993162ef55e4"

    POST /tips HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-tips+json, application/alto-error+json
    Authorization: Digest
        username="client1",
        realm="alto.example.com",
        uri="/tips",
        qop=auth,
        algorithm=MD5,
        nonce="173b5aba4242409ee2ac3a4fd797f9d7",
        nc=00000001,
        cnonce="ZTg3MTI3NDFmMDQ0NzI1MDQ3MWE3ZTFjZmM5MTNiM2I=",
        response="8e937ae696c1512e4f990fa21c7f9347",
        opaque="a237ff9ab865379a69d9993162ef55e4"
    Content-Type: application/alto-tipsparams+json
    Content-Length: 41

    {
      "resource-id": "my-routingcost-map"
    }


    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 258

    {....}
]]></artwork>
          </figure>
        </section>
        <section anchor="tips-sse">
          <name>Example using ALTO/SSE</name>
          <t>This section gives an example of receiving incremental updates of the TIPS view
summary using ALTO/SSE <xref target="RFC8895"/>. Consider the <tt>tips-sse</tt> resource, as
announced by the IRD in <xref target="ex-ird"/>, which provides ALTO/SSE for the
<tt>update-my-cost-tips</tt> resource, a client may send the following request to
receive updates of the TIPS view (authentication is omitted for simplicity).</t>
          <figure anchor="ex-tips-sse">
            <name>Example of Monitoring TIPS view with ALTO/SSE</name>
            <artwork align="left"><![CDATA[
    POST /updates/tips HTTP/1.1
    Host: alto.example.com
    Accept: text/event-stream,application/alto-error+json
    Content-Type: application/alto-updatestreamparams+json
    Content-Length: 76

    {
      "add": {
        "tips-123": { "resource-id": "update-my-cost-tips" }
      }
    }
]]></artwork>
          </figure>
          <t>Then, the client will be able to receive the TIPS view summary as follows.</t>
          <artwork><![CDATA[
    HTTP/1.1 200 OK
    Connection: keep-alive
    Content-Type: text/event-stream

    event: application/alto-tips+json,tips-123
    data: {
    data:   "tips-view-uri": "https://alto.example.com/tips/2718281828",
    data:   "tips-view-summary": {
    data:     "updates-graph-summary": {
    data:       "start-seq": 101,
    data:       "end-seq": 106,
    data:       "start-edge-rec" : {
    data:         "seq-i": 0,
    data:         "seq-j": 105
    data:       }
    data:     }
    data:   }
    data: }
]]></artwork>
          <t>When there is an update to the TIPS view, for example, the <tt>end-seq</tt> is
increased by 1, the client will be able to receive the incremental update of the
TIPS view summary as follows.</t>
          <artwork><![CDATA[
    event: application/merge-patch+json,tips-123
    data: {
    data:   "tips-view-summary": {
    data:     "updates-graph-summary": {
    data:       "end-seq": 107
    data:     }
    data:   }
    data: }
]]></artwork>
        </section>
      </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 <bcp14>MUST</bcp14> be the same as the "media-type" field of
the update item on the specified edge in the updates graph.</t>
        <t>The GET request <bcp14>MUST</bcp14> have the following format:</t>
        <artwork><![CDATA[
    GET /<tips-view-path>/ug/<i>/<j>
    HOST: <tips-view-host>
]]></artwork>
        <t>For example, consider the updates graph in <xref target="fig-ug-schema"/>. 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 sends a request to
"/tips/2718281828/ug/0/101" and sets the "Accept" header to
"application/alto-costmap+json,application/alto-error+json". See <xref target="iu-example"/>
for a concrete example.</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>A client <bcp14>MAY</bcp14> conduct proactive fetching of future updates, by long polling
updates that have not been provided in the directory yet. For such updates, the
client <bcp14>MUST</bcp14> indicate all media types that may appear. It is <bcp14>RECOMMENDED</bcp14> that the
server allows for at least the long polling of <tt>&lt;end-seq&gt; -&gt; &lt;end-seq + 1&gt;</tt>.</t>
        <t>Hence, the server processing logic <bcp14>MUST</bcp14> 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 long polling <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> is acceptable: put request in a
backlog queue, then either a response is triggered when the content is ready
or the request is interrupted, e.g., by a network error.</li>
          <li>Else: return error.</li>
        </ul>
        <t>It is <bcp14>RECOMMENDED</bcp14> 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 update does not exist, or the requested
TIPS view does not exist or is closed by the server.</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 long-polling window</li>
          <li>429 (Too Many Requests): when the number of pending (long-poll)
requests exceeds the server threshold. The server <bcp14>MAY</bcp14> indicate when to re-try
the request in the "Re-Try After" headers.</li>
        </ul>
      </section>
      <section anchor="iu-example">
        <name>Example</name>
        <t>Assume the client wants to get the contents of the update item on
edge 0 to 101.  The format of the request is shown in <xref target="ex-get"/>.</t>
        <figure anchor="ex-get">
          <name>GET Example</name>
          <artwork align="left"><![CDATA[
    GET /tips/2718281828/ug/0/101 HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-costmap+json, \
              application/alto-error+json
]]></artwork>
        </figure>
        <t>The response is shown in <xref target="ex-get-res"/>.</t>
        <figure anchor="ex-get-res">
          <name>Response to a GET Request</name>
          <artwork align="left"><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/alto-costmap+json
    Content-Length: 50

    { ... full replacement of my-routingcost-map ... }
]]></artwork>
        </figure>
      </section>
      <section anchor="new-next-edge-recommendation">
        <name>New Next Edge Recommendation</name>
        <t>While intended TIPS usage is for the client to receive 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 request the next logical
incremental URI but the server has compacted the updates graph so it
no longer exists.  Thus, the client <bcp14>MAY</bcp14> 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 URL of the request <bcp14>MUST</bcp14> have the format of</t>
          <artwork><![CDATA[
    <tips-view-path>/ug
]]></artwork>
          <t>and the <tt>HOST</tt> field <bcp14>MUST</bcp14> be the <tt>&lt;tips-view-host&gt;</tt>.</t>
          <t>The POST body has the same format as the TIPSReq <xref target="fig-open-req"/>. The
<tt>resource-id</tt> <bcp14>MUST</bcp14> be the same as the resource ID used to create the TIPS view,
and the optional <tt>input</tt> field <bcp14>MUST NOT</bcp14> be present.</t>
        </section>
        <section anchor="response-1">
          <name>Response</name>
          <t>The response to a valid request <bcp14>MUST</bcp14> be a JSON merge patch to the object of type
AddTIPSResponse (defined in <xref target="open-resp"/>), denoted as media type
"application/merge-patch+json". The "update-graph-summary" field <bcp14>MUST</bcp14> be present
in the response and hence its parent field "tips-view-summary" <bcp14>MUST</bcp14> be present
as well.</t>
          <t>If the <tt>tag</tt> field is present in the request, the server <bcp14>MUST</bcp14> check if any
version within the range [start-seq, end-seq] has the same tag value. If the
version exists, e.g., denoted as tag-seq, the server <bcp14>MUST</bcp14> compute the paths from
both tag-seq and 0 to the end-seq, and choose the one with the minimal cost. The
cost <bcp14>MAY</bcp14> be implementation specific, e.g., number of messages, accumulated data
size, etc. The first edge of the selected path <bcp14>MUST</bcp14> be returned as the
recommended next edge.</t>
          <t>If the <tt>tag</tt> field is NOT present, it <bcp14>MUST</bcp14> be interpreted as the tag-seq is 0.</t>
          <t>It is <bcp14>RECOMMENDED</bcp14> that the server uses the following HTTP codes to
indicate errors, with the media type "application/alto-error+json",
regarding new next edge requests.</t>
          <ul spacing="normal">
            <li>404 (Not Found): if the requested TIPS view does not exist or is
closed by the server.</li>
          </ul>
        </section>
        <section anchor="example">
          <name>Example</name>
          <t>We give an example of the new next edge recommendation service. Assume that a
client already creates a TIPS view as in <xref target="open-example"/>, whose updates graph
is as shown in <xref target="fig-ug"/>. Now assume that the client already has tag 0881080
whose corresponding sequence number is 103, and sends the following new next
edge recommendation request (authentication is omitted for simplicity):</t>
          <artwork><![CDATA[
    POST /tips/2718281828/ug HTTP/1.1
    HOST alto.example.com
    Accept: application/merge-patch+json, application/alto-error+json
    Content-Type: application/alto-tipsparams+json
    Content-Length: 62

    {
      "resource-id": "my-routingcost-map",
      "tag": "0881080"
    }
]]></artwork>
          <t>According to <xref target="fig-ug"/>, there are 3 potential paths: 103 -&gt; 104 -&gt; 105 -&gt; 106,
103 -&gt; 105 -&gt; 106, and 0 -&gt; 105 -&gt; 106. Assume that the server chooses shortest
update path by the accumulated data size and the best path is 103 -&gt; 105 -&gt; 106.
Thus, the server responds with the following message:</t>
          <artwork><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/merge-patch+json
    Content-Length: 193

    {
      "tips-view-summary": {
        "updates-graph-summary": {
          "start-seq": 101,
          "end-seq": 106,
          "start-edge-rec": {
            "seq-i": 103,
            "seq-j": 105
          }
        }
      }
    }
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="ops-considerations">
      <name>Operation and Processing Considerations</name>
      <t>TIPS has some common operational considerations as ALTO/SSE <xref target="RFC8895"/>,
including:</t>
      <ul spacing="normal">
        <li>server choosing update messages (<xref section="9.1" sectionFormat="of" target="RFC8895"/>);</li>
        <li>client processing update messages (<xref section="9.2" sectionFormat="of" target="RFC8895"/>);</li>
        <li>updates of filtered map services (<xref section="9.3" sectionFormat="of" target="RFC8895"/>);</li>
        <li>updates of ordinal mode costs (<xref section="9.4" sectionFormat="of" target="RFC8895"/>).</li>
      </ul>
      <t>There are also some operation considerations specific to TIPS, which we discuss
below.</t>
      <section anchor="load-balancing">
        <name>Considerations for Load Balancing</name>
        <t>There are two levels of load balancing in TIPS. The first level is to balance
the load of TIPS views for different clients, and the second is to balance the
load of incremental updates.</t>
        <t>Load balancing of TIPS views can be achieved either at the application layer or
at the infrastructure layer. For example, an ALTO server <bcp14>MAY</bcp14> set
<tt>&lt;tips-view-host&gt;</tt> to different subdomains to distribute TIPS views, or simply
use the same host of the TIPS service and rely on load balancers to distribute
the load.</t>
        <t>TIPS allows a client to make concurrent pulls of incremental updates for the
same TIPS view potentially through different HTTP connections. As a consequence,
it introduces additional complexities when the ALTO server is being load
balanced. For example, a request may be directed to a wrong backend server and
get 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 <bcp14>MAY</bcp14> configure layer-7 load balancers that
distribute requests based on the tips-view-path component in the URI.</li>
        </ul>
      </section>
      <section anchor="cross-sched">
        <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>Thus, the client must decide the order in which to receive and apply the
updates. The 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 client requests N89, N90, N91, C101, C102 in that
order.  The client either gets no consistent view of the resources
or has to buffer N90 and N91.</li>
          <li>Example 2: The client requests C101, C102, C103, N89.  The client
either gets no consistent view or has to buffer C103.</li>
        </ul>
        <t>To get consistent ALTO information, a client must process the updates following
the guidelines specified in <xref section="9.2" sectionFormat="of" target="RFC8895"/>. If resource permits
(i.e., sufficient updates can be buffered), an ALTO client can safely use long
polling to fetch all the updates. This allows a client to build consistent views
quickly as the updates are already stored in the buffer. Otherwise, it is
<bcp14>RECOMMENDED</bcp14> to request</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.</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 have sent a polling
request to the TIPS view, and only removes the view from the storage when
the set becomes empty and no client immediately issues a new edge request;</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 <bcp14>MAY</bcp14> 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"/>.  The following sub-sections 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 new classes of Denial-of-Service attacks. In
particular, for the TIPS server, one or multiple malicious ALTO clients might
create an excessive number of TIPS views, to exhaust the server resource and/or
to block normal users from the accessing the service.</t>
        <t>To avoid such attacks, the server <bcp14>MAY</bcp14> choose to limit the number of active
views and reject new requests when that threshold is reached. TIPS allows
predictive fetching and the server <bcp14>MAY</bcp14> also choose to limit the number of
pending requests. If a new request exceeds the threshold, the server <bcp14>MAY</bcp14> log
the event and 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 TIPS view eviction policies, IP reputation,
rate-limiting, and compartmentalization of the overall threshold into smaller
thresholds that apply to subsets of potential clients. If service availability
is a concern, ALTO clients <bcp14>MAY</bcp14> establish service level agreements with the ALTO
server.</t>
      </section>
      <section anchor="alto-client-update-overloading-or-instability">
        <name>ALTO Client: Update Overloading or Instability</name>
        <t>The availability of continuous updates 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. For example, TCP, HTTP/2 and QUIC
provide stream and connection flow control data limits, which might help prevent
the client from being overloaded. Under overloading, the client <bcp14>MAY</bcp14> 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>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following media types from the registry available at <xref target="IANA-Media-Type"/>:</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>
      <ul empty="true">
        <li>
          <t>Note to the RFC Editor: Please replace This-Document with the RFC number to be assigned to this document.</t>
        </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>See the Security Considerations section of This-Document.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies the 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>
          <dt>Provisional registration?:</dt>
          <dd>
            <t>No</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>See the Security Considerations section of This-Document.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies the 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>
          <dt>Provisional registration?:</dt>
          <dd>
            <t>No</t>
          </dd>
        </dl>
      </section>
    </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"/>
            <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"/>
            <author fullname="R. Penno" initials="R." role="editor" surname="Penno"/>
            <author fullname="Y. Yang" initials="Y." role="editor" surname="Yang"/>
            <author fullname="S. Kiesel" initials="S." surname="Kiesel"/>
            <author fullname="S. Previdi" initials="S." surname="Previdi"/>
            <author fullname="W. Roome" initials="W." surname="Roome"/>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
            <author fullname="R. Woundy" initials="R." surname="Woundy"/>
            <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"/>
            <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"/>
            <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"/>
            <author fullname="Y. Yang" initials="Y." surname="Yang"/>
            <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"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <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"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <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"/>
            <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>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="R. Salz" initials="R." surname="Salz"/>
            <date month="July" year="2005"/>
            <abstract>
              <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group). Information from earlier versions of the DCE specification have been incorporated into this document. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4122"/>
          <seriesInfo name="DOI" value="10.17487/RFC4122"/>
        </reference>
        <reference anchor="RFC9205">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <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>
        <reference anchor="IANA-Media-Type" target="https://www.iana.org/assignments/media-types/media-types.xhtml">
          <front>
            <title>Media Types</title>
            <author>
              <organization/>
            </author>
            <date year="2023" month="June"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="sec-dep-model">
      <name>A High-Level Deployment Model</name>
      <t>Conceptually, the TIPS system consists of three types of resources:</t>
      <ul spacing="normal">
        <li>(R1) TIPS frontend to create 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>Sample TIPS Deployment 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 the three resource types at the same, single server (accessed via
relative reference)</li>
        <li>Design 2 (Flexible): all three resource 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 supports Design 1 and Design 3. For Design 1, the TIPS service
simply needs to always use the same host for the TIPS views. For Design 3, the
TIPS service can set tips-view-host to a different server. Note that the
deployment flexibility is at the logical level, as these services
can be distinguished by different paths and potentially be routed to different
physical servers by layer-7 load balancing. See <xref target="load-balancing"/> for a
discussion on load balancing considerations. Future documents may extend the
protocol to support Design 2.</t>
    </section>
    <section anchor="sec-bcp-http">
      <name>Conformance to "Building Protocols with HTTP" Best Current Practices</name>
      <t>This specification adheres fully to <xref target="RFC9205"/> as further elaborated below:</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" (<xref section="3.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>There are no statically defined URI components (<xref section="3.2" sectionFormat="of" target="RFC9205"/>).</li>
        <li>No minimum version of HTTP is specified by TIPS which is
recommended (<xref section="4.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>The TIPS design 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" (<xref section="4.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS uses URI templates which is recommended (<xref section="4.2" sectionFormat="of" 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 allows the application to tailor the "discovery document" to the client"
(<xref section="4.4.1" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS uses existing HTTP schemes (<xref section="4.4.2" sectionFormat="of" target="RFC9205"/>).</li>
        <li>TIPS defines its errors "to use the most applicable status code"
(<xref section="4.6" sectionFormat="of" 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" (<xref section="4.11" sectionFormat="of" target="RFC9205"/>).  The only relationship
between requests is that a client must first discover where a TIPS view of
a resource will be served, which is consistent with the URI discovery in
<xref section="4.4.1" sectionFormat="of" target="RFC9205"/>.</li>
      </ul>
    </section>
    <section anchor="push">
      <name>Push-mode TIPS using HTTP Server Push</name>
      <t>TIPS allows ALTO clients to subscribe to incremental updates of an ALTO
resource, and the specification in this document is based on the current best
practice of building such a service using native HTTP. Earlier versions of this
document had investigated the possibility of enabling push-mode TIPS, i.e., by
taking advantage of the server push feature in HTTP/2 and HTTP/3.</t>
      <t>In the ideal case, push-mode TIPS can potentially improve performance (e.g.,
latency) in more dynamic environments and use cases, with wait-free message
delivery. Using native server push also results in minimal changes to the
current protocol. While not adopted due to the lack of server push support and
increased protocol complexity, push-mode TIPS remains a potential direction of
protocol improvement.</t>
    </section>
    <section anchor="persistent-http-connections">
      <name>Persistent HTTP Connections</name>
      <t>Previous versions of this document use persistent HTTP connections to detect the
liveness of clients. This design, however, does not conform well with the best
current practice of HTTP. For example, if an ALTO client is accessing a TIPS
view over an HTTP proxy, the connection is not established directly between the
ALTO client and the ALTO server, but between the ALTO client and the proxy and
between the proxy and the ALTO server. Thus, using persistent connections may
not correctly detect the right liveness state.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors of this document would 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, Russ
White, Donald Eastlake, Martin Thomson, Bernard Adoba, Spencer Dawkins, Linda
Dunbar and Sheng Jiang for the directorate reviews, Martin Duke for the Area
Director review, and Mohamed Boucadair for shepherding the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19a3fbRrLgd/wKLP0h0pqkRMpPZewdxbIzutevK8mTk5nk
xCAJiYhJgAFAybyy96/s/pbdP7b17K4GQUl2Zu7MOTvMiUXi0Y/q6up6V6/X
iybFOE/m6X48KZOzupel9VkvmdVFL08ve3WZ5NWiKOveLKnTqo7qrJ7Bs53T
aRofvDx9E5/qE/FRflaU86TOijx+uxzNsjF/P0nLi2ycdqJkNCrTC3iZXzx6
e9KJ4Jn0vChX+3FVT6IJ/NqPrw4PTp9/jqJsUe7Hdbms6uHu7uPdYZSUabJv
ejyA39FlUX44L4vlYp8GFEVVneSTX5JZkUNbq7SKFtl+FEP7ZTau+Uocj4v5
PM3rSn9n+SzT5+M4nWR1lp/vx3kBv+pirDfgazFfJL4duDBJF/V0P97DVhZl
XtTZWZZO5N0KxlmmZ66fajW3PxutVcuRuwKvR8mynhYljr4H/+Mo4c1/78ff
JwX95oX79yRzV2CWaQpvd14X/eG9+KSAFmAFxrQSg278YzZdJnl8XCSTDr0w
zmoA/rNpmp9PlnylmECjDwa78JELy7wu6aksT+hSUQJwTrIxNfYuzy7SsoKG
6F46T7LZfvwhyc6T4o/VeNlPJ8v+OI/CaRz345PxtKhrM5PjYgZrZ6/rfI4m
Se94CiOreieAlP/3f6Xx0Iz/MCnnsO6T2s7g3vDx/XAC36eAoPnKT+EwXdbV
GHD5NJ2lH4q5nQAPps+D+WPND/QnaWMeP/ZxKj8m+bmZCP6MjwE+STnx93Qy
9wfx27KoFrAs8QldM1N5nV7Gf0ou0txM5dlpOI93Jwd+Dj8ms3TDGqzK1R/H
VX8FT+AiNEb+sg/zn13CKFMz9JfJskzz8M5XD3z3wf3h7teNfUbjAHjzOP64
eRL/ns5maRlMYTyFtbM3/jEzoGH0P9AwzARyppMXKe7s4xfPhoPBY/n6cPjo
vnx9NLyvVx8NHt7Tr48e6wOPB4Oh/7rnv+qze48fPdgHOqqE2XV4bzB0bw53
qb2jg9cHvVdA+JLe6WpBDwJ1Y2pPl2O8XPHlpDxHYE7relHt7+xcXl72syRP
+gCRnaSqsvOciOvOnNqr8UX7vf9xWs9n1BRT/OHucK+3+yCKer1enIxgsYAE
RpE7ZGDJkPLO4i0YcYww2o5nKYA8OU+r+E+np293Bv1BjLQjq2IgEjCCdBLD
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
GjM2S2CAUjJHNqyRfDJfbj6RXEbLA+NjmKgeJMwMEmbuUB8WIkpOG9UVhVBY
QiSshhL7aihYWO9yzb+x0fuU91y8++jRYPfRbsQ9BMUT10KxoEcqYMrKOBfT
4tBBgRK1AUXJ9+1tlPtt3jmhONIQRN5QLehbyiFrZoQbXTL+Bv4AD4Zf7A/g
neKSc3xEVsz4IgI7NYaV4+SiRdyoi4NBwPD/XrwoKAgxYY/6at/XYLmnpVjo
zwMq9Nu4JDQ2uBgiuCEVTHUrrvaC/J4IqkTpZMc1CSbHXikDMUJUoccZ6Rod
R55pdd6QhLZV3BJ3LlR6/0bT6IbVbWJK68oOHu9t9IP8BzsxbvRhxN38u70Y
0aD1xjmt4gK+9frTZ4GzNmWrqHqhB7cauZAiVcWcAu/mRe4dYemYDppJqlav
jm7EeiromFS1FhuNGlAPbcxto46Hjznxrmtq+1t4X0imUQdf28JwvQXjqaH5
5SgLtJwQjQb2rm2ANjhm1sGoFErFFb59L3ybhQTZ/JSimoDr3YsbMHV1b4GC
cMQPS8mXqOWvxsuqikboLyr1QsKXkXK/xDKn3yWzJB8jqK7uYN3T3kgvfLbj
qS8LrkhNM6MCqe5BPMw0y7TyTfQs6bQLeTCNWNWf+HIkHIMQRvpLLLTP0MP1
vcOmiNHSptpLsr0Mhxh2KTETyXjK2X1UG8800VCSeJaskHEsI7mX5WdlwjoO
1G3Q7WZcbKPWDCcAitalQpyQqRSwHE2KOcdn4/VKc+Db3Ad63q4il2MM2XdK
bWGdi8Jay7MVSv1m0Sh2yXbi1qbfMGDb+s8YFmLy3KG9u9pU/UqdqWh4nl1y
Jxqm7J7CwXk+NSAQ7lQdXio8rtiop4wNEAwUiuqymCypvK2vk8zRvx85iZBT
LjeCREYp24iSSSSQmKxFNSvfwzoosZilEhF2WaIlCC06KfFUbNfKJ9E5p8d3
lcOFBqHQetY43XAvIU5nvBVJMEIVNlur6DAN2ucCGXBE1CnFFXBBi0CQJ2sF
J65DOk/8Xl2UpO7h1cfjOj+f6fH7reurNYyG8Lp3r7HRTdeBXp6K/zhcmoS5
K06fvY3v9+olW2MlD71dtvCgKFON2ZtwpRNyUhG42pUTU72QvvAcwZISOGME
GSVlSUrY6nVKm3Y/fgOCZVXMlsrOYnVHWh1nB3EvsjCLfQE3AcdBvs83oclR
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

-->

</rfc>
