<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<!-- edited with XMLSPY v5 rel. 3 U (http://www.xmlspy.com)
     by Daniel M Kohn (private) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" docName="draft-ietf-alto-new-transport-04" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" symRefs="true" sortRefs="true" version="3" consensus="true">
  <!-- xml2rfc v2v3 conversion 3.12.10 -->
  <?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>

  <front>
    <title abbrev="ALTO/Transport Queue">ALTO Transport Information Publication Service</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-alto-new-transport-04"/>
    <author fullname="Roland Schott" initials="R." surname="Schott">
      <organization>Deutsche Telekom</organization>
      <address>
        <postal>
          <street>Heinrich-Hertz-Strasse 3-7</street>
          <city>64295 Darmstadt</city>
          <country>Germany</country>
        </postal>
        <email>Roland.Schott@telekom.de</email>
      </address>
    </author>
    <author fullname="Y. Richard Yang" initials="Y." surname="Yang">
      <organization>Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect St</street>
          <city>New Haven</city>
          <region>CT</region>
          <code>06520</code>
          <country>USA</country>
        </postal>
        <email>yry@cs.yale.edu</email>
      </address>
    </author>
    <author fullname="Kai Gao" initials="K." surname="Gao">
      <organization>Sichuan University</organization>
      <address>
        <postal>
          <street/>
          <city>Chengdu</city>
          <code>201804</code>
          <country>China</country>
        </postal>
        <email>kgao@scu.edu.cn</email>
      </address>
    </author>
    <author fullname="Jingxuan Jensen Zhang" initials="J." surname="Zhang">
      <organization>Tongji University</organization>
      <address>
        <postal>
          <street>4800 Cao'An Road</street>
          <city>Shanghai</city>
          <code>201804</code>
          <country>China</country>
        </postal>
        <email>jingxuan.n.zhang@gmail.com</email>
      </address>
    </author>
    <date day="30" month="December" year="2022"/>
    <area>TSV Area</area>
    <workgroup>ALTO Working Group</workgroup>
    <keyword>RFC</keyword>
    <keyword>Request for Comments</keyword>
    <keyword>I-D</keyword>
    <keyword>Internet-Draft</keyword>
    <keyword>Application-Layer Traffic Optimization, HTTP/2, HTTP/3, SSE, Message Queue</keyword>
    <abstract>
      <t>The ALTO base protocol [RFC7285] is based on HTTP/1.x, focusing on the simple, sequential request-reply use case, in which an ALTO client requests a sequence of information resources, and the server sends the complete content of each information resource to the client one by one. ALTO/SSE [RFC8895] defines a new transport design to allow an ALTO client to request the monitoring of multiple resources, and the server can then continuously, concurrently, and incrementally push updates whenever monitored network information resources change. But ALTO/SSE assumes an HTTP/1.x setting, and essentially designs a new concurrent transport protocol on top of a sequential HTTP/1.x connection, but newer  versions of HTTP (e.g., HTTP/2 [RFC7540]) already support concurrent, non-blocking transport of multiple streams in the same HTTP connection. This document introduces the ALTO transport information publication service (TIPS), which allows the naming of individual incremental updates to multiple ALTO information resources and the distribution of the naming, enabling ALTO to take advantage of newer HTTP versions. In particular, it gives an ALTO client the new capability to explicitly request (pull) a specific incremental update. It also provides an ALTO server the new capability to push a specific incremental update using native HTTP/2 or HTTP/3 server push. This document defines TIPS as a service, independent of client pull or server push. A companion document
        <xref target="draft-schott-alto-new-transport-push" format="default"/> defines 
        server-push ALTO transport based on ALTO TIPS.
      </t>
    </abstract>
    <note>
      <name>Requirements Language</name>
      <t>
          The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
          "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY",
          and "OPTIONAL" in this document are to be interpreted as described
          in BCP 14 <xref target="RFC2119" format="default"/><xref target="RFC8174" format="default"/> when,
          and only when, they appear in all capitals, as shown here.
      </t>
    </note>
  </front>
  <middle>
    <section anchor="intro" numbered="true" toc="default">
      <name>Introduction</name>
      <t>Application-Layer Traffic Optimization (ALTO) provides means for network applications
      to obtain network status information. The ALTO base protocol <xref target="RFC7285" format="default"/> is based on the sequential request and response model of HTTP/1.1 <xref target="RFC7230" format="default"/>. Hence, the base protocol cannot support well the use cases where an ALTO client (e.g., a controller) may need to efficiently monitor the changes to a set of network information resources. If the client opens only a single HTTP connection, the first request for resource A may block the request for B resource. </t>

      <t>To address the issue using a protocol that is still based on the HTTP/1.1 transport model, the ALTO Working Group introduces ALTO/SSE (ALTO Incremental Update based on Server-Sent-Event)
      <xref target="RFC8895" format="default"/>, so that an ALTO client can manage (i.e., add and remove) a set of
      requests maintained at an ALTO server, and the server can continuously, concurrently, and
      incrementally push updates whenever a monitored network information resource changes.
      Figure 1 shows the architecture and message flow of ALTO/SSE, which can be considered as a more general transport protocol than the ALTO base transport protocol.  Although ALTO/SSE allows the concurrent transport of multiple ALTO information resources, it has complexities and limitations. For example, it requires that the server provides a separate control URI, leading to complexity in management; it needs its own envelop protocol to multiplex the incremental updates of multiple resources on a single HTTP connection, not using the functions of substream multipelxing in newer HTTP versions; its envelop does not provide naming for individual incremental updates, and hence cannot support client explicit pull or server push, which needs to indicate the URI.
      </t>
      <figure anchor="FigOverview">
        <name>ALTO SSE Architecture and Message Flow.</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[

 ------------------------------------------------------------------
|                                                                  |
|          +-------+         +-------+ 1. init request  +------+   |
|          |       |         |       | <-------------   |      |   |
|          |       |         |       | ------------->   |      |   |
| 3.add/   |       |         |       | 1'. control uri  |      |   |
| remove   |       |         |       |                  |      |   |
| resource |Stream |         |Update |                  |      |   |
  -------->|Control| private |Stream | 2a. data update  |Client| --
           |Server |<------->|Server | messages         |      |
  -------- |       |         |       | -------------->  |      | <-
| response |       |         |       | -------------->  |      |   |
|          |       |         |       | 2b.control update|      |   |
|          +-------+         +-------+ messages         +------+   |
|                                                                  |
 ------------------------------------------------------------------

    ]]></artwork>
      </figure>
      <t>This document specifies ALTO transport queue information service, which allows the naming of individual incremental updates to multiple ALTO information resources and the distribution of the naming, enabling ALTO to take advantage of newer HTTP versions. In particular, it gives an ALTO client the new capability to explicitly request (pull) a specific incremental update. It also provides an ALTO server the new capability to push a specific incremental update using native HTTP/2 or HTTP/3 server push.  ALTO New Transport, which realizes ALTO/SSE functions but takes advantage of newer versions of HTTP (e.g., HTTP/2 <xref target="RFC7540" format="default"/>) that support concurrent, non-blocking transport of multiple streams in the same HTTP connection.</t>
    </section>

    <section anchor="altoh2overview" numbered="true" toc="default">
      <name>TIPS Overview</name>

      <t>A key design of the ALTO TIPS is to distinguish between information about ALTO resources and information about ALTO transport. The latter information provides meta information about the transport of ALTO information resources.</t>

      <section anchor="altoh2req" numbered="true" toc="default">
        <name>TIPS Design Requirements</name>
        <t>ALTO TIPS is designed to provide meta information about transport to satisfy a set of requirements. First, it should satisfy the following requirements to realize the functions of ALTO/SSE:</t>
        <ul spacing="normal">
          <li>R1: The client can request the addition (start) of transport of incremental updates to a resource.</li>
          <li>R2: The client can request the deletion (stop) of transport of incremental updates to a resource.</li>
          <li>R3: The server can signal to the client the start or stop of transport of incremental updates to a resource.</li>
          <li>R4: The server can choose the type of each incremental update encoding, as long as the type is indicated to be acceptable by the client.</li>
        </ul>

        <t>ALTO TIPS provides meta information to allow an ALTO client to take advantage of newer HTTP design features, in particular, parallel transfers, but be as transparent to versions (HTTP/2, HTTP/3) as possible. If a design is based on a particular HTTP version, it should respect its semantics:</t>
        <ul spacing="normal">
          <li>R5: The design respects specific HTTP semantics such as the semantics of PUSH_PROMISE, if the feature is used.</li>
        </ul>

      </section>
      <!-- end of requirements -->


      <section anchor="altoh2concepts" numbered="true" toc="default">
        <name>TIPS Concepts</name>
        <ul spacing="normal">
          <li>The transport state from the ALTO server to an ALTO client (or a set of clients) for
          an ALTO information resource is conceptually through a transport
          queue. A static ALTO information resource (e.g., Cost Map, Network Map) has a single transport queue, and a dynamic ALTO information resource (e.g., Filtered Cost Map) may create a queue for each unique filter request.</li>

          <li>The base transport queue defined in this document includes only a single element: the incremental update message queue, which includes a sequence of incremental update messages. A particular transport design may extend the base design to include additional state. For example, the server-push design <xref target="draft-schott-alto-new-transport-push" format="default"/> may include the additional receiver set state, which includes the set of receivers receiving incremental push updates from the ALTO server. </li>

          <li>The transport queue state is exposed to clients through views; that is, a client can see only a virtual view of the server state.</li>
        </ul>

      <t>Figure 2 shows an example illustrating the aforementioned information. It includes the additional receiver-set state, to illustrate the possibility of extension. Each ALTO client
        (Client 1, Client 2, or Client 3) maintains a single HTTP connection with the ALTO server.
      </t>
      <figure anchor="FigInfoStruct">
        <name>ALTO Transport Information.</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[

Information Resource:

a) Static resource (#1) such as NetworkMap
b) Filterable resource (#3) such as FilteredCostMap


                              +-------------+
                              |             |
         +--------------------| ALTO Server |-----------+
         |                  +-|             |-+         |
         |                  | +-------------+ |         |
         |                  |                 |         |
---------|------------------|-----------------|---------|------------
         |                  |                 |         | Information
         |                  |                 |         | Resource
+-------------+   +-------------+   +-------------+   +-------------+
| Information |   | Information |   | Information |   | Information |
| Resource #1 |   | Resource #2 |   | Resource #3 |   | Resource #4 |
+-------------+   +-------------+   +-------------+   +-------------+
       |                              /    \
-------|-----------------------------/------\------------------------
       |                            /        \            Transport
       |                      +----/          \------+    Queues
       |                      |                      |
  +--------+             +--------+             +--------+
  |   tq1  |-----+       |   tq2  |-----+       |   tq3  |-----+
  +----|---+     |       +----|---+     |       +----|---+     |
       |         |            |         |            |         |
  +----|---+ +---|----+  +----|---+ +---|----+  +----|---+ +---|----+
  | tq1/uq | | tq1/rs |  | tq2/uq | | tq2/rs |  | tq3/uq | | tq3/rs |
  +--------+ +--------+  +--------+ +--------+  +--------+ +--------+
       |\       /\              |         /           |          |
-------|-\-----/--\-------------|--------/------------|----------|---
       |  \   /    +-------+    |       /             |          |
       |   +-/-----------+  \   |      /              |          |
       |    /             \  \  |     /   A           +          +
       |   /            +--\--\-|----/--+ single       \        /
       |  /             +---\--\|---/---+ http2/3       \      /
   +----------+             +----------+  connection   +----------+
   | Client 1 |             | Client 2 |               | Client 3 |
   +----------+             +------- --+               +----------+

tqi    = transport queue i
tqi/uq = incremental updates queue of transport queue i
tqi/rs = receiver set of transport queue i

      ]]></artwork>
      </figure>

      <t>The basic work flow of a client connecting to an ALTO server is the following:</t>
      <figure anchor="FigInfoWorkflow">
        <name>ALTO New Transport Workflow.</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Client                  TIPS          TQ      TQ/UQ    ULS
  o                      .
  | Open HTTP connection .
  |--------------------->| Create TQ  o        o       o
  | Return URI to TQ     |...........>|.......>|......>|
  |<---------------------|            .        .       .
  | (Pull Mode)          .            .        .       .
  | Request update queue status       .        .       .
  |------------------------------------------->|       .
  | Return status of the update queue .        |       .
  |<-------------------------------------------|       .
  | Request an element in the UQ      .        .       .
  |--------------------------------------------------->|
  | Return the content of an incremental update.       |
  |<---------------------------------------------------|
  | (Explicit deletion)  .            .        .       .
  | Close the transport queue         .        .       .
  |---------------------------------->|.......>|......>|
  |                      .            o        o       o
  | Close the connection .
  |--------------------->|
  o                      .

  tips: Transport Queue Service, TQ: Transport Queue
  UQ: Incremental Update Queue, ULS: Update Log Service
      ]]></artwork>
      </figure>
  <!--
    Client opens a connection to the server
    Client opens/identifies a transport queue tq

    // pull mode
    Client requests transport queue status of tq
    Client requests an element in the incremental update queue

    // push mode
    Client becomes a receiver
    Client receives incremental push updates

    Client closes the transport queue tq
    Client closes the connection -->
    </section>
    <!-- end of concepts -->

    </section>
    <!-- end of overview -->

    <section anchor="ext" numbered="true" toc="default">
      <name>TIPS Information Resources</name>
      <t>As shown in <xref target="FigInfoWorkflow" format="default"/>, TIPS defines 
      4 new ALTO information resources: Transport Information Service,
      Transport Queue, Incremental Updates Queue, and Update Log Service (optional).
      </t>

      <section anchor="notations" numbered="true" toc="default">
        <name>Notations</name>
        <t>This document uses the same syntax and notations as introduced in Section 8.2 of
