<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-ietf-alto-new-transport-22" number="9569" submissionType="IETF" category="std" consensus="true" updates="" obsoletes="" tocDepth="3" tocInclude="true" sortRefs="true" symRefs="true" xml:lang="en" prepTime="2024-09-10T22:19:27" indexInclude="true" scripts="Common,Latin">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-alto-new-transport-22" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc9569" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="ALTO TIPS">The Application-Layer Traffic Optimization (ALTO) Transport Information Publication Service (TIPS)</title>
    <seriesInfo name="RFC" value="9569" stream="IETF"/>
    <author initials="K." surname="Gao" fullname="Kai Gao">
      <organization showOnFrontPage="true">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 showOnFrontPage="true">Deutsche Telekom</organization>
      <address>
        <postal>
          <street>Deutsche-Telekom-Allee 9</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 showOnFrontPage="true">Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <code>06511</code>
          <region>CT</region>
          <country>United States of America</country>
        </postal>
        <email>yry@cs.yale.edu</email>
      </address>
    </author>
    <author initials="L." surname="Delwiche" fullname="Lauren Delwiche">
      <organization showOnFrontPage="true">Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <region>CT</region>
          <code>06511</code>
          <country>United States of America</country>
        </postal>
        <email>lauren.delwiche@yale.edu</email>
      </address>
    </author>
    <author initials="L." surname="Keller" fullname="Lachlan Keller">
      <organization showOnFrontPage="true">Yale University</organization>
      <address>
        <postal>
          <street>51 Prospect Street</street>
          <city>New Haven</city>
          <region>CT</region>
          <code>06511</code>
          <country>United States of America</country>
        </postal>
        <email>lachlan.keller@aya.yale.edu</email>
      </address>
    </author>
    <date month="09" year="2024"/>
    <area>Transport Area</area>
    <workgroup>ALTO</workgroup>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">"Application-Layer Traffic Optimization (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 indent="0" pn="section-abstract-2">RFC 8895, which describes ALTO incremental updates using Server-Sent Events (SSE),
      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 indent="0" pn="section-abstract-3">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 and concurrently (in a non-blocking manner) request (or pull)
      specific incremental updates using HTTP/2 or HTTP/3, while still
      functioning for HTTP/1.1.</t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc9569" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2024 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Revised BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Revised BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-requirements-language">Requirements Language</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.2">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.2.1"><xref derivedContent="1.2" format="counter" sectionFormat="of" target="section-1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-notations">Notations</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-overview">TIPS Overview</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.2.2">
              <li pn="section-toc.1-1.2.2.1">
                <t indent="0" pn="section-toc.1-1.2.2.1.1"><xref derivedContent="2.1" format="counter" sectionFormat="of" target="section-2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-transport-requirements">Transport Requirements</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.2">
                <t indent="0" pn="section-toc.1-1.2.2.2.1"><xref derivedContent="2.2" format="counter" sectionFormat="of" target="section-2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-terminology">TIPS Terminology</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-updates-graph">TIPS Updates Graph</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t indent="0" pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-basic-data-model-of-an-upda">Basic Data Model of an Updates Graph</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-updates-graph-modification-">Updates Graph Modification Invariants</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-workflow-and-resource-">TIPS Workflow and Resource Location Schema</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-workflow">Workflow</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-resource-location-schema">Resource Location Schema</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-information-resource-d">TIPS Information Resource Directory (IRD) Announcement</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-media-type">Media Type</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.2">
                <t indent="0" pn="section-toc.1-1.5.2.2.1"><xref derivedContent="5.2" format="counter" sectionFormat="of" target="section-5.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-capabilities">Capabilities</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.3">
                <t indent="0" pn="section-toc.1-1.5.2.3.1"><xref derivedContent="5.3" format="counter" sectionFormat="of" target="section-5.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-uses">Uses</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.4">
                <t indent="0" pn="section-toc.1-1.5.2.4.1"><xref derivedContent="5.4" format="counter" sectionFormat="of" target="section-5.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-an-example">An Example</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-management">TIPS Management</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t indent="0" pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-open-request">Open Request</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t indent="0" pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-open-response">Open Response</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.3">
                <t indent="0" pn="section-toc.1-1.6.2.3.1"><xref derivedContent="6.3" format="counter" sectionFormat="of" target="section-6.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-open-example">Open Example</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2.3.2">
                  <li pn="section-toc.1-1.6.2.3.2.1">
                    <t indent="0" pn="section-toc.1-1.6.2.3.2.1.1"><xref derivedContent="6.3.1" format="counter" sectionFormat="of" target="section-6.3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-basic-example">Basic Example</xref></t>
                  </li>
                  <li pn="section-toc.1-1.6.2.3.2.2">
                    <t indent="0" pn="section-toc.1-1.6.2.3.2.2.1"><xref derivedContent="6.3.2" format="counter" sectionFormat="of" target="section-6.3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-using-digest-authen">Example Using Digest Authentication</xref></t>
                  </li>
                  <li pn="section-toc.1-1.6.2.3.2.3">
                    <t indent="0" pn="section-toc.1-1.6.2.3.2.3.1"><xref derivedContent="6.3.3" format="counter" sectionFormat="of" target="section-6.3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-using-alto-sse">Example Using ALTO/SSE</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-data-transfers-client-">TIPS Data Transfers - Client Pull</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent="7.1" format="counter" sectionFormat="of" target="section-7.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-request">Request</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent="7.2" format="counter" sectionFormat="of" target="section-7.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-response">Response</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.3">
                <t indent="0" pn="section-toc.1-1.7.2.3.1"><xref derivedContent="7.3" format="counter" sectionFormat="of" target="section-7.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example">Example</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.4">
                <t indent="0" pn="section-toc.1-1.7.2.4.1"><xref derivedContent="7.4" format="counter" sectionFormat="of" target="section-7.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-new-next-edge-recommendatio">New Next Edge Recommendation</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2.4.2">
                  <li pn="section-toc.1-1.7.2.4.2.1">
                    <t indent="0" pn="section-toc.1-1.7.2.4.2.1.1"><xref derivedContent="7.4.1" format="counter" sectionFormat="of" target="section-7.4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-request-2">Request</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.4.2.2">
                    <t indent="0" pn="section-toc.1-1.7.2.4.2.2.1"><xref derivedContent="7.4.2" format="counter" sectionFormat="of" target="section-7.4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-response-2">Response</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.4.2.3">
                    <t indent="0" pn="section-toc.1-1.7.2.4.2.3.1"><xref derivedContent="7.4.3" format="counter" sectionFormat="of" target="section-7.4.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-2">Example</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-operation-and-processing-co">Operation and Processing Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.8.2">
              <li pn="section-toc.1-1.8.2.1">
                <t indent="0" pn="section-toc.1-1.8.2.1.1"><xref derivedContent="8.1" format="counter" sectionFormat="of" target="section-8.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-considerations-for-load-bal">Considerations for Load Balancing</xref></t>
              </li>
              <li pn="section-toc.1-1.8.2.2">
                <t indent="0" pn="section-toc.1-1.8.2.2.1"><xref derivedContent="8.2" format="counter" sectionFormat="of" target="section-8.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-considerations-for-cross-re">Considerations for Cross-Resource Dependency Scheduling</xref></t>
              </li>
              <li pn="section-toc.1-1.8.2.3">
                <t indent="0" pn="section-toc.1-1.8.2.3.1"><xref derivedContent="8.3" format="counter" sectionFormat="of" target="section-8.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-considerations-for-managing">Considerations for Managing Shared TIPS Views</xref></t>
              </li>
              <li pn="section-toc.1-1.8.2.4">
                <t indent="0" pn="section-toc.1-1.8.2.4.1"><xref derivedContent="8.4" format="counter" sectionFormat="of" target="section-8.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-considerations-for-offering">Considerations for Offering Shortcut Incremental Updates</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.9.2">
              <li pn="section-toc.1-1.9.2.1">
                <t indent="0" pn="section-toc.1-1.9.2.1.1"><xref derivedContent="9.1" format="counter" sectionFormat="of" target="section-9.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-tips-denial-of-service-atta">TIPS: Denial-of-Service Attacks</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.2">
                <t indent="0" pn="section-toc.1-1.9.2.2.1"><xref derivedContent="9.2" format="counter" sectionFormat="of" target="section-9.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-alto-client-update-overload">ALTO Client: Update Overloading or Instability</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" format="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.10.2">
              <li pn="section-toc.1-1.10.2.1">
                <t indent="0" pn="section-toc.1-1.10.2.1.1"><xref derivedContent="10.1" format="counter" sectionFormat="of" target="section-10.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-application-alto-tipsjson-m">application/alto-tips+json Media Type</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.2">
                <t indent="0" pn="section-toc.1-1.10.2.2.1"><xref derivedContent="10.2" format="counter" sectionFormat="of" target="section-10.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-application-alto-tipsparams">application/alto-tipsparams+json Media Type</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="11" format="counter" sectionFormat="of" target="section-11"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.11.2">
              <li pn="section-toc.1-1.11.2.1">
                <t indent="0" pn="section-toc.1-1.11.2.1.1"><xref derivedContent="11.1" format="counter" sectionFormat="of" target="section-11.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.11.2.2">
                <t indent="0" pn="section-toc.1-1.11.2.2.1"><xref derivedContent="11.2" format="counter" sectionFormat="of" target="section-11.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.12">
            <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-a-high-level-deployment-mod">A High-Level Deployment Model</xref></t>
          </li>
          <li pn="section-toc.1-1.13">
            <t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="Appendix B" format="default" sectionFormat="of" target="section-appendix.b"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-conformance-with-building-p">Conformance with "Building Protocols with HTTP" (RFC 9205) Best Current Practices</xref></t>
          </li>
          <li pn="section-toc.1-1.14">
            <t indent="0" pn="section-toc.1-1.14.1"><xref derivedContent="Appendix C" format="default" sectionFormat="of" target="section-appendix.c"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-push-mode-tips-using-http-s">Push-Mode TIPS Using HTTP Server Push</xref></t>
          </li>
          <li pn="section-toc.1-1.15">
            <t indent="0" pn="section-toc.1-1.15.1"><xref derivedContent="Appendix D" format="default" sectionFormat="of" target="section-appendix.d"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-persistent-http-connections">Persistent HTTP Connections</xref></t>
          </li>
          <li pn="section-toc.1-1.16">
            <t indent="0" pn="section-toc.1-1.16.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.e"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgments">Acknowledgments</xref></t>
          </li>
          <li pn="section-toc.1-1.17">
            <t indent="0" pn="section-toc.1-1.17.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.f"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="intro" numbered="true" removeInRFC="false" toc="include" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">The Application-Layer Traffic Optimization (ALTO) protocol provides means for network
applications to obtain network status information. So far, the ALTO information
can be transported in two ways:</t>
      <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-1-2"><li pn="section-1-2.1" derivedCounter="1.">Using the ALTO base protocol <xref target="RFC7285" format="default" sectionFormat="of" derivedContent="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 pn="section-1-2.2" derivedCounter="2.">Using ALTO incremental updates using Server-Sent Events (ALTO/SSE) <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/>;
this method 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 indent="0" pn="section-1-3">Both protocols are designed for HTTP/1.1 <xref target="RFC9112" format="default" sectionFormat="of" derivedContent="RFC9112"/>. While they still work with HTTP/2 <xref target="RFC9113" format="default" sectionFormat="of" derivedContent="RFC9113"/> and
HTTP/3 <xref target="RFC9114" format="default" sectionFormat="of" derivedContent="RFC9114"/>, ALTO and ALTO/SSE cannot take full advantage of new features offered by HTTP/2 and HTTP/3.</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-1-4">
        <li pn="section-1-4.1">First, consider the ALTO base protocol, which is designed to transfer only
complete information resources. A client can run the base protocol on top of
HTTP/2 or HTTP/3 to request multiple information resources in concurrent
streams, but each request must be for a complete information resource: there is
no capability for the server to transmit incremental updates. Hence, there can be a large
overhead when the client already has an information resource and then there are
small changes to the resource.</li>
        <li pn="section-1-4.2">Next, consider ALTO/SSE <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="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 indent="0" pn="section-1-5">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
HTTP/2 or HTTP/3, while still functioning for HTTP/1.1.</t>
      <t indent="0" pn="section-1-6">While both ALTO/SSE <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/> and TIPS can transport incremental updates of
ALTO information resources to clients, they have different design goals. The
TIPS extension enables more scalable and robust distribution of incremental
updates but is missing the session management and built-in server push
capabilities of ALTO/SSE. From the performance perspective, TIPS is optimizing
throughput by leveraging concurrent and out-of-order transport of data, while
ALTO/SSE is optimizing latency as new events can be immediately transferred to
the clients without waiting for another round of communication when there are
multiple updates. Thus, we do not see TIPS as a replacement for ALTO/SSE, but as a complement
to it. One example of combining these two extensions is shown in
<xref target="tips-sse" format="default" sectionFormat="of" derivedContent="Section 6.3.3"/>.</t>
      <t indent="0" pn="section-1-7">Note that future extensions may leverage server push, a feature of HTTP/2
<xref target="RFC9113" format="default" sectionFormat="of" derivedContent="RFC9113"/> and HTTP/3 <xref target="RFC9114" format="default" sectionFormat="of" derivedContent="RFC9114"/>, as an alternative of SSE. We discuss why
this alternative design is not ready at the time of writing in <xref target="push" format="default" sectionFormat="of" derivedContent="Appendix C"/>.</t>
      <t indent="0" pn="section-1-8">Specifically, this document specifies:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-1-9">
        <li pn="section-1-9.1">Extensions to the ALTO Protocol for dynamic subscription and efficient
uniform update delivery of an incrementally changing network information
resource.</li>
        <li pn="section-1-9.2">A new resource type that indicates the TIPS updates graph model for a
resource.</li>
        <li pn="section-1-9.3">URI patterns to fetch the snapshots or incremental updates.</li>
      </ul>
      <t indent="0" pn="section-1-10">Some operational complexities that must be taken into consideration when
implementing this extension are discussed in <xref target="ops-considerations" format="default" sectionFormat="of" derivedContent="Section 8"/>: these include
load balancing in <xref target="load-balancing" format="default" sectionFormat="of" derivedContent="Section 8.1"/> and fetching and processing incremental updates
of dependent resources in <xref target="cross-sched" format="default" sectionFormat="of" derivedContent="Section 8.2"/>.</t>
      <t indent="0" pn="section-1-11"><xref target="sec-bcp-http" format="default" sectionFormat="of" derivedContent="Appendix B"/> discusses to what extent the TIPS design adheres to the best
current practices for building protocols with HTTP <xref target="RFC9205" format="default" sectionFormat="of" derivedContent="RFC9205"/>.</t>
      <section anchor="requirements-language" numbered="true" removeInRFC="false" toc="include" pn="section-1.1">
        <name slugifiedName="name-requirements-language">Requirements Language</name>
        <t indent="0" pn="section-1.1-1">
    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" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/>
    when, and only when, they appear in all capitals, as shown here.
        </t>
      </section>
      <section anchor="notations" numbered="true" removeInRFC="false" toc="include" pn="section-1.2">
        <name slugifiedName="name-notations">Notations</name>
        <t indent="0" pn="section-1.2-1">This document uses the same syntax and notations as introduced in
<xref section="8.2" sectionFormat="of" target="RFC7285" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-8.2" derivedContent="RFC7285"/> to specify the extensions to existing ALTO resources and services.</t>
      </section>
    </section>
    <section anchor="overview" numbered="true" removeInRFC="false" toc="include" pn="section-2">
      <name slugifiedName="name-tips-overview">TIPS Overview</name>
      <section anchor="requirements" numbered="true" removeInRFC="false" toc="include" pn="section-2.1">
        <name slugifiedName="name-transport-requirements">Transport Requirements</name>
        <t indent="0" pn="section-2.1-1">The ALTO Protocol and its extensions support two transport mechanisms:</t>
        <ol indent="adaptive" spacing="normal" start="1" type="1" pn="section-2.1-2">
<li pn="section-2.1-2.1" derivedCounter="1.">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" format="default" sectionFormat="of" derivedContent="RFC7285"/>;</li>
          <li pn="section-2.1-2.2" derivedCounter="2.">A client can subscribe to incremental changes of one or multiple ALTO
resources using the incremental update extension <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/>, and a server pushes
the updates to the client through SSE.</li>
        </ol>
        <t indent="0" pn="section-2.1-3">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 indent="3" newline="false" spacing="normal" pn="section-2.1-4">
          <dt pn="section-2.1-4.1">Incremental updates:</dt>
          <dd pn="section-2.1-4.2">
            <t indent="0" pn="section-2.1-4.2.1">Incremental updates only maintain and transfer the "diff" upon changes. Thus,
it is more efficient than storing and transferring the full updates,
especially when the change of an ALTO resource is minor. The base protocol
does not support incremental updates and the current incremental update
mechanism in <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/> has limitations (as discussed below).</t>
          </dd>
          <dt pn="section-2.1-4.3">Concurrent, non-blocking update transmission:</dt>
          <dd pn="section-2.1-4.4">
            <t indent="0" pn="section-2.1-4.4.1">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. Unfortunately, the ALTO incremental update extension
<xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/> 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 pn="section-2.1-4.5">Long polling updates:</dt>
          <dd pn="section-2.1-4.6">
            <t indent="0" pn="section-2.1-4.6.1">Long polling updates can reduce the time to send the request, making it
possible to achieve sub-RTT transmission of ALTO incremental updates. In
<xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/>, this requirement is fulfilled using SSE and
is still desired in the new ALTO transport.</t>
          </dd>
          <dt pn="section-2.1-4.7">Backward compatibility:</dt>
          <dd pn="section-2.1-4.8">
            <t indent="0" pn="section-2.1-4.8.1">While some of the previous requirements are offered by HTTP/2 <xref target="RFC9113" format="default" sectionFormat="of" derivedContent="RFC9113"/> and
HTTP/3 <xref target="RFC9114" format="default" sectionFormat="of" derivedContent="RFC9114"/>, it is desired that the new ALTO 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 indent="0" pn="section-2.1-5">The new ALTO transport specified in this document satisfies all of the following design
requirements above by:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-2.1-6">
          <li pn="section-2.1-6.1">Reusing the data format introduced in <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/> that enables
incremental updates using JSON patches or merge patches.</li>
          <li pn="section-2.1-6.2">Introducing a unified data model to describe the
     changes (snapshots and incremental updates) of an ALTO resource,
     referred to as a "TIPS view".  In the data model, snapshots and
     incremental updates are indexed as individual HTTP resources
     following a unified naming convention, independent of the HTTP
     version.  Thus, these updates can be concurrently requested and be
     transferred in a non-blocking manner either by using multiple
     connections or leveraging multiplexed data transfer offered by
     HTTP/2 or HTTP/3.</li>
          <li pn="section-2.1-6.3">Basing the unified naming convention on a monotonically
     increasing sequence number, making it possible for a client to
     construct the URL of a future update and send a long polling
     request.</li>
          <li pn="section-2.1-6.4">Making the unified naming convention independent of the HTTP versions
     and able to operate atop HTTP/1.1, HTTP/2, or HTTP/3.</li>
        </ul>
        <t indent="0" pn="section-2.1-7">This document assumes the deployment model discussed in  <xref target="sec-dep-model" format="default" sectionFormat="of" derivedContent="Appendix A"/>.</t>
      </section>
      <section anchor="terminology" numbered="true" removeInRFC="false" toc="include" pn="section-2.2">
        <name slugifiedName="name-tips-terminology">TIPS Terminology</name>
        <t indent="0" pn="section-2.2-1">In addition to the terms defined in <xref target="RFC7285" format="default" sectionFormat="of" derivedContent="RFC7285"/>, this document uses the following terms:</t>
        <dl indent="3" newline="false" spacing="normal" pn="section-2.2-2">
          <dt pn="section-2.2-2.1">Transport Information Publication Service (TIPS):</dt>
          <dd pn="section-2.2-2.2">
            <t indent="0" pn="section-2.2-2.2.1">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 pn="section-2.2-2.3">Network information resource:</dt>
          <dd pn="section-2.2-2.4">
            <t indent="0" pn="section-2.2-2.4.1">A piece of retrievable information about network state, per <xref target="RFC7285" format="default" sectionFormat="of" derivedContent="RFC7285"/>.</t>
          </dd>
          <dt pn="section-2.2-2.5">TIPS view (tv):</dt>
          <dd pn="section-2.2-2.6">
            <t indent="0" pn="section-2.2-2.6.1">The container of incremental transport
information about the network information resource. The TIPS view has one
basic component, the updates graph (ug), but may include other transport
information.</t>
          </dd>
          <dt pn="section-2.2-2.7">Updates graph (ug):</dt>
          <dd pn="section-2.2-2.8">
            <t indent="0" pn="section-2.2-2.8.1">A directed, acyclic graph whose nodes represent the set of
            versions of an information resource and whose edges represent the
            set of update items to compute these versions. An ALTO map service
            (e.g., a cost map or a network map) may need only a single updates
            graph. A dynamic network information service (e.g., a filtered
            cost map) may create an updates graph (within a new TIPS view) for
            each unique request. The encoding of an updates graph is specified
            in <xref target="open-req" format="default" sectionFormat="of" derivedContent="Section 6.1"/>.</t>
          </dd>
          <dt pn="section-2.2-2.9">Version:</dt>
          <dd pn="section-2.2-2.10">
            <t indent="0" pn="section-2.2-2.10.1">The representation of 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". The version is encoded as a JSONNumber, as specified in <xref target="open-req" format="default" sectionFormat="of" derivedContent="Section 6.1"/>.</t>
          </dd>
          <dt pn="section-2.2-2.11">Start sequence number (&lt;start-seq&gt;):</dt>
          <dd pn="section-2.2-2.12">
            <t indent="0" pn="section-2.2-2.12.1">The smallest non-zero sequence number in an updates graph.</t>
          </dd>
          <dt pn="section-2.2-2.13">End sequence number (&lt;end-seq&gt;):</dt>
          <dd pn="section-2.2-2.14">
            <t indent="0" pn="section-2.2-2.14.1">The largest sequence number in an updates graph.</t>
          </dd>
          <dt pn="section-2.2-2.15">Snapshot:</dt>
          <dd pn="section-2.2-2.16">
            <t indent="0" pn="section-2.2-2.16.1">A full replacement of a resource that is contained within an updates graph.</t>
          </dd>
          <dt pn="section-2.2-2.17">Incremental update:</dt>
          <dd pn="section-2.2-2.18">
            <t indent="0" pn="section-2.2-2.18.1">A partial replacement of a resource contained within an
            updates graph, codified in this document as a JSON merge patch or
            a JSON patch. An incremental update is mandatory if the source
            version (i) and the target version (j) are consecutive (i.e., i + 1 =
            j); otherwise, it is optional (or a shortcut). 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 pn="section-2.2-2.19">Update item:</dt>
          <dd pn="section-2.2-2.20">
            <t indent="0" pn="section-2.2-2.20.1">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 to be 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 pn="section-2.2-2.21">ID#i-#j:</dt>
          <dd pn="section-2.2-2.22">
            <t indent="0" pn="section-2.2-2.22.1">Denotation of 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" align="left" suppress-title="false" pn="figure-1">
          <name slugifiedName="name-overview-of-alto-tips">Overview of ALTO TIPS</name>
          <artwork type="drawing" align="center" pn="section-2.2-3.1">
                                   +-------------+
    +-----------+ +--------------+ |  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 indent="0" pn="section-2.2-4"><xref target="fig-overview" format="default" sectionFormat="of" derivedContent="Figure 1"/> shows an example illustrating an overview of the ALTO TIPS
extension. The server provides TIPS for two information resources (#1
and #2) where #1 is an ALTO map service and #2 is a filterable
service. There are three ALTO clients (Client 1, Client 2, and Client 3) that are
connected to the ALTO server.</t>
        <t indent="0" pn="section-2.2-5">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" numbered="true" removeInRFC="false" toc="include" pn="section-3">
      <name slugifiedName="name-tips-updates-graph">TIPS Updates Graph</name>
      <t indent="0" pn="section-3-1">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" numbered="true" removeInRFC="false" toc="include" pn="section-3.1">
        <name slugifiedName="name-basic-data-model-of-an-upda">Basic Data Model of an Updates Graph</name>
        <t indent="0" pn="section-3.1-1">For each resource (e.g., a cost map or 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 one each time):</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1-2">
          <li pn="section-3.1-2.1">Each node in the graph is a version of the resource, which is identified by a
sequence number (defined as a JSONNumber). Version 0 is reserved as the
initial state (empty/null).</li>
          <li pn="section-3.1-2.2">A tag identifies the content of a node. A tag has the same format as the
"tag" field in <xref section="10.3" sectionFormat="of" target="RFC7285" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-10.3" derivedContent="RFC7285"/> and is valid only within the
scope of the resource.</li>
          <li pn="section-3.1-2.3">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 pn="section-3.1-2.4">The version is path independent, i.e., different paths arriving at the node associated with the same version
have the same content.</li>
        </ul>
        <t indent="0" pn="section-3.1-3">A concrete example is shown in <xref target="fig-ug" format="default" sectionFormat="of" derivedContent="Figure 2"/>. There are seven nodes in the graph,
representing seven 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.</t>
        <t indent="0" pn="section-3.1-4">The target version 105 can be:</t>
        <ul bare="false" empty="false" indent="3" spacing="normal" pn="section-3.1-5">
          <li pn="section-3.1-5.1">directly fetched as a snapshot;</li>
          <li pn="section-3.1-5.2">computed incrementally by applying the incremental updates between
  103 and 104, then 104 and 105; or,</li>
          <li pn="section-3.1-5.3">computed incrementally by taking the "shortcut" path from 103 to
  105 if the optional update from 103 to 105 exists.</li>
        </ul>
        <figure anchor="fig-ug" align="left" suppress-title="false" pn="figure-2">
          <name slugifiedName="name-tips-model-example">TIPS Model Example</name>
          <artwork type="drawing" align="center" pn="section-3.1-6.1">
                                                    +======+
                                              ------|  0   |
                                             /      +======+
                                    ID0-101 /        |   |
                                          |/__       |   |
                                   +======+          |   |
                   tag: 3421097 -&gt; | 101  |          |   |
                                   +======+          |   |
                           ID101-102  ||             |   |
                                      \/             |   |
                                   +======+          |   |
                   tag: 6431234 -&gt; | 102  |          |   |
                                   +======+          |   |
                           ID102-103  ||             |   |
                                      \/             |   |
                                   +======+          /   |
+--------------+   tag: 0881080 -&gt; | 103  |&lt;--------/    |
| Base Version |   =======&gt;        +======+ ID0-103      |
+--------------+             103-104  ||    ..           |
                                      \/     ..          |
                                   +======+  ..          |
                   tag: 6452654 -&gt; | 104  |  .. ID103    |
                                   +======+  .. -105     |
                           ID104-105  ||     ..          | ID0-105
                                      \/   |._           /
                                   +======+             /
                   tag: 7838392 -&gt; | 105  |&lt;-----------/
                                   +======+
                           ID105-106  ||
                                      \/
                                   +======+
                   tag: 6470983 -&gt; | 106  |
                                   +======+
</artwork>
        </figure>
      </section>
      <section anchor="updates-graph-modification-invariants" numbered="true" removeInRFC="false" toc="include" pn="section-3.2">
        <name slugifiedName="name-updates-graph-modification-">Updates Graph Modification Invariants</name>
        <t indent="0" pn="section-3.2-1">A server might change its updates graph (to compact it, to add nodes,
etc.), but it will need to 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 will need to increment
contiguously by 1.  More specifically, the updates graph <bcp14>MUST</bcp14> satisfy
the following invariants:</t>
        <dl spacing="normal" indent="3" newline="false" pn="section-3.2-2">
          <dt pn="section-3.2-2.1">Continuity:</dt>
          <dd pn="section-3.2-2.2">At any time, let ns denote the smallest non-zero version (i.e.,
&lt;start-seq&gt;) in the updates graph and let ne denote the latest version (i.e.,
&lt;end-seq&gt;). Then, any version in between ns and ne <bcp14>MUST</bcp14> also exist.  This implies
that the incremental update from ni to ni + 1 exists for any ns &lt;= ni &lt;= ne, and all the version numbers in the updates graph (except 0)
   constitute exactly the integer interval [ns, ne].</dd>
          <dt pn="section-3.2-2.3">Feasibility:</dt>
          <dd pn="section-3.2-2.4">Let ns denote &lt;start-seq&gt; in the updates graph. The server <bcp14>MUST</bcp14>
provide a snapshot of ns;  in other words, there is always a direct link
to ns in the updates graph.</dd>
          <dt pn="section-3.2-2.5">"Right shift" only:</dt>
          <dd pn="section-3.2-2.6">Assume a server provides versions in [n1, n2] at time t
and versions in [n1', n2'] at time t'. If t' &gt; t, then n1' &gt;= n1 and n2' &gt;=
n2.</dd>
        </dl>
        <t indent="0" pn="section-3.2-3">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" format="default" sectionFormat="of" derivedContent="Section 3.1"/>. Assume at time 0,
the server provides the versions {101, 102, 103, 104, 105, 106}.  At time 1,
both {103, 104, 105, 106} and {105, 106} are valid sets. However, {102,
103, 104, 105, 106} and {104, 105, 106} are not valid sets as there is no
snapshot to version 102 or 104 in the updates 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" numbered="true" removeInRFC="false" toc="include" pn="section-4">
      <name slugifiedName="name-tips-workflow-and-resource-">TIPS Workflow and Resource Location Schema</name>
      <section anchor="workflow-overview" numbered="true" removeInRFC="false" toc="include" pn="section-4.1">
        <name slugifiedName="name-workflow">Workflow</name>
        <t indent="0" pn="section-4.1-1">At a high level, an ALTO client first requests the TIPS information resource (denoted as TIPS-F,
where F is for frontend) to indicate the information resource or resources 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" format="default" sectionFormat="of" derivedContent="Section 4.2"/>) to fetch incremental updates.</t>
        <t indent="0" pn="section-4.1-2">An example workflow is shown in <xref target="fig-workflow-pull" format="default" sectionFormat="of" derivedContent="Figure 3"/>. After the TIPS-F
 receives the request from the client to monitor the updates of an ALTO
resource, it creates a TIPS view resource and returns the corresponding
information to the client. The URI points to that specific TIPS-V instance, and
the summary contains the &lt;start-seq&gt; and &lt;end-seq&gt; of the updates graph and a
server-recommended edge to consume first (e.g., from i to j).</t>
        <t indent="0" pn="section-4.1-3">An ALTO client can then continuously pull each additional update with the
information. For example, the client in <xref target="fig-workflow-pull" format="default" sectionFormat="of" derivedContent="Figure 3"/> first fetches the
update from i to j and then from j to j+1. Note that the update item at
"&lt;tips-view-uri&gt;/ug/&lt;j&gt;/&lt;j+1&gt;" might not yet exist, so the server holds the
request until the update becomes available (i.e., long polling).</t>
        <t indent="0" pn="section-4.1-4">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 (Not Found) in response, and the client will have to request a
new TIPS view URI.</t>
        <t indent="0" pn="section-4.1-5">If resources allow, a server <bcp14>SHOULD</bcp14> avoid closing TIPS views that have active
polling edge requests or have recently served responses until clients have had a
reasonable interval to request the next update, unless guided by specific
control policies.</t>
        <figure anchor="fig-workflow-pull" align="left" suppress-title="false" pn="figure-3">
          <name slugifiedName="name-alto-tips-workflow-supporti">ALTO TIPS Workflow Supporting Client Pull</name>
          <artwork type="drawing" align="center" pn="section-4.1-6.1">
Client                                 TIPS-F           TIPS-V
  o                                       .                .
  | POST to create/receive a TIPS view    .  Create TIPS   .
  |           for resource 1              .      View      .
  |-------------------------------------&gt; |.-.-.-.-.-.-.-&gt; |
  | &lt;tips-view-uri&gt;, &lt;tips-view-summary&gt;  .                |
  | &lt;-------------------------------------| &lt;-.-.-.-.-.-.-.|
  |                                                        .
  | GET /&lt;tips-view-path&gt;/ug/&lt;i&gt;/&lt;j&gt;                       .
  |------------------------------------------------------&gt; |
  | content on edge i to j                                 |
  | &lt;------------------------------------------------------|
  |                                                        .
  | GET /&lt;tips-view-path&gt;/ug/&lt;j&gt;/&lt;j+1&gt;                     .
  |------------------------------------------------------&gt; |
  .                                                        .
  .                                                        .
  | content on edge j to j+1                               |
  | &lt;------------------------------------------------------|
  |                                                        .
  o                                                        .
                                                           .
                                         TIPS View Closed  o
</artwork>
        </figure>
      </section>
      <section anchor="schema" numbered="true" removeInRFC="false" toc="include" pn="section-4.2">
        <name slugifiedName="name-resource-location-schema">Resource Location Schema</name>
        <t indent="0" pn="section-4.2-1">The resource location schema defines how a client constructs URIs to fetch
incremental updates.</t>
        <t indent="0" pn="section-4.2-2">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" format="default" sectionFormat="of" derivedContent="Section 6.2"/> for the definition of tips-view-uri).
For example, assuming that the updates graph of a TIPS view is as shown in
<xref target="fig-ug" format="default" sectionFormat="of" derivedContent="Figure 2"/>, the location schema of this TIPS view will have the format as in
<xref target="fig-ug-schema" format="default" sectionFormat="of" derivedContent="Figure 4"/>.</t>
        <figure anchor="fig-ug-schema" align="left" suppress-title="false" pn="figure-4">
          <name slugifiedName="name-location-schema-example">Location Schema Example</name>
          <artwork type="drawing" align="center" pn="section-4.2-3.1">
  &lt;tips-view-path&gt;  // root path to a TIPS view
    |_ ug    // updates graph
    |  |_ 0
    |  |  |_ 101    // full 101 snapshot
    |  |  |_ 103
    |  |  \_ 105
    |  |_ 101
    |  |  \_ 102    // 101 -&gt; 102 incremental update
    |  |_ 102
    |  |  \_ 103
    |  |_ 103
    |  |  |_ 104
    |  |  \_ 105    // optional shortcut 103 -&gt; 105 incr. update
    |  |_ 104
    |  |  \_ 105
    |  \_ 105
    |     \_ 106
    \_ ...
</artwork>
        </figure>
        <t indent="0" pn="section-4.2-4">TIPS uses this directory schema to generate template URIs that 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>
        <sourcecode type="" markers="false" pn="section-4.2-5">
    &lt;tips-view-uri&gt;/ug/&lt;i&gt;/&lt;j&gt;
</sourcecode>
        <t indent="0" pn="section-4.2-6">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). This can be done by constructing the URI for the next edge that will be added, starting from
the sequence number of the current last node (denoted as &lt;end-seq&gt;) in the graph
to the next sequential node (with the sequence number of &lt;end-seq + 1&gt;):</t>
        <sourcecode type="" markers="false" pn="section-4.2-7">
    &lt;tips-view-uri&gt;/ug/&lt;end-seq&gt;/&lt;end-seq + 1&gt;
</sourcecode>
        <t indent="0" pn="section-4.2-8">Incremental updates of a TIPS view are read-only. Thus, they are fetched using
the HTTP GET method.</t>
      </section>
    </section>
    <section anchor="ird" numbered="true" removeInRFC="false" toc="include" pn="section-5">
      <name slugifiedName="name-tips-information-resource-d">TIPS Information Resource Directory (IRD) Announcement</name>
      <t indent="0" pn="section-5-1">To announce a TIPS information resource in the IRD, an ALTO server <bcp14>MUST</bcp14> specify "media-type", "capabilities", and "uses"
as follows.</t>
      <section anchor="media-type" numbered="true" removeInRFC="false" toc="include" pn="section-5.1">
        <name slugifiedName="name-media-type">Media Type</name>
        <t indent="0" pn="section-5.1-1">The media type of the Transport Information Publication Service (TIPS) resource is
"application/alto-tips+json".</t>
      </section>
      <section anchor="caps" numbered="true" removeInRFC="false" toc="include" pn="section-5.2">
        <name slugifiedName="name-capabilities">Capabilities</name>
        <t indent="0" pn="section-5.2-1">The "capabilities" field of a TIPS information resource is modeled on that defined in
<xref target="RFC8895" sectionFormat="of" section="6.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8895#section-6.3" derivedContent="RFC8895"/>.</t>
        <t indent="0" pn="section-5.2-2">Specifically, the capabilities are defined as an object of the TIPSCapabilities type:</t>
        <figure anchor="tips-cap" align="left" suppress-title="false" pn="figure-5">
          <name slugifiedName="name-tipscapabilities">TIPSCapabilities</name>
          <sourcecode type="" markers="false" pn="section-5.2-3.1">
     object {
       IncrementalUpdateMediaTypes incremental-change-media-types;
     } TIPSCapabilities;

     object-map {
        ResourceID -&gt; String;
     } IncrementalUpdateMediaTypes;
</sourcecode>
        </figure>
        <t indent="0" pn="section-5.2-4">with the field:</t>
        <dl indent="3" newline="false" spacing="normal" pn="section-5.2-5">
          <dt pn="section-5.2-5.1">incremental-change-media-types:</dt>
          <dd pn="section-5.2-5.2">
            <t indent="0" pn="section-5.2-5.2.1">If a TIPS information resource can provide updates with incremental changes for a
resource, the "incremental-change-media-types" field has an entry
whose key is the ID of the resource 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 indent="0" pn="section-5.2-5.2.2">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; hence, the field is no longer defined
(i.e., undefined).  However, this 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 encoding over JSON merge patch encoding for the incremental update if both media types "application/json-patch+json" and "application/merge-patch" are supported by the TIPS information resource.</t>
          </dd>
        </dl>
      </section>
      <section anchor="uses" numbered="true" removeInRFC="false" toc="include" pn="section-5.3">
        <name slugifiedName="name-uses">Uses</name>
        <t indent="0" pn="section-5.3-1">The "uses" attribute <bcp14>MUST</bcp14> be an array with the resource IDs of every
network information resource for which this TIPS information resource can provide service.</t>
        <t indent="0" pn="section-5.3-2">This set <bcp14>MAY</bcp14> be any subset of the ALTO server's network information resources
and <bcp14>MAY</bcp14> include resources defined in linked IRDs. However, it is <bcp14>RECOMMENDED</bcp14>
that the ALTO server selects a set that is closed under the resource dependency
relationship. That is, if a TIPS information resource's "uses" set includes resource R1, and resource
R1 depends on ("uses") resource R0, then the "uses" set should include R0
as well as R1. For example, if a TIPS information resource provides a TIPS view for a cost map, it
should also provide a TIPS view for the network map upon which that cost map
depends.</t>
        <t indent="0" pn="section-5.3-3">If the set is not closed, at least one resource R1 in the "uses" field of a TIPS information resource
depends on another resource R0 that is not in the "uses" field of the same
TIPS information resource. Thus, a client cannot receive incremental updates for another resource R0 that is not in the "uses" field of the same TIPS information resource.  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" numbered="true" removeInRFC="false" toc="include" pn="section-5.4">
        <name slugifiedName="name-an-example">An Example</name>
        <t indent="0" pn="section-5.4-1">Extending the IRD example in <xref target="RFC8895" sectionFormat="of" section="8.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8895#section-8.1" derivedContent="RFC8895"/>, <xref target="ex-ird" format="default" sectionFormat="of" derivedContent="Figure 6"/> is the IRD of an
ALTO server supporting the ALTO base protocol, ALTO/SSE, and ALTO TIPS.</t>
        <figure anchor="ex-ird" align="left" suppress-title="false" pn="figure-6">
          <name slugifiedName="name-example-of-an-alto-server-s">Example of an ALTO Server Supporting the ALTO Base Protocol, ALTO/⁠SSE, and ALTO TIPS</name>
          <sourcecode type="json" markers="false" pn="section-5.4-2.1">
  "my-network-map": {
    "uri": "https://alto.example.com/networkmap",
    "media-type": "application/alto-networkmap+json"
  },
  "my-routingcost-map": {
    "uri": "https://alto.example.com/costmap/routingcost",
    "media-type": "application/alto-costmap+json",
    "uses": ["my-network-map"],
    "capabilities": {
      "cost-type-names": ["num-routingcost"]
    }
  },
  "my-hopcount-map": {
    "uri": "https://alto.example.com/costmap/hopcount",
    "media-type": "application/alto-costmap+json",
    "uses": ["my-network-map"],
    "capabilities": {
      "cost-type-names": ["num-hopcount"]
    }
  },
  "my-simple-filtered-cost-map": {
    "uri": "https://alto.example.com/costmap/filtered/simple",
    "media-type": "application/alto-costmap+json",
    "accepts": "application/alto-costmapfilter+json",
    "uses": ["my-network-map"],
    "capabilities": {
      "cost-type-names": ["num-routingcost", "num-hopcount"],
      "cost-constraints": false
    }
  },
  "update-my-costs": {
    "uri": "https://alto.example.com/updates/costs",
    "media-type": "text/event-stream",
    "accepts": "application/alto-updatestreamparams+json",
    "uses": [
        "my-network-map",
        "my-routingcost-map",
        "my-hopcount-map",
        "my-simple-filtered-cost-map"
    ],
    "capabilities": {
      "incremental-change-media-types": {
        "my-network-map": "application/json-patch+json",
        "my-routingcost-map": "application/merge-patch+json",
        "my-hopcount-map": "application/merge-patch+json"
      },
      "support-stream-control": true
    }
  },
  "update-my-costs-tips": {
    "uri": "https://alto.example.com/updates-new/costs",
    "media-type": "application/alto-tips+json",
    "accepts": "application/alto-tipsparams+json",
    "uses": [
        "my-network-map",
        "my-routingcost-map",
        "my-hopcount-map",
        "my-simple-filtered-cost-map"
    ],
    "capabilities": {
      "incremental-change-media-types": {
        "my-network-map": "application/json-patch+json",
        "my-routingcost-map": "application/merge-patch+json",
        "my-hopcount-map": "application/merge-patch+json",
        "my-simple-filtered-cost-map": "application/merge-patch+json"
      }
    }
  },
  "tips-sse": {
    "uri": "https://alto.example.com/updates/tips",
    "media-type": "text/event-stream",
    "accepts": "application/alto-updatestreamparams+json",
    "uses": [ "update-my-costs-tips" ],
    "capabilities": {
      "incremental-change-media-types": {
        "update-my-costs-tips": "application/merge-patch+json"
      }
    }
  }
</sourcecode>
        </figure>
        <t indent="0" pn="section-5.4-3">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 indent="0" pn="section-5.4-4">The resource "update-my-costs-tips" provides an ALTO TIPS information resource, and this is
indicated by the media type "application/alto-tips+json".</t>
      </section>
    </section>
    <section anchor="tips-management" numbered="true" removeInRFC="false" toc="include" pn="section-6">
      <name slugifiedName="name-tips-management">TIPS Management</name>
      <t indent="0" pn="section-6-1">Upon request, a server sends a TIPS view to a client. This TIPS view might be
created at the time of the request or might 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" numbered="true" removeInRFC="false" toc="include" pn="section-6.1">
        <name slugifiedName="name-open-request">Open Request</name>
        <t indent="0" pn="section-6.1-1">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 the TIPSReq type, where:</t>
        <figure anchor="fig-open-req" align="left" suppress-title="false" pn="figure-7">
          <name slugifiedName="name-tipsreq">TIPSReq</name>
          <sourcecode type="" markers="false" pn="section-6.1-2.1">
    object {
       ResourceID   resource-id;
       [JSONString  tag;]
       [Object      input;]
    } TIPSReq;
</sourcecode>
        </figure>
        <t indent="0" pn="section-6.1-3">with the following fields:</t>
        <dl indent="3" newline="false" spacing="normal" pn="section-6.1-4">
          <dt pn="section-6.1-4.1">resource-id:</dt>
          <dd pn="section-6.1-4.2">
            <t indent="0" pn="section-6.1-4.2.1">This field contains the resource ID of an ALTO resource to be monitored, which <bcp14>MUST</bcp14> be in the TIPS information resource's "uses" list
(<xref target="ird" format="default" sectionFormat="of" derivedContent="Section 5"/>). 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
information resource.</t>
          </dd>
          <dt pn="section-6.1-4.3">tag:</dt>
          <dd pn="section-6.1-4.4">
            <t indent="0" pn="section-6.1-4.4.1">If the "resource-id" is associated with a GET-mode resource with a version tag (or
"vtag"), as defined in <xref target="RFC7285" sectionFormat="of" section="10.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-10.3" derivedContent="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 pn="section-6.1-4.5">input:</dt>
          <dd pn="section-6.1-4.6">
            <t indent="0" pn="section-6.1-4.6.1">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" numbered="true" removeInRFC="false" toc="include" pn="section-6.2">
        <name slugifiedName="name-open-response">Open Response</name>
        <t indent="0" pn="section-6.2-1">The response to a valid request <bcp14>MUST</bcp14> be a JSON object of the AddTIPSResponse type, denoted as media type "application/alto-tips+json":</t>
        <figure anchor="fig-open-resp" align="left" suppress-title="false" pn="figure-8">
          <name slugifiedName="name-addtipsresponse">AddTIPSResponse</name>
          <sourcecode type="" markers="false" pn="section-6.2-2.1">
    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;
</sourcecode>
        </figure>
        <t indent="0" pn="section-6.2-3">with the following fields:</t>
        <dl indent="3" newline="false" spacing="normal" pn="section-6.2-4">
          <dt pn="section-6.2-4.1">tips-view-uri:</dt>
          <dd pn="section-6.2-4.2">
            <t indent="0" pn="section-6.2-4.2.1">This is the URI to the requested TIPS view. The value of this field <bcp14>MUST</bcp14> have the
following format:
</t>
            <sourcecode type="" markers="false" pn="section-6.2-4.2.2">
    scheme "://" tips-view-host "/" tips-view-path

    tips-view-host = host [ ":" port]
    tips-view-path = path
</sourcecode>
            <t indent="0" pn="section-6.2-4.2.3">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 <xref target="RFC3986" sectionFormat="bare" section="3.2.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3986#section-3.2.2" derivedContent="RFC3986"/>, <xref target="RFC3986" sectionFormat="bare" section="3.2.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3986#section-3.2.3" derivedContent="RFC3986"/>, and <xref target="RFC3986" sectionFormat="bare" section="3.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3986#section-3.3" derivedContent="RFC3986"/> in <xref target="RFC3986" format="default" sectionFormat="of" derivedContent="RFC3986"/>. An ALTO server <bcp14>SHOULD</bcp14> use the "https" scheme unless
the contents of the TIPS view are intended to be publicly accessible and do
not raise security concerns. The field <bcp14>MUST</bcp14> contain only ASCII characters. In
case the original URL contains international characters (e.g., in the domain
name), the ALTO server implementation <bcp14>MUST</bcp14> properly encode the URL into the
ASCII format (e.g., using the "urlencode" function).</t>
            <t indent="0" pn="section-6.2-4.2.4">A server <bcp14>MUST NOT</bcp14> use the same URI for different TIPS views, either for
different resources or for different request bodies to the same resource. URI
generation is implementation specific; for example, one may compute a
Universally Unique Identifier (UUID) <xref target="RFC9562" format="default" sectionFormat="of" derivedContent="RFC9562"/> or a hash value based on
the request and append it to a base URL. For performance considerations, it
is <bcp14>NOT RECOMMENDED</bcp14> to use properties that are not included in the request
body to determine the URI of a TIPS view, such as cookies or the client's IP
address, which may result in duplicated TIPS views in cases such as mobile
clients. However, this is not mandatory as a server might intentionally use
client information to compute the TIPS view URI to provide service isolation
between clients.</t>
          </dd>
          <dt pn="section-6.2-4.3">tips-view-summary:</dt>
          <dd pn="section-6.2-4.4">
            <t indent="0" pn="section-6.2-4.4.1">Contains an updates-graph-summary.
</t>
            <t indent="0" pn="section-6.2-4.4.2">The "updates-graph-summary" field contains the
&lt;start-seq&gt; of the updates graph (in the "start-seq" field) and the &lt;end-seq&gt; that
is currently available (in the "end-seq" field), along with a recommended edge to consume
(in the "start-edge-rec" field). If the client does not provide a version tag, the server
<bcp14>MUST</bcp14> recommend the edge of the latest available snapshot.
If the client provides a version tag, the server <bcp14>MUST</bcp14> either recommend
the first incremental update edge starting from the client's tagged version
or recommend the edge of the latest snapshot: which edge is selected depends on the
implementation. For example, a server <bcp14>MAY</bcp14> calculate the cumulative size of
the incremental updates available from that version onward and compare it to
the size of the complete resource snapshot. If the snapshot is bigger, the
server recommends the first incremental update edge starting from the
client's tagged version. Otherwise, the server recommends the latest snapshot
edge.</t>
          </dd>
        </dl>
        <t indent="0" pn="section-6.2-5">If the request has any errors, the ALTO server <bcp14>MUST</bcp14> return an HTTP
400 (Bad Request) error code to the ALTO client; the body of the response
follows the generic ALTO error response format specified in
<xref target="RFC7285" sectionFormat="of" section="8.5.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-8.5.2" derivedContent="RFC7285"/>.  Hence, an example ALTO error response
has the format shown in <xref target="ex-bad-request" format="default" sectionFormat="of" derivedContent="Figure 9"/>.</t>
        <figure anchor="ex-bad-request" align="left" suppress-title="false" pn="figure-9">
          <name slugifiedName="name-alto-error-example">ALTO Error Example</name>
          <sourcecode type="" markers="false" pn="section-6.2-6.1">
    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/#"
        }
    }
