<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.24 (Ruby 3.0.5) -->
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc editing="no"?>
<?rfc tocompact="yes"?>
<?rfc iprnotified="no"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-alto-new-transport-16" 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-16"/>
    <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, two transport
protocols have been designed:</t>
      <ol spacing="normal" type="1"><li>The ALTO base protocol <xref target="RFC7285"/>, which is designed for the simple use case
in which an ALTO client requests a network information resource, and the
server sends the complete content of the requested information (if any)
resource to the client.</li>
        <li>ALTO incremental updates using Server-Sent Events (ALTO/SSE) <xref target="RFC8895"/>,
which is designed for an ALTO client to indicate to the server that it wants
to receive updates for a set of resources and the server can then
concurrently and incrementally push updates to that client whenever
monitored resources change.</li>
      </ol>
      <t>Both protocols are designed for HTTP/1.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 it transmits 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>Despite the benefits, however, ALTO/SSE <xref target="RFC8895"/>, which solves a similar
problem, has its advantages. First, SSE is a mature technique with a
well-established ecosystem that can simplify development. Second, SSE does not
allow multiple connections to receive updates for multiple objects over
HTTP/1.1.</t>
      <t>HTTP/2 <xref target="RFC9113"/> and HTTP/3 <xref target="RFC9114"/> also specify server push, which might
enhance TIPS. We discuss push-mode TIPS as an alternative design 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><xref target="sec-bcp-http"/> discusses to what extent the TIPS design adheres to the Best
Current Practices for building protocols with HTTP <xref target="RFC9205"/>.</t>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
      <section anchor="notations">
        <name>Notations</name>
        <t>This document uses the same syntax and notations as introduced in
<xref section="8.2" sectionFormat="of" target="RFC7285"/> to specify the extensions to existing ALTO resources and services.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>TIPS Overview</name>
      <section anchor="requirements">
        <name>Transport Requirements</name>
        <t>The ALTO Protocol and its extensions support two transport mechanisms:
First, a client can directly request an ALTO resource and obtain a complete
snapshot of that ALTO resource, as specified in the base protocol <xref target="RFC7285"/>;
Second, a client can subscribe to incremental changes of one or multiple ALTO
resources using the incremental update extension <xref target="RFC8895"/>, and a server pushes
the updates to the client through Server Sent Events (SSE).</t>
        <t>However, the current transport mechanisms are not optimized for storing,
transmitting, and processing (incremental) updates of ALTO information
resources. Specifically, the new transport mechanism must satisfy the following
requirements:</t>
        <dl>
          <dt>Incremental updates:</dt>
          <dd>
            <t>Incremental updates can reduce both the data storage on an ALTO server and the
transmission time of the updates, especially when the change of an ALTO
resource is minor. The base protocol does not support incremental updates and
the current incremental update mechanism in <xref target="RFC8895"/> has limitations (as
discussed below).</t>
          </dd>
          <dt>Concurrent, non-blocking update transmission:</dt>
          <dd>
            <t>When a client needs to receive and apply multiple incremental updates, it is
desired to transmit the updates concurrently to fully utilize the bandwidth
and to reduce head-of-line blocking. The ALTO incremental update extension
<xref target="RFC8895"/>, unfortunately, does not satisfy this requirement -- even though
the updates can be multiplexed by the server to avoid head-of-line blocking
between multiple resources, the updates are delivered sequentially and can
suffer from head-of-line blocking inside the connection, for example, when
there is a packet loss.</t>
          </dd>
          <dt>Prefetching updates:</dt>
          <dd>
            <t>Prefetching updates can reduce the time to send the request, making it
possible to achieve sub-RTT transmission of ALTO incremental updates. In
<xref target="RFC8895"/>, this requirement is fulfilled using server-sent event (SSE) and
is still desired in the ALTO new transport.</t>
          </dd>
          <dt>Backward compatibility:</dt>
          <dd>
            <t>While some of the previous requirements are offered by HTTP/2 <xref target="RFC9113"/> and
HTTP/3 <xref target="RFC9114"/>, it is desired that the ALTO new transport mechanism can
work with HTTP/1.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 and hence improves the efficiency of continuous dissemination of
ALTO information. The key idea is to introduce a unified data model to describe
the changes (snapshots and incremental updates) of an ALTO resource, referred to
as a TIPS view. Along with the data model, this document also specifies a
unified naming for the snapshots and incremental updates, independent of the
HTTP version. Thus, these updates can be concurrently requested. Prefetching is
realized using long polling.</t>
        <t>This document assumes the deployment model discussed in  <xref target="sec-dep-model"/>.</t>
      </section>
      <section anchor="terminology">
        <name>TIPS Terminology</name>
        <t>In addition to the terms defined in <xref target="RFC7285"/>, this document uses the following terms:</t>
        <dl>
          <dt>Transport Information Publication Service (TIPS):</dt>
          <dd>
            <t>Is a new type of ALTO service, as specified in this document, to enable a
uniform transport mechanism for updates of an incrementally changing ALTO
network information resource.</t>
          </dd>
          <dt>Network information resource:</dt>
          <dd>
            <t>Is a piece of retrievable information about network state, per <xref target="RFC7285"/>.</t>
          </dd>
          <dt>TIPS view (tv):</dt>
          <dd>
            <t>Is defined in this document to be the container of incremental transport