RFC 7285 <xref target="RFC7285" format="default"/> to specify the extensions to existing ALTO resources and
services.</t>
      </section>

      <section anchor="tips-spec" numbered="true" toc="default">
        <name>Transport Information Publication Service</name>
        <section anchor="tips-media-type" numbered="true" toc="default">
          <name>Media Type</name>
          <t>The media type of the Transport Information Publication Service resource is
          "application/alto-tips+json".
          </t>
        </section>
        <section anchor="tips-method" numbered="true" toc="default">
          <name>HTTP Method</name>
          <t>The Transport Queue Service resource is requested using the HTTP POST method.
          </t>
        </section>
        <section anchor="tips-cap" numbered="true" toc="default">
          <name>Capabilities</name>
          <t>The capabilities of a Transport Queue Service are the same as the
          capabilities of an Update Stream Service, as defined in Section 6.3 of
          <xref target="RFC8895" format="default"/>.
          </t>
        </section>
        <section anchor="tips-uses" numbered="true" toc="default">
          <name>Uses</name>
          <t>The "uses" of a Transport Queue Service has the same format as that of an Update Stream Service, as defined in Section 6.4 of <xref target="RFC8895" format="default"/>.
          </t>
        </section>
        <section anchor="tips-accept" numbered="true" toc="default">
          <name>Request: Accept Input Parameters</name>
          <t>The input parameters of the Transport Queue Service resource are
          supplied in the body of an HTTP Post request, which MUST be a JSON object of
          type AddUpdateReq (defined in Section 6.5 of
          <xref target="RFC8895" format="default"/>), indicated by the media
          type "application/alto-tipsparams+json".
        </t>
        </section>
        <section anchor="tips-resp" numbered="true" toc="default">
          <name>Response</name>
          <t>The response of a successful POST request MUST be a JSON object of
          type AltoTransportData
          </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
    object {
        JSONString tq;
    } ALTOTransportData;
        ]]></artwork>
        <t>with field:</t>
        <dl>
          <dt>tq:</dt>
          <dd><t>The relative URI to the incremental updates queue resource.</t></dd>
        </dl>
        </section>
        <section anchor="tips-example" numbered="true" toc="default">
          <name>Example</name>
          <t>For simplicity, assume the ALTO server is using the Basic
          authentication. If a client with username "client1" and password "helloalto"
          wants to create a transport queue of an ALTO Cost Map resource with resource ID
          "my-routingcost-map", it can send the following request:
          </t>
          <artwork name="" type="" align="left" alt=""><![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: [TBD]

{
  "resource-id": "my-routingcost-map"
}
        ]]></artwork>
          <t>If the operation is successful, the ALTO server returns the following message:
          </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/alto-tips+json
