<?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-17" 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-17"/>
    <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>A server <bcp14>MAY</bcp14> close a TIPS view at any time, e.g., under high system load or due
to client inactivity. In the event that a TIPS view is closed, an edge request
will receive error code 404 in response, and the client will have to request a
new TIPS view URI.</t>
        <t>If resources allow, servers <bcp14>SHOULD</bcp14> avoid closing TIPS views that have active
polling edge requests or have recently served responses until clients have had a
reasonable interval to request the next update.</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 a client to make concurrent pulls of incremental updates for the
same TIPS view potentially through different HTTP connections. As a consequence,
it introduces additional complexities when the ALTO server is being load
balanced. For example, a request may be directed to a wrong backend server and
get incorrectly processed if the following two conditions both hold:</t>
        <ul spacing="normal">
          <li>the backend servers are stateful, i.e., the TIPS view is created
and stored only on a single server;</li>
          <li>the ALTO server is using layer-4 load balancing, i.e., the
requests are distributed based on the TCP 5-tuple.</li>
        </ul>
        <t>Thus, additional considerations are required to enable correct load
balancing for TIPS, including:</t>
        <ul spacing="normal">
          <li>Use a stateless architecture: One solution is to follow the
stateless computing pattern: states about the TIPS view are not
maintained by the backend servers but are stored in a distributed
database.  Thus, concurrent requests to the same TIPS view can be
processed on arbitrary stateless backend servers, which all
fetches data from the same database.</li>
          <li>Configure the load balancers properly: In case when the backend
servers are stateful, the load balancers must be properly
configured to guarantee that requests of the same TIPS view always
arrive at the same server.  For example, an operator or a provider
of an ALTO server 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 and no client immediately issues a new edge request;</li>
              <li>the TIPS view is never removed from the storage.</li>
            </ul>
          </li>
        </ul>
        <t>Developers may choose different implementation options depending on
criteria such as request frequency, available resources of the ALTO
server, the ability to scale, and programming complexity.</t>
      </section>
      <section anchor="considerations-for-offering-shortcut-incremental-updates">
        <name>Considerations for Offering Shortcut Incremental Updates</name>
        <t>Besides the mandatory stepwise incremental updates (from i to i+1),
an ALTO server 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:
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
C2zlaJ3YvEoemUJ6IA6syQqyCwe9bojIXmcNlwDChgYUHryUqvKRMZdWn5oM
s2ltc+oVJpHAmmVpBXh7LT8tdJLWTJ318bYOATf9Wx9ZizgcBde+TRLRmJg2
AXR4nCM85uU5MDJewjpWMapjkY9VitC9xByoD8Xi8ilzXP7W+zDWgeSBqx27
vKFe79ih2BFYZla7jtLxOxgV7t1VFhr1vRN2o5rrbyiKfLEQgqVPztNqElBL
qTfLFjx+TIm18xzw7HG5KiYgneTR3rL2oKCxYH8cEuVZLqVgGdkevmgWtn6w
73Z+KIuMGw5nH2n+UCHu9d6cT5fiI4ugdx+wx8FftLm7budNEWIjQxhxGHmA
DyZX5CX1ozNitJ+NhsxsnnvmxBojaShMK9E0D++yqPcorebrMBScn0hwMY7L
/oB1n5SX0sTNpcWlePXs+F2/y3J1LDT+JpFR1TFmC1wrM6qH34dbhqYDiQzl
WVTk00PwXM4W2bZ1C+jCJiTEGOxzdZADUeoIgS43joKYwYceYu6e2IErDr3f
LrrFR+DPEQPsrpTmLLdLsZpXsLo4D5u0o3XGbUABzcm/Wc6xU+sUde7ui6SD
mUk6K7tvCob06Kf25HG8N+P1SemF4FCDAOc3eg4U6zmmjEALO9wTCwXNJkl+
pErlPlxVcp6kXFtrw53GhRx0xlSWxE44xqFLs2H2vVWOCxhRFetGUlJyro0E
XW+ENaAkKiNTB0rVKD63BTn/UvZzzferTpVpzeFjGm7nR+9jSb3G3GFCQ5PP
A3OxqqvQZpSgda8sWD0VjgRMN4J3gI5SFkMp3c6F4GMWJF0HxnMm2TzoiG9V
rEJzMWbcN9SLwtw457QwLjHjXZcYoRhCmJkpIEKxqjcZoesBQfFklOsBo619
Ntru+nFE/ayw9fmenGEMVYSnEpLOjp0B6ts8O3ViX+7cGdvm1Ex1vKHk6pCn
WoTzKoEK+wmuqKEnK8SpNMpA0o2giaPR5a5dV9Ass63xldfenmPn0XZD3eZm
yp5JSEjYU4ddSmESuugqlEQU+LO9wLo8pnaMI2ScgGxEzCmABsQNvY+Cp9xO
6wQjf3e/3JesE0b/j3tfBferaz2vOgZI/sL/dIx/TOD+saz/P5BXf7sdod9S
QMMLrzJGlcbLIGQ+FHUOB/JzhqDoEpHgh5pQRBYe+QegyN4tRhP8YmjEBFPK
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
AZRdwtntc8YEF7L/Cym5C7o/FgEA

-->

</rfc>