information about the network information resource. The TIPS view has one
basic component, updates graph (ug), but may include other transport
information.</t>
          </dd>
          <dt>Updates graph (ug):</dt>
          <dd>
            <t>Is a directed, acyclic graph whose nodes represent the set of versions of an
information resource, and edges the set of update items to compute these
versions. An ALTO map service (e.g., Cost Map, Network Map) may need only a
single updates graph. A dynamic network information service (e.g., Filtered
Cost Map) may create an updates graph (within a new TIPS view) for each unique
request.</t>
          </dd>
          <dt>Version:</dt>
          <dd>
            <t>Represents a historical content of an information resource. For an information
resource, each version is associated with and uniquely identified by a
monotonically and consecutively increased sequence number. This document uses the term
"version s" to refer to the version associated with sequence number "s".</t>
          </dd>
          <dt>Start sequence number (start-seq):</dt>
          <dd>
            <t>Is the smallest non-zero sequence number in an updates graph.</t>
          </dd>
          <dt>End sequence number (end-seq):</dt>
          <dd>
            <t>Is the largest sequence number in an updates graph.</t>
          </dd>
          <dt>Snapshot:</dt>
          <dd>
            <t>Is a full replacement of a resource and is contained within an updates graph.</t>
          </dd>
          <dt>Incremental update:</dt>
          <dd>
            <t>Is a partial replacement of a resource contained within an updates graph,
codified in this document as a JSON Merge Patch or JSON Patch. An incremental
update is mandatory if the source version (i) and target version (j) are
consecutive, i.e., i + 1 = j, and optional or a shortcut otherwise. Mandatory
incremental updates are always in an updates graph, while optional/shortcut
incremental updates may or may not be included in an updates graph.</t>
          </dd>
          <dt>Update item:</dt>
          <dd>
            <t>Refers to the content on an edge of the updates graph, which can be either a
snapshot or an incremental update. An update item can be considered as a pair
(op, data) where op denotes whether the item is an incremental update or a
snapshot, and data is the content of the item.</t>
          </dd>
          <dt>ID#i-#j:</dt>
          <dd>
            <t>Denotes the update item on a specific edge in the updates graph to transition
from version i to version j, where i and j are the sequence numbers of the
source node and the target node of the edge, respectively.</t>
          </dd>
        </dl>
        <figure anchor="fig-overview">
          <name>Overview of ALTO TIPS</name>
          <artwork type="drawing" align="center"><![CDATA[
                                   +-------------+
    +-----------+ +--------------+ |  Dynamic    | +-----------+
    |  Routing  | | Provisioning | |  Network    | | External  |
    | Protocols | |    Policy    | | Information | | Interface |
    +-----------+ +--------------+ +-------------+ +-----------+
          |              |                |              |
+-----------------------------------------------------------------+
| ALTO Server                                                     |
| +-------------------------------------------------------------+ |
| |                                         Network Information | |
| | +-------------+                         +-------------+     | |
| | | Information |                         | Information |     | |
| | | Resource #1 |                         | Resource #2 |     | |
| | +-------------+                         +-------------+     | |
| +-----|--------------------------------------/-------\--------+ |
|       |                                     /         \         |
| +-----|------------------------------------/-----------\------+ |
| |     |       Transport Information       /             \     | |
| | +--------+                     +--------+        +--------+ | |
| | |  tv1   |                     |  tv2   |        |  tv3   | | |
| | +--------+                     +--------+        +--------+ | |
| |     |                          /                     |      | |
| | +--------+            +--------+                 +--------+ | |
| | | tv1/ug |            | tv2/ug |                 | tv3/ug | | |
| | +--------+            +--------+                 +--------+ | |
| +----|----\----------------|-------------------------|--------+ |
|      |     \               |                         |          |
+------|------\--------------|-------------------------|----------+
       |       +------+      |                         |
       |               \     |                         |
   +----------+       +----------+                 +----------+
   | Client 1 |       | Client 2 |                 | Client 3 |
   +----------+       +----------+                 +----------+

tvi   = TIPS view i
tvi/ug = incremental updates graph associated with tvi
]]></artwork>
        </figure>
        <t><xref target="fig-overview"/> shows an example illustrating an overview of the ALTO TIPS