Content-Length: [TBD]

{"tq": “/tips/2718281828459”}
        ]]></artwork>
        </section>
      </section>
      <section anchor="tq-spec" numbered="true" toc="default">
        <name>Transport Queue</name>
        <section anchor="tq-media-type" numbered="true" toc="default">
          <name>Media Type</name>
          <t>None.</t>
        </section>
        <section anchor="tq-method" numbered="true" toc="default">
          <name>HTTP Method</name>
          <t>The Transport Queue resource can be requested using the HTTP DELETE method.
          </t>
        </section>
        <section anchor="tq-cap" numbered="true" toc="default">
          <name>Capabilities</name>
          <t>None.</t>
        </section>
        <section anchor="tq-uses" numbered="true" toc="default">
          <name>Uses</name>
          <t>None.</t>
        </section>
        <section anchor="tq-accept" numbered="true" toc="default">
          <name>Request: Accept Input Parameters</name>
          <t>None.</t>
        </section>
        <section anchor="tq-resp" numbered="true" toc="default">
          <name>Response</name>
          <t>When receiving a DELETE request, the ALTO server MUST check whether
          the client has the permission to close the transport queue.
          Specifically, if the request is issued by the same client that creates
          the Transport Queue, the ALTO server MUST return an HTTP message with
          status code 200 (OK) to indicate that the operation is successful.
          Otherwise, the ALTO server must return an HTTP message with status
          code 403 (Forbidden).
          </t>
        </section>
        <section anchor="tq-example" numbered="true" toc="default">
          <name>Example</name>
          <t>Assume the client wants to close the transport queue, it can send
          the following request:
          </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
DELETE /tips/2718281828459 HTTP/1.1
Host: alto.example.com
Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K
          ]]></artwork>
        <t>As the credential matches the client that creates the transport
        queue, the request will succeed and the ALTO server returns the following
        message:
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
HTTP/1.1 200 OK
          ]]></artwork>
        </section>
      </section>
      <section anchor="uq-spec" numbered="true" toc="default">
        <name>Incremental Updates Queue</name>
        <section anchor="uq-path" numbered="true" toc="default">
          <name>Path</name>
          <t>The path to an Incremental Updates Queue resource has the following format:
          </t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
  TQ_URI "/uq"
          ]]></artwork>
          <t>where TQ_URI is the URI of the Transport Queue resource and SEQ is
          the sequence number of an incremental update log.
          </t>
          <t>For example, if the relative URI of a transport queue is
          "/tq/2718281828459", the URI of the corresponding incremental update
          queue is "/tq/2718281828459/uq".
          </t>
        </section>
        <section anchor="uq-media-type" numbered="true" toc="default">
          <name>Media Type</name>
          <t>The media type of an Incremental Update Queue resource is
          "application/alto-tipsqueue+json".
          </t>
        </section>
        <section anchor="uq-method" numbered="true" toc="default">
          <name>HTTP Method</name>
          <t>The Incremental Update Queue resource must be requested using the
          HTTP GET method.
          </t>
        </section>
        <section anchor="uq-cap" numbered="true" toc="default">
          <name>Capabilities</name>
          <t>None.</t>
        </section>
        <section anchor="uq-uses" numbered="true" toc="default">
          <name>Uses</name>
          <t>None.</t>
        </section>
        <section anchor="uq-accept" numbered="true" toc="default">
          <name>Accept Input Parameters</name>
          <t>None.</t>
        </section>
        <section anchor="uq-resp" numbered="true" toc="default">
          <name>Response</name>
          <t>If the transport queue indicated by the TQ_URI is closed, the ALTO
          server MUST return an HTTP message with status code 404 (Not Found).
          </t>
          <t>Otherwise, the response is encoded as a JSON object of type
          AltoIncUpdateQueue
          </t>

          <artwork name="" type="" align="left" alt=""><![CDATA[
    object {
        AltoIncUpdateLog  uq<0..*>;
    } AltoIncUpdateQueue;
          ]]></artwork>
          <t>with field:</t>
          <dl>
            <dt>uq: </dt>
            <dd>
              <t>An ordered list of update logs.</t>
            </dd>
          </dl>

          <t>Each incremental update is encoded as a JSON object of type