</sourcecode>
        </figure>
        <t indent="0" pn="section-6.2-7">Note that "field" and "value" are optional fields.  If the "value"
field exists, the "field" field <bcp14>MUST</bcp14> exist.</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.2-8">
          <li pn="section-6.2-8.1">If the TIPS request does not have a "resource-id" field, the error code of
the error message <bcp14>MUST</bcp14> be "E_MISSING_FIELD" and the "field" field, if
present, <bcp14>MUST</bcp14> be "resource-id". The ALTO server <bcp14>MUST NOT</bcp14> create any TIPS
view.</li>
          <li pn="section-6.2-8.2">If the "resource-id" field is invalid or is not associated with the TIPS information resource, the
error code of the error message <bcp14>MUST</bcp14> be "E_INVALID_FIELD_VALUE". If present,
the "field" field <bcp14>MUST</bcp14> be the full path of the "resource-id" field, and the
"value" field <bcp14>MUST</bcp14> be the value of the "resource-id" field in the request.</li>
          <li pn="section-6.2-8.3">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 resource
expects. If the "input" field is missing or invalid, the ALTO server <bcp14>MUST</bcp14> return the
same error response that resource would return for missing or invalid inputs
(see <xref target="RFC7285" format="default" sectionFormat="of" derivedContent="RFC7285"/>).</li>
        </ul>
        <t indent="0" pn="section-6.2-9">Furthermore, it is <bcp14>RECOMMENDED</bcp14> that the server use the following HTTP code to
