<?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-21" 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-21"/>
    <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>N/A.</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>N/A.</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, Murray
Kucherawy and Zaheduzzaman Sarker for the telechat and IESG reviews, and Mohamed
Boucadair for shepherding the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1963rb1rXgfzzFHvpHpGOSEinLtpTaU8WyU536diS5+dIm
XwySEImYBFgAlMzKnleZeZaZF5t13RcAlGSnPe03c5gvFonLvqy99trrvnq9
XjTJx1m8SA7NpIgvql6aVBe9eF7lvSy56lVFnJXLvKh687hKyiqq0moOz3bO
Z4k5enn+xpzrE+Yku8iLRVyleWberkbzdMzfz5LiMh0nnSgejYrkEl7mF0/e
nnUieCaZ5sX60JTVJJrAr0NzfXx0/vxzFKXL4tBUxaqshru7B7vDKC6S+NDr
8Qh+R1d58WFa5KvlIQ0oisoqzia/xPM8g7bWSRkt08PIQPtFOq74ijHjfLFI
sqrU32k2T/V5Y5JJWqXZ9NBkOfyq8rHegK/5Yhm7duDCJFlWs0Ozh60siyyv
0os0mci7JYyzSC5sP+V64f+stVauRvYKvB7Fq2qWFzj6HvyPo4Q3/9g338c5
/eaF+2Oc2iswyySBtzuv8/7wgTnLoQVYgTGtxKBrfkxnqzgzp3k86dAL47QC
4D+bJdl0suIr+QQafTjYhY9cWGVVQU+lWUyX8gKAc5aOqbF3WXqZFCU0RPeS
RZzOD82HOJ3G+e/L8aqfTFb9cRaF0zjtm7PxLK8qbyan+RzWzr+u8zmZxL3T
GYys7J0BUv6f/5mYoTf+47hYwLpPKn8GD4YH++EEvk8AQbO1m8JxsqrKMeDy
eTJPPuQLfwI8mD4P5vcVP9CfJLV5/NjHqfwYZ1NvIvjTnAJ84mLi7ulk9gfm
bZGXS1gWc0bXvKm8Tq7MH+LLJPOm8uw8nMe7syM3hx/jebJhDdbF+vfjsr+G
J3ARaiN/2Yf5z69glIk39Jfxqkiy8M5XD3z34f5w9+vGPqdxALx5HL/fPIk/
JvN5UgRTGM9g7fwb/5wZ0DD6H2gY3gQyppOXCe7s0xfPhoPBgXx9NHy8L18f
D/f16uPBowf69fGBPnAwGAzd1z33VZ/dO3j88BDoqBJm2+GDwdC+Odyl9k6O
Xh/1XgHhi3vn6yU9CNSNqT1dNni55MtxMUVgzqpqWR7u7FxdXfXTOIv7AJGd
uCzTaUbEdWdB7VX4ov+9/3FWLebUFFP84e5wr7f7MIp6vZ6JR7BYQAKjyB4y
sGRIeedmC0ZsEEbbZp4AyONpUpo/nJ+/3Rn0BwZpR1oaIBIwgmRiYNqmgjbK
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
An0sx2Y+IwEA

-->

</rfc>