service. The server provides the TIPS service of two information resources (#1
and #2) where #1 is an ALTO map service, and #2 is a filterable
service. There are 3 ALTO clients (Client 1, Client 2, and Client 3) that are
connected to the ALTO server.</t>
        <t>Each client uses the TIPS view to retrieve updates. Specifically, a TIPS view
(tv1) is created for the map service #1, and is shared by multiple clients. For
the filtering service #2, two different TIPS views (tv2 and tv3) are created upon
different client requests with different filter sets.</t>
      </section>
    </section>
    <section anchor="tips-updates-graph">
      <name>TIPS Updates Graph</name>
      <t>In order to provide incremental updates for a resource, an ALTO server creates
an updates graph, which is a directed, acyclic graph that contains a sequence of
incremental updates and snapshots (collectively called update items) of a
network information resource.</t>
      <section anchor="data-model">
        <name>Basic Data Model of Updates Graph</name>
        <t>For each resource (e.g., a cost map, a network map), the incremental updates and
snapshots can be represented using the following directed acyclic graph model,
where the server tracks the change of the resource maps with version IDs that are
assigned sequentially (i.e., incremented by 1 each time):</t>
        <ul spacing="normal">
          <li>Each node in the graph is a version of the resource, where a tag identifies the
content of the version (tag is valid only within the scope of resource).
Version 0 is reserved as the initial state (empty/null).</li>
          <li>Each edge is an update item. In particular, the edge from i to j is the update
item to transit from version i to version j.</li>
          <li>Version is path-independent (different paths arrive at the same version/node
has the same content)</li>
        </ul>
        <t>A concrete example is shown in <xref target="fig-ug"/>. There are 7 nodes in the graph,
representing 7 different versions of the resource. Edges in the figure represent
the updates from the source version to the target version. Thick lines represent
mandatory incremental updates (e.g., ID103-104), dotted lines represent optional
incremental updates (e.g., ID103-105), and thin lines represent snapshots (e.g.,
ID0-103). Note that node content is path independent: the content of node v can
be obtained by applying the updates from any path that ends at v. For example,
assume the latest version is 105 and a client already has version 103. The base
version of the client is 103 as it serves as a base upon which incremental
updates can be applied. The target version 105 can either be directly fetched as
a snapshot, computed incrementally by applying the incremental updates between
103 and 104, then 104 and 105, or if the optional update from 103 to 105 exists,
computed incrementally by taking the "shortcut" path from 103 to 105.</t>
        <figure anchor="fig-ug">
          <name>TIPS Model Example</name>
          <artwork type="drawing" align="center"><![CDATA[
                                                        +======+
                                                  ------|  0   |
                                                 /      +======+
                                        ID0-101 /        |   |
                                              |/__       |   |
                                       +======+          |   |
                       tag: 3421097 -> | 101  |          |   |
                                       +======+          |   |
                               ID101-102  ||             |   |
                                          \/             |   |
                                       +======+          |   |
                       tag: 6431234 -> | 102  |          |   |
                                       +======+          |   |
                               ID102-103  ||             |   |
                                          \/             |   |
                                       +======+          /   |
    +--------------+   tag: 0881080 -> | 103  |<--------/    |
    | Base Version |   =======>        +======+ ID0-103      |
    +--------------+             103-104  ||    ..           |
                                          \/     ..          |
                                       +======+  ..          |
                       tag: 6452654 -> | 104  |  .. ID103    |
                                       +======+  .. -105     |
                               ID104-105  ||     ..          | ID0-105
                                          \/   |._           /
                                       +======+             /
                       tag: 7838392 -> | 105  |<-----------/
                                       +======+
                               ID105-106  ||
                                          \/
                                       +======+
                       tag: 6470983 -> | 106  |
                                       +======+
]]></artwork>
        </figure>
      </section>
      <section anchor="updates-graph-modification-invariants">
        <name>Updates Graph Modification Invariants</name>
        <t>A server may change its updates graph (to compact, to add nodes,
etc.), but it must ensure that any resource state that it makes
available is reachable by clients, either directly via a snapshot
(that is, relative to 0) or indirectly by requesting an earlier
snapshot and a contiguous set of incremental updates.  Additionally,
to allow clients to proactively construct URIs for future update
items, the ID of each added node in the updates graph must increment
contiguously by 1.  More specifically, the updates graph <bcp14>MUST</bcp14> satisfy
the following invariants:</t>
        <ul spacing="normal">
          <li>Continuity: At any time, let ns denote the smallest non-zero version (i.e.,
start-seq) in the update graph and ne denote the latest version (i.e.,
end-seq). Then any version in between ns and ne must also exist. This implies
that the incremental update from ni to ni + 1 exists for any ns &lt;= ni &lt;= ne,
and all versions in the update graph (except 0) is an integer interval
<tt>[ns, ne]</tt>.</li>
          <li>Feasibility: Let ns denote the start-seq in the update graph. The server must
provide a snapshot of ns and, in other words, there is always a direct link
to ns in the update graph.</li>
          <li>"Right shift" only: Assume a server provides versions in <tt>[n1, n2]</tt> at time t
and versions in <tt>[n1', n2']</tt> at time t'. If t' &gt; t, then n1' &gt;= n1 and n2' &gt;=
n2.</li>
        </ul>
        <t>For example, consider the case that a server compacts a resource's updates graph
to conserve space, using the example model in <xref target="data-model"/>. Assume at time 0,
the server provides the versions <tt>{101, 102, 103, 104, 105, 106}</tt>. At time 1,
both <tt>{103, 104, 105, 106}</tt> and <tt>{105, 106}</tt> are valid sets. However, <tt>{102,
103, 104, 105, 106}</tt> and <tt>{104, 105, 106}</tt> are not valid sets as there is no
snapshot to version 102 or 104 in the update graph. Thus, there is a risk that
the right content of version 102 (in the first example) or 104 (in the second
example) cannot be obtained by a client that does not have the previous version
101 or 103, respectively.</t>
      </section>
    </section>
    <section anchor="workflow">
      <name>TIPS 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>It must be noted that a server may close a TIPS view, e.g., under high system
load or due to inactivity. It is <bcp14>RECOMMENDED</bcp14> that a client detects the liveness
and declares interests of the TIPS view by sending a polling edge request. For
example, as long as the polling request to <tt>&lt;tips-view-uri&gt;/ug/&lt;j&gt;/&lt;j+1&gt;</tt> does
not receive error code 404, the TIPS view is still alive.</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 may be any subset of the ALTO server's network information resources
and may 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 <bcp14>SHOULD</bcp14> include R0
as well as R1. For example, if a TIPS provides a TIPS view for a cost map, it
<bcp14>SHOULD</bcp14> 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-networkmap"],
      "capabilities": {
        "cost-type-names": ["num-routingcost"]
      }
    },
    "my-hopcount-map": {
      "uri": "https://alto.example.com/costmap/hopcount",
      "media-type": "application/alto-costmap+json",
      "uses": ["my-networkmap"],
      "capabilities": {
        "cost-type-names": ["num-hopcount"]
      }
    },
    "my-simple-filtered-cost-map": {
      "uri": "https://alto.example.com/costmap/filtered/simple",
      "media-type": "application/alto-costmap+json",
      "accepts": "application/alto-costmapfilter+json",
      "uses": ["my-networkmap"],
      "capabilities": {
        "cost-type-names": ["num-routingcost", "num-hopcount"],
        "cost-constraints": false
      }
    },
    "update-my-costs": {
      "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"
        },
      }
    }
]]></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"/>.</t>
            <t>A server <bcp14>SHOULD NOT</bcp14> 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. Furthermore, TIPS <bcp14>MUST NOT</bcp14> reuse a URI for a different TIPS view