indicate other errors, with the media type "application/alto-error+json".</t>
        <dl spacing="normal" indent="3" newline="false" pn="section-6.2-10">
          <dt pn="section-6.2-10.1">429 (Too Many Requests):</dt>
          <dd pn="section-6.2-10.2">Indicates when the number of TIPS views open requests exceeds
the server threshold. The server <bcp14>MAY</bcp14> indicate when to retry the request in
the "Re-Try After" headers.</dd>
        </dl>
        <t indent="0" pn="section-6.2-11">It is <bcp14>RECOMMENDED</bcp14> that the server provide the ALTO/SSE support for the TIPS
resource. Thus, the client can be notified of the version updates of all the
TIPS views that it monitors and make better cross-resource transport decisions
(see <xref target="cross-sched" format="default" sectionFormat="of" derivedContent="Section 8.2"/> for related considerations).</t>
      </section>
      <section anchor="open-example" numbered="true" removeInRFC="false" toc="include" pn="section-6.3">
        <name slugifiedName="name-open-example">Open Example</name>
        <section anchor="basic-example" numbered="true" removeInRFC="false" toc="include" pn="section-6.3.1">
          <name slugifiedName="name-basic-example">Basic Example</name>
          <t indent="0" pn="section-6.3.1-1">For simplicity, assume that the ALTO server is using Basic