AltoIncUpdateLog</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
    object {
        JSONNumber   seq;
        JSONString   media-type;
        JSONString   tag;
        [JSONString  link;]
    } AltoIncUpdateLog;
]]></artwork>
        <t>with fields:</t>
        <dl>
          <dt>seq:</dt>
          <dd><t>A required JSON integer indicating the sequence number of the incremental update. As JSON allows a large integer space, when the server reaches the largest integer, the server SHOULD close the incremental update queue. </t></dd>
          <dt>media-type:</dt>
          <dd><t>A required JSON string giving the type of the incremental update  (see ALTO/SSE).</t></dd>
          <dt>tag:</dt>
          <dd><t>A required JSON string which is defined the same way as the "tag" field of VersionTag (see Section 10.3 of <xref target="RFC7285" format="default"/>). </t></dd>
          <dt>link:</dt>
          <dd><t>An optional JSON string giving an optional link for a client to directly request a resource as a complete snapshot (not through incremental updates).</t></dd>
        </dl>
        </section>
        <section anchor="uq-example" numbered="true" toc="default">
          <name>Example</name>
          <t>Assume the client wants to query the status of the incremental update
          queue of the transport queue whose URI is "/tips/2718281828459", it can
          send the following request:
          </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
GET /tips/2718281828459/uq HTTP/1.1
Host: alto.example.com
Accept: application/alto-tipsqueue+json,
        application/alto-error+json
          ]]></artwork>

          <t>Assume the server returns the following response:
          </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/alto-tipsqueue+json
Content-Length: [TBD]

{
  "uq": [
    {"seq":        101,
     "media-type": "application/alto-costmap+json",
     "tag":        "a10ce8b059740b0b2e3f8eb1d4785acd42231bfe" },
    {"seq":        102,
     "media-type": "application/merge-patch+json",
     "tag":        "cdf0222x59740b0b2e3f8eb1d4785acd42231bfe" },
    {"seq":        103,
     "media-type": "application/merge-patch+json",
     "tag":        "8eb1d4785acd42231bfecdf0222x59740b0b2e3f",
     "link":       "/tips/2718281828459/snapshot/2e3f" }
  ]
}
          ]]></artwork>
        <t>The media type of the first update log (with sequence number 101) is
        "application/alto-costmap+json", which indicates that the update
        contains a full replacement. The media types of the logs with sequence
        number 102 and 103 are both "application/merge-patch+json", which
        indicates that the two updates contain incremental updates encoded as
        JSON merge patches. Note that the "link" attribute of the log with
        sequence number 103 is present. Thus, the client can request a full
        replacement by sending a GET message to "/tips/2718281828459/snapshot/2e3f".
        </t>
        </section>
      </section>
      <section anchor="ums-spec" numbered="true" toc="default">
        <name>Update Log Service</name>
        <section anchor="ums-path" numbered="true" toc="default">
          <name>Path</name>
          <t>The path to an Incremental Update Log Service resource has the following format:
          </t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
  TQ_URI "/uq/" SEQ
          ]]></artwork>
          <t>where TQ_URI is the URI of the Transport Queue resource and SEQ is
          the sequence number of an incremental update log.
          </t>
          <t>For example, if the client wants to query the content of the first
          update log (with sequence number 101), it can send a request to
          "/tips/2718281828459/uq/101".
          </t>
        </section>
        <section anchor="ums-media-type" numbered="true" toc="default">
          <name>Media Type</name>
          <t>The media type of an Update Log  Service resource MUST be the
          same as the "media-type" field of the update log with sequence number
          SEQ in the transport queue identified by the TQ_URI.
          </t>
          <t>For example, if the client wants to query the content of the first
          update log (with sequence number 101) whose media type is
          "application/alto-costmap+json", it must set the "Accept" header to
          "application/alto-costmap+json, application/alto-error+json" in the request.
          </t>
        </section>
        <section anchor="ums-method" numbered="true" toc="default">
          <name>HTTP Method</name>
          <t>The Incremental Update Queue resource must be requested using the
          HTTP GET method.
          </t>
        </section>
        <section anchor="ums-cap" numbered="true" toc="default">
          <name>Capabilities</name>
          <t>None.</t>
        </section>
        <section anchor="ums-uses" numbered="true" toc="default">
          <name>Uses</name>
          <t>None.</t>
        </section>
        <section anchor="ums-accept" numbered="true" toc="default">
          <name>Accept Input Parameters</name>
          <t>None.</t>
        </section>
        <section anchor="ums-resp" numbered="true" toc="default">
          <name>Response</name>
          <t>Let TQ_URI and SEQ denote the URI of the Transport Queue resource
          and the sequence number of an incremental update log indicated in the
          path. If the transport queue indicated by TQ_URI is closed, the ALTO
          server MUST return an error HTTP message with status code 404 (Not
          Found) and media type "application/alto-error+json". Otherwise, let
          LOW_SEQ and HIGH_SEQ represent the smallest and largest sequence
          number in the incremental update queue of the transport queue
          respectively. If SEQ is smaller than LOW_SEQ, the ALTO server MUST
          return an error HTTP message with status code 410 (Gone) and media
          type "application/alto-error+json". If SEQ is greater than HIGH_SEQ,
          the ALTO server MAY either treat the request as a long polling request
          or return an error HTTP message with status code 400 (Bad Request).
          </t>
          <t>If the request is valid, the response is encoded as a JSON object
          whose data format is indicated by the media type.
          </t>
        </section>
        <section anchor="ums-example" numbered="true" toc="default">
          <name>Example</name>
          <t>Assume the client wants to get the contents of updates 101, the request is:
          </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
GET /tips/2718281828459/uq/101 HTTP/1.1
Host: alto.example.com
Accept: application/alto-costmap+json, application/alto-error+json
          ]]></artwork>
        <t>And the response will be</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/alto-costmap+json
Content-Length: [TBD]

