<?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-20" 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-20"/>
    <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 only maintain and transfer the "diff" upon changes. Thus,
it is more efficient than storing and transferring the full 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. Encoding of a updates graph is specified in <xref target="open-req"/>.</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". Version is encoded as a JSONNumber, as specified in <xref target="open-req"/>.</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, which is identified by a
sequence number (defined as a JSONNumber). Version 0 is reserved as the
initial state (empty/null).</li>
          <li>A tag identifies the content of a node. A tag has the same format as the
"tag" field in <xref section="10.3" sectionFormat="of" target="RFC7285"/> and is valid only within the
scope of resource.</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. The field <bcp14>MUST</bcp14> contain only ASCII characters. In
case the original URL contains international characters (e.g., in the domain
name), the ALTO server implementation <bcp14>MUST</bcp14> properly encode the URL into the
ASCII format (e.g., using the "urlencode" function).</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, Francesca Palombini, Wesley Eddy, Roman Danyliw and
Zaheduzzaman Sarker for the telechat and IESG reviews, and Mohamed Boucadair for
shepherding the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
08q57oa1BiI5QCqL14Ut+z5WjQDxhCdHr48a/CBdTK1EzobSIpmmJIWFBjk/
1NdiEz9beEn80VB6fY0N9yhukZzxPn8Geem/t0SF2aQjh5xQzmNmAr/+bze/
7vlr3tDIX6mNp1LFi1l3YI3M8wmmdjk0b+ckr0kUF6lWe8f5eLWwm1nfkAOO
K78A+wKbNplYBngi74jiYfOEvahOIE/oV43JwLC6g/dOFJ2tRlVwM8wPFZ2q
a4RLQoyPvd45iiIrfrXcey5RzTVeGe9vuMWFbybs9zvnCeNWdDpzp2drlNDt
+KHuEq2P6vTh/gFF6521CyU4nLOEN/kGocZmnULOzV81PPXRckY2edkdzdbP
/UWzcwlyyvNRgT88T1TLFDvHfF4xw5rk/AL6f7uiAw4rzYlrHqeCg34D7G4b
+5GDoBzHrAZN/bAWbCnMyqi1XfWkFTsLEAhSuQqbjEuZABpPJpIlHAsO4YNR
gLJIOV6AiE+wSV25miYYCaeOnNzgUSkqWPK7UfGUlJDHCXJaXFd0nmJIHVaE
F9RBzxuaFTwobcK3VzEySLzttsrt2t0XKCtbScndDxfWkk8vjoFI3QVvZSvU
1pZ3VYpN1x7LVg+C7qBez30Z6xhZKqD+dJf6weiK2rjfwlqJfixZAOHUMjdS
4gQEAU73fMGJuOvgxC3ByQXLb7CWHL6a2J0giE/xJiv2mj40aLB58xrpBTqS
iNCH2aD1AV5BavROXTyjGsnKAQD7iG/RhsuSCmjINM0SVrCex+UHZDeArG7h
ZKv8EHbY9PdpUl3082KKSqe3yGuUInPymUKz/R80tJyI6W3U/7dSVN/x/1+U
rv6bsN6dsP71/wO6qmT1rlT130T130TVI6q9Xo+cLVE+ODJ/AFGp95JkcMCn
eb6mRSbnIjTUJ+PeJFlSRQ3MavYMBfslF/P2aw2tS0xlIc4HYsQrkkQEB9+h
j6zVW6eDbX4TZIqMtZw2NNlp4vr87HDbDwvUzEWNDJ5Yb4dEUqk9SBiJ3uKY
KkW9dAFz6mXLSY6Vrva2SV0KSANTbH+yq+mfjATuU60pIhPyfOQXIZTBqBtA
13j+Adtcm6MtbuEO3oPofPZFn02eap82ObBt+nyKtPP74fXTwaF5ISu6Qwln
zekQcyDLmu28gjWCa3uHnEUPGvqkY+ik06TqcBHDT94E/S7qV+xvvyG7WgOd
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
YJwnbJUl8AwTdUx3rmv/D/7JuRHaIwEA

-->

</rfc>