authentication <xref target="RFC7617" format="default" sectionFormat="of" derivedContent="RFC7617"/>.  If a client with username "client1" and password
"helloalto" wants to create a TIPS view of an ALTO cost map resource
with the resource ID "my-routingcost-map", it can send the
request depicted in <xref target="ex-op" format="default" sectionFormat="of" derivedContent="Figure 10"/>.</t>
          <figure anchor="ex-op" align="left" suppress-title="false" pn="figure-10">
            <name slugifiedName="name-request-example-of-opening-">Request Example of Opening a TIPS View</name>
            <sourcecode type="" markers="false" pn="section-6.3.1-2.1">
    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"
    }
</sourcecode>
          </figure>
          <t indent="0" pn="section-6.3.1-3">If the operation is successful, the ALTO server returns the
message shown in <xref target="ex-op-rep" format="default" sectionFormat="of" derivedContent="Figure 11"/>.</t>
          <figure anchor="ex-op-rep" align="left" suppress-title="false" pn="figure-11">
            <name slugifiedName="name-response-example-of-opening">Response Example of Opening a TIPS View</name>
            <sourcecode type="" markers="false" pn="section-6.3.1-4.1">
    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 255

    {
      "tips-view-uri": "https://alto.example.com/tips/2718281828",
      "tips-view-summary": {
        "updates-graph-summary": {
          "start-seq": 101,
          "end-seq": 106,
          "start-edge-rec" : {
            "seq-i": 0,
            "seq-j": 105
          }
        }
      }
    }