{ ... full replacement of my-routingcost-map ... }
          ]]></artwork>
        </section>
      </section>
    </section>

    <section anchor="altoh2tq" numbered="true" toc="default">
      <name>Transport Information: Transport Queue</name>
      <section anchor="altoh2tqops" numbered="true" toc="default">
        <name>Transport Queue Operations</name>
        <t>Create a transport queue: An ALTO client creates a transport queue using the HTTP POST method with ALTO SSE AddUpdateReq
        ([RFC 8895] Sec. 6.5) as the parameter:
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

    object {
        ResourceID   resource-id;
        [JSONString  tag;]
        [Boolean     incremental-changes;]
        [Object      input;]
     } AddUpdateReq;


        ]]></artwork>
        <t>In the base design, the client should not include the incremental-changes field.</t>
        <t>A successful POST request MUST return a JSON object of type ALTOTransportQueueData </t>

        <artwork name="" type="" align="left" alt=""><![CDATA[

    object {
        JSONString tq;
    } ALTOTransportQueueData;

        ]]></artwork>
        <t>with field:</t>
        <dl>
          <dt>tq:</dt>
          <dd><t>The relative URI to the incremental update queue resource.</t></dd>
        </dl>

        <t>Read a transport queue: A client reads the status of a transport queue by issuing a GET request to the transport queue URI returned from the POST method. </t>

        <t>Delete a transport queue: a transport queue exposed to a client can be closed (deleted) either explicitly or implicitly.</t>
        <ul spacing="normal">
          <li>Explicit delete: A client uses the HTTP DELETE method to explicitly delete a transport
          queue. If successful, the transport queue is deleted from the local view of the client, although the server may still maintain the transport queue for other client connections.
          </li>
          <li>Implicit delete: Transport queue for a client is ephemeral: the close of the HTTP connection between the client and the server deletes the transport queue from the client's view --- when the client reconnects, the client MUST NOT assume that the transport queue is still valid.
          </li>
        </ul>
        <t>Error codes: ALTO TIPS uses HTTP error codes.</t>
      </section>
      <!-- transport queue section operation -->

      <section anchor="altoh2tqexamples" numbered="true" toc="default">
        <name>Examples</name>
        <t>The first example is a client creating a transport queue.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
   Client -> server request

   POST /tips HTTP/1.1
   Host: alto.example.com
   Accept: application/alto-tips+json,
           application/alto-error+json
   Content-Type: application/alto-tipsparams+json
   Content-Length: [TBD]

   {
      "resource-id": "my-routingcost-map"
   }
        ]]></artwork>
        <artwork name="" type="" align="left" alt=""><![CDATA[

   Server -> client response:

   HTTP/1.1 200 OK
   Content-Type: application/alto-tips+json
   Content-Length: [TBD]

   {"tq": “/tips/2718281828459”}

        ]]></artwork>
        <t>The client can then read the status of the transport queue using the read operation
          (GET) in the same HTTP connection. Below is an example (structure of incremental updates queue will be specified in the next section):</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
   Client -> server request

   GET /tips/2718281828459 HTTP/1.1
   Host: alto.example.com
   Accept: application/alto-tips+json,
           application/alto-error+json

   Server -> client response:

   HTTP/1.1 200 OK
   Content-Type: application/alto-tips+json
   Content-Length: [TBD]

   { "uq":
      [
        {“seq”:        101,
         "media-type": "application/alto-costmap+json",
         “tag”:        "a10ce8b059740b0b2e3f8eb1d4785acd42231bfe" },
        {“seq”:        102,
         "media-type": "application/merge-patch+json",
         “tag”:        "cdf0222x59740b0b2e3f8eb1d4785acd42231bfe" },
        {“seq”:        103,
         "media-type": "application/merge-patch+json",
         “tag”:        "8eb1d4785acd42231bfecdf0222x59740b0b2e3f",
         "link":       "/tips/2718281828459/snapshot/2e3f" }
      ]
   }

          ]]></artwork>
      </section>
    </section>
    <!-- transport queue section -->

    <section anchor="altoh2uq" numbered="true" toc="default">
      <name>Transport Information: Incremental Updates Queue</name>
      <section anchor="altoh2uqops" numbered="true" toc="default">
        <name>Incremental Updates Queue Operations</name>
        <t>Among the CRUD operations, an incremental updates queue supports only the
          read operation: a client cannot create, update, or delete incremental updates queue directly---it is read only, and associated with transport queue automatically.</t>
        <t>Reads an incremental updates queue: A client reads the status of an incremental updates queue using the HTTP GET method: GET transport-queue-uri/uq, where the transport-queue-uri is
        the URI returned in the transport queue create method.
        </t>
        <section anchor="media-type" numbered="true" toc="default">
          <name>Media Type</name>
          <t>The media type of the incremental update queue resource is
 "application/alto-tipsqueue+json".</t>
        </section>
        <section anchor="http-method" numbered="true" toc="default">
          <name>HTTP Method</name>
          <t>The incremental update queue resource is requested using the HTTP GET method.</t>
        </section>
        <section anchor="resp" numbered="true" toc="default">
          <name>Response</name>
          <t>The response informs the client the backlog status, and potential direct links.
          Specifically, the response is encoded as a JSON object of type ALTOIncUpdateQueue
          </t>

          <artwork name="" type="" align="left" alt=""><![CDATA[
object {
  ALTOIncUpdate  uq<0..*>;
} ALTOIncUpdateQueue;
]]></artwork>
          <t>with field:</t>
          <dl>
            <dt>uq: </dt>
            <dd>
              <t>A queue of incremental updates.</t>
            </dd>
          </dl>

          <t>Each incremental update is encoded as a JSON object of type
ALTOIncUpdate</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
object {
    JSONNumber   seq;
    JSONString   media-type;
    JSONString   tag;
    [JSONString  link;]
} ALTOIncUpdate;
]]></artwork>
        <t>with fields:</t>
        <dl>
          <dt>seq:</dt>
          <dd><t>A required JSON integer indicating the sequence number of the incremental update. As JSON allows a large integer space, when the server reaches the largest integer, the server SHOULD close the incremental update queue. </t></dd>
          <dt>media-type:</dt>
          <dd><t>A required JSON string giving the type of the incremental update  (see ALTO/SSE).</t></dd>
          <dt>tag:</dt>
          <dd><t>A required JSON string which is defined the same way as the "tag" field of VersionTag (see Section 10.3 of [RFC7285]). </t></dd>
          <dt>link:</dt>
          <dd><t>An optional JSON string giving an optional link for a client to directly request a resource as a complete snapshot (not through incremental updates).</t></dd>
        </dl>
        <t>Note that the server determines the state (window of history and type of each update)
          in the incremental updates queue, as specified by [R4].</t>
        </section>
      </section>
      <section anchor="altoh2uqexamples" numbered="true" toc="default">
        <name>Examples</name>
        <t>Assume the same example in the preceding section. The client can check the status of the incremental updates queue of a transport queue from the same connection:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Client -> server request:

GET /tips/2718281828459/uq HTTP/1.1
Host: alto.example.com
Accept: application/alto-tipsqueue+json,
        application/alto-error+json

Server -> client response:

HTTP/1.1 200 OK
Content-Type: application/alto-tipsqueue+json
Content-Length: [TBD]

 {
    "uq": [
      {“seq”:        101,
       "media-type": "application/alto-costmap+json",
       “tag”:        "a10ce8b059740b0b2e3f8eb1d4785acd42231bfe" },
      {“seq”:        102,
       "media-type": "application/merge-patch+json",
       “tag”:        "cdf0222x59740b0b2e3f8eb1d4785acd42231bfe" },
      {“seq”:        103,
       "media-type": "application/merge-patch+json",
       “tag”:        "8eb1d4785acd42231bfecdf0222x59740b0b2e3f",
       "link":       "/tips/2718281828459/snapshot/2e3f"}
    ]
 }
          ]]></artwork>
      </section>
    </section>
    <!-- Incremental Update Log Queue Section -->

    <section anchor="altoh2updates" numbered="true" toc="default">
      <name>Information Resource Information: Client Pull Individual Updates</name>
      <section anchor="altoh2updatesops" numbered="true" toc="default">
        <name>Individual Updates Operations</name>
        <t>A client can only read an individual update: A client uses the HTTP GET method on the incremental updates queue concatenated by a sequence number to pull an individual update.The server push model, however,  depends on HTTP specific version.</t>

      </section>
      <section anchor="altoh2updatesexamples" numbered="true" toc="default">
        <name>Examples</name>
        <t>The first example is a client pull example, in which the client directly requests an
          individual update. </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
   Client -> server request:

   GET /tips/2718281828459/uq/101 HTTP/1.1
   Host: alto.example.com
   Accept: application/alto-costmap+json, application/alto-error+json

   Server -> client response:

   HTTP/1.1 200 OK
   Content-Type: application/alto-costmap+json
   Content-Length: [TBD]

   {
     "meta" : {
        "dependent-vtags" : [{
           "resource-id": "my-network-map",
           "tag": "da65eca2eb7a10ce8b059740b0b2e3f8eb1d4785"
         }],
        "cost-type" : {
          "cost-mode"  : "numerical",
          "cost-metric": "routingcost"
        },
        "vtag": {
          "resource-id" : "my-routingcost-map",
          "tag" : "3ee2cb7e8d63d9fab71b9b34cbf764436315542e"
        }
     },
     "cost-map" : {
       "PID1": { "PID1": 1,  "PID2": 5,  "PID3": 10 },
       "PID2": { "PID1": 5,  "PID2": 1,  "PID3": 15 },
       "PID3": { "PID1": 20, "PID2": 15  }
     }
  }

          ]]></artwork>
        <t>Note from the transport queue state that the 103 message has an OPTIONAL link to a complete snapshot, which a client can request.</t>

        <t>One important design is that the "seq" must be sequentially increasing. Hence, by issuing a request on the next sequence number, the client realizes long pull.</t>

      </section>
      <!-- individual example -->

    </section>
    <!-- individual -->

    <section anchor="altoh2streams" numbered="true" toc="default">
      <name>TIPS Stream Management</name>
      <section anchor="altoh2streamsobj" numbered="true" toc="default">
        <name>Objectives</name>
        <t>A main benefit of ALTO TIPS is to take advantage of concurrent streams in newer versions of HTTP (HTTP/2 and later). In particular, the objectives of ALTO TIPS include: </t>
        <ul spacing="normal">
          <li>Allow stream concurrency to reduce latency</li>
          <li>Minimize the number of streams created</li>
          <li>Enforce dependency among streams (so that if A depends on B, then A should be sent after B)</li>
          <li>Encode dependency to enforce semantics (correctness)</li>
        </ul>
        <t>To realize the objectives, ALTO New Transport MUST satisfy the following stream management requirements in all 4 phases specified in the next 4 subsections.</t>
      </section>
      <section anchor="altoh2streamcreatetq" numbered="true" toc="default">
        <name>Client -&gt; Server [Create Transport Queue]</name>
        <t>Each request to create a transport queue (POST) MUST choose a new client selected stream ID (SID_tq), with the following requirements:</t>
        <ul spacing="normal">
          <li>Stream Identifier of the frame is a new client-selected stream ID; Stream Dependency in HEADERS is 0 (connection) for an independent resource, the other transport queue if the dependency is known.</li>
          <li>Invariant: Stream keeps open until close or error.</li>
        </ul>
      </section>
      <section anchor="altoh2streamclosetq" numbered="true" toc="default">
        <name>Client -&gt; Server [Close Transport Queue]</name>
        <t>DELETE to close a transport queue (SID_tq) MUST be sent in SID_tq, with the following requirements:</t>
        <ul spacing="normal">
          <li>Stream Identifier of the frame is SID_tq, and Stream Dependency in HEADER is 0
              (connection), so that a client cannot close a different stream.</li>
          <li>HEADERS indicates END_STREAM; server response SHOULD close the stream.</li>
        </ul>
      </section>
      <section anchor="altoh2streamread" numbered="true" toc="default">
        <name>Client -&gt; Server [Request on Data of a Transport Queue on Stream SID_tq]</name>
        <t>The request and response MUST satisfy the following requirements:</t>
        <ul spacing="normal">
          <li>The Stream Identifier of the frame is a new client-selected stream ID, and Stream Dependency in HEADERs MUST be SID_tq, so that a client cannot issue request on a closed transport queue;</li>
          <li>Both the request and the response MUST indicate END_STREAM.</li>
        </ul>
      </section>
      <section anchor="altoh2streamconc" numbered="true" toc="default">
        <name>Concurrency Management</name>
        <t/>
        <ul spacing="normal">
          <li>ALTO New Transport must allow concurrency control.</li>
          <li>From the client to the server direction, there MUST be one stream for each open transport
              queue, and hence a client can always close a transport queue (which it uses to open the stream) and hence can also close, without the risk of deadlock.</li>
        </ul>
      </section>
    </section>
    <section anchor="altoh2ird" numbered="true" toc="default">
      <name>ALTO TIPS Resource Directory (IRD)</name>
      <t>Extending the IRD example in Section 8.1 of <xref target="RFC8895" format="default"/>, below is the IRD of an ALTO server supporting ALTO base protocol, ALTO/SSE, and ALTO TIPS.</t>
      <t>In particular, </t>
      <artwork name="" type="" align="left" alt=""><![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-filtered-cost-map": {
    "uri": "https://alto.example.com/costmap/filtered/constraints",
    "media-type": "application/alto-costmap+json",
    "accepts": "application/alto-costmapfilter+json",
    "uses": ["my-networkmap"],
    "capabilities": {
      "cost-type-names": ["num-routingcost", "num-hopcount"],
      "cost-constraints": true
    }
  },
  "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
    }
  },
  "my-props": {
    "uri": "https://alto.example.com/properties",
    "media-type": "application/alto-endpointprops+json",
    "accepts": "application/alto-endpointpropparams+json",
    "capabilities": {
      "prop-types": ["priv:ietf-bandwidth"]
    }
  },
  "my-pv": {
    "uri": "https://alto.example.com/endpointcost/pv",
    "media-type": "multipart/related;
                   type=application/alto-endpointcost+json",
    "accepts": "application/alto-endpointcostparams+json",
    "capabilities": {
      "cost-type-names": [ "path-vector" ],
      "ane-properties": [ "maxresbw", "persistent-entities" ]
    }
  },
  "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-new": {
    "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"
      },
      "support-stream-control": true
    }
  },

  "update-my-props": {
    "uri": "https://alto.example.com/updates/properties",
    "media-type": "text/event-stream",
    "uses": [ "my-props" ],
    "accepts": "application/alto-updatestreamparams+json",
    "capabilities": {
      "incremental-change-media-types": {
        "my-props": "application/merge-patch+json"
      },
      "support-stream-control": true
    }
  },
  "update-my-pv": {
    "uri": "https://alto.example.com/updates/pv",
    "media-type": "text/event-stream",
    "uses": [ "my-pv" ],
    "accepts": "application/alto-updatestreamparams+json",
    "capabilities": {
      "incremental-change-media-types": {
        "my-pv": "application/merge-patch+json"
      },
      "support-stream-control": true
    }
  }
  ]]></artwork>
      <t>Note that it is straightforward for an ALTO sever 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-h2" provides an ALTO TIPS based connection, and this is indicated by the media-type "application/alto-tips+json". The client can send in a sequence of control requests using media type application/alto-updatestreamparams+json. The server creates HTTP/2 streams and pushes updates to the client.</t>
    </section>
    <section anchor="secconsider" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>The properties defined in this document present no security
      considerations beyond those in Section 15 of the base ALTO specification
      <xref target="RFC7285" format="default"/> and in Section 10 of the ALTO SSE specification <xref target="RFC8895" format="default"/>.</t>
    </section>
    <section anchor="ianaconsider" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>IANA will need to register the following media type under ALTO registry as defined in <xref target="RFC7285" format="default"/>:
      </t>
      <ul spacing="normal">
        <li>application/alto-tips+json: as described in <xref target="tips-resp" format="default"/>;</li>
        <li>application/alto-tipsparams+json: as described in <xref target="tips-accept" format="default"/>;</li>
        <li>application/alto-tipsqueue+json: as described in <xref target="uq-resp" format="default"/></li>
      </ul>
      <section numbered="true" toc="default">
        <name>application/alto-tips+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>application</dd>
          <dt>Subtype name:</dt>
          <dd>alto-tips+json</dd>
          <dt>Required parameters:</dt>
          <dd>N/A</dd>
          <dt>Optional parameters:</dt>
          <dd>N/A</dd>
          <dt>Encoding considerations:</dt>
          <dd>Encoding considerations are identical to those specified for the
          "application/json" media type. See <xref target="RFC8259" format="default"/>.
          </dd>
          <dt>Security considerations:</dt>
          <dd>Security considerations relating to the generation and consumption
          of ALTO Protocol messages are discussed in Section 10 of
          <xref target="RFC8895"/> and Section 15 of <xref target="RFC7285"/>.
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>This document specifies format of conforming messages and the
          interpretation thereof.
          </dd>
          <dt>Published specification:</dt>
          <dd><xref target="tips-resp"/> of this document.</dd>
          <dt>Applications that use this media type:</dt>
          <dd>ALTO servers and ALTO clients either stand alone or are embedded
          within other applications.</dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>N/A</dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/></t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>This document uses the media type to refer to protocol messages
              and thus does not require a file extension.</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>See Authors' Addresses section.</dd>
          <dt>Intended usage:</dt>
          <dd>COMMON</dd>
          <dt>Restrictions on usage:</dt>
          <dd>N/A</dd>
          <dt>Author:</dt>
          <dd>See Authors' Addresses section.</dd>
          <dt>Change controller:</dt>
          <dd>Internet Engineering Task Force (mailto:iesg@ietf.org).</dd>
        </dl>
      </section>
      <section numbered="true" toc="default">
        <name>application/alto-tipsparams+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>application</dd>
          <dt>Subtype name:</dt>
          <dd>alto-tipsparams+json</dd>
          <dt>Required parameters:</dt>
          <dd>N/A</dd>
          <dt>Optional parameters:</dt>
          <dd>N/A</dd>
          <dt>Encoding considerations:</dt>
          <dd>Encoding considerations are identical to those specified for the
          "application/json" media type. See <xref target="RFC8259" format="default"/>.
          </dd>
          <dt>Security considerations:</dt>
          <dd>Security considerations relating to the generation and consumption
          of ALTO Protocol messages are discussed in Section 10 of
          <xref target="RFC8895"/> and Section 15 of <xref target="RFC7285"/>.
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>This document specifies format of conforming messages and the
          interpretation thereof.
          </dd>
          <dt>Published specification:</dt>
          <dd><xref target="tips-accept"/> of this document.</dd>
          <dt>Applications that use this media type:</dt>
          <dd>ALTO servers and ALTO clients either stand alone or are embedded
          within other applications.</dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>N/A</dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/></t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>This document uses the media type to refer to protocol messages
              and thus does not require a file extension.</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>See Authors' Addresses section.</dd>
          <dt>Intended usage:</dt>
          <dd>COMMON</dd>
          <dt>Restrictions on usage:</dt>
          <dd>N/A</dd>
          <dt>Author:</dt>
          <dd>See Authors' Addresses section.</dd>
          <dt>Change controller:</dt>
          <dd>Internet Engineering Task Force (mailto:iesg@ietf.org).</dd>
        </dl>
      </section>
      <section numbered="true" toc="default">
        <name>application/alto-tipsqueue+json Media Type</name>
        <dl>
          <dt>Type name:</dt>
          <dd>application</dd>
          <dt>Subtype name:</dt>
          <dd>alto-tipsqueue+json</dd>
          <dt>Required parameters:</dt>
          <dd>N/A</dd>
          <dt>Optional parameters:</dt>
          <dd>N/A</dd>
          <dt>Encoding considerations:</dt>
          <dd>Encoding considerations are identical to those specified for the
          "application/json" media type. See <xref target="RFC8259" format="default"/>.
          </dd>
          <dt>Security considerations:</dt>
          <dd>Security considerations relating to the generation and consumption
          of ALTO Protocol messages are discussed in Section 10 of
          <xref target="RFC8895"/> and Section 15 of <xref target="RFC7285"/>.
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>This document specifies format of conforming messages and the
          interpretation thereof.
          </dd>
          <dt>Published specification:</dt>
          <dd><xref target="uq-resp"/> of this document.</dd>
          <dt>Applications that use this media type:</dt>
          <dd>ALTO servers and ALTO clients either stand alone or are embedded
          within other applications.</dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>N/A</dd>
          <dt>Additional information:</dt>
          <dd>
            <t><br/></t>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>N/A</dd>
              <dt>Magic number(s):</dt>
              <dd>N/A</dd>
              <dt>File extension(s):</dt>
              <dd>This document uses the media type to refer to protocol messages
              and thus does not require a file extension.</dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>N/A</dd>
            </dl>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>See Authors' Addresses section.</dd>
          <dt>Intended usage:</dt>
          <dd>COMMON</dd>
          <dt>Restrictions on usage:</dt>
          <dd>N/A</dd>
          <dt>Author:</dt>
          <dd>See Authors' Addresses section.</dd>
          <dt>Change controller:</dt>
          <dd>Internet Engineering Task Force (mailto:iesg@ietf.org).</dd>
        </dl>
      </section>
    </section>
    <section numbered="true" toc="default">
      <name>Acknowledgments</name>
      <t>The authors of this document would also like to thank many
      for the reviews and comments.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization/>
            </author>
            <date year="1997" month="March"/>
            <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>
        <!-- requirements words -->
    <reference anchor="RFC7230" target="https://www.rfc-editor.org/info/rfc7230" xml:base="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7230.xml">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
            <author initials="R." surname="Fielding" fullname="R. Fielding" role="editor">
              <organization/>
            </author>
            <author initials="J." surname="Reschke" fullname="J. Reschke" role="editor">
              <organization/>
            </author>
            <date year="2014" month="June"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7230"/>
          <seriesInfo name="DOI" value="10.17487/RFC7230"/>
        </reference>
        <!-- HTTP/1.1 -->
    <reference anchor="RFC7285" target="https://www.rfc-editor.org/info/rfc7285" xml:base="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7285.xml">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Protocol</title>
            <author initials="R." surname="Alimi" fullname="R. Alimi" role="editor">
              <organization/>
            </author>
            <author initials="R." surname="Penno" fullname="R. Penno" role="editor">
              <organization/>
            </author>
            <author initials="Y." surname="Yang" fullname="Y. Yang" role="editor">
              <organization/>
            </author>
            <author initials="S." surname="Kiesel" fullname="S. Kiesel">
              <organization/>
            </author>
            <author initials="S." surname="Previdi" fullname="S. Previdi">
              <organization/>
            </author>
            <author initials="W." surname="Roome" fullname="W. Roome">
              <organization/>
            </author>
            <author initials="S." surname="Shalunov" fullname="S. Shalunov">
              <organization/>
            </author>
            <author initials="R." surname="Woundy" fullname="R. Woundy">
              <organization/>
            </author>
            <date year="2014" month="September"/>
            <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>
        <!-- alto base -->