(different resources or different request bodies).</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).  How the server
calculates the recommended edge depends on the implementation.
Ideally, if the client does not provide a version tag, the server
should recommend the edge of the latest snapshot available.  If
the client does provide a version tag, the server should calculate
the cumulative size of the incremental updates available from that
version onward and compare it to the size of the complete resource
snapshot.  If the snapshot is bigger, the server should recommend
the first incremental update edge starting from the client's tagged
version.  Otherwise, the server should recommend 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 <bcp14>SHOULD</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>.  The "field" field <bcp14>SHOULD</bcp14> be the full path
of the "resource-id" field, and the "value" field <bcp14>SHOULD</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 may indicate when to re-try the request in
the "Re-Try After" headers.</li>
        </ul>
      </section>
      <section anchor="open-example">
        <name>Open Example</name>
        <t>For simplicity, assume that the ALTO server is using the Basic
authentication.  If a client with username "client1" and password
"helloalto" wants to create a TIPS view of an ALTO Cost Map resource
with resource ID "my-routingcost-map", it can send the
request depicted in <xref target="ex-op"/>.</t>
        <figure anchor="ex-op">
          <name>Open Example</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</name>
          <artwork align="left"><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 258

    {
      "tips-view-uri": "https://alto.example.com/tips/2718281828459",
      "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>
    <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 must send a request to
"/tips/2718281828459/ug/0/101" and set 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 may conduct proactive fetching of future updates, by
long polling updates that have not been listed in the directory yet. For
long-poll prefetch, the client must have indicated the media type that may
appear. It is <bcp14>RECOMMENDED</bcp14> that the server allows for at least the prefetch of
<tt>&lt;end-seq&gt; -&gt; &lt;end-seq + 1&gt;</tt></t>
        <t>Hence, the server processing logic <bcp14>SHOULD</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 <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> pre-fetch is acceptable: put request in a
backlog queue.</li>
          <li>Else: return error.</li>
        </ul>
        <t>It is <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 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 prefetch window</li>
          <li>429 (Too Many Requests): when the number of pending (long-poll)
requests exceeds the server threshold. The server may 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/2718281828459/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 must request a new next edge to
consume based on its current version of the resource.</t>
        <section anchor="request-1">
          <name>Request</name>
          <t>An ALTO client requests that the server provide a next edge recommendation for a
given TIPS view by sending an HTTP POST request with the media type
"application/alto-tipsparams+json". The request has the form:</t>
          <artwork><![CDATA[
    POST /<tips-view-path>/ug HTTP/1.1
    HOST: <tips-view-host>
]]></artwork>
          <t>The POST body has the following form, where providing the version
tag of the resource the client already has is optional:</t>
          <artwork><![CDATA[
    object {
        [JSONString  tag;]
    } TIPSNextEdgeReq;
]]></artwork>
        </section>
        <section anchor="response-1">
          <name>Response</name>
          <t>The response to a valid request <bcp14>MUST</bcp14> be a JSON object of type
UpdatesGraphSummary (defined in <xref target="open-resp"/> but reproduced in <xref target="fig-resp"/> as
well), denoted as media type "application/alto-tips+json":</t>
          <figure anchor="fig-resp">
            <name>UpdatesGraphSummary</name>
            <artwork align="left"><![CDATA[
    object {
      JSONNumber       start-seq;
      JSONNumber       end-seq;
      StartEdgeRec     start-edge-rec;
    } UpdatesGraphSummary;

    object {
      JSONNumber       seq-i;
      JSONNumber       seq-j;
    } StartEdgeRec;
]]></artwork>
          </figure>
          <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>
            <li>415 (Unsupported Media Type): if the media type(s) accepted by the
client does not include the media type <tt>application/alto-tips+json</tt>.</li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="operation-and-processing-considerations">
      <name>Operation and Processing Considerations</name>
      <section anchor="considerations-for-choosing-updates">
        <name>Considerations for Choosing Updates</name>
        <t>When implementing TIPS, a developer should be cognizant of the
effects of update schedule, which includes both the choice of timing
(i.e., when/what to trigger an update on the updates graph) and the
choice of message format (i.e., given an update, send a full
replacement or an incremental change).  In particular, the update
schedule can have effects on both the overhead and the freshness of
information.  To minimize overhead, developers may choose to batch a
sequence of updates for resources that frequently change by
cumulative updates or a full replacement after a while.  Developers
should be cognizant that batching reduces the freshness of
information and should also consider the effect of such delays on
client behaviors.</t>
        <t>For incremental updates, this design allows both JSON patch and JSON
merge patch for incremental changes.  JSON merge patch is clearly
superior to JSON patch for describing incremental changes to cost
maps, endpoint costs, and endpoint properties.  For these data
structures, JSON merge patch is more space efficient, as well as
simpler to apply.  There is no advantage in allowing a server to use
JSON patch for those resources.</t>
        <t>The case is not as clear for incremental changes to network maps.</t>
        <t>First, consider small changes, such as moving a prefix from one PID
to another.  JSON patch could encode that as a simple insertion and
deletion, while JSON merge patch would have to replace the entire
array of prefixes for both PIDs.  On the other hand, to process a
JSON patch update, the ALTO client would have to retain the indexes
of the prefixes for each PID.  Logically, the prefixes in a PID are
an unordered set, not an array; aside from handling updates, a client
does not need to retain the array indexes of the prefixes.  Hence, to
take advantage of JSON patch for network maps, ALTO clients would
have to retain additional, otherwise unnecessary, data.</t>
        <t>Second, consider more involved changes, such as removing half of the
prefixes from a PID.  JSON merge patch would send a new array for
that PID, while JSON patch would have to send a list of remove
operations and delete the prefix one by one.</t>
        <t>Therefore, each TIPS instance may choose to encode the updates using
JSON merge patch or JSON patch based on the type of changes in
network maps.</t>
      </section>
      <section anchor="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 may 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 clients to make concurrent pulls of incremental
updates potentially through different HTTP connections.  As a
consequence, it introduces additional complexities when the ALTO
server is being load balanced -- a feature widely used to build
scalable and fault-tolerant web services.  For example, a request may
be incorrectly processed if the following two conditions both hold:</t>
        <ul spacing="normal">
          <li>the backend servers are stateful, i.e., the TIPS view is created
and stored only on a single server;</li>
          <li>the ALTO server is using layer-4 load balancing, i.e., the
requests are distributed based on the TCP 5-tuple.</li>
        </ul>
        <t>Thus, additional considerations are required to enable correct load
balancing for TIPS, including:</t>
        <ul spacing="normal">
          <li>Use a stateless architecture: One solution is to follow the
stateless computing pattern: states about the TIPS view are not
maintained by the backend servers but are stored in a distributed
database.  Thus, concurrent requests to the same TIPS view can be
processed on arbitrary stateless backend servers, which all
fetches data from the same database.</li>
          <li>Configure the load balancers properly: In case when the backend
servers are stateful, the load balancers must be properly
configured to guarantee that requests of the same TIPS view always
arrive at the same server.  For example, an operator or a provider
of an ALTO server may configure layer-7 load balancers that
distribute requests based on the tips-view-path component in the URI.</li>
        </ul>
      </section>
      <section anchor="considerations-for-cross-resource-dependency-scheduling">
        <name>Considerations for Cross-Resource Dependency Scheduling</name>
        <t>Dependent ALTO resources result in cross-resource dependencies in
TIPS.  Consider the following pair of resources, where my-cost-map
(C) is dependent on my-network-map (N).  The updates graph for each
resource is shown, along with links in between the respective updates
graphs to show dependency:</t>
        <figure anchor="fig-cross">
          <name>Example Dependency Model</name>
          <artwork type="drawing" align="center"><![CDATA[
                       +---+   +---+   +---+   +---+   +---+
  my-network-map (N)   | 0 |-->|89 |-->|90 |-->|91 |-->|92 |
                       +---+   +---+   +---+   +---+   +---+
                                 |   \       \       \
                                 |    \       \       \
                       +---+   +---+   +---+   +---+   +---+
  my-cost-map (C)      | 0 |-->|101|-->|102|-->|103|-->|104|
                       +---+   +---+   +---+   +---+   +---+
                        |_______________________|
]]></artwork>
        </figure>
        <t>In <xref target="fig-cross"/>, the cost-map versions 101 and 102 (denoted as C101 and C102)
are dependent on the network-map version 89 (denoted as N89). The cost-map
version 103 (C103) is dependent on the network-map version 90 (N90), and so on.</t>
        <t>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>Therefore, the client is <bcp14>RECOMMENDED</bcp14> to request and process updates in the
ascending order of the smallest dependent tag, e.g., {C101, C102, N89} before
{C103, N90}</t>
      </section>
      <section anchor="client-processing">
        <name>Considerations for Client Processing Updates</name>
        <t>In general, when an ALTO client receives a full replacement for a
resource, the ALTO client should replace the current version with the
new version.  When an ALTO client receives an incremental update for
a resource, the ALTO client should apply those updates to the current
version of the resource.</t>
        <t>However, because resources can depend on other resources (e.g., cost
maps depend on network maps), an ALTO client must not use a dependent
resource if the resource on which it depends has changed.  There are
at least two ways an ALTO client can do that.  The following
paragraphs illustrate these techniques by referring to network and
cost map messages, although these techniques apply to any dependent
resources.</t>
        <t>Note that when a network map changes, the server should send the
network map update message before sending the updates for the
dependent cost maps.</t>
        <t>One approach is for the ALTO client to save the network map update
message in a buffer and continue to use the previous network map and
the associated cost maps until the ALTO client receives the update
messages for all dependent cost maps.  The ALTO client then applies
all network and cost map updates atomically.</t>
        <t>Alternatively, the ALTO client may update the network map
immediately.  In this case, the cost maps using the network map
become invalid because they are inconsistent with the current network
map; hence, the ALTO client must mark each such dependent cost map as
temporarily invalid and must not use each such cost map until the
ALTO client receives a cost map update indicating that it is based on
the new network map version tag.</t>
        <t>Though a server should send update items sequentially, it is possible that a
client receives the update items out of order (in the case of a retransmitted
update item or a result of concurrent fetch). The client must buffer the update
items if they arrive out of order and then apply them sequentially (based on
the sequence numbers) due to the operation of JSON merge patch and JSON patch.</t>
      </section>
      <section anchor="considerations-for-updates-to-filtered-cost-maps">
        <name>Considerations for Updates to Filtered Cost Maps</name>
        <t>If TIPS provides updates to a Filtered Cost Map that allows
constraint tests, then an ALTO client may request updates to a
Filtered Cost Map request with a constraint test.  In this case, when
a cost changes, the updates graph <bcp14>MUST</bcp14> have an update if the new
value satisfies the test.  If the new value does not, whether there
is an update depends on whether the previous value satisfies the
test.  If it did not, the updates graph <bcp14>SHOULD NOT</bcp14> have an update.
But if the previous value did, then the updates graph <bcp14>MUST</bcp14> add an
update with a "null" value to inform the ALTO client that this cost
no longer satisfies the criteria.</t>
        <t>TIPS can avoid having to handle such complicated behavior by
offering TIPS only for Filtered Cost Maps that do not allow
constraint tests.</t>
      </section>
      <section anchor="considerations-for-updates-to-ordinal-mode-costs">
        <name>Considerations for Updates to Ordinal Mode Costs</name>
        <t>For an ordinal mode cost map, a change to a single cost point may
require updating many other costs.  As an extreme example, suppose
the lowest cost changes to the highest cost.  For a numerical mode
cost map, only that one cost changes.  But for an ordinal mode cost
map, every cost might change.  While this document allows TIPS to
offer incremental updates for ordinal mode cost maps, TIPS
implementors should be aware that incremental updates for ordinal
costs are more complicated than for numerical costs, and that small
changes of the original cost value may result in large updates.</t>
        <t>A TIPS implementation can avoid this complication by only offering
full replacements as updates in the updates graph for ordinal cost
maps.</t>
      </section>
      <section anchor="shared-tips-view">
        <name>Considerations for Managing Shared TIPS Views</name>
        <t>From a client's point of view, it sees only one copy of the TIPS view
for any resource.  However, on the server side, there are different
implementation options, especially for common resources (e.g.,
network map or cost map) that may be frequently queried by many
clients.  Some potential options are listed below:</t>
        <ul spacing="normal">
          <li>An ALTO server creates one TIPS view of the common resource for
each client.</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.</li>
              <li>the TIPS view is never removed from the storage.</li>
            </ul>
          </li>
        </ul>
        <t>Developers may choose different implementation options depending on
criteria such as request frequency, available resources of the ALTO
server, the ability to scale, and programming complexity.</t>
      </section>
      <section anchor="considerations-for-offering-shortcut-incremental-updates">
        <name>Considerations for Offering Shortcut Incremental Updates</name>
        <t>Besides the mandatory stepwise incremental updates (from i to i+1),
an ALTO server may optionally offer shortcut incremental updates, or
simple shortcuts, between two non-consecutive versions i and i+k (k &gt;
1).  Such shortcuts offer alternative paths in the update graph and
can potentially speed up the transmission and processing of
incremental updates, leading to faster synchronization of ALTO
information, especially when the client has limited bandwidth and
computation.  However, implementors of an ALTO server must be aware
that:</t>
        <ol spacing="normal" type="1"><li>Optional shortcuts may increase the size of the update graph, in
the worst case being the square of the number of updates (i.e.,
when a shortcut is offered for each version to all future
versions).</li>
          <li>Optional shortcuts require additional storage on the ALTO server.</li>
          <li>Optional shortcuts may reduce concurrency when the updates do not
overlap, e.g., when the updates apply to different parts of an
ALTO resource.  In such a case, the total size of the original
updates is close to the size of the shortcut, but the original
updates can be transmitted concurrently while the shortcut is
transmitted in a single connection.</li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations (Section 15 of <xref target="RFC7285"/>) of the base
protocol fully apply to this extension.  For example, the same
authenticity and integrity considerations (Section 15.1 of <xref target="RFC7285"/>)
still fully apply; the same considerations for the privacy of ALTO
users (Section 15.4 of <xref target="RFC7285"/>) also still fully apply.</t>
      <t>The additional services (addition of update read service and update
push service) provided by this extension extend the attack surface
described in Section 15.1.1 of <xref target="RFC7285"/>.  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>SHOULD</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>SHOULD</bcp14> also choose to limit the number of
pending requests. If a new request exceeds the threshold, the server <bcp14>SHOULD</bcp14> log
the event and may 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 may establish service level agreements with the ALTO
server.</t>
      </section>
      <section anchor="alto-client-update-overloading-or-instability">
        <name>ALTO Client: Update Overloading or Instability</name>
        <t>The availability of continuous updates can also cause overload for an ALTO
client, in particular, an ALTO client with limited processing capabilities. The
current design does not include any flow control mechanisms for the client to
reduce the update rates from the server. For example, TCP, HTTP/2 and QUIC
provide stream and connection flow control data limits, which might help prevent
the client from being overloaded. Under overloading, the client <bcp14>MAY</bcp14> choose to
remove the information resources with high update rates.</t>
        <t>Also, under overloading, the client may no longer be able to detect
whether information is still fresh or has become stale.  In such a
case, the client should be careful in how it uses the information to
avoid stability or efficiency issues.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following media types from the registry available at <xref target="IANA-Media-Type"/>:</t>
      <ul spacing="normal">
        <li>application/alto-tips+json: as described in <xref target="open-resp"/>;</li>
        <li>application/alto-tipsparams+json: as described in <xref target="open-req"/>;</li>
      </ul>
      <ul empty="true">
        <li>
          <t>Note to the RFC Editor: Please replace This-Document with the RFC number to be assigned to this document.</t>
        </li>
      </ul>
      <section anchor="applicationalto-tipsjson-media-type">
        <name>application/alto-tips+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>alto-tips+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>Encoding considerations are identical to those specified for the
"application/json" media type. See <xref target="RFC8259"/>.</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See the Security Considerations section of This-Document.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies the format of conforming messages and the interpretation
thereof.</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="open-resp"/> of This-Document.</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/>
            </t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>This document uses the media type to refer to protocol messages and thus
 does not require a file extension.</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
          </dd>
          <dt>Provisional registration?:</dt>
          <dd>
            <t>No</t>
          </dd>
        </dl>
      </section>
      <section anchor="applicationalto-tipsparamsjson-media-type">
        <name>application/alto-tipsparams+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>alto-tipsparams+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>Encoding considerations are identical to those specified for the
 "application/json" media type. See <xref target="RFC8259"/>.</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See the Security Considerations section of This-Document.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>This document specifies the format of conforming messages and the interpretation
thereof.</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="open-req"/> of This-Document.</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/>
            </t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>This document uses the media type to refer to protocol messages and thus
 does not require a file extension.</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
          </dd>
          <dt>Provisional registration?:</dt>
          <dd>
            <t>No</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC7285">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Protocol</title>
            <author fullname="R. Alimi" initials="R." role="editor" surname="Alimi"/>
            <author fullname="R. Penno" initials="R." role="editor" surname="Penno"/>
            <author fullname="Y. Yang" initials="Y." role="editor" surname="Yang"/>
            <author fullname="S. Kiesel" initials="S." surname="Kiesel"/>
            <author fullname="S. Previdi" initials="S." surname="Previdi"/>
            <author fullname="W. Roome" initials="W." surname="Roome"/>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
            <author fullname="R. Woundy" initials="R." surname="Woundy"/>
            <date month="September" year="2014"/>
            <abstract>
              <t>Applications using the Internet already have access to some topology information of Internet Service Provider (ISP) networks. For example, views to Internet routing tables at Looking Glass servers are available and can be practically downloaded to many network application clients. What is missing is knowledge of the underlying network topologies from the point of view of ISPs. In other words, what an ISP prefers in terms of traffic optimization -- and a way to distribute it.</t>
              <t>The Application-Layer Traffic Optimization (ALTO) services defined in this document provide network information (e.g., basic network location structure and preferences of network paths) with the goal of modifying network resource consumption patterns while maintaining or improving application performance. The basic information of ALTO is based on abstract maps of a network. These maps provide a simplified view, yet enough information about a network for applications to effectively utilize them. Additional services are built on top of the maps.</t>
              <t>This document describes a protocol implementing the ALTO services. Although the ALTO services would primarily be provided by ISPs, other entities, such as content service providers, could also provide ALTO services. Applications that could use the ALTO services are those that have a choice to which end points to connect. Examples of such applications are peer-to-peer (P2P) and content delivery networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7285"/>
          <seriesInfo name="DOI" value="10.17487/RFC7285"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8895">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Incremental Updates Using Server-Sent Events (SSE)</title>
            <author fullname="W. Roome" initials="W." surname="Roome"/>
            <author fullname="Y. Yang" initials="Y." surname="Yang"/>
            <date month="November" year="2020"/>
            <abstract>
              <t>The Application-Layer Traffic Optimization (ALTO) protocol (RFC 7285) provides network-related information, called network information resources, to client applications so that clients can make informed decisions in utilizing network resources. This document presents a mechanism to allow an ALTO server to push updates to ALTO clients to achieve two benefits: (1) updates can be incremental, in that if only a small section of an information resource changes, the ALTO server can send just the changes and (2) updates can be immediate, in that the ALTO server can send updates as soon as they are available.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8895"/>
          <seriesInfo name="DOI" value="10.17487/RFC8895"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="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, and
Sheng Jiang for the directorate reviews, Martin Duke for the Area Director
review, and Mohamed Boucadair for shepherding the document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1923YbR5Lge31FLvRgcgSAN8mW6La2aVFyc0a3Ean28bT7
WAWgQJYFVKGrCqTQkvZXdr9l98c2rpmRhQJJyd09fXYHPhaBuuQlMjIy7jEY
DJJJOS7SeXboJlU6bQZ51kwH6awpB0V2NWiqtKgXZdUMZmmT1U3S5M0Mnu2d
XWTu6NnZS3emT7iTYlpW87TJy8K9Wo5m+Zi/n2bVZT7Oekk6GlXZJbzML568
Ou0l8Ex2XlarQ1c3k2QCvw7dh+OjsyefkiRfVIeuqZZ1s7+7+3B3P0mrLD00
PR7B7+SqrN6dV+VycUgDSpK6SYvJL+msLKCtVVYni/wwcdB+lY8bvuLcuJzP
s6Kp9XdezHJ93rlskjd5cX7oihJ+NeVYb8DXcr5IQztwYZItmotDd4CtLKqi
bPJpnk3k3RrGWWVT30+9mtufrdbq5chfgdeTdNlclBWOfgD/4yjhzX8buh/S
kn7zwv1bmvsrMMssg7d7L8rh/j13WkILsAJjWom9vvspv1imhXtdppMevTDO
GwD+44usOJ8s+Uo5gUa/3tuFj1xYFk1FT+VFSpfKCoBzmo+psTdFfplVNTRE
97J5ms8O3bs0P0/L39fj5TCbLIfjIomn8XroTscXZdOYmbwuZ7B29rrO52SS
Dl5fwMjqwSkg5f/5n5nbN+M/Tqs5rPuksTO4t//wfjyBHzJA0GIVpnCcLZt6
DLh8ls2yd+XcToAHM+TB/L7hB4aTrDWPn4Y4lZ/S4txMBH+61wCftJqEezqZ
+3vuVVXWC1gWd0rXzFReZFfuD+llVpipPD6L5/Hm9CjM4ad0lm1Yg1W1+v24
Hq7gCVyE1sifDWH+sysYZWaG/ixdVlkR3/nige9+fX9/98vGPqNxALx5HL/f
PIl/y2azrIqmML6AtbM3/nNmQMMYvqNhmAkUTCcvM9zZr58+3t/beyhfv9l/
cF++Pti/r1cf7H1zT78+eKgPPNzb2w9fD8JXffbg4YOvD4GOKmH2HT7c36VG
To5eHA2eA7VLB2erBd0FksYkni47vFzz5bQ6RwheNM2iPtzZubq6GuZpkQ4B
DDtpXefnBVHUnTm11+CL9vvw/UUzn1FTTOb3d/cPBrtfJ8lgMHDpCFYI6F6S
+JMF1gnJ7cxtwYgdAmbbzTKAc3qe1e4PZ2evdvaGew4JRl47oAwwgmziYK6u
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
acvRpJyz8zperzUdWBg3JeUj0rtKfJQrWm8puMLWsohLvswQNe2ikSeZ7cSv
zTC2pJtcwFi+0EZao929bsHf17ZelA3nesUsRRdVuTy/MFMVuQnpBWEjVhdE
4k3FwZibY68wzLvAvJOpy8Ku1+85Xs0r2SmUMDgyjTI2RIUpT9xggKxdxrl7
r2AzwOCWNRPW0TIHOlcDXSfncITbNF3OmkFTAg+APN1VNlKw1m11W7DMoh2O
QkRDKSM5nFDan7YESNxViN05b0o66FDXzxYzfBYNVxnZcnFmnDWQykqS2wxz
+n7VNQO5BFFrlErdlBVRC8YDPL2L85kKfd/6vjp9wQjDB/daW950HRkwKCmq
x6pJTKfOHr9y9wfNku3CkpzLrmtEoTgxL7lTTphU0soIXGk8SdjfSERYjmPx
C64xEN9QJAuBjAKE0go2PRaIASQ4BHYCwFDOluqThFnvaXW8sci/yFXMsS8g
wSANFId8E5oclaL1jNMKF+xBr0HnQdpuLyoqhXhhaaGIkTBQxEbwPEVgetVo
lPNA1ZRlIAlhKEzsyI/UYyKiQTXKmwq1VWGOrYH1Q15wcj+W4kVsZrcp0sLw
tGTmND9fikdKi+4wz44lD08K5nz9Hpbug5Guje8dzWnNIW2W3a2lf0Kc82WK
GzgzLrq29k8LWlzSkbZOVZHhoAmPadryNYLPHEJZsfgo6uFKPJM7DgQ/Qtlf
36xRZ3G5NeeAH3h8+Mfxc4ilwIYU3u735vXJRgbgcVXW9SAkq/YJEim3PEj3
yIkkermJQ+JryRSKHY2pofVMizlzI5Jv87EVaQMRXKR5xcyWNKwKZMmhgZam
ZOsx1Qed+LHA9OPQA7f1YnsYRYiJjUHZdx/3761sUXgW5qKsbeVUdT7hAoTa
aEKNcopPrJ8RskoerlVj6PxgBfG7N/2Fl9dn57CSwC6Wonn08cFD/vtQfj/c
k7/7m0sw37bnGz5YzeBn+e7/3u6127/3GVDy1kjEEelKoLK3uyd/9+Xvgfy9
93eC0sdfuj8fYz01bZgbCj2oUd5sSyp8Tf60ajeghrS6iIeEL4CKZnFkAaiq
pzEpPNYb8GV/O+Fc5mZrsZ0vYJ8a0ADtbDMvHjzk8sO+6yTUET2ABYF/1/ft
psYBl7dePNyVYpJ16Sg1dLclcJKNcxGcSMo2BlRj80VhDlU3dJr7UtZn/iVK
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

-->

</rfc>