</sourcecode>
          </figure>
        </section>
        <section anchor="example-using-digest-authentication" numbered="true" removeInRFC="false" toc="include" pn="section-6.3.2">
          <name slugifiedName="name-example-using-digest-authen">Example Using Digest Authentication</name>
          <t indent="0" pn="section-6.3.2-1">Below is another example of the same query using Digest authentication, a
mandatory authentication method of ALTO servers as defined in <xref section="8.3.5" sectionFormat="of" target="RFC7285" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-8.3.5" derivedContent="RFC7285"/>. The content of the response is the same as in <xref target="ex-op-rep" format="default" sectionFormat="of" derivedContent="Figure 11"/>; thus, it has been
omitted for simplicity.</t>
          <figure anchor="ex-op-digest" align="left" suppress-title="false" pn="figure-12">
            <name slugifiedName="name-open-example-with-digest-au">Open Example with Digest Authentication</name>
            <sourcecode type="" markers="false" pn="section-6.3.2-2.1">
    POST /tips HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-tips+json, application/alto-error+json
    Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K
    Content-Type: application/alto-tipsparams+json
    Content-Length: 41

    {
      "resource-id": "my-routingcost-map"
    }

    HTTP/1.1 401 UNAUTHORIZED
    WWW-Authenticate: Digest
        realm="alto.example.com",
        qop="auth",
        algorithm="MD5",
        nonce="173b5aba4242409ee2ac3a4fd797f9d7",
        opaque="a237ff9ab865379a69d9993162ef55e4"

    POST /tips HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-tips+json, application/alto-error+json
    Authorization: Digest
        username="client1",
        realm="alto.example.com",
        uri="/tips",
        qop=auth,
        algorithm=MD5,
        nonce="173b5aba4242409ee2ac3a4fd797f9d7",
        nc=00000001,
        cnonce="ZTg3MTI3NDFmMDQ0NzI1MDQ3MWE3ZTFjZmM5MTNiM2I=",
        response="8e937ae696c1512e4f990fa21c7f9347",
        opaque="a237ff9ab865379a69d9993162ef55e4"
    Content-Type: application/alto-tipsparams+json
    Content-Length: 41

    {
      "resource-id": "my-routingcost-map"
    }


    HTTP/1.1 200 OK
    Content-Type: application/alto-tips+json
    Content-Length: 258

    {....}
</sourcecode>
          </figure>
        </section>
        <section anchor="tips-sse" numbered="true" removeInRFC="false" toc="include" pn="section-6.3.3">
          <name slugifiedName="name-example-using-alto-sse">Example Using ALTO/SSE</name>
          <t indent="0" pn="section-6.3.3-1">This section gives an example of receiving incremental updates of the TIPS view
summary using ALTO/SSE <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/>. Consider the "tips-sse" resource, as
announced by the IRD in <xref target="ex-ird" format="default" sectionFormat="of" derivedContent="Figure 6"/>, which provides ALTO/SSE for the
"update-my-cost-tips" resource; a client might send the following request to
receive updates of the TIPS view (authentication is omitted for simplicity).</t>
          <figure anchor="ex-tips-sse" align="left" suppress-title="false" pn="figure-13">
            <name slugifiedName="name-example-of-monitoring-tips-">Example of Monitoring TIPS View with ALTO/SSE</name>
            <sourcecode type="" markers="false" pn="section-6.3.3-2.1">
    POST /updates/tips HTTP/1.1
    Host: alto.example.com
    Accept: text/event-stream,application/alto-error+json
    Content-Type: application/alto-updatestreamparams+json
    Content-Length: 76

    {
      "add": {
        "tips-123": { "resource-id": "update-my-cost-tips" }
      }
    }
</sourcecode>
          </figure>
          <t indent="0" pn="section-6.3.3-3">Then, the client will be able to receive the TIPS view summary as follows.</t>
          <sourcecode type="" markers="false" pn="section-6.3.3-4">
 HTTP/1.1 200 OK
 Connection: keep-alive
 Content-Type: text/event-stream

 event: application/alto-tips+json,tips-123
 data: {
 data:   "tips-view-uri": "https://alto.example.com/tips/2718281828",
 data:   "tips-view-summary": {
 data:     "updates-graph-summary": {
 data:       "start-seq": 101,
 data:       "end-seq": 106,
 data:       "start-edge-rec" : {
 data:         "seq-i": 0,
 data:         "seq-j": 105
 data:       }
 data:     }
 data:   }
 data: }
</sourcecode>
          <t indent="0" pn="section-6.3.3-5">When there is an update to the TIPS view (for example, when the "end-seq" field is
increased by 1), the client will be able to receive the incremental update of the
TIPS view summary as follows.</t>
          <sourcecode type="" markers="false" pn="section-6.3.3-6">
    event: application/merge-patch+json,tips-123
    data: {
    data:   "tips-view-summary": {
    data:     "updates-graph-summary": {
    data:       "end-seq": 107
    data:     }
    data:   }
    data: }
</sourcecode>
        </section>
      </section>
    </section>
    <section anchor="pull" numbered="true" removeInRFC="false" toc="include" pn="section-7">
      <name slugifiedName="name-tips-data-transfers-client-">TIPS Data Transfers - Client Pull</name>
      <t indent="0" pn="section-7-1">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" numbered="true" removeInRFC="false" toc="include" pn="section-7.1">
        <name slugifiedName="name-request">Request</name>
        <t indent="0" pn="section-7.1-1">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 indent="0" pn="section-7.1-2">The GET request <bcp14>MUST</bcp14> have the following format:</t>
        <sourcecode type="" markers="false" pn="section-7.1-3">
    GET /&lt;tips-view-path&gt;/ug/&lt;i&gt;/&lt;j&gt;
    HOST: &lt;tips-view-host&gt;
</sourcecode>
        <t indent="0" pn="section-7.1-4">For example, consider the updates graph in <xref target="fig-ug-schema" format="default" sectionFormat="of" derivedContent="Figure 4"/>. If the client
wants to query the content of the first update item (0 -&gt; 101) whose media type
is "application/alto-costmap+json", it sends a request to
"/tips/2718281828/ug/0/101" and sets the "Accept" header to
"application/alto-costmap+json,application/alto-error+json". See <xref target="iu-example" format="default" sectionFormat="of" derivedContent="Section 7.3"/>
for a concrete example.</t>
      </section>
      <section anchor="response" numbered="true" removeInRFC="false" toc="include" pn="section-7.2">
        <name slugifiedName="name-response">Response</name>
        <t indent="0" pn="section-7.2-1">If the request is valid (i.e., "ug/&lt;i&gt;/&lt;j&gt;" exists), the response is encoded
as a JSON object whose data format is indicated by the media type.</t>
        <t indent="0" pn="section-7.2-2">A client <bcp14>MAY</bcp14> conduct proactive fetching of future updates, by long polling
updates that have not been provided in the directory yet. For such updates, the
client <bcp14>MUST</bcp14> indicate all media types that might appear. It is <bcp14>RECOMMENDED</bcp14> that the
server allow for at least the long polling of &lt;end-seq&gt; -&gt; &lt;end-seq + 1&gt;.</t>
        <t indent="0" pn="section-7.2-3">Hence, the server processing logic <bcp14>MUST</bcp14> be:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-7.2-4">
          <li pn="section-7.2-4.1">If a resource with path "ug/&lt;i&gt;/&lt;j&gt;" exists, return content using encoding.</li>
          <li pn="section-7.2-4.2">Else, if long polling "ug/&lt;i&gt;/&lt;j&gt;" is acceptable, put request in a
backlog queue, then either a response is triggered when the content is ready
or the request is interrupted (e.g., by a network error).</li>
          <li pn="section-7.2-4.3">Else, return error.</li>
        </ul>
        <t indent="0" pn="section-7.2-5">It is <bcp14>RECOMMENDED</bcp14> that the server use the following HTTP codes to
indicate errors, with the media type "application/alto-error+json",
regarding update item requests.</t>
        <dl spacing="normal" indent="3" newline="false" pn="section-7.2-6">
          <dt pn="section-7.2-6.1">404 (Not Found):</dt>
          <dd pn="section-7.2-6.2">Indicates that the requested update does not exist or the requested
TIPS view does not exist or is closed by the server.</dd>
          <dt pn="section-7.2-6.3">410 (Gone):</dt>
          <dd pn="section-7.2-6.4">Indicates an update has a seq that is smaller than the &lt;start-seq&gt;.</dd>
          <dt pn="section-7.2-6.5">415 (Unsupported Media Type):</dt>
          <dd pn="section-7.2-6.6">Indicates the media type (or types) accepted by the
client does not include the media type of the update chosen by the
server.</dd>
          <dt pn="section-7.2-6.7">425 (Too Early):</dt>
          <dd pn="section-7.2-6.8">Indicates the seq exceeds the server long polling window.</dd>
          <dt pn="section-7.2-6.9">429 (Too Many Requests):</dt>
          <dd pn="section-7.2-6.10">Indicates the number of pending (long poll)
requests exceeds the server threshold. The server <bcp14>MAY</bcp14> indicate when to retry
the request in the "Re-Try After" headers.</dd>
        </dl>
      </section>
      <section anchor="iu-example" numbered="true" removeInRFC="false" toc="include" pn="section-7.3">
        <name slugifiedName="name-example">Example</name>
        <t indent="0" pn="section-7.3-1">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" format="default" sectionFormat="of" derivedContent="Figure 14"/>.</t>
        <figure anchor="ex-get" align="left" suppress-title="false" pn="figure-14">
          <name slugifiedName="name-get-example">GET Example</name>
          <sourcecode type="" markers="false" pn="section-7.3-2.1">
    GET /tips/2718281828/ug/0/101 HTTP/1.1
    Host: alto.example.com
    Accept: application/alto-costmap+json, \
              application/alto-error+json
</sourcecode>
        </figure>
        <t indent="0" pn="section-7.3-3">The response is shown in <xref target="ex-get-res" format="default" sectionFormat="of" derivedContent="Figure 15"/>.</t>
        <figure anchor="ex-get-res" align="left" suppress-title="false" pn="figure-15">
          <name slugifiedName="name-response-to-a-get-request">Response to a GET Request</name>
          <sourcecode type="" markers="false" pn="section-7.3-4.1">
    HTTP/1.1 200 OK
    Content-Type: application/alto-costmap+json
    Content-Length: 50

    { ... full replacement of my-routingcost-map ... }
</sourcecode>
        </figure>
      </section>
      <section anchor="new-next-edge-recommendation" numbered="true" removeInRFC="false" toc="include" pn="section-7.4">
        <name slugifiedName="name-new-next-edge-recommendatio">New Next Edge Recommendation</name>
        <t indent="0" pn="section-7.4-1">While intended TIPS usage is for the client to receive a recommended