<reference anchor="RFC8259" target="https://www.rfc-editor.org/info/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"/>
  <format target="https://www.rfc-editor.org/info/rfc8259" type="TXT"/>
</reference>
    <reference target="https://www.rfc-editor.org/info/rfc7540" anchor="RFC7540" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7540.xml">
          <front>
            <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
            <author fullname="M. Belshe" surname="Belshe" initials="M"/>
            <author fullname="R. Peon" surname="Peon" initials="R"/>
            <author fullname="M. Thomson" surname="Thomson" initials="M"/>
            <date year="2015" month="May"/>
            <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 perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection. It also introduces unsolicited push of representations from servers to clients.</t>
              <t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax. HTTP's existing semantics remain unchanged.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7540"/>
          <seriesInfo name="DOI" value="10.17487/RFC7540"/>
        </reference>
        <!-- HTTP/2 -->
    <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization/>
            </author>
            <date year="2017" month="May"/>
            <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>
        <!-- requirements words -->
    <reference anchor="RFC8895" target="https://www.rfc-editor.org/info/rfc8895" xml:base="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8895.xml">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Incremental Updates Using Server-Sent Events (SSE)</title>
            <author initials="W." surname="Roome" fullname="W. Roome">
              <organization/>
            </author>
            <author initials="Y." surname="Yang" fullname="Y. Yang">
              <organization/>
            </author>
            <date year="2020" month="November"/>
            <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>
        <!-- ALTO SSE -->
    </references>
      <references>
        <name>Informative References</name>

          <reference anchor="draft-schott-alto-new-transport-push" target="https://datatracker.ietf.org/doc/draft-schott-alto-new-transport-push/">
          <front>
            <title>ALTO New Transport: Server Push</title>
            <author initials="R." surname="Schott" fullname="R. Schott">
              <organization/>
            </author>
            <author initials="Y." surname="Yang" fullname="Y. Yang">
              <organization/>
            </author>
            <date year="2022" month="October"/>
          </front>
          <seriesInfo name="Internet Draft" value="ID"/>
        </reference>

        <reference anchor="RFC7971" target="https://www.rfc-editor.org/info/rfc7971" xml:base="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7971.xml">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Deployment Considerations</title>
            <author initials="M." surname="Stiemerling" fullname="M. Stiemerling">
              <organization/>
            </author>
            <author initials="S." surname="Kiesel" fullname="S. Kiesel">
              <organization/>
            </author>
            <author initials="M." surname="Scharf" fullname="M. Scharf">
              <organization/>
            </author>
            <author initials="H." surname="Seidel" fullname="H. Seidel">
              <organization/>
            </author>
            <author initials="S." surname="Previdi" fullname="S. Previdi">
              <organization/>
            </author>
            <date year="2016" month="October"/>
            <abstract>
              <t>Many Internet applications are used to access resources such as pieces of information or server processes that are available in several equivalent replicas on different hosts.  This includes, but is not limited to, peer-to-peer file sharing applications.  The goal of Application-Layer Traffic Optimization (ALTO) is to provide guidance to applications that have to select one or several hosts from a set of candidates capable of providing a desired resource. This memo discusses deployment-related issues of ALTO.  It addresses different use cases of ALTO such as peer-to-peer file sharing and Content Delivery Networks (CDNs) and presents corresponding examples. The document also includes recommendations for network administrators and application designers planning to deploy ALTO, such as recommendations on how to generate ALTO map information.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7971"/>
          <seriesInfo name="DOI" value="10.17487/RFC7971"/>
        </reference>
        <!-- requirements -->

    </references>
    </references>
    <section numbered="true" toc="default">
      <name>Outlook to ALTO with HTTP/3</name>
      <t>This draft is focusing on HTTP/2 enhancement of the ALTO protocol and the
design takes advantage of HTTP/2 design features such as parallel transfer
and respects HTTP/2 semantics (e.g., PUSH_PROMISE). Since QUIC and HTTP/3
respectively are coming up for various protocols on the Internet it is
understandable that the question arises, if ATLO could also take
advantage of the advantages of HTTP/3. QUIC can be seen as a replacement
for TCP+TLS+HTTP2. HTTP/3 bases on the QUIC transport protocol and uses
UDP instead of a TCP connection.</t>
      <t>QUIC has been developed by the IETF QUIC Working Group with the
following goals:</t>
      <ul spacing="normal">
        <li>Minimizing connection establishment and overall transport latency for applications, starting with HTTP/2</li>
        <li>Providing multiplexing without head-of-line blocking</li>
        <li>Requiring only changes to path endpoints to enable deployment</li>
        <li>Enabling multipath and forward error correction extensions</li>
        <li>Providing always-secure transport, using TLS 1.3 by default</li>
      </ul>
      <t>If HTTP/3 is not supported, it automatically runs on HTTP/2.
The prerequisite for HTTP/3 is that both client and server support it.</t>
      <t>The basic assumption is that an implementation that runs on HTTP/2 should
also run-on HTTP/3. This should be transparent.
HTTP/3 uses "well known port" UDP 443 analogous to TCP 443.
The network between client and server must not filter HTTP/3.</t>
      <t>Since many applications still using HTTP/2 it is mandatory for ALTO
to support this protocol first. This ensures compatibility.
Therefore, this document describes the update of ALTO from HTTP/1.x
to HTTP/2. The usage of HTTP/3 will be described in a separate
document so that compatibility of ALTO with HTTP/3 will be ensured
in a later stage.</t>
    </section>
  </back>
</rfc>