starting edge in the TIPS summary, consume that edge, and then construct
all future URIs by incrementing the sequence count by one, 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 but has not
polled in a while, the client might request the next logical
incremental URI; however, the server has compacted the updates graph, so it
no longer exists.  Thus, the client <bcp14>MAY</bcp14> request a new next edge to
consume based on its current version of the resource.</t>
        <section anchor="request-1" numbered="true" removeInRFC="false" toc="include" pn="section-7.4.1">
          <name slugifiedName="name-request-2">Request</name>
          <t indent="0" pn="section-7.4.1-1">An ALTO client requests that the server provide a next edge recommendation for a
given TIPS view by sending an HTTP POST request with the media type
"application/alto-tipsparams+json". The URL of the request <bcp14>MUST</bcp14> have the following format:</t>
          <sourcecode type="" markers="false" pn="section-7.4.1-2">
    &lt;tips-view-path&gt;/ug
</sourcecode>
          <t indent="0" pn="section-7.4.1-3">and the "HOST" field <bcp14>MUST</bcp14> be "&lt;tips-view-host&gt;".</t>
          <t indent="0" pn="section-7.4.1-4">The POST body has the same format as the TIPSReq in <xref target="fig-open-req" format="default" sectionFormat="of" derivedContent="Figure 7"/>. The
"resource-id" field <bcp14>MUST</bcp14> be the same as the resource ID used to create the TIPS view,
and the optional "input" field <bcp14>MUST NOT</bcp14> be present.</t>
        </section>
        <section anchor="response-1" numbered="true" removeInRFC="false" toc="include" pn="section-7.4.2">
          <name slugifiedName="name-response-2">Response</name>
          <t indent="0" pn="section-7.4.2-1">The response to a valid request <bcp14>MUST</bcp14> be a JSON merge patch to the object of the AddTIPSResponse type (defined in <xref target="open-resp" format="default" sectionFormat="of" derivedContent="Section 6.2"/>), denoted as media type
"application/merge-patch+json". The "updates-graph-summary" field <bcp14>MUST</bcp14> be present
in the response; hence, its parent field "tips-view-summary" <bcp14>MUST</bcp14> be present
as well.</t>
          <t indent="0" pn="section-7.4.2-2">If the "tag" field is present in the request, the server <bcp14>MUST</bcp14> check if any
version within the range [&lt;start-seq&gt;, &lt;end-seq&gt;] has the same tag value. If the
version exists (e.g., denoted as &lt;tag-seq&gt;), the server <bcp14>MUST</bcp14> compute the paths from
both &lt;tag-seq&gt; and 0 to the &lt;end-seq&gt; and choose the one with the minimal cost. The
cost <bcp14>MAY</bcp14> be implementation specific (e.g., number of messages, accumulated data
size, etc.). The first edge of the selected path <bcp14>MUST</bcp14> be returned as the
	  recommended next edge.</t>
          <t indent="0" pn="section-7.4.2-3">If the "tag" field is not present, the interpretation   <bcp14>MUST</bcp14> be that the &lt;tag-seq&gt; is 0.</t>
          <t indent="0" pn="section-7.4.2-4">It is <bcp14>RECOMMENDED</bcp14> that the server use the following HTTP code to
indicate errors, with the media type "application/alto-error+json",
regarding new next edge requests.</t>
          <dl spacing="normal" indent="3" newline="false" pn="section-7.4.2-5">
            <dt pn="section-7.4.2-5.1">404 (Not Found):</dt>
            <dd pn="section-7.4.2-5.2">Indicates that the requested TIPS view does not exist or has been
closed by the server.</dd>
          </dl>
        </section>
        <section anchor="example" numbered="true" removeInRFC="false" toc="include" pn="section-7.4.3">
          <name slugifiedName="name-example-2">Example</name>
          <t indent="0" pn="section-7.4.3-1">In this section, we give an example of the new next edge recommendation service. Assume that a
client already creates a TIPS view (as in <xref target="open-example" format="default" sectionFormat="of" derivedContent="Section 6.3"/>) whose updates graph
is as shown in <xref target="fig-ug" format="default" sectionFormat="of" derivedContent="Figure 2"/>. Now assume that the client already has tag 0881080,
whose corresponding sequence number is 103, and sends the following new next
edge recommendation request (authentication is omitted for simplicity):</t>
          <sourcecode type="" markers="false" pn="section-7.4.3-2">
    POST /tips/2718281828/ug HTTP/1.1
    HOST alto.example.com
    Accept: application/merge-patch+json, application/alto-error+json
    Content-Type: application/alto-tipsparams+json
    Content-Length: 62

    {
      "resource-id": "my-routingcost-map",
      "tag": "0881080"
    }
</sourcecode>
          <t indent="0" pn="section-7.4.3-3">According to <xref target="fig-ug" format="default" sectionFormat="of" derivedContent="Figure 2"/>, there are three potential paths: 103 -&gt; 104 -&gt; 105 -&gt; 106,
103 -&gt; 105 -&gt; 106, and 0 -&gt; 105 -&gt; 106. Assume that the server chooses the shortest
update path by the accumulated data size and the best path is 103 -&gt; 105 -&gt; 106.
Thus, the server responds with the following message:</t>
          <sourcecode type="" markers="false" pn="section-7.4.3-4">
    HTTP/1.1 200 OK
    Content-Type: application/merge-patch+json
    Content-Length: 193

    {
      "tips-view-summary": {
        "updates-graph-summary": {
          "start-seq": 101,
          "end-seq": 106,
          "start-edge-rec": {
            "seq-i": 103,
            "seq-j": 105
          }
        }
      }
    }
</sourcecode>
        </section>
      </section>
    </section>
    <section anchor="ops-considerations" numbered="true" removeInRFC="false" toc="include" pn="section-8">
      <name slugifiedName="name-operation-and-processing-co">Operation and Processing Considerations</name>
      <t indent="0" pn="section-8-1">TIPS has some common operational considerations as ALTO/SSE <xref target="RFC8895" format="default" sectionFormat="of" derivedContent="RFC8895"/>,
including:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8-2">
        <li pn="section-8-2.1">the server choosing update messages (<xref section="9.1" sectionFormat="of" target="RFC8895" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8895#section-9.1" derivedContent="RFC8895"/>);</li>
        <li pn="section-8-2.2">the client processing update messages (<xref section="9.2" sectionFormat="of" target="RFC8895" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8895#section-9.2" derivedContent="RFC8895"/>);</li>
        <li pn="section-8-2.3">the updates of filtered map services (<xref section="9.3" sectionFormat="of" target="RFC8895" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8895#section-9.3" derivedContent="RFC8895"/>); and</li>
        <li pn="section-8-2.4">the updates of ordinal mode costs (<xref section="9.4" sectionFormat="of" target="RFC8895" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8895#section-9.4" derivedContent="RFC8895"/>).</li>
      </ul>
      <t indent="0" pn="section-8-3">There are also some operational considerations specific to TIPS, which we discuss
below.</t>
      <section anchor="load-balancing" numbered="true" removeInRFC="false" toc="include" pn="section-8.1">
        <name slugifiedName="name-considerations-for-load-bal">Considerations for Load Balancing</name>
        <t indent="0" pn="section-8.1-1">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 indent="0" pn="section-8.1-2">Load balancing of TIPS views can be achieved either at the application layer or
at the infrastructure layer. For example, an ALTO server <bcp14>MAY</bcp14> set
&lt;tips-view-host&gt; to different subdomains to distribute TIPS views or simply
use the same host of the TIPS information resource and rely on load balancers to distribute
	the load.</t>
        <t indent="0" pn="section-8.1-3">TIPS allows a client to make concurrent pulls of incremental updates for the
same TIPS view, potentially through different HTTP connections. As a consequence,
TIPS introduces additional complexities when the ALTO server balances the load by distributing the requests to a set of backend servers. For example, a request might be directed to the wrong backend server and
get processed incorrectly if the following two conditions both hold:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8.1-4">
          <li pn="section-8.1-4.1">these backend servers are stateful (i.e., the TIPS view is created
and stored only on a single server); and</li>
          <li pn="section-8.1-4.2">the ALTO server is using Layer 4 load balancing (i.e., the
requests are distributed based on the TCP 5-tuple).</li>
        </ul>
        <t indent="0" pn="section-8.1-5">Thus, additional considerations are required to enable correct load
balancing for TIPS, including:</t>
        <dl spacing="normal" indent="3" newline="false" pn="section-8.1-6">
          <dt pn="section-8.1-6.1">Using a stateless architecture:</dt>
          <dd pn="section-8.1-6.2">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
fetch data from the same database.</dd>
          <dt pn="section-8.1-6.3">Configuring the load balancers properly:</dt>
          <dd pn="section-8.1-6.4">In the case that the backend
servers are stateful, the load balancers must be properly
configured to guarantee that requests of the same TIPS view always
arrive at the same server.  For example, an operator or a provider
of an ALTO server <bcp14>MAY</bcp14> configure Layer 7 load balancers that
distribute requests based on the tips-view-path component in the URI.</dd>
        </dl>
      </section>
      <section anchor="cross-sched" numbered="true" removeInRFC="false" toc="include" pn="section-8.2">
        <name slugifiedName="name-considerations-for-cross-re">Considerations for Cross-Resource Dependency Scheduling</name>
        <t indent="0" pn="section-8.2-1">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 between the respective updates
graphs to show dependency:</t>
        <figure anchor="fig-cross" align="left" suppress-title="false" pn="figure-16">
          <name slugifiedName="name-example-dependency-model">Example Dependency Model</name>
          <artwork type="drawing" align="center" pn="section-8.2-2.1">
                       +---+   +---+   +---+   +---+   +---+
  my-network-map (N)   | 0 |--&gt;|89 |--&gt;|90 |--&gt;|91 |--&gt;|92 |
                       +---+   +---+   +---+   +---+   +---+
                                 |   \       \       \
                                 |    \       \       \
                       +---+   +---+   +---+   +---+   +---+
  my-cost-map (C)      | 0 |--&gt;|101|--&gt;|102|--&gt;|103|--&gt;|104|
                       +---+   +---+   +---+   +---+   +---+
                        |_______________________|
</artwork>
        </figure>
        <t indent="0" pn="section-8.2-3">In <xref target="fig-cross" format="default" sectionFormat="of" derivedContent="Figure 16"/>, 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 indent="0" pn="section-8.2-4">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>
        <dl spacing="normal" indent="3" newline="false" pn="section-8.2-5">
          <dt pn="section-8.2-5.1">Example 1:</dt>
          <dd pn="section-8.2-5.2">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.</dd>
          <dt pn="section-8.2-5.3">Example 2:</dt>
          <dd pn="section-8.2-5.4">The client requests C101, C102, C103, N89.  The client
either gets no consistent view or has to buffer C103.</dd>
        </dl>
        <t indent="0" pn="section-8.2-6">To get consistent ALTO information, a client must process the updates following
the guidelines specified in <xref section="9.2" sectionFormat="of" target="RFC8895" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8895#section-9.2" derivedContent="RFC8895"/>. If resources permit
(i.e., sufficient updates can be buffered), an ALTO client can safely use long
polling to fetch all the updates. This allows a client to build consistent views
quickly as the updates are already stored in the buffer. Otherwise, it is
            <bcp14>RECOMMENDED</bcp14> to request a full snapshot if the client does not have enough local resources to
            buffer and process the incremental updates.</t>
      </section>
      <section anchor="shared-tips-view" numbered="true" removeInRFC="false" toc="include" pn="section-8.3">
        <name slugifiedName="name-considerations-for-managing">Considerations for Managing Shared TIPS Views</name>
        <t indent="0" pn="section-8.3-1">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 maps or cost maps) that may be frequently queried by many
clients.  Some potential options are listed below:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8.3-2">
          <li pn="section-8.3-2.1">An ALTO server creates one TIPS view of the common resource for
each client.</li>
          <li pn="section-8.3-2.2">
            <t indent="0" pn="section-8.3-2.2.1">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" bare="false" empty="false" indent="3" pn="section-8.3-2.2.2">
              <li pn="section-8.3-2.2.2.1">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; or</li>
              <li pn="section-8.3-2.2.2.2">the TIPS view is never removed from the storage.</li>
            </ul>
          </li>
        </ul>
        <t indent="0" pn="section-8.3-3">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" numbered="true" removeInRFC="false" toc="include" pn="section-8.4">
        <name slugifiedName="name-considerations-for-offering">Considerations for Offering Shortcut Incremental Updates</name>
        <t indent="0" pn="section-8.4-1">Besides the mandatory stepwise incremental updates (from i to i+1),
an ALTO server <bcp14>MAY</bcp14> optionally offer shortcut incremental updates, or
simple shortcuts, between two non-consecutive versions i and i+k (k &gt;
1).  Such shortcuts offer alternative paths in the updates 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" indent="adaptive" start="1" pn="section-8.4-2"><li pn="section-8.4-2.1" derivedCounter="1.">optional shortcuts may increase the size of the updates graph, worst case scenario being the square of the number of updates (i.e.,
when a shortcut is offered for each version to all future
versions).</li>
          <li pn="section-8.4-2.2" derivedCounter="2.">optional shortcuts require additional storage on the ALTO server.</li>
          <li pn="section-8.4-2.3" derivedCounter="3.">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" numbered="true" removeInRFC="false" toc="include" pn="section-9">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-9-1">The security considerations of the base protocol (<xref target="RFC7285" sectionFormat="of" section="15" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-15" derivedContent="RFC7285"/>) fully apply to this
      extension.  For example, the same authenticity and integrity
      considerations (<xref target="RFC7285" sectionFormat="of" section="15.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-15.1" derivedContent="RFC7285"/>) still fully apply; the same considerations for the
      privacy of ALTO users (<xref target="RFC7285" sectionFormat="of" section="15.4" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-15.4" derivedContent="RFC7285"/>) also still fully apply. Additionally, operators of the
      ALTO servers <bcp14>MUST</bcp14> follow the guidelines in <xref target="RFC9325" format="default" sectionFormat="of" derivedContent="RFC9325"/> to avoid new TLS vulnerabilities discovered after
      <xref target="RFC7285" format="default" sectionFormat="of" derivedContent="RFC7285"/> was published.</t>
      <t indent="0" pn="section-9-2">The additional services (the addition of update read service and update
push service) provided by this extension extend the attack surface
described in <xref target="RFC7285" sectionFormat="of" section="15.1.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7285#section-15.1.1" derivedContent="RFC7285"/>.  The following subsections discuss the
additional risks and their remedies.</t>
      <section anchor="tips-denial-of-service-attacks" numbered="true" removeInRFC="false" toc="include" pn="section-9.1">
        <name slugifiedName="name-tips-denial-of-service-atta">TIPS: Denial-of-Service Attacks</name>
        <t indent="0" pn="section-9.1-1">Allowing TIPS views enables new classes of DoS 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 accessing the service.</t>
        <t indent="0" pn="section-9.1-2">To avoid such attacks, the server <bcp14>MAY</bcp14> choose to limit the number of active
views and reject new requests when that threshold is reached. TIPS allows
predictive fetching and the server <bcp14>MAY</bcp14> also choose to limit the number of
pending requests. If a new request exceeds the threshold, the server <bcp14>MAY</bcp14> log
the event and return the HTTP status 429 (Too Many Requests).</t>
        <t indent="0" pn="section-9.1-3">It is important to note that the preceding approaches are not the only
possibilities. For example, it might be possible for a TIPS server to use somewhat more
clever logic involving TIPS view eviction policies, IP reputation,
rate-limiting, and compartmentalization of the overall threshold into smaller
thresholds that apply to subsets of potential clients. If service availability
is a concern, ALTO clients <bcp14>MAY</bcp14> establish service level agreements with the ALTO
server.</t>
      </section>
      <section anchor="alto-client-update-overloading-or-instability" numbered="true" removeInRFC="false" toc="include" pn="section-9.2">
        <name slugifiedName="name-alto-client-update-overload">ALTO Client: Update Overloading or Instability</name>
        <t indent="0" pn="section-9.2-1">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 indent="0" pn="section-9.2-2">Also, under overloading, the client might 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" numbered="true" removeInRFC="false" toc="include" pn="section-10">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-10-1">IANA has registered the following media types from the registry available at <xref target="IANA-Media-Type" format="default" sectionFormat="of" derivedContent="IANA-Media-Type"/>:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-10-2">
        <li pn="section-10-2.1">application/alto-tips+json: as described in <xref target="open-resp" format="default" sectionFormat="of" derivedContent="Section 6.2"/>;</li>
        <li pn="section-10-2.2">application/alto-tipsparams+json: as described in <xref target="open-req" format="default" sectionFormat="of" derivedContent="Section 6.1"/>;</li>
      </ul>
      <section anchor="applicationalto-tipsjson-media-type" numbered="true" removeInRFC="false" toc="include" pn="section-10.1">
        <name slugifiedName="name-application-alto-tipsjson-m">application/alto-tips+json Media Type</name>
        <dl indent="3" newline="false" spacing="normal" pn="section-10.1-1">
          <dt pn="section-10.1-1.1">Type name:</dt>
          <dd pn="section-10.1-1.2">application</dd>
          <dt pn="section-10.1-1.3">Subtype name:</dt>
          <dd pn="section-10.1-1.4">alto-tips+json</dd>
          <dt pn="section-10.1-1.5">Required parameters:</dt>
          <dd pn="section-10.1-1.6">N/A</dd>
          <dt pn="section-10.1-1.7">Optional parameters:</dt>
          <dd pn="section-10.1-1.8">N/A</dd>
          <dt pn="section-10.1-1.9">Encoding considerations:</dt>
          <dd pn="section-10.1-1.10">Encoding considerations are identical to those specified for the
"application/json" media type. See <xref target="RFC8259" format="default" sectionFormat="of" derivedContent="RFC8259"/>.</dd>
          <dt pn="section-10.1-1.11">Security considerations:</dt>
          <dd pn="section-10.1-1.12">See the Security Considerations section of RFC 9569.</dd>
          <dt pn="section-10.1-1.13">Interoperability considerations:</dt>
          <dd pn="section-10.1-1.14">N/A</dd>
          <dt pn="section-10.1-1.15">Published specification:</dt>
          <dd pn="section-10.1-1.16">
            <xref target="open-resp" format="default" sectionFormat="of" derivedContent="Section 6.2"/> of RFC 9569.</dd>
          <dt pn="section-10.1-1.17">Applications that use this media type:</dt>
          <dd pn="section-10.1-1.18">ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</dd>
          <dt pn="section-10.1-1.19">Fragment identifier considerations:</dt>
          <dd pn="section-10.1-1.20">N/A</dd>
          <dt pn="section-10.1-1.21">Additional information:</dt>
          <dd pn="section-10.1-1.22">
            <t indent="0" pn="section-10.1-1.22.1"><br/></t>
            <dl spacing="compact" indent="3" newline="false" pn="section-10.1-1.22.2">
              <dt pn="section-10.1-1.22.2.1">Deprecated alias names for this type:</dt>
              <dd pn="section-10.1-1.22.2.2">N/A</dd>
              <dt pn="section-10.1-1.22.2.3">Magic number(s):</dt>
              <dd pn="section-10.1-1.22.2.4">N/A</dd>
              <dt pn="section-10.1-1.22.2.5">File extension(s):</dt>
              <dd pn="section-10.1-1.22.2.6">RFC 9569 uses the media type to refer to protocol messages; thus, it
 does not require a file extension.</dd>
              <dt pn="section-10.1-1.22.2.7">Macintosh file type code(s):</dt>
              <dd pn="section-10.1-1.22.2.8">N/A</dd>
            </dl>
          </dd>
          <dt pn="section-10.1-1.23">Person &amp; email address to contact for further information:</dt>
          <dd pn="section-10.1-1.24">
            <br/>See the Authors' Addresses section of RFC 9569.</dd>
          <dt pn="section-10.1-1.25">Intended usage:</dt>
          <dd pn="section-10.1-1.26">COMMON</dd>
          <dt pn="section-10.1-1.27">Restrictions on usage:</dt>
          <dd pn="section-10.1-1.28">N/A</dd>
          <dt pn="section-10.1-1.29">Author:</dt>
          <dd pn="section-10.1-1.30">See the Authors' Addresses section of RFC 9569.</dd>
          <dt pn="section-10.1-1.31">Change controller:</dt>
          <dd pn="section-10.1-1.32">Internet Engineering Task Force (iesg@ietf.org).</dd>
        </dl>
      </section>
      <section anchor="applicationalto-tipsparamsjson-media-type" numbered="true" removeInRFC="false" toc="include" pn="section-10.2">
        <name slugifiedName="name-application-alto-tipsparams">application/alto-tipsparams+json Media Type</name>
        <dl indent="3" newline="false" spacing="normal" pn="section-10.2-1">
          <dt pn="section-10.2-1.1">Type name:</dt>
          <dd pn="section-10.2-1.2">application</dd>
          <dt pn="section-10.2-1.3">Subtype name:</dt>
          <dd pn="section-10.2-1.4">alto-tipsparams+json</dd>
          <dt pn="section-10.2-1.5">Required parameters:</dt>
          <dd pn="section-10.2-1.6">N/A</dd>
          <dt pn="section-10.2-1.7">Optional parameters:</dt>
          <dd pn="section-10.2-1.8">N/A</dd>
          <dt pn="section-10.2-1.9">Encoding considerations:</dt>
          <dd pn="section-10.2-1.10">Encoding considerations are identical to those specified for the
 "application/json" media type. See <xref target="RFC8259" format="default" sectionFormat="of" derivedContent="RFC8259"/>.</dd>
          <dt pn="section-10.2-1.11">Security considerations:</dt>
          <dd pn="section-10.2-1.12">See the Security Considerations section of RFC 9569.</dd>
          <dt pn="section-10.2-1.13">Interoperability considerations:</dt>
          <dd pn="section-10.2-1.14">N/A</dd>
          <dt pn="section-10.2-1.15">Published specification:</dt>
          <dd pn="section-10.2-1.16">
            <xref target="open-req" format="default" sectionFormat="of" derivedContent="Section 6.1"/> of RFC 9569.</dd>
          <dt pn="section-10.2-1.17">Applications that use this media type:</dt>
          <dd pn="section-10.2-1.18">ALTO servers and ALTO clients either stand alone or are embedded within other
applications.</dd>
          <dt pn="section-10.2-1.19">Fragment identifier considerations:</dt>
          <dd pn="section-10.2-1.20">N/A</dd>
          <dt pn="section-10.2-1.21">Additional information:</dt>
          <dd pn="section-10.2-1.22">
            <t indent="0" pn="section-10.2-1.22.1"><br/></t>
            <dl spacing="compact" indent="3" newline="false" pn="section-10.2-1.22.2">
              <dt pn="section-10.2-1.22.2.1">Deprecated alias names for this type:</dt>
              <dd pn="section-10.2-1.22.2.2">N/A</dd>
              <dt pn="section-10.2-1.22.2.3">Magic number(s):</dt>
              <dd pn="section-10.2-1.22.2.4">N/A</dd>
              <dt pn="section-10.2-1.22.2.5">File extension(s):</dt>
              <dd pn="section-10.2-1.22.2.6">RFC 9569 uses the media type to refer to protocol messages; thus, it
 does not require a file extension.</dd>
              <dt pn="section-10.2-1.22.2.7">Macintosh file type code(s):</dt>
              <dd pn="section-10.2-1.22.2.8">N/A</dd>
            </dl>
          </dd>
          <dt pn="section-10.2-1.23">Person &amp; email address to contact for further information:<br/></dt>
          <dd pn="section-10.2-1.24">
            <br/>See the Authors' Addresses section of RFC 9569.</dd>
          <dt pn="section-10.2-1.25">Intended usage:</dt>
          <dd pn="section-10.2-1.26">COMMON</dd>
          <dt pn="section-10.2-1.27">Restrictions on usage:</dt>
          <dd pn="section-10.2-1.28">N/A</dd>
          <dt pn="section-10.2-1.29">Author:</dt>
          <dd pn="section-10.2-1.30">See the Authors' Addresses section of RFC 9569.</dd>
          <dt pn="section-10.2-1.31">Change controller:</dt>
          <dd pn="section-10.2-1.32">Internet Engineering Task Force (iesg@ietf.org).</dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references pn="section-11">
      <name slugifiedName="name-references">References</name>
      <references pn="section-11.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="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 indent="0">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="RFC3986" target="https://www.rfc-editor.org/info/rfc3986" quoteTitle="true" derivedAnchor="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 indent="0">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>
        <reference anchor="RFC7285" target="https://www.rfc-editor.org/info/rfc7285" quoteTitle="true" derivedAnchor="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 indent="0">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 indent="0">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 indent="0">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="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="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 indent="0">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="RFC8259" target="https://www.rfc-editor.org/info/rfc8259" quoteTitle="true" derivedAnchor="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 indent="0">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 indent="0">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="RFC8895" target="https://www.rfc-editor.org/info/rfc8895" quoteTitle="true" derivedAnchor="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 indent="0">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" target="https://www.rfc-editor.org/info/rfc9112" quoteTitle="true" derivedAnchor="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 indent="0">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 indent="0">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" target="https://www.rfc-editor.org/info/rfc9113" quoteTitle="true" derivedAnchor="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 indent="0">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 indent="0">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" target="https://www.rfc-editor.org/info/rfc9114" quoteTitle="true" derivedAnchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t indent="0">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="RFC9325" target="https://www.rfc-editor.org/info/rfc9325" quoteTitle="true" derivedAnchor="RFC9325">
          <front>
            <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="T. Fossati" initials="T." surname="Fossati"/>
            <date month="November" year="2022"/>
            <abstract>
              <t indent="0">Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) are used to protect data exchanged over a wide range of application protocols and can also form the basis for secure transport protocols. Over the years, the industry has witnessed several serious attacks on TLS and DTLS, including attacks on the most commonly used cipher suites and their modes of operation. This document provides the latest recommendations for ensuring the security of deployed services that use TLS and DTLS. These recommendations are applicable to the majority of use cases.</t>
              <t indent="0">RFC 7525, an earlier version of the TLS recommendations, was published when the industry was transitioning to TLS 1.2. Years later, this transition is largely complete, and TLS 1.3 is widely available. This document updates the guidance given the new environment and obsoletes RFC 7525. In addition, this document updates RFCs 5288 and 6066 in view of recent attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="195"/>
          <seriesInfo name="RFC" value="9325"/>
          <seriesInfo name="DOI" value="10.17487/RFC9325"/>
        </reference>
      </references>
      <references pn="section-11.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="IANA-Media-Type" target="https://www.iana.org/assignments/media-types" quoteTitle="true" derivedAnchor="IANA-Media-Type">
          <front>
            <title>Media Types</title>
            <author>
              <organization showOnFrontPage="true">IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="RFC7617" target="https://www.rfc-editor.org/info/rfc7617" quoteTitle="true" derivedAnchor="RFC7617">
          <front>
            <title>The 'Basic' HTTP Authentication Scheme</title>
            <author fullname="J. Reschke" initials="J." surname="Reschke"/>
            <date month="September" year="2015"/>
            <abstract>
              <t indent="0">This document defines the "Basic" Hypertext Transfer Protocol (HTTP) authentication scheme, which transmits credentials as user-id/ password pairs, encoded using Base64.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7617"/>
          <seriesInfo name="DOI" value="10.17487/RFC7617"/>
        </reference>
        <reference anchor="RFC9205" target="https://www.rfc-editor.org/info/rfc9205" quoteTitle="true" derivedAnchor="RFC9205">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="June" year="2022"/>
            <abstract>
              <t indent="0">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 indent="0">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="RFC9562" target="https://www.rfc-editor.org/info/rfc9562" quoteTitle="true" derivedAnchor="RFC9562">
          <front>
            <title>Universally Unique IDentifiers (UUIDs)</title>
            <author fullname="K. Davis" initials="K." surname="Davis"/>
            <author fullname="B. Peabody" initials="B." surname="Peabody"/>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <date month="May" year="2024"/>
            <abstract>
              <t indent="0">This specification defines UUIDs (Universally Unique IDentifiers) --
also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform
Resource Name namespace for UUIDs. A UUID is 128 bits long and is
intended to guarantee uniqueness across space and time. UUIDs were
originally used in the Apollo Network Computing System (NCS), later
in the Open Software Foundation's (OSF's) Distributed Computing
Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t indent="0">This specification is derived from the OSF DCE specification with the
kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have
been incorporated into this document. This document obsoletes RFC
4122.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9562"/>
          <seriesInfo name="DOI" value="10.17487/RFC9562"/>
        </reference>
      </references>
    </references>
    <section anchor="sec-dep-model" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a">
      <name slugifiedName="name-a-high-level-deployment-mod">A High-Level Deployment Model</name>
      <t indent="0" pn="section-appendix.a-1">Conceptually, the TIPS system consists of three types of resources:</t>
      <dl spacing="normal" indent="3" newline="false" pn="section-appendix.a-2">
        <dt pn="section-appendix.a-2.1">(R1):</dt>
        <dd pn="section-appendix.a-2.2">The TIPS frontend to create TIPS views.</dd>
        <dt pn="section-appendix.a-2.3">(R2):</dt>
        <dd pn="section-appendix.a-2.4">The TIPS view directory, which provides metadata (e.g., references) about the
network resource data.</dd>
        <dt pn="section-appendix.a-2.5">(R3):</dt>
        <dd pn="section-appendix.a-2.6">The actual network resource data, encoded as complete ALTO network
resources (e.g., a cost map or a network map) or incremental updates.</dd>
      </dl>
      <figure anchor="fig-service-model" align="left" suppress-title="false" pn="figure-17">
        <name slugifiedName="name-sample-tips-deployment-mode">Sample TIPS Deployment Model</name>
        <artwork type="drawing" align="center" pn="section-appendix.a-3.1">	
                      +------------------------------------------------+
                      |                                                |
 +------+             |R1: Frontend/Open  R2: Directory/Meta  R3: Data |
 |      | "iget" base |     +-----+           +-----+         +-----+  |
 |      | resource 1  |     |     |           |     |         |     |  |
 |      |-------------|----&gt;|     |           |     |         |     |  |
 |      | incremental |     |     |           |     |--------&gt;|     |  |
 |      | transfer    |     |     |           |     |         |     |  |
 |      | resource    |     |     |           |     |         |     |  |
 |      |&lt;------------|-----------------------|     |         |     |  |
 |Client|             |     |     |           +-----+         +-----+  |
 |      | "iget" base |     |     |                                    |
 |      | resource 2  |     |     |           +-----+         +-----+  |
 |      |-------------|----&gt;|     |           |     |         |     |  |
 |      | incremental |     |     |           |     |         |     |  |
 |      | transfer    |     +-----+           |     | -------&gt;|     |  |
 |      | resource    |                       |     |         |     |  |
 |      |&lt;------------|-----------------------|     |         |     |  |
 +------+             |                       +-----+         +-----+  |
                      |                                                |
                      +------------------------------------------------+
</artwork>
      </figure>
      <t indent="0" pn="section-appendix.a-4">Design Point: Component Resource Location</t>
      <dl spacing="normal" indent="3" newline="false" pn="section-appendix.a-5">
        <dt pn="section-appendix.a-5.1">Design 1 (Single):</dt>
        <dd pn="section-appendix.a-5.2">all the three resource types at the same single server (accessed via
relative reference).</dd>
        <dt pn="section-appendix.a-5.3">Design 2 (Flexible):</dt>
        <dd pn="section-appendix.a-5.4">all three resource types can be at their own server (accessed via
absolute reference).</dd>
        <dt pn="section-appendix.a-5.5">Design 3 (Dir + Data):</dt>
        <dd pn="section-appendix.a-5.6">R2 and R3 must remain together, though R1 might not be
on the same server.</dd>
      </dl>
      <t indent="0" pn="section-appendix.a-6">This document supports Designs 1 and 3. For Design 1, the ALTO server
simply needs to always use the same host for the TIPS views. For Design 3, the
ALTO server 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" format="default" sectionFormat="of" derivedContent="Section 8.1"/> for a
discussion on load balancing considerations. Future documents could extend the
protocol to support Design 2.</t>
    </section>
    <section anchor="sec-bcp-http" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-conformance-with-building-p">Conformance with "Building Protocols with HTTP" (RFC 9205) Best Current Practices</name>
      <t indent="0" pn="section-appendix.b-1">This specification adheres fully to <xref target="RFC9205" format="default" sectionFormat="of" derivedContent="RFC9205"/> as further elaborated below:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-appendix.b-2">
        <li pn="section-appendix.b-2.1">
          <t indent="0" pn="section-appendix.b-2.1.1">TIPS does not (as described in <xref section="3.1" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-3.1" derivedContent="RFC9205"/>):</t>
          <blockquote pn="section-appendix.b-2.1.2">...redefine, refine, or overlay the semantics of
generic protocol elements such as methods, status codes, or
	existing header fields.</blockquote>
          <t indent="0" pn="section-appendix.b-2.1.3">and instead focuses on</t>
          <blockquote pn="section-appendix.b-2.1.4">...protocol elements
	that are specific to [the TIPS] application -- namely, [its] HTTP
	resources.</blockquote>
        </li>
        <li pn="section-appendix.b-2.2">There are no statically defined URI components (<xref section="3.2" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-3.2" derivedContent="RFC9205"/>).</li>
        <li pn="section-appendix.b-2.3">No minimum version of HTTP is specified by TIPS, which is
recommended (in <xref section="4.1" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.1" derivedContent="RFC9205"/>).</li>
        <li pn="section-appendix.b-2.4">
          <t indent="0" pn="section-appendix.b-2.4.1">The TIPS design follows the advice (in <xref section="4.1" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.1" derivedContent="RFC9205"/>) that:</t>
          <blockquote pn="section-appendix.b-2.4.2">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...</blockquote>
        </li>
        <li pn="section-appendix.b-2.5">TIPS uses URI templates, which is recommended (in <xref section="4.2" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.2" derivedContent="RFC9205"/>).</li>
        <li pn="section-appendix.b-2.6">
          <t indent="0" pn="section-appendix.b-2.6.1">TIPS follows the pattern (in <xref section="4.4.1" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.4.1" derivedContent="RFC9205"/>) that:</t>
          <blockquote pn="section-appendix.b-2.6.2">Generally, 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 gives the application the
	  opportunity to tailor the "discovery document" to the
	  client.</blockquote>
        </li>
        <li pn="section-appendix.b-2.7">TIPS uses existing HTTP schemes (<xref section="4.4.2" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.4.2" derivedContent="RFC9205"/>).</li>
        <li pn="section-appendix.b-2.8">TIPS defines its errors "to use the most applicable status code"
(<xref section="4.6" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.6" derivedContent="RFC9205"/>).</li>
        <li pn="section-appendix.b-2.9">
          <t indent="0" pn="section-appendix.b-2.9.1">TIPS does not (as in <xref section="4.11" sectionFormat="of" target="RFC9205" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.11" derivedContent="RFC9205"/>):</t>
          <blockquote pn="section-appendix.b-2.9.2">...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.</blockquote>
          <t indent="0" pn="section-appendix.b-2.9.3">The only relationship between requests is that a
	client has to 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" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9205#section-4.4.1" derivedContent="RFC9205"/>.</t>
        </li>
      </ul>
    </section>
    <section anchor="push" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.c">
      <name slugifiedName="name-push-mode-tips-using-http-s">Push-Mode TIPS Using HTTP Server Push</name>
      <t indent="0" pn="section-appendix.c-1">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 basic 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 indent="0" pn="section-appendix.c-2">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 the built-in HTTP 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" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.d">
      <name slugifiedName="name-persistent-http-connections">Persistent HTTP Connections</name>
      <t indent="0" pn="section-appendix.d-1">Previous draft versions of this document use persistent HTTP connections to detect the
liveness of clients. However, this design does not conform well with the best
current practices 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 might
not correctly detect the right liveness state.</t>
    </section>
    <section numbered="false" anchor="acknowledgments" removeInRFC="false" toc="include" pn="section-appendix.e">
      <name slugifiedName="name-acknowledgments">Acknowledgments</name>
      <t indent="0" pn="section-appendix.e-1">The authors of this document would like to thank <contact fullname="Mark Nottingham"/> and <contact fullname="Spencer Dawkins"/>
      for providing invaluable reviews of earlier draft versions of this document;
      <contact fullname="Adrian Farrel"/>, <contact fullname="Qin Wu"/>, and
      <contact fullname="Jordi Ros Giralt"/> for their continuous feedback;      <contact fullname="Russ White"/>, <contact fullname="Donald Eastlake 3rd"/>,
      <contact fullname="Martin Thomson"/>, <contact fullname="Bernard       Aboba"/>, <contact fullname="Spencer Dawkins"/>, <contact fullname="Linda Dunbar"/>, and <contact fullname="Sheng Jiang"/> for the
      directorate reviews; <contact fullname="Martin Duke"/> for the area
      director review; <contact fullname="Francesca Palombini"/>, <contact fullname="Wesley Eddy"/>, <contact fullname="Roman Danyliw"/>, <contact fullname="Murray Kucherawy"/>, and <contact fullname="Zaheduzzaman       Sarker"/> for the telechat and IESG reviews; and <contact fullname="Mohamed Boucadair"/> for shepherding the document.</t>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.f">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author initials="K." surname="Gao" fullname="Kai Gao">
        <organization showOnFrontPage="true">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 showOnFrontPage="true">Deutsche Telekom</organization>
        <address>
          <postal>
            <street>Deutsche-Telekom-Allee 9</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 showOnFrontPage="true">Yale University</organization>
        <address>
          <postal>
            <street>51 Prospect Street</street>
            <city>New Haven</city>
            <code>06511</code>
            <region>CT</region>
            <country>United States of America</country>
          </postal>
          <email>yry@cs.yale.edu</email>
        </address>
      </author>
      <author initials="L." surname="Delwiche" fullname="Lauren Delwiche">
        <organization showOnFrontPage="true">Yale University</organization>
        <address>
          <postal>
            <street>51 Prospect Street</street>
            <city>New Haven</city>
            <region>CT</region>
            <code>06511</code>
            <country>United States of America</country>
          </postal>
          <email>lauren.delwiche@yale.edu</email>
        </address>
      </author>
      <author initials="L." surname="Keller" fullname="Lachlan Keller">
        <organization showOnFrontPage="true">Yale University</organization>
        <address>
          <postal>
            <street>51 Prospect Street</street>
            <city>New Haven</city>
            <region>CT</region>
            <code>06511</code>
            <country>United States of America</country>
          </postal>
          <email>lachlan.keller@aya.yale.edu</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
