rfc9569.original.xml   rfc9569.xml 
<?xml version='1.0' encoding='utf-8'?> <?xml version="1.0" encoding="utf-8"?>
<!-- xml2rfc v2v3 conversion 3.17.1 -->
<!DOCTYPE rfc [ <!DOCTYPE rfc [
<!ENTITY nbsp "&#160;"> <!ENTITY nbsp "&#160;">
<!ENTITY zwsp "&#8203;"> <!ENTITY zwsp "&#8203;">
<!ENTITY nbhy "&#8209;"> <!ENTITY nbhy "&#8209;">
<!ENTITY wj "&#8288;"> <!ENTITY wj "&#8288;">
]> ]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.24 (Ruby 3.0. <rfc xmlns:xi="http://www.w3.org/2001/XInclude"
6) --> ipr="trust200902"
<?rfc strict="yes"?> docName="draft-ietf-alto-new-transport-22"
<?rfc comments="yes"?> number="9569"
<?rfc inline="yes"?> submissionType="IETF"
<?rfc editing="no"?> category="std"
<?rfc tocompact="yes"?> consensus="true"
<?rfc iprnotified="no"?> updates=""
<?rfc compact="yes"?> obsoletes=""
<?rfc subcompact="no"?> tocDepth="3"
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft tocInclude="true"
-ietf-alto-new-transport-22" category="std" consensus="true" tocDepth="3" tocInc sortRefs="true"
lude="true" sortRefs="true" symRefs="true" version="3"> symRefs="true"
<!-- xml2rfc v2v3 conversion 3.17.1 --> xml:lang="en"
version="3">
<front> <front>
<title abbrev="ALTO TIPS">The ALTO Transport Information Publication Service
</title> <title abbrev="ALTO TIPS">The Application-Layer Traffic Optimization (ALTO)
<seriesInfo name="Internet-Draft" value="draft-ietf-alto-new-transport-22"/> Transport Information Publication Service (TIPS)</title>
<seriesInfo name="RFC" value="9569"/>
<author initials="K." surname="Gao" fullname="Kai Gao"> <author initials="K." surname="Gao" fullname="Kai Gao">
<organization>Sichuan University</organization> <organization>Sichuan University</organization>
<address> <address>
<postal> <postal>
<street>No.24 South Section 1, Yihuan Road</street> <street>No.24 South Section 1, Yihuan Road</street>
<city>Chengdu</city> <city>Chengdu</city>
<code>610000</code> <code>610000</code>
<country>China</country> <country>China</country>
</postal> </postal>
<email>kaigao@scu.edu.cn</email> <email>kaigao@scu.edu.cn</email>
</address> </address>
</author> </author>
<author initials="R." surname="Schott" fullname="Roland Schott"> <author initials="R." surname="Schott" fullname="Roland Schott">
<organization>Deutsche Telekom</organization> <organization>Deutsche Telekom</organization>
<address> <address>
<postal> <postal>
<street>Ida-Rhodes-Straße 2</street> <street>Deutsche-Telekom-Allee 9</street>
<city>Darmstadt</city> <city>Darmstadt</city>
<code>64295</code> <code>64295</code>
<country>Germany</country> <country>Germany</country>
</postal> </postal>
<email>Roland.Schott@telekom.de</email> <email>Roland.Schott@telekom.de</email>
</address> </address>
</author> </author>
<author initials="Y. R." surname="Yang" fullname="Yang Richard Yang"> <author initials="Y. R." surname="Yang" fullname="Yang Richard Yang">
<organization>Yale University</organization> <organization>Yale University</organization>
<address> <address>
<postal> <postal>
<street>51 Prospect Street</street> <street>51 Prospect Street</street>
<city>New Haven</city> <city>New Haven</city>
<code>CT</code> <code>06511</code>
<country>USA</country> <region>CT</region>
<country>United States of America</country>
</postal> </postal>
<email>yry@cs.yale.edu</email> <email>yry@cs.yale.edu</email>
</address> </address>
</author> </author>
<author initials="L." surname="Delwiche" fullname="Lauren Delwiche"> <author initials="L." surname="Delwiche" fullname="Lauren Delwiche">
<organization>Yale University</organization> <organization>Yale University</organization>
<address> <address>
<postal> <postal>
<street>51 Prospect Street</street> <street>51 Prospect Street</street>
<city>New Haven</city> <city>New Haven</city>
<code>3408</code> <region>CT</region>
<country>USA</country> <code>06511</code>
<country>United States of America</country>
</postal> </postal>
<email>lauren.delwiche@yale.edu</email> <email>lauren.delwiche@yale.edu</email>
</address> </address>
</author> </author>
<author initials="L." surname="Keller" fullname="Lachlan Keller"> <author initials="L." surname="Keller" fullname="Lachlan Keller">
<organization>Yale University</organization> <organization>Yale University</organization>
<address> <address>
<postal> <postal>
<street>51 Prospect Street</street> <street>51 Prospect Street</street>
<city>New Haven</city> <city>New Haven</city>
<code>3408</code> <region>CT</region>
<country>USA</country> <code>06511</code>
<country>United States of America</country>
</postal> </postal>
<email>lachlan.keller@yale.edu</email> <email>lachlan.keller@aya.yale.edu</email>
</address> </address>
</author> </author>
<date/>
<date year="2024" month="August"/>
<area>Transport Area</area> <area>Transport Area</area>
<workgroup>ALTO</workgroup> <workgroup>ALTO</workgroup>
<abstract> <abstract>
<t>The ALTO Protocol (RFC 7285) leverages HTTP/1.1 and is designed for the <t>"Application-Layer Traffic Optimization (ALTO) Protocol" (RFC 7285) lev
simple, erages HTTP/1.1 and is designed for
sequential request-reply use case, in which an ALTO client requests a the simple, sequential request-reply use case, in which an ALTO client
sequence of information resources and the server responds with the complete requests a sequence of information resources and the server responds
content of each resource one at a time.</t> with the complete content of each resource, one at a time.</t>
<t>ALTO incremental updates using Server-Sent Events (SSE) (RFC 8895) defi <t>RFC 8895, which describes ALTO incremental updates using Server-Sent Ev
nes a ents (SSE),
multiplexing protocol on top of HTTP/1.x, so that an ALTO server can defines a multiplexing protocol on top of HTTP/1.x, so that an ALTO
incrementally push resource updates to clients whenever monitored network server can incrementally push resource updates to clients whenever
information resources change, allowing the clients to monitor multiple resources monitored network information resources change, allowing the clients to
at the same time. However, HTTP/2 and later versions already support concurrent, monitor multiple resources at the same time. However, HTTP/2 and later
non-blocking transport of multiple streams in the same HTTP connection.</t> versions already support concurrent, non-blocking transport of multiple
<t>To take advantage of newer HTTP features, this document introduces the streams in the same HTTP connection.</t>
ALTO
Transport Information Publication Service (TIPS). TIPS uses an incremental <t>To take advantage of newer HTTP features, this document introduces
RESTful design to give an ALTO client the new capability to explicitly, the ALTO Transport Information Publication Service (TIPS). TIPS uses an
concurrently (non-blocking) request (pull) specific incremental updates using incremental RESTful design to give an ALTO client the new capability to
native HTTP/2 or HTTP/3, while still functioning for HTTP/1.1.</t> 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> </abstract>
<note removeInRFC="true">
<name>Discussion Venues</name>
<t>Discussion of this document takes place on the
Application-Layer Traffic Optimization Working Group mailing list (alto@ietf
.org),
which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/
alto/"/>.</t>
<t>Source for this draft and an issue tracker can be found at
<eref target="https://github.com/ietf-wg-alto/draft-ietf-alto-new-transport"
/>.</t>
</note>
</front> </front>
<middle> <middle>
<section anchor="intro"> <section anchor="intro">
<name>Introduction</name> <name>Introduction</name>
<t>Application-Layer Traffic Optimization (ALTO) provides means for networ k <t>The Application-Layer Traffic Optimization (ALTO) protocol provides mea ns for network
applications to obtain network status information. So far, the ALTO information applications to obtain network status information. So far, the ALTO information
can be transported in two ways:</t> can be transported in two ways:</t>
<ol spacing="normal" type="1"><li>The ALTO base protocol <xref target="RFC <ol spacing="normal" type="1"><li>Using the ALTO base protocol <xref targe
7285"/>, which is designed for the simple use case t="RFC7285"/>, which is designed for the simple use case
in which an ALTO client requests a network information resource, and the in which an ALTO client requests a network information resource and the
server sends the complete content of the requested information (if any) server sends the complete content of the requested information (if any)
resource to the client.</li> resource to the client.</li>
<li>ALTO incremental updates using Server-Sent Events (ALTO/SSE) <xref t <li>Using ALTO incremental updates using Server-Sent Events (ALTO/SSE) <
arget="RFC8895"/>, xref target="RFC8895"/>;
which is designed for an ALTO client to indicate to the server that it wants this method is designed for an ALTO client to indicate to the server that it wan
to receive updates for a set of resources and the server can then ts
to receive updates for a set of resources, and the server can then
concurrently and incrementally push updates to that client whenever concurrently and incrementally push updates to that client whenever
monitored resources change.</li> monitored resources change.</li>
</ol> </ol>
<t>Both protocols are designed for HTTP/1.1 <xref target="RFC9112"/>, but
HTTP/2 <xref target="RFC9113"/> and <t>Both protocols are designed for HTTP/1.1 <xref target="RFC9112"/>. Whil
HTTP/3 <xref target="RFC9114"/> can support HTTP/1.1 workflows. However, HTTP/2 e they still work with HTTP/2 <xref target="RFC9113"/> and
and HTTP/3 HTTP/3 <xref target="RFC9114"/>, ALTO and ALTO/SSE cannot take full advantage of
provide features that can improve certain properties of ALTO and ALTO/SSE.</t> new features offered by HTTP/2 and HTTP/3.</t>
<ul spacing="normal"> <ul spacing="normal">
<li>First, consider the ALTO base protocol, which is designed to transfe r only <li>First, consider the ALTO base protocol, which is designed to transfe r only
complete information resources. A client can run the base protocol on top of 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 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 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 b e a large no capability for the server to transmit incremental updates. Hence, there can b e a large
overhead when the client already has an information resource and then there are overhead when the client already has an information resource and then there are
small changes to the resource.</li> small changes to the resource.</li>
<li>Next, consider ALTO/SSE <xref target="RFC8895"/>. Although ALTO/SSE can transfer <li>Next, consider ALTO/SSE <xref target="RFC8895"/>. Although ALTO/SSE can transfer
incremental updates, it introduces a customized multiplexing protocol on top incremental updates, it introduces a customized multiplexing protocol on top
of HTTP, assuming a total-order message channel from the server to the client. 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) The multiplexing design does not provide naming (i.e., a resource identifier)
to individual incremental updates. Such a design cannot use concurrent data 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 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 identifier. Additionally, ALTO/SSE is a push-only protocol, which denies the
client flexibility in choosing how and when it receives updates.</li> client flexibility in choosing how and when it receives updates.</li>
</ul> </ul>
<t>To mitigate these concerns, this document introduces a new ALTO service called <t>To mitigate these concerns, this document introduces a new ALTO service called
the Transport Information Publication Service (TIPS). TIPS uses an incremental the Transport Information Publication Service (TIPS). TIPS uses an incremental
RESTful design to provide an ALTO client with a new capability to explicitly, RESTful design to provide an ALTO client with a new capability to explicitly,
concurrently issue non-blocking requests for specific incremental updates using concurrently issue non-blocking requests for specific incremental updates using
native HTTP/2 or HTTP/3, while still functioning for HTTP/1.1.</t> HTTP/2 or HTTP/3, while still functioning for HTTP/1.1.</t>
<t>While ALTO/SSE <xref target="RFC8895"/> and TIPS both can transport inc <t>While both ALTO/SSE <xref target="RFC8895"/> and TIPS can transport inc
remental updates of remental updates of
ALTO information resources to clients, they have different design goals. The ALTO information resources to clients, they have different design goals. The
TIPS extension enables more scalable and robust distribution of incremental TIPS extension enables more scalable and robust distribution of incremental
updates, but is missing the session management and built-in server push updates but is missing the session management and built-in server push
capabilities of ALTO/SSE. From the performance perspective, TIPS is optimizing capabilities of ALTO/SSE. From the performance perspective, TIPS is optimizing
throughput by leveraging concurrent and out-of-order transport of data, while 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 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 the clients without waiting for another round of communication when there are
multiple updates. Thus, we do not see TIPS as a replacement but as a complement multiple updates. Thus, we do not see TIPS as a replacement for ALTO/SSE, but as
of ALTO/SSE. One example of combining these two extensions is as shown in a complement
to it. One example of combining these two extensions is shown in
<xref target="tips-sse"/>.</t> <xref target="tips-sse"/>.</t>
<t>Note that future extensions may leverage server push, a feature of HTTP /2 <t>Note that future extensions may leverage server push, a feature of HTTP /2
<xref target="RFC9113"/> and HTTP/3 <xref target="RFC9114"/>, as an alternative of SSE. We discuss why <xref target="RFC9113"/> and HTTP/3 <xref target="RFC9114"/>, as an alternative of SSE. We discuss why
this alternative design is not ready in <xref target="push"/>.</t> this alternative design is not ready at the time of writing in <xref target="pus h"/>.</t>
<t>Specifically, this document specifies:</t> <t>Specifically, this document specifies:</t>
<ul spacing="normal"> <ul spacing="normal">
<li>Extensions to the ALTO Protocol for dynamic subscription and efficie nt <li>Extensions to the ALTO Protocol for dynamic subscription and efficie nt
uniform update delivery of an incrementally changing network information uniform update delivery of an incrementally changing network information
resource.</li> resource.</li>
<li>A new resource type that indicates the TIPS updates graph model for a <li>A new resource type that indicates the TIPS updates graph model for a
resource.</li> resource.</li>
<li>URI patterns to fetch the snapshots or incremental updates.</li> <li>URI patterns to fetch the snapshots or incremental updates.</li>
</ul> </ul>
<t>Some operational complexities that must be taken into consideration whe n <t>Some operational complexities that must be taken into consideration whe n
implementing this extension are discussed in <xref target="ops-considerations"/> implementing this extension are discussed in <xref target="ops-considerations"/>
, including : these include
load balancing <xref target="load-balancing"/>, fetching and processing incremen load balancing in <xref target="load-balancing"/> and fetching and processing in
tal updates cremental updates
of dependent resources <xref target="cross-sched"/></t> of dependent resources in <xref target="cross-sched"/>.</t>
<t><xref target="sec-bcp-http"/> discusses to what extent the TIPS design <t><xref target="sec-bcp-http"/> discusses to what extent the TIPS design
adheres to the Best adheres to the best
Current Practices for building protocols with HTTP <xref target="RFC9205"/>.</t> current practices for building protocols with HTTP <xref target="RFC9205"/>.</t>
<section anchor="requirements-language">
<section anchor="requirements-language">
<name>Requirements Language</name> <name>Requirements Language</name>
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp <t>
14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
nterpreted as "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and be interpreted as
only when, they described in BCP&nbsp;14 <xref target="RFC2119"/> <xref target="RFC8174"/>
appear in all capitals, as shown here.</t> when, and only when, they appear in all capitals, as shown here.
</t>
</section> </section>
<section anchor="notations"> <section anchor="notations">
<name>Notations</name> <name>Notations</name>
<t>This document uses the same syntax and notations as introduced in <t>This document uses the same syntax and notations as introduced in
<xref section="8.2" sectionFormat="of" target="RFC7285"/> to specify the extensi ons to existing ALTO resources and services.</t> <xref section="8.2" sectionFormat="of" target="RFC7285"/> to specify the extensi ons to existing ALTO resources and services.</t>
</section> </section>
</section> </section>
<section anchor="overview"> <section anchor="overview">
<name>TIPS Overview</name> <name>TIPS Overview</name>
<section anchor="requirements"> <section anchor="requirements">
<name>Transport Requirements</name> <name>Transport Requirements</name>
<t>The ALTO Protocol and its extensions support two transport mechanisms <t>The ALTO Protocol and its extensions support two transport mechanisms
: :</t>
First, a client can directly request an ALTO resource and obtain a complete <ol>
snapshot of that ALTO resource, as specified in the base protocol <xref target=" <li>A client can directly request an ALTO resource and obtain a complete
RFC7285"/>; snapshot of that ALTO resource, as specified in the base protocol <xref target="
Second, a client can subscribe to incremental changes of one or multiple ALTO RFC7285"/>;</li>
<li>A client can subscribe to incremental changes of one or multiple ALTO
resources using the incremental update extension <xref target="RFC8895"/>, and a server pushes resources using the incremental update extension <xref target="RFC8895"/>, and a server pushes
the updates to the client through Server Sent Events (SSE).</t> the updates to the client through SSE.</li>
</ol>
<t>However, the current transport mechanisms are not optimized for stori ng, <t>However, the current transport mechanisms are not optimized for stori ng,
transmitting, and processing (incremental) updates of ALTO information transmitting, and processing (incremental) updates of ALTO information
resources. Specifically, the new transport mechanism must satisfy the following resources. Specifically, the new transport mechanism must satisfy the following
requirements:</t> requirements:</t>
<dl> <dl>
<dt>Incremental updates:</dt> <dt>Incremental updates:</dt>
<dd> <dd>
<t>Incremental updates only maintain and transfer the "diff" upon ch anges. Thus, <t>Incremental updates only maintain and transfer the "diff" upon ch anges. Thus,
it is more efficient than storing and transferring the full updates, it is more efficient than storing and transferring the full updates,
especially when the change of an ALTO resource is minor. The base protocol especially when the change of an ALTO resource is minor. The base protocol
does not support incremental updates and the current incremental update does not support incremental updates and the current incremental update
mechanism in <xref target="RFC8895"/> has limitations (as discussed below).</t> mechanism in <xref target="RFC8895"/> has limitations (as discussed below).</t>
</dd> </dd>
<dt>Concurrent, non-blocking update transmission:</dt> <dt>Concurrent, non-blocking update transmission:</dt>
<dd> <dd>
<t>When a client needs to receive and apply multiple incremental upd ates, it is <t>When a client needs to receive and apply multiple incremental upd ates, it is
desired to transmit the updates concurrently to fully utilize the bandwidth desired to transmit the updates concurrently to fully utilize the bandwidth
and to reduce head-of-line blocking. The ALTO incremental update extension and to reduce head-of-line blocking. Unfortunately, the ALTO incremental update
<xref target="RFC8895"/>, unfortunately, does not satisfy this requirement -- ev extension
en though <xref target="RFC8895"/> does not satisfy this requirement. Even though
the updates can be multiplexed by the server to avoid head-of-line blocking the updates can be multiplexed by the server to avoid head-of-line blocking
between multiple resources, the updates are delivered sequentially and can between multiple resources, the updates are delivered sequentially and can
suffer from head-of-line blocking inside the connection, for example, when suffer from head-of-line blocking inside the connection (for example, when
there is a packet loss.</t> there is a packet loss).</t>
</dd> </dd>
<dt>Long-polling updates:</dt> <dt>Long polling updates:</dt>
<dd> <dd>
<t>Long-polling updates can reduce the time to send the request, mak ing it <t>Long polling updates can reduce the time to send the request, mak ing it
possible to achieve sub-RTT transmission of ALTO incremental updates. In possible to achieve sub-RTT transmission of ALTO incremental updates. In
<xref target="RFC8895"/>, this requirement is fulfilled using server-sent event <xref target="RFC8895"/>, this requirement is fulfilled using SSE and
(SSE) and is still desired in the new ALTO transport.</t>
is still desired in the ALTO new transport.</t>
</dd> </dd>
<dt>Backward compatibility:</dt> <dt>Backward compatibility:</dt>
<dd> <dd>
<t>While some of the previous requirements are offered by HTTP/2 <xr ef target="RFC9113"/> and <t>While some of the previous requirements are offered by HTTP/2 <xr ef target="RFC9113"/> and
HTTP/3 <xref target="RFC9114"/>, it is desired that the ALTO new transport mecha nism can HTTP/3 <xref target="RFC9114"/>, it is desired that the new ALTO transport mecha nism can
work with HTTP/1.1 as many development tools and current ALTO implementations work with HTTP/1.1 as many development tools and current ALTO implementations
are based on HTTP/1.1.</t> are based on HTTP/1.1.</t>
</dd> </dd>
</dl> </dl>
<t>The ALTO new transport specified in this document satisfies all the d
esign <t>The new ALTO transport specified in this document satisfies all of th
requirements:</t> e following design
requirements above by:</t>
<ul spacing="normal"> <ul spacing="normal">
<li>This document reuses the data format introduced in <xref target="R FC8895"/> that enables <li>Reusing the data format introduced in <xref target="RFC8895"/> tha t enables
incremental updates using JSON patches or merge patches.</li> incremental updates using JSON patches or merge patches.</li>
<li>This document introduce a unified data model to describe the chang <li>Introducing a unified data model to describe the
es changes (snapshots and incremental updates) of an ALTO resource,
(snapshots and incremental updates) of an ALTO resource, referred to as a TIPS referred to as a "TIPS view". In the data model, snapshots and
view. In the data model, snapshots and incremental updates are indexed as incremental updates are indexed as individual HTTP resources
individual HTTP resources following a unified naming convention, independent following a unified naming convention, independent of the HTTP
of the HTTP version. Thus, these updates can be concurrently requested and be version. Thus, these updates can be concurrently requested and be
transferred in a non-blocking manner either by using multiple connections or transferred in a non-blocking manner either by using multiple
leveraging multiplexed data transfer offered by HTTP/2 or HTTP/3.</li> connections or leveraging multiplexed data transfer offered by
<li>The unified naming convention is based on a monotonically increasi HTTP/2 or HTTP/3.</li>
ng sequence <li>Basing the unified naming convention on a monotonically
number, making it possible for a client to construct the URL of a future increasing sequence number, making it possible for a client to
update and send a long-polling request.</li> construct the URL of a future update and send a long polling
<li>The unified naming convention is independent of the HTTP versions request.</li>
and can <li>Making the unified naming convention independent of the HTTP versi
operate atop HTTP/1.1, HTTP/2 or HTTP/3.</li> ons
and able to operate atop HTTP/1.1, HTTP/2, or HTTP/3.</li>
</ul> </ul>
<t>This document assumes the deployment model discussed in <xref target ="sec-dep-model"/>.</t> <t>This document assumes the deployment model discussed in <xref target ="sec-dep-model"/>.</t>
</section> </section>
<section anchor="terminology"> <section anchor="terminology">
<name>TIPS Terminology</name> <name>TIPS Terminology</name>
<t>In addition to the terms defined in <xref target="RFC7285"/>, this do cument uses the following terms:</t> <t>In addition to the terms defined in <xref target="RFC7285"/>, this do cument uses the following terms:</t>
<dl> <dl>
<dt>Transport Information Publication Service (TIPS):</dt> <dt>Transport Information Publication Service (TIPS):</dt>
<dd> <dd>
<t>Is a new type of ALTO service, as specified in this document, to enable a <t>A new type of ALTO service, as specified in this document, to ena ble a
uniform transport mechanism for updates of an incrementally changing ALTO uniform transport mechanism for updates of an incrementally changing ALTO
network information resource.</t> network information resource.</t>
</dd> </dd>
<dt>Network information resource:</dt> <dt>Network information resource:</dt>
<dd> <dd>
<t>Is a piece of retrievable information about network state, per <x ref target="RFC7285"/>.</t> <t>A piece of retrievable information about network state, per <xref target="RFC7285"/>.</t>
</dd> </dd>
<dt>TIPS view (tv):</dt> <dt>TIPS view (tv):</dt>
<dd> <dd>
<t>Is defined in this document to be the container of incremental tr ansport <t>The container of incremental transport
information about the network information resource. The TIPS view has one information about the network information resource. The TIPS view has one
basic component, updates graph (ug), but may include other transport basic component, the updates graph (ug), but may include other transport
information.</t> information.</t>
</dd> </dd>
<dt>Updates graph (ug):</dt> <dt>Updates graph (ug):</dt>
<dd> <dd>
<t>Is a directed, acyclic graph whose nodes represent the set of ver <t>A directed, acyclic graph whose nodes represent the set of
sions of an versions of an information resource and whose edges represent the
information resource, and edges the set of update items to compute these set of update items to compute these versions. An ALTO map service
versions. An ALTO map service (e.g., Cost Map, Network Map) may need only a (e.g., a cost map or a network map) may need only a single updates
single updates graph. A dynamic network information service (e.g., Filtered 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 cost map) may create an updates graph (within a new TIPS view) for
request. Encoding of a updates graph is specified in <xref target="open-req"/>.< each unique request. The encoding of an updates graph is specified
/t> in <xref target="open-req"/>.</t>
</dd> </dd>
<dt>Version:</dt> <dt>Version:</dt>
<dd> <dd>
<t>Represents a historical content of an information resource. For a n information <t>The representation of a historical content of an information reso urce. For an information
resource, each version is associated with and uniquely identified by a resource, each version is associated with and uniquely identified by a
monotonically and consecutively increased sequence number. This document uses monotonically and consecutively increased sequence number. This document uses
the term "version s" to refer to the version associated with sequence number the term "version s" to refer to the version associated with sequence number
"s". Version is encoded as a JSONNumber, as specified in <xref target="open-req" />.</t> "s". The version is encoded as a JSONNumber, as specified in <xref target="open- req"/>.</t>
</dd> </dd>
<dt>Start sequence number (start-seq):</dt> <dt>Start sequence number (&lt;start-seq&gt;):</dt>
<dd> <dd>
<t>Is the smallest non-zero sequence number in an updates graph.</t> <t>The smallest non-zero sequence number in an updates graph.</t>
</dd> </dd>
<dt>End sequence number (end-seq):</dt> <dt>End sequence number (&lt;end-seq&gt;):</dt>
<dd> <dd>
<t>Is the largest sequence number in an updates graph.</t> <t>The largest sequence number in an updates graph.</t>
</dd> </dd>
<dt>Snapshot:</dt> <dt>Snapshot:</dt>
<dd> <dd>
<t>Is a full replacement of a resource and is contained within an up dates graph.</t> <t>A full replacement of a resource that is contained within an upda tes graph.</t>
</dd> </dd>
<dt>Incremental update:</dt> <dt>Incremental update:</dt>
<dd> <dd>
<t>Is a partial replacement of a resource contained within an update <t>A partial replacement of a resource contained within an
s graph, updates graph, codified in this document as a JSON merge patch or
codified in this document as a JSON Merge Patch or JSON Patch. An incremental a JSON patch. An incremental update is mandatory if the source
update is mandatory if the source version (i) and target version (j) are version (i) and the target version (j) are consecutive (i.e., i + 1
consecutive, i.e., i + 1 = j, and optional or a shortcut otherwise. Mandatory =
incremental updates are always in an updates graph, while optional/shortcut j); otherwise, it is optional (or a shortcut). Mandatory incremental
incremental updates may or may not be included in an updates graph.</t> updates are always in an updates graph, while optional/shortcut
incremental updates may or may not be included in an updates
graph.</t>
</dd> </dd>
<dt>Update item:</dt> <dt>Update item:</dt>
<dd> <dd>
<t>Refers to the content on an edge of the updates graph, which can <t>The content on an edge of the updates graph, which can be either
be either a a
snapshot or an incremental update. An update item can be considered as a pair 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 (op, data) where op denotes whether the item is an incremental update or a
snapshot, and data is the content of the item.</t> snapshot and data is the content of the item.</t>
</dd> </dd>
<dt>ID#i-#j:</dt> <dt>ID#i-#j:</dt>
<dd> <dd>
<t>Denotes the update item on a specific edge in the updates graph t o transition <t>Denotation of the update item on a specific edge in the updates g raph to transition
from version i to version j, where i and j are the sequence numbers of the 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> source node and the target node of the edge, respectively.</t>
</dd> </dd>
</dl> </dl>
<figure anchor="fig-overview"> <figure anchor="fig-overview">
<name>Overview of ALTO TIPS</name> <name>Overview of ALTO TIPS</name>
<artwork type="drawing" align="center"><![CDATA[ <artwork type="drawing" align="center"><![CDATA[
+-------------+ +-------------+
+-----------+ +--------------+ | Dynamic | +-----------+ +-----------+ +--------------+ | Dynamic | +-----------+
| Routing | | Provisioning | | Network | | External | | Routing | | Provisioning | | Network | | External |
skipping to change at line 380 skipping to change at line 405
| \ | | | \ | |
+----------+ +----------+ +----------+ +----------+ +----------+ +----------+
| Client 1 | | Client 2 | | Client 3 | | Client 1 | | Client 2 | | Client 3 |
+----------+ +----------+ +----------+ +----------+ +----------+ +----------+
tvi = TIPS view i tvi = TIPS view i
tvi/ug = incremental updates graph associated with tvi tvi/ug = incremental updates graph associated with tvi
]]></artwork> ]]></artwork>
</figure> </figure>
<t><xref target="fig-overview"/> shows an example illustrating an overvi ew of the ALTO TIPS <t><xref target="fig-overview"/> shows an example illustrating an overvi ew of the ALTO TIPS
service. The server provides the TIPS service of two information resources (#1 extension. The server provides TIPS for two information resources (#1
and #2) where #1 is an ALTO map service, and #2 is a filterable and #2) where #1 is an ALTO map service and #2 is a filterable
service. There are 3 ALTO clients (Client 1, Client 2, and Client 3) that are service. There are three ALTO clients (Client 1, Client 2, and Client 3) that ar
e
connected to the ALTO server.</t> connected to the ALTO server.</t>
<t>Each client uses the TIPS view to retrieve updates. Specifically, a T IPS view <t>Each client uses the TIPS view to retrieve updates. Specifically, a T IPS view
(tv1) is created for the map service #1, and is shared by multiple clients. For (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 upo n the filtering service #2, two different TIPS views (tv2 and tv3) are created upo n
different client requests with different filter sets.</t> different client requests with different filter sets.</t>
</section> </section>
</section> </section>
<section anchor="tips-updates-graph"> <section anchor="tips-updates-graph">
<name>TIPS Updates Graph</name> <name>TIPS Updates Graph</name>
<t>In order to provide incremental updates for a resource, an ALTO server creates <t>In order to provide incremental updates for a resource, an ALTO server creates
an updates graph, which is a directed, acyclic graph that contains a sequence of an updates graph, which is a directed acyclic graph that contains a sequence of
incremental updates and snapshots (collectively called update items) of a incremental updates and snapshots (collectively called "update items") of a
network information resource.</t> network information resource.</t>
<section anchor="data-model"> <section anchor="data-model">
<name>Basic Data Model of Updates Graph</name> <name>Basic Data Model of an Updates Graph</name>
<t>For each resource (e.g., a cost map, a network map), the incremental <t>For each resource (e.g., a cost map or a network map), the incrementa
updates and l updates and
snapshots can be represented using the following directed acyclic graph model, 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 ar e where the server tracks the change of the resource maps with version IDs that ar e
assigned sequentially (i.e., incremented by 1 each time):</t> assigned sequentially (i.e., incremented by one each time):</t>
<ul spacing="normal"> <ul spacing="normal">
<li>Each node in the graph is a version of the resource, which is iden tified by a <li>Each node in the graph is a version of the resource, which is iden tified by a
sequence number (defined as a JSONNumber). Version 0 is reserved as the sequence number (defined as a JSONNumber). Version 0 is reserved as the
initial state (empty/null).</li> initial state (empty/null).</li>
<li>A tag identifies the content of a node. A tag has the same format as the <li>A tag identifies the content of a node. A tag has the same format as the
"tag" field in <xref section="10.3" sectionFormat="of" target="RFC7285"/> and is valid only within the "tag" field in <xref section="10.3" sectionFormat="of" target="RFC7285"/> and is valid only within the
scope of resource.</li> scope of the resource.</li>
<li>Each edge is an update item. In particular, the edge from i to j i s the update <li>Each edge is an update item. In particular, the edge from i to j i s the update
item to transit from version i to version j.</li> item to transit from version i to version j.</li>
<li>Version is path-independent (different paths arrive at the same ve <li>The version is path independent, i.e., different paths arriving at
rsion/node the node associated with the same version
has the same content)</li> have the same content.</li>
</ul> </ul>
<t>A concrete example is shown in <xref target="fig-ug"/>. There are 7 n
odes in the graph, <t>A concrete example is shown in <xref target="fig-ug"/>. There are sev
representing 7 different versions of the resource. Edges in the figure represent en nodes in the graph,
representing seven different versions of the resource. Edges in the figure repre
sent
the updates from the source version to the target version. Thick lines 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 mandatory incremental updates (e.g., ID103-104), dotted lines represent optional
incremental updates (e.g., ID103-105), and thin lines represent snapshots (e.g., 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 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, 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 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 version of the client is 103 as it serves as a base upon which incremental
updates can be applied. The target version 105 can either be directly fetched as updates can be applied.</t>
a snapshot, computed incrementally by applying the incremental updates between
103 and 104, then 104 and 105, or if the optional update from 103 to 105 exists, <t>The target version 105 can be:</t>
computed incrementally by taking the "shortcut" path from 103 to 105.</t>
<ul>
<li>directly fetched as a snapshot;</li>
<li>computed incrementally by applying the incremental updates between
103 and 104, then 104 and 105; or,</li>
<li>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"> <figure anchor="fig-ug">
<name>TIPS Model Example</name> <name>TIPS Model Example</name>
<artwork type="drawing" align="center"><![CDATA[ <artwork type="drawing" align="center"><![CDATA[
+======+ +======+
------| 0 | ------| 0 |
/ +======+ / +======+
ID0-101 / | | ID0-101 / | |
|/__ | | |/__ | |
+======+ | | +======+ | |
tag: 3421097 -> | 101 | | | tag: 3421097 -> | 101 | | |
+======+ | | +======+ | |
ID101-102 || | | ID101-102 || | |
\/ | | \/ | |
+======+ | | +======+ | |
tag: 6431234 -> | 102 | | | tag: 6431234 -> | 102 | | |
+======+ | | +======+ | |
ID102-103 || | | ID102-103 || | |
\/ | | \/ | |
+======+ / | +======+ / |
+--------------+ tag: 0881080 -> | 103 |<--------/ | +--------------+ tag: 0881080 -> | 103 |<--------/ |
| Base Version | =======> +======+ ID0-103 | | Base Version | =======> +======+ ID0-103 |
+--------------+ 103-104 || .. | +--------------+ 103-104 || .. |
\/ .. | \/ .. |
+======+ .. | +======+ .. |
tag: 6452654 -> | 104 | .. ID103 | tag: 6452654 -> | 104 | .. ID103 |
+======+ .. -105 | +======+ .. -105 |
ID104-105 || .. | ID0-105 ID104-105 || .. | ID0-105
\/ |._ / \/ |._ /
+======+ / +======+ /
tag: 7838392 -> | 105 |<-----------/ tag: 7838392 -> | 105 |<-----------/
+======+ +======+
ID105-106 || ID105-106 ||
\/ \/
+======+ +======+
tag: 6470983 -> | 106 | tag: 6470983 -> | 106 |
+======+ +======+
]]></artwork> ]]></artwork>
</figure> </figure>
</section> </section>
<section anchor="updates-graph-modification-invariants"> <section anchor="updates-graph-modification-invariants">
<name>Updates Graph Modification Invariants</name> <name>Updates Graph Modification Invariants</name>
<t>A server may change its updates graph (to compact, to add nodes, <t>A server might change its updates graph (to compact it, to add nodes,
etc.), but it must ensure that any resource state that it makes etc.), but it will need to ensure that any resource state that it makes
available is reachable by clients, either directly via a snapshot available is reachable by clients, either directly via a snapshot
(that is, relative to 0) or indirectly by requesting an earlier (that is, relative to 0) or indirectly by requesting an earlier
snapshot and a contiguous set of incremental updates. Additionally, snapshot and a contiguous set of incremental updates. Additionally,
to allow clients to proactively construct URIs for future update to allow clients to proactively construct URIs for future update
items, the ID of each added node in the updates graph must increment 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> sat isfy contiguously by 1. More specifically, the updates graph <bcp14>MUST</bcp14> sat isfy
the following invariants:</t> the following invariants:</t>
<ul spacing="normal"> <dl spacing="normal">
<li>Continuity: At any time, let ns denote the smallest non-zero versi <dt>Continuity:</dt><dd>At any time, let ns denote the smallest non-ze
on (i.e., ro version (i.e.,
start-seq) in the update graph and ne denote the latest version (i.e., &lt;start-seq&gt;) in the updates graph and let ne denote the latest version (i.
end-seq). Then any version in between ns and ne <bcp14>MUST</bcp14> also exist. e.,
This implies &lt;end-seq&gt;). Then, any version in between ns and ne <bcp14>MUST</bcp14> als
that the incremental update from ni to ni + 1 exists for any ns &lt;= ni &lt;= n o exist. This implies
e, that the incremental update from ni to ni + 1 exists for any ns &lt;= ni &lt;= n
and all versions in the update graph (except 0) is an integer interval e, and all the version numbers in the updates graph (except 0)
<tt>[ns, ne]</tt>.</li> constitute exactly the integer interval [ns, ne].</dd>
<li>Feasibility: Let ns denote the start-seq in the update graph. The <dt>Feasibility:</dt><dd>Let ns denote &lt;start-seq&gt; in the update
server <bcp14>MUST</bcp14> s graph. The server <bcp14>MUST</bcp14>
provide a snapshot of ns and, in other words, there is always a direct link provide a snapshot of ns; in other words, there is always a direct link
to ns in the update graph.</li> to ns in the updates graph.</dd>
<li>"Right shift" only: Assume a server provides versions in <tt>[n1, <dt>"Right shift" only:</dt><dd>Assume a server provides versions in [
n2]</tt> at time t n1, n2] at time t
and versions in <tt>[n1', n2']</tt> at time t'. If t' &gt; t, then n1' &gt;= n1 and versions in [n1', n2'] at time t'. If t' &gt; t, then n1' &gt;= n1 and n2' &
and n2' &gt;= gt;=
n2.</li> n2.</dd>
</ul> </dl>
<t>For example, consider the case that a server compacts a resource's up dates graph <t>For example, consider the case that a server compacts a resource's up dates graph
to conserve space, using the example model in <xref target="data-model"/>. Assum e at time 0, to conserve space, using the example model in <xref target="data-model"/>. Assum e at time 0,
the server provides the versions <tt>{101, 102, 103, 104, 105, 106}</tt>. At tim the server provides the versions {101, 102, 103, 104, 105, 106}. At time 1,
e 1, both {103, 104, 105, 106} and {105, 106} are valid sets. However, {102,
both <tt>{103, 104, 105, 106}</tt> and <tt>{105, 106}</tt> are valid sets. Howev 103, 104, 105, 106} and {104, 105, 106} are not valid sets as there is no
er, <tt>{102, snapshot to version 102 or 104 in the updates graph. Thus, there is a risk that
103, 104, 105, 106}</tt> and <tt>{104, 105, 106}</tt> are not valid sets as ther
e is no
snapshot to version 102 or 104 in the update graph. Thus, there is a risk that
the right content of version 102 (in the first example) or 104 (in the second 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 example) cannot be obtained by a client that does not have the previous version
101 or 103, respectively.</t> 101 or 103, respectively.</t>
</section> </section>
</section> </section>
<section anchor="workflow"> <section anchor="workflow">
<name>TIPS Workflow and Resource Location Schema</name> <name>TIPS Workflow and Resource Location Schema</name>
<section anchor="workflow-overview"> <section anchor="workflow-overview">
<name>Workflow</name> <name>Workflow</name>
<t>At a high level, an ALTO client first uses the TIPS service (denoted <t>At a high level, an ALTO client first requests the TIPS information r
as TIPS-F esource (denoted as TIPS-F,
and F is for frontend) to indicate the information resource(s) that the client 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 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 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 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 correctly interact with the current view. With the URI to the root of a TIPS
view, clients can construct URIs (see <xref target="schema"/>) to fetch incremen tal updates.</t> view, clients can construct URIs (see <xref target="schema"/>) to fetch incremen tal updates.</t>
<t>An example workflow is shown in <xref target="fig-workflow-pull"/>. A fter the TIPS-F <t>An example workflow is shown in <xref target="fig-workflow-pull"/>. A fter the TIPS-F
service receives the request from the client to monitor the updates of an ALTO receives the request from the client to monitor the updates of an ALTO
resource, it creates a TIPS view service and returns the corresponding 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 information to the client. The URI points to that specific TIPS-V instance, and
the summary contains the start-seq and end-seq of the update graph, and a the summary contains the &lt;start-seq&gt; and &lt;end-seq&gt; of the updates gr
server-recommended edge to consume first, e.g., from i to j.</t> aph and a
server-recommended edge to consume first (e.g., from i to j).</t>
<t>An ALTO client can then continuously pull each additional update with the <t>An ALTO client can then continuously pull each additional update with the
information. For example, the client in <xref target="fig-workflow-pull"/> first fetches the information. For example, the client in <xref target="fig-workflow-pull"/> first fetches the
update from i to j, and then from j to j+1. Note that the update item at update from i to j and then from j to j+1. Note that the update item at
<tt>&lt;tips-view-uri&gt;/ug/&lt;j&gt;/&lt;j+1&gt;</tt> may not yet exist, so th "&lt;tips-view-uri&gt;/ug/&lt;j&gt;/&lt;j+1&gt;" might not yet exist, so the ser
e server holds the ver holds the
request until the update becomes available (long polling).</t> request until the update becomes available (i.e., long polling).</t>
<t>A server <bcp14>MAY</bcp14> close a TIPS view at any time, e.g., unde <t>A server <bcp14>MAY</bcp14> close a TIPS view at any time (e.g., unde
r high system load or due r high system load or due
to client inactivity. In the event that a TIPS view is closed, an edge request to client inactivity). In the event that a TIPS view is closed, an edge request
will receive error code 404 in response, and the client will have to request a will receive error code 404 (Not Found) in response, and the client will have to
request a
new TIPS view URI.</t> new TIPS view URI.</t>
<t>If resources allow, a server <bcp14>SHOULD</bcp14> avoid closing TIPS views that have active <t>If resources allow, a server <bcp14>SHOULD</bcp14> avoid closing TIPS views that have active
polling edge requests or have recently served responses until clients have had a polling edge requests or have recently served responses until clients have had a
reasonable interval to request the next update, unless guided by specific reasonable interval to request the next update, unless guided by specific
control policies.</t> control policies.</t>
<figure anchor="fig-workflow-pull"> <figure anchor="fig-workflow-pull">
<name>ALTO TIPS Workflow Supporting Client Pull</name> <name>ALTO TIPS Workflow Supporting Client Pull</name>
<artwork type="drawing" align="center"><![CDATA[ <artwork type="drawing" align="center"><![CDATA[
Client TIPS-F TIPS-V Client TIPS-F TIPS-V
o . . o . .
skipping to change at line 563 skipping to change at line 598
| <------------------------------------------------------| | <------------------------------------------------------|
| . | .
o . o .
. .
TIPS View Closed o TIPS View Closed o
]]></artwork> ]]></artwork>
</figure> </figure>
</section> </section>
<section anchor="schema"> <section anchor="schema">
<name>Resource Location Schema</name> <name>Resource Location Schema</name>
<t>The resource location schema defines how a client constructs URI to f etch <t>The resource location schema defines how a client constructs URIs to fetch
incremental updates.</t> incremental updates.</t>
<t>To access each update in an updates graph, consider the model <t>To access each update in an updates graph, consider the model
represented as a "virtual" file system (adjacency list), contained within the represented as a "virtual" file system (adjacency list), contained within the
root of a TIPS view URI (see <xref target="open-resp"/> for the definition of ti ps-view-uri). root of a TIPS view URI (see <xref target="open-resp"/> for the definition of ti ps-view-uri).
For example, assuming that the update graph of a TIPS view is as shown in For example, assuming that the updates graph of a TIPS view is as shown in
<xref target="fig-ug"/>, the location schema of this TIPS view will have the for mat as in <xref target="fig-ug"/>, the location schema of this TIPS view will have the for mat as in
<xref target="fig-ug-schema"/>.</t> <xref target="fig-ug-schema"/>.</t>
<figure anchor="fig-ug-schema"> <figure anchor="fig-ug-schema">
<name>Location Schema Example</name> <name>Location Schema Example</name>
<artwork type="drawing" align="center"><![CDATA[ <artwork type="drawing" align="center"><![CDATA[
<tips-view-path> // root path to a TIPS view <tips-view-path> // root path to a TIPS view
|_ ug // updates graph |_ ug // updates graph
| |_ 0 | |_ 0
| | |_ 101 // full 101 snapshot | | |_ 101 // full 101 snapshot
| | |_ 103 | | |_ 103
skipping to change at line 594 skipping to change at line 629
| |_ 103 | |_ 103
| | |_ 104 | | |_ 104
| | \_ 105 // optional shortcut 103 -> 105 incr. update | | \_ 105 // optional shortcut 103 -> 105 incr. update
| |_ 104 | |_ 104
| | \_ 105 | | \_ 105
| \_ 105 | \_ 105
| \_ 106 | \_ 106
\_ ... \_ ...
]]></artwork> ]]></artwork>
</figure> </figure>
<t>TIPS uses this directory schema to generate template URIs which allow <t>TIPS uses this directory schema to generate template URIs that allow
clients to construct the location of incremental updates after receiving the 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 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> update item on the edge from node 'i' to node 'j' in the updates graph is:</t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
<tips-view-uri>/ug/<i>/<j> <tips-view-uri>/ug/<i>/<j>
]]></artwork> ]]></sourcecode>
<t>Due to the sequential nature of the update item IDs, a client can lon g poll a <t>Due to the sequential nature of the update item IDs, a client can lon g poll a
future update that does not yet exist (e.g., the incremental update from 106 to future update that does not yet exist (e.g., the incremental update from 106 to
107) by constructing the URI for the next edge that will be added, starting from 107). This can be done by constructing the URI for the next edge that will be ad
the sequence number of the current last node (denoted as end-seq) in the graph ded, starting from
to the next sequential node (with the sequence number of end-seq + 1):</t> the sequence number of the current last node (denoted as &lt;end-seq&gt;) in the
<artwork><![CDATA[ graph
to the next sequential node (with the sequence number of &lt;end-seq + 1&gt;):</
t>
<sourcecode type=""><![CDATA[
<tips-view-uri>/ug/<end-seq>/<end-seq + 1> <tips-view-uri>/ug/<end-seq>/<end-seq + 1>
]]></artwork> ]]></sourcecode>
<t>Incremental updates of a TIPS view are read-only. Thus, they are fetc hed using <t>Incremental updates of a TIPS view are read-only. Thus, they are fetc hed using
the HTTP GET method.</t> the HTTP GET method.</t>
</section> </section>
</section> </section>
<section anchor="ird"> <section anchor="ird">
<name>TIPS Information Resource Directory (IRD) Announcement</name> <name>TIPS Information Resource Directory (IRD) Announcement</name>
<t>To announce a TIPS information resource in the information resource dir <t>To announce a TIPS information resource in the IRD, an ALTO server <bcp
ectory 14>MUST</bcp14> specify "media-type", "capabilities", and "uses"
(IRD), an ALTO server <bcp14>MUST</bcp14> specify the "media-type", "capabilitie
s" and "uses"
as follows.</t> as follows.</t>
<section anchor="media-type"> <section anchor="media-type">
<name>Media Type</name> <name>Media Type</name>
<t>The media type of the Transport Information Publication Service resou rce is <t>The media type of the Transport Information Publication Service (TIPS ) resource is
"application/alto-tips+json".</t> "application/alto-tips+json".</t>
</section> </section>
<section anchor="caps"> <section anchor="caps">
<name>Capabilities</name> <name>Capabilities</name>
<t>The capabilities field of TIPS is modeled on that defined in <t>The "capabilities" field of a TIPS information resource is modeled on
Section 6.3 of <xref target="RFC8895"/>.</t> that defined in
<t>Specifically, the capabilities are defined as an object of type <xref target="RFC8895" sectionFormat="of" section="6.3"/>.</t>
TIPSCapabilities:</t> <t>Specifically, the capabilities are defined as an object of the TIPSCa
pabilities type:</t>
<figure anchor="tips-cap"> <figure anchor="tips-cap">
<name>TIPSCapabilities</name> <name>TIPSCapabilities</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
object { object {
IncrementalUpdateMediaTypes incremental-change-media-types; IncrementalUpdateMediaTypes incremental-change-media-types;
} TIPSCapabilities; } TIPSCapabilities;
object-map { object-map {
ResourceID -> String; ResourceID -> String;
} IncrementalUpdateMediaTypes; } IncrementalUpdateMediaTypes;
]]></artwork> ]]></sourcecode>
</figure> </figure>
<t>with field:</t> <t>with the field:</t>
<dl> <dl>
<dt>incremental-change-media-types:</dt> <dt>incremental-change-media-types:</dt>
<dd> <dd>
<t>If a TIPS can provide updates with incremental changes for a <t>If a TIPS information resource can provide updates with increment al changes for a
resource, the "incremental-change-media-types" field has an entry resource, the "incremental-change-media-types" field has an entry
for that resource-id, and the value is the supported media types 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 of incremental changes, separated by commas. For the implementation of this
specification, this <bcp14>MUST</bcp14> be "application/merge-patch+json", specification, this <bcp14>MUST</bcp14> be "application/merge-patch+json",
"application/json-patch+json", or "application/json-patch+json", or
"application/merge-patch+json,application/json-patch+json", unless defined by "application/merge-patch+json,application/json-patch+json", unless defined by
a future extension. a future extension.
</t> </t>
<t>When choosing the media types to encode incremental updates for a <t>When choosing the media types to encode incremental updates for a
resource, the server <bcp14>MUST</bcp14> consider the limitations of the resource, the server <bcp14>MUST</bcp14> consider the limitations of the
encoding. For example, when a JSON merge patch specifies that 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 value of a field is null, its semantics are that the field is
removed from the target and hence the field is no longer defined removed from the target; hence, the field is no longer defined
(i.e., undefined). This, however, may not be the intended result (i.e., undefined). However, this may not be the intended result
for the resource, when null and undefined have different semantics for the resource, when null and undefined have different semantics
for the resource. In such a case, the server <bcp14>MUST</bcp14> choose JSON for the resource. In such a case, the server <bcp14>MUST</bcp14> choose JSON
patch over JSON merge patch if JSON patch is indicated as a patch encoding over JSON merge patch encoding for the incremental update if both
capability of the TIPS. If the server does not support JSON patch media types "application/json-patch+json" and "application/merge-patch" are sup
to handle such a case, the server then needs to send a full ported by the TIPS information resource.</t>
replacement.</t>
</dd> </dd>
</dl> </dl>
</section> </section>
<section anchor="uses"> <section anchor="uses">
<name>Uses</name> <name>Uses</name>
<t>The "uses" attribute <bcp14>MUST</bcp14> be an array with the resourc <t>The "uses" attribute <bcp14>MUST</bcp14> be an array with the resourc
e-ids of every e IDs of every
network information resource for which this TIPS can provide service.</t> network information resource for which this TIPS information resource can provid
e service.</t>
<t>This set <bcp14>MAY</bcp14> be any subset of the ALTO server's networ k information resources <t>This set <bcp14>MAY</bcp14> be any subset of the ALTO server's networ k information resources
and <bcp14>MAY</bcp14> include resources defined in linked IRDs. However, it is <bcp14>RECOMMENDED</bcp14> 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 that the ALTO server selects a set that is closed under the resource dependency
relationship. That is, if a TIPS' "uses" set includes resource R1 and resource relationship. That is, if a TIPS information resource's "uses" set includes reso
R1 depends on ("uses") resource R0, then the TIPS' "uses" set should include R0 urce R1, and resource
as well as R1. For example, if a TIPS provides a TIPS view for a cost map, it 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 should also provide a TIPS view for the network map upon which that cost map
depends.</t> depends.</t>
<t>If the set is not closed, at least one resource R1 in the "uses" fiel <t>If the set is not closed, at least one resource R1 in the "uses" fiel
d of a TIPS d of a TIPS information resource
depends on another resource R0 which is not in the "uses" field of the same depends on another resource R0 that is not in the "uses" field of the same
TIPS. Thus, a client cannot receive incremental updates for R0 from the same TIPS information resource. Thus, a client cannot receive incremental updates for
TIPS service. If the client observes in an update of R1 that the version tag for another resource R0 that is not in the "uses" field of the same TIPS informatio
n 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 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> less efficient than receiving the incremental updates of R0.</t>
</section> </section>
<section anchor="an-example"> <section anchor="an-example">
<name>An Example</name> <name>An Example</name>
<t>Extending the IRD example in Section 8.1 of <xref target="RFC8895"/>, <t>Extending the IRD example in <xref target="RFC8895" sectionFormat="of
<xref target="ex-ird"/> is the IRD of an " section="8.1"/>, <xref target="ex-ird"/> is the IRD of an
ALTO server supporting ALTO base protocol, ALTO/SSE, and ALTO TIPS.</t> ALTO server supporting the ALTO base protocol, ALTO/SSE, and ALTO TIPS.</t>
<figure anchor="ex-ird"> <figure anchor="ex-ird">
<name>Example of an ALTO Server Supporting ALTO Base Protocol, ALTO/SS <name>Example of an ALTO Server Supporting the ALTO Base Protocol, ALT
E, and ALTO TIPS</name> O/&wj;SSE, and ALTO TIPS</name>
<artwork align="left"><![CDATA[
"my-network-map": { <sourcecode type="json"><![CDATA[
"uri": "https://alto.example.com/networkmap", "my-network-map": {
"media-type": "application/alto-networkmap+json" "uri": "https://alto.example.com/networkmap",
}, "media-type": "application/alto-networkmap+json"
"my-routingcost-map": { },
"uri": "https://alto.example.com/costmap/routingcost", "my-routingcost-map": {
"media-type": "application/alto-costmap+json", "uri": "https://alto.example.com/costmap/routingcost",
"uses": ["my-network-map"], "media-type": "application/alto-costmap+json",
"capabilities": { "uses": ["my-network-map"],
"cost-type-names": ["num-routingcost"] "capabilities": {
} "cost-type-names": ["num-routingcost"]
}, }
"my-hopcount-map": { },
"uri": "https://alto.example.com/costmap/hopcount", "my-hopcount-map": {
"media-type": "application/alto-costmap+json", "uri": "https://alto.example.com/costmap/hopcount",
"uses": ["my-network-map"], "media-type": "application/alto-costmap+json",
"capabilities": { "uses": ["my-network-map"],
"cost-type-names": ["num-hopcount"] "capabilities": {
} "cost-type-names": ["num-hopcount"]
}, }
"my-simple-filtered-cost-map": { },
"uri": "https://alto.example.com/costmap/filtered/simple", "my-simple-filtered-cost-map": {
"media-type": "application/alto-costmap+json", "uri": "https://alto.example.com/costmap/filtered/simple",
"accepts": "application/alto-costmapfilter+json", "media-type": "application/alto-costmap+json",
"uses": ["my-network-map"], "accepts": "application/alto-costmapfilter+json",
"capabilities": { "uses": ["my-network-map"],
"cost-type-names": ["num-routingcost", "num-hopcount"], "capabilities": {
"cost-constraints": false "cost-type-names": ["num-routingcost", "num-hopcount"],
} "cost-constraints": false
}, }
"update-my-costs": { },
"uri": "https://alto.example.com/updates/costs", "update-my-costs": {
"media-type": "text/event-stream", "uri": "https://alto.example.com/updates/costs",
"accepts": "application/alto-updatestreamparams+json", "media-type": "text/event-stream",
"uses": [ "accepts": "application/alto-updatestreamparams+json",
"my-network-map", "uses": [
"my-routingcost-map", "my-network-map",
"my-hopcount-map", "my-routingcost-map",
"my-simple-filtered-cost-map" "my-hopcount-map",
], "my-simple-filtered-cost-map"
"capabilities": { ],
"incremental-change-media-types": { "capabilities": {
"my-network-map": "application/json-patch+json", "incremental-change-media-types": {
"my-routingcost-map": "application/merge-patch+json", "my-network-map": "application/json-patch+json",
"my-hopcount-map": "application/merge-patch+json" "my-routingcost-map": "application/merge-patch+json",
}, "my-hopcount-map": "application/merge-patch+json"
"support-stream-control": true },
} "support-stream-control": true
}, }
"update-my-costs-tips": { },
"uri": "https://alto.example.com/updates-new/costs", "update-my-costs-tips": {
"media-type": "application/alto-tips+json", "uri": "https://alto.example.com/updates-new/costs",
"accepts": "application/alto-tipsparams+json", "media-type": "application/alto-tips+json",
"uses": [ "accepts": "application/alto-tipsparams+json",
"my-network-map", "uses": [
"my-routingcost-map", "my-network-map",
"my-hopcount-map", "my-routingcost-map",
"my-simple-filtered-cost-map" "my-hopcount-map",
], "my-simple-filtered-cost-map"
"capabilities": { ],
"incremental-change-media-types": { "capabilities": {
"my-network-map": "application/json-patch+json", "incremental-change-media-types": {
"my-routingcost-map": "application/merge-patch+json", "my-network-map": "application/json-patch+json",
"my-hopcount-map": "application/merge-patch+json", "my-routingcost-map": "application/merge-patch+json",
"my-simple-filtered-cost-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", "tips-sse": {
"media-type": "text/event-stream", "uri": "https://alto.example.com/updates/tips",
"accepts": "application/alto-updatestreamparams+json", "media-type": "text/event-stream",
"uses": [ "update-my-costs-tips" ], "accepts": "application/alto-updatestreamparams+json",
"capabilities": { "uses": [ "update-my-costs-tips" ],
"incremental-change-media-types": { "capabilities": {
"update-my-costs-tips": "application/merge-patch+json" "incremental-change-media-types": {
} "update-my-costs-tips": "application/merge-patch+json"
} }
} }
]]></artwork> }
]]></sourcecode>
</figure> </figure>
<t>Note that it is straightforward for an ALTO server to run HTTP/2 and <t>Note that it is straightforward for an ALTO server to run HTTP/2 and
support concurrent retrieval of multiple resources such as "my- support concurrent retrieval of multiple resources such as "my-network-map" and
network-map" and "my-routingcost-map" using multiple HTTP/2 streams.</t> "my-routingcost-map" using multiple HTTP/2 streams.</t>
<t>The resource "update-my-costs-tips" provides an ALTO TIPS service, an <t>The resource "update-my-costs-tips" provides an ALTO TIPS information
d this is resource, and this is
indicated by the media-type "application/alto-tips+json".</t> indicated by the media type "application/alto-tips+json".</t>
</section> </section>
</section> </section>
<section anchor="tips-management"> <section anchor="tips-management">
<name>TIPS Management</name> <name>TIPS Management</name>
<t>Upon request, a server sends a TIPS view to a client. This TIPS view ma <t>Upon request, a server sends a TIPS view to a client. This TIPS view mi
y be ght be
created at the time of the request or may already exist (either because another created at the time of the request or might already exist (either because anothe
r
client has already created a TIPS view for the same requested network resource 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 or because the server perpetually maintains a TIPS view for an often-requested
resource).</t> resource).</t>
<section anchor="open-req"> <section anchor="open-req">
<name>Open Request</name> <name>Open Request</name>
<t>An ALTO client requests that the server provide a TIPS view for a giv en resource <t>An ALTO client requests that the server provide a TIPS view for a giv en resource
by sending an HTTP POST body with the media type by sending an HTTP POST body with the media type
"application/alto-tipsparams+json". That body contains a JSON object of type "application/alto-tipsparams+json". That body contains a JSON object of the TIPS
TIPSReq, where:</t> Req type, where:</t>
<figure anchor="fig-open-req"> <figure anchor="fig-open-req">
<name>TIPSReq</name> <name>TIPSReq</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
object { object {
ResourceID resource-id; ResourceID resource-id;
[JSONString tag;] [JSONString tag;]
[Object input;] [Object input;]
} TIPSReq; } TIPSReq;
]]></artwork> ]]></sourcecode>
</figure> </figure>
<t>with the following fields:</t> <t>with the following fields:</t>
<dl> <dl>
<dt>resource-id:</dt> <dt>resource-id:</dt>
<dd> <dd>
<t>The resource-id of an ALTO resource and <bcp14>MUST</bcp14> be in the TIPS' "uses" list <t>This field contains the resource ID of an ALTO resource to be mon itored, which <bcp14>MUST</bcp14> be in the TIPS information resource's "uses" l ist
(<xref target="ird"/>). If a client does not support all incremental methods fro m the set (<xref target="ird"/>). If a client does not support all incremental methods fro m the set
announced in the server's capabilities, the client <bcp14>MUST NOT</bcp14> use t he TIPS announced in the server's capabilities, the client <bcp14>MUST NOT</bcp14> use t he TIPS
service.</t> information resource.</t>
</dd> </dd>
<dt>tag:</dt> <dt>tag:</dt>
<dd> <dd>
<t>If the resource-id is a GET-mode resource with a version tag (or <t>If the "resource-id" is associated with a GET-mode resource with
"vtag"), as defined in Section 10.3 of <xref target="RFC7285"/>, and the ALTO a version tag (or
"vtag"), as defined in <xref target="RFC7285" sectionFormat="of" section="10.3"/
>, and the ALTO
client has previously retrieved a version of that resource from 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 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 ta g the client's version of that resource. The server <bcp14>MAY</bcp14> use the ta g
when calculating a recommended starting edge for the client to when calculating a recommended starting edge for the client to
consume. Note that the client <bcp14>MUST</bcp14> support all incremental consume. Note that the client <bcp14>MUST</bcp14> support all incremental
methods from the set announced in the server's capabilities for methods from the set announced in the server's capabilities for
this resource.</t> this resource.</t>
</dd> </dd>
<dt>input:</dt> <dt>input:</dt>
<dd> <dd>
<t>If the resource is a POST-mode service that requires input, the <t>If the resource is a POST-mode service that requires input, the
ALTO client <bcp14>MUST</bcp14> set the "input" field to a JSON object with the ALTO client <bcp14>MUST</bcp14> set the "input" field to a JSON object with the
parameters that the resource expects.</t> parameters that the resource expects.</t>
</dd> </dd>
</dl> </dl>
</section> </section>
<section anchor="open-resp"> <section anchor="open-resp">
<name>Open Response</name> <name>Open Response</name>
<t>The response to a valid request <bcp14>MUST</bcp14> be a JSON object <t>The response to a valid request <bcp14>MUST</bcp14> be a JSON object
of type of the AddTIPSResponse type, denoted as media type "application/alto-tips+json":
AddTIPSResponse, denoted as media type "application/alto-tips+json":</t> </t>
<figure anchor="fig-open-resp"> <figure anchor="fig-open-resp">
<name>AddTIPSResponse</name> <name>AddTIPSResponse</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
object { object {
URI tips-view-uri; URI tips-view-uri;
TIPSViewSummary tips-view-summary; TIPSViewSummary tips-view-summary;
} AddTIPSResponse; } AddTIPSResponse;
object { object {
UpdatesGraphSummary updates-graph-summary; UpdatesGraphSummary updates-graph-summary;
} TIPSViewSummary; } TIPSViewSummary;
object { object {
JSONNumber start-seq; JSONNumber start-seq;
JSONNumber end-seq; JSONNumber end-seq;
StartEdgeRec start-edge-rec; StartEdgeRec start-edge-rec;
} UpdatesGraphSummary; } UpdatesGraphSummary;
object { object {
JSONNumber seq-i; JSONNumber seq-i;
JSONNumber seq-j; JSONNumber seq-j;
} StartEdgeRec; } StartEdgeRec;
]]></artwork> ]]></sourcecode>
</figure> </figure>
<t>with the following fields:</t> <t>with the following fields:</t>
<dl> <dl>
<dt>tips-view-uri:</dt> <dt>tips-view-uri:</dt>
<dd> <dd>
<t>URI to the requested TIPS view. The value of this field <bcp14>MU ST</bcp14> have the <t>This is the URI to the requested TIPS view. The value of this fie ld <bcp14>MUST</bcp14> have the
following format: following format:
</t> </t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
scheme "://" tips-view-host "/" tips-view-path scheme "://" tips-view-host "/" tips-view-path
tips-view-host = host [ ":" port] tips-view-host = host [ ":" port]
tips-view-path = path tips-view-path = path
]]></artwork> ]]></sourcecode>
<t>where scheme <bcp14>MUST</bcp14> be "http" or "https" unless spec ified by a future <t>where scheme <bcp14>MUST</bcp14> be "http" or "https" unless spec ified by a future
extension, and host, port and path are as specified in Sections 3.2.2, 3.2.3, extension, and host, port, and path are as specified in Sections <xref target="R
and 3.3 in <xref target="RFC3986"/>. An ALTO server <bcp14>SHOULD</bcp14> use th FC3986" sectionFormat="bare" section="3.2.2"/>, <xref target="RFC3986" sectionFo
e "https" scheme unless rmat="bare"
the contents of the TIPS view are intended to be publicly accessible and does section="3.2.3"/>, and <xref target="RFC3986" sectionFormat="bare"
section="3.3"/> in <xref target="RFC3986"/>. An ALTO server <bcp14>SHOULD</bcp14
> use the "https" scheme unless
the contents of the TIPS view are intended to be publicly accessible and do
not raise security concerns. The field <bcp14>MUST</bcp14> contain only ASCII ch aracters. In not raise security concerns. The field <bcp14>MUST</bcp14> contain only ASCII ch aracters. In
case the original URL contains international characters (e.g., in the domain case the original URL contains international characters (e.g., in the domain
name), the ALTO server implementation <bcp14>MUST</bcp14> properly encode the UR L into the name), the ALTO server implementation <bcp14>MUST</bcp14> properly encode the UR L into the
ASCII format (e.g., using the "urlencode" function).</t> ASCII format (e.g., using the "urlencode" function).</t>
<t>A server <bcp14>MUST NOT</bcp14> use the same URI for different T IPS views, either for <t>A server <bcp14>MUST NOT</bcp14> use the same URI for different T IPS views, either for
different resources or different request bodies to the same resource. URI different resources or for different request bodies to the same resource. URI
generation is implementation specific, for example, one may compute a generation is implementation specific; for example, one may compute a
Universally Unique Identifier (UUID, <xref target="RFC4122"/>) or a hash value b Universally Unique Identifier (UUID) <xref target="RFC9562"/> or a hash value ba
ased on sed on
the request, and append it to a base URL. For performance considerations, it 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 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 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 address, which may result in duplicated TIPS views in cases such as mobile
clients. However, this is not mandatory as a server may intentionally use clients. However, this is not mandatory as a server might intentionally use
client information to compute the TIPS view URI to provide service isolation client information to compute the TIPS view URI to provide service isolation
between clients.</t> between clients.</t>
</dd> </dd>
<dt>tips-view-summary:</dt> <dt>tips-view-summary:</dt>
<dd> <dd>
<t>Contains an updates-graph-summary. <t>Contains an updates-graph-summary.
</t> </t>
<t>The updates-graph-summary field contains the starting sequence nu <t>The "updates-graph-summary" field contains the
mber &lt;start-seq&gt; of the updates graph (in the "start-seq" field) and the &lt;en
(start-seq) of the updates graph and the last sequence number (end-seq) that d-seq&gt; that
is currently available, along with a recommended edge to consume is currently available (in the "end-seq" field), along with a recommended edge t
(start-edge-rec). If the client does NOT provide a version tag, the server o consume
<bcp14>MUST</bcp14> recommend the edge of the latest snapshot available. (in the "start-edge-rec" field). If the client does not provide a version tag, t
If the client does provide a version tag, the server <bcp14>MUST</bcp14> either he server
recommend <bcp14>MUST</bcp14> recommend the edge of the latest available snapshot.
If the client provides a version tag, the server <bcp14>MUST</bcp14> either reco
mmend
the first incremental update edge starting from the client's tagged version the first incremental update edge starting from the client's tagged version
or the edge of the latest snapshot. Which edge is selected depends on the 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 cumulativ e size of implementation. For example, a server <bcp14>MAY</bcp14> calculate the cumulativ e size of
the incremental updates available from that version onward and compare it to 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 the size of the complete resource snapshot. If the snapshot is bigger, the
server recommends the first incremental update edge starting from the server recommends the first incremental update edge starting from the
client's tagged version. Otherwise, the server recommends the latest snapshot client's tagged version. Otherwise, the server recommends the latest snapshot
edge.</t> edge.</t>
</dd> </dd>
</dl> </dl>
<t>If the request has any errors, the TIPS service <bcp14>MUST</bcp14> r <t>If the request has any errors, the ALTO server <bcp14>MUST</bcp14> re
eturn an HTTP turn an HTTP
"400 Bad Request" to the ALTO client; the body of the response 400 (Bad Request) error code to the ALTO client; the body of the response
follows the generic ALTO error response format specified in follows the generic ALTO error response format specified in
Section 8.5.2 of <xref target="RFC7285"/>. Hence, an example ALTO error respons e <xref target="RFC7285" sectionFormat="of" section="8.5.2"/>. Hence, an example ALTO error response
has the format shown in <xref target="ex-bad-request"/>.</t> has the format shown in <xref target="ex-bad-request"/>.</t>
<figure anchor="ex-bad-request"> <figure anchor="ex-bad-request">
<name>ALTO Error Example</name> <name>ALTO Error Example</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
HTTP/1.1 400 Bad Request HTTP/1.1 400 Bad Request
Content-Length: 131 Content-Length: 131
Content-Type: application/alto-error+json Content-Type: application/alto-error+json
{ {
"meta":{ "meta":{
"code": "E_INVALID_FIELD_VALUE", "code": "E_INVALID_FIELD_VALUE",
"field": "resource-id", "field": "resource-id",
"value": "my-network-map/#" "value": "my-network-map/#"
} }
} }
]]></artwork> ]]></sourcecode>
</figure> </figure>
<t>Note that "field" and "value" are optional fields. If the "value" <t>Note that "field" and "value" are optional fields. If the "value"
field exists, the "field" field <bcp14>MUST</bcp14> exist.</t> field exists, the "field" field <bcp14>MUST</bcp14> exist.</t>
<ul spacing="normal"> <ul spacing="normal">
<li>If the TIPS request does not have a "resource-id" field, the error code of <li>If the TIPS request does not have a "resource-id" field, the error code of
the error message <bcp14>MUST</bcp14> be <tt>E_MISSING_FIELD</tt> and the "field the error message <bcp14>MUST</bcp14> be "E_MISSING_FIELD" and the "field" field
" field, if , if
present, <bcp14>MUST</bcp14> be "resource-id". The TIPS service <bcp14>MUST NOT< present, <bcp14>MUST</bcp14> be "resource-id". The ALTO server <bcp14>MUST NOT</
/bcp14> create any TIPS bcp14> create any TIPS
view.</li> view.</li>
<li>If the "resource-id" field is invalid or is not associated with th <li>If the "resource-id" field is invalid or is not associated with th
e TIPS, the e TIPS information resource, the
error code of the error message <bcp14>MUST</bcp14> be <tt>E_INVALID_FIELD_VALUE error code of the error message <bcp14>MUST</bcp14> be "E_INVALID_FIELD_VALUE".
</tt>. If present, If present,
the "field" field <bcp14>MUST</bcp14> be the full path of the "resource-id" fiel d, and the the "field" field <bcp14>MUST</bcp14> be the full path of the "resource-id" fiel d, and the
"value" field <bcp14>MUST</bcp14> be the invalid resource-id.</li> "value" field <bcp14>MUST</bcp14> be the value of the "resource-id" field in the request.</li>
<li>If the resource is a POST-mode service that requires input, the cl ient <bcp14>MUST</bcp14> <li>If the resource is a POST-mode service that requires input, the cl ient <bcp14>MUST</bcp14>
set the "input" field to a JSON object with the parameters that that resource set the "input" field to a JSON object with the parameters that resource
expects. If the "input" field is missing or invalid, TIPS <bcp14>MUST</bcp14> re expects. If the "input" field is missing or invalid, the ALTO server <bcp14>MUST
turn the </bcp14> return the
same error response that resource would return for missing or invalid input same error response that resource would return for missing or invalid inputs
(see <xref target="RFC7285"/>).</li> (see <xref target="RFC7285"/>).</li>
</ul> </ul>
<t>Furthermore, it is <bcp14>RECOMMENDED</bcp14> that the server uses th e following HTTP codes to <t>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> indicate other errors, with the media type "application/alto-error+json".</t>
<ul spacing="normal"> <dl spacing="normal">
<li>429 (Too Many Requests): when the number of TIPS views open reques <dt>429 (Too Many Requests):</dt><dd>Indicates when the number of TIPS
ts exceeds views open requests exceeds
the server threshold. The server <bcp14>MAY</bcp14> indicate when to re-try the the server threshold. The server <bcp14>MAY</bcp14> indicate when to retry the r
request in equest in
the "Re-Try After" headers.</li> the "Re-Try After" headers.</dd>
</ul> </dl>
<t>It is <bcp14>RECOMMENDED</bcp14> that the server provide the ALTO/SSE support for the TIPS <t>It is <bcp14>RECOMMENDED</bcp14> that the server provide the ALTO/SSE support for the TIPS
resource. Thus, the client can be notified of the version updates of all the 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 TIPS views that it monitors and make better cross-resource transport decisions
(see <xref target="cross-sched"/> for related considerations).</t> (see <xref target="cross-sched"/> for related considerations).</t>
</section> </section>
<section anchor="open-example"> <section anchor="open-example">
<name>Open Example</name> <name>Open Example</name>
<section anchor="basic-example"> <section anchor="basic-example">
<name>Basic Example</name> <name>Basic Example</name>
<t>For simplicity, assume that the ALTO server is using the Basic
authentication. If a client with username "client1" and password <t>For simplicity, assume that the ALTO server is using Basic
"helloalto" wants to create a TIPS view of an ALTO Cost Map resource authentication <xref target="RFC7617"/>. If a client with username "client1" an
with resource ID "my-routingcost-map", it can send the d 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"/>.</t> request depicted in <xref target="ex-op"/>.</t>
<figure anchor="ex-op"> <figure anchor="ex-op">
<name>Request Example of Opening a TIPS View</name> <name>Request Example of Opening a TIPS View</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
POST /tips HTTP/1.1 POST /tips HTTP/1.1
Host: alto.example.com Host: alto.example.com
Accept: application/alto-tips+json, application/alto-error+json Accept: application/alto-tips+json, application/alto-error+json
Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K
Content-Type: application/alto-tipsparams+json Content-Type: application/alto-tipsparams+json
Content-Length: 41 Content-Length: 41
{ {
"resource-id": "my-routingcost-map" "resource-id": "my-routingcost-map"
} }
]]></artwork> ]]></sourcecode>
</figure> </figure>
<t>If the operation is successful, the ALTO server returns the <t>If the operation is successful, the ALTO server returns the
message shown in <xref target="ex-op-rep"/>.</t> message shown in <xref target="ex-op-rep"/>.</t>
<figure anchor="ex-op-rep"> <figure anchor="ex-op-rep">
<name>Response Example of Opening a TIPS View</name> <name>Response Example of Opening a TIPS View</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/alto-tips+json Content-Type: application/alto-tips+json
Content-Length: 255 Content-Length: 255
{ {
"tips-view-uri": "https://alto.example.com/tips/2718281828", "tips-view-uri": "https://alto.example.com/tips/2718281828",
"tips-view-summary": { "tips-view-summary": {
"updates-graph-summary": { "updates-graph-summary": {
"start-seq": 101, "start-seq": 101,
"end-seq": 106, "end-seq": 106,
"start-edge-rec" : { "start-edge-rec" : {
"seq-i": 0, "seq-i": 0,
"seq-j": 105 "seq-j": 105
} }
} }
} }
} }
]]></artwork> ]]></sourcecode>
</figure> </figure>
</section> </section>
<section anchor="example-using-digest-authentication"> <section anchor="example-using-digest-authentication">
<name>Example using Digest Authentication</name> <name>Example Using Digest Authentication</name>
<t>Below is another example of the same query using Digest authenticat ion, a <t>Below is another example of the same query using Digest authenticat ion, a
mandatory authentication method of ALTO servers as defined in <xref section="8.3 .5" sectionFormat="of" target="RFC7285"/>. The content of the response is the sa me as in <xref target="ex-op-rep"/> and thus mandatory authentication method of ALTO servers as defined in <xref section="8.3 .5" sectionFormat="of" target="RFC7285"/>. The content of the response is the sa me as in <xref target="ex-op-rep"/>; thus, it has been
omitted for simplicity.</t> omitted for simplicity.</t>
<figure anchor="ex-op-digest"> <figure anchor="ex-op-digest">
<name>Open Example with Digest Authentication</name> <name>Open Example with Digest Authentication</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
POST /tips HTTP/1.1 POST /tips HTTP/1.1
Host: alto.example.com Host: alto.example.com
Accept: application/alto-tips+json, application/alto-error+json Accept: application/alto-tips+json, application/alto-error+json
Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K Authorization: Basic Y2xpZW50MTpoZWxsb2FsdG8K
Content-Type: application/alto-tipsparams+json Content-Type: application/alto-tipsparams+json
Content-Length: 41 Content-Length: 41
{ {
"resource-id": "my-routingcost-map" "resource-id": "my-routingcost-map"
} }
skipping to change at line 1068 skipping to change at line 1097
{ {
"resource-id": "my-routingcost-map" "resource-id": "my-routingcost-map"
} }
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/alto-tips+json Content-Type: application/alto-tips+json
Content-Length: 258 Content-Length: 258
{....} {....}
]]></artwork> ]]></sourcecode>
</figure> </figure>
</section> </section>
<section anchor="tips-sse"> <section anchor="tips-sse">
<name>Example using ALTO/SSE</name> <name>Example Using ALTO/SSE</name>
<t>This section gives an example of receiving incremental updates of t he TIPS view <t>This section gives an example of receiving incremental updates of t he TIPS view
summary using ALTO/SSE <xref target="RFC8895"/>. Consider the <tt>tips-sse</tt> resource, as summary using ALTO/SSE <xref target="RFC8895"/>. Consider the "tips-sse" resourc e, as
announced by the IRD in <xref target="ex-ird"/>, which provides ALTO/SSE for the announced by the IRD in <xref target="ex-ird"/>, which provides ALTO/SSE for the
<tt>update-my-cost-tips</tt> resource, a client may send the following request t o "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> receive updates of the TIPS view (authentication is omitted for simplicity).</t>
<figure anchor="ex-tips-sse"> <figure anchor="ex-tips-sse">
<name>Example of Monitoring TIPS view with ALTO/SSE</name> <name>Example of Monitoring TIPS View with ALTO/SSE</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
POST /updates/tips HTTP/1.1 POST /updates/tips HTTP/1.1
Host: alto.example.com Host: alto.example.com
Accept: text/event-stream,application/alto-error+json Accept: text/event-stream,application/alto-error+json
Content-Type: application/alto-updatestreamparams+json Content-Type: application/alto-updatestreamparams+json
Content-Length: 76 Content-Length: 76
{ {
"add": { "add": {
"tips-123": { "resource-id": "update-my-cost-tips" } "tips-123": { "resource-id": "update-my-cost-tips" }
} }
} }
]]></artwork> ]]></sourcecode>
</figure> </figure>
<t>Then, the client will be able to receive the TIPS view summary as f ollows.</t> <t>Then, the client will be able to receive the TIPS view summary as f ollows.</t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK HTTP/1.1 200 OK
Connection: keep-alive Connection: keep-alive
Content-Type: text/event-stream Content-Type: text/event-stream
event: application/alto-tips+json,tips-123 event: application/alto-tips+json,tips-123
data: { data: {
data: "tips-view-uri": "https://alto.example.com/tips/2718281828", data: "tips-view-uri": "https://alto.example.com/tips/2718281828",
data: "tips-view-summary": { data: "tips-view-summary": {
data: "updates-graph-summary": { data: "updates-graph-summary": {
data: "start-seq": 101, data: "start-seq": 101,
data: "end-seq": 106, data: "end-seq": 106,
data: "start-edge-rec" : { data: "start-edge-rec" : {
data: "seq-i": 0, data: "seq-i": 0,
data: "seq-j": 105 data: "seq-j": 105
data: } data: }
data: } data: }
data: } data: }
data: } data: }
]]></artwork> ]]></sourcecode>
<t>When there is an update to the TIPS view, for example, the <tt>end- <t>When there is an update to the TIPS view (for example, when the "en
seq</tt> is d-seq" field is
increased by 1, the client will be able to receive the incremental update of the increased by 1), the client will be able to receive the incremental update of th
e
TIPS view summary as follows.</t> TIPS view summary as follows.</t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
event: application/merge-patch+json,tips-123 event: application/merge-patch+json,tips-123
data: { data: {
data: "tips-view-summary": { data: "tips-view-summary": {
data: "updates-graph-summary": { data: "updates-graph-summary": {
data: "end-seq": 107 data: "end-seq": 107
data: } data: }
data: } data: }
data: } data: }
]]></artwork> ]]></sourcecode>
</section> </section>
</section> </section>
</section> </section>
<section anchor="pull"> <section anchor="pull">
<name>TIPS Data Transfers - Client Pull</name> <name>TIPS Data Transfers - Client Pull</name>
<t>TIPS allows an ALTO client to retrieve the content of an update item <t>TIPS allows an ALTO client to retrieve the content of an update item
from the updates graph, with an update item defined as the content from the updates graph, with an update item defined as the content
(incremental update or snapshot) on an edge in the updates graph.</t> (incremental update or snapshot) on an edge in the updates graph.</t>
<section anchor="request"> <section anchor="request">
<name>Request</name> <name>Request</name>
<t>The client sends an HTTP GET request, where the media type of an <t>The client sends an HTTP GET request, where the media type of an
update item resource <bcp14>MUST</bcp14> be the same as the "media-type" field o f update item resource <bcp14>MUST</bcp14> be the same as the "media-type" field o f
the update item on the specified edge in the updates graph.</t> the update item on the specified edge in the updates graph.</t>
<t>The GET request <bcp14>MUST</bcp14> have the following format:</t> <t>The GET request <bcp14>MUST</bcp14> have the following format:</t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
GET /<tips-view-path>/ug/<i>/<j> GET /<tips-view-path>/ug/<i>/<j>
HOST: <tips-view-host> HOST: <tips-view-host>
]]></artwork> ]]></sourcecode>
<t>For example, consider the updates graph in <xref target="fig-ug-schem a"/>. If the client <t>For example, consider the updates graph in <xref target="fig-ug-schem a"/>. If the client
wants to query the content of the first update item (0 -&gt; 101) whose media ty pe wants to query the content of the first update item (0 -&gt; 101) whose media ty pe
is "application/alto-costmap+json", it sends a request to is "application/alto-costmap+json", it sends a request to
"/tips/2718281828/ug/0/101" and sets the "Accept" header to "/tips/2718281828/ug/0/101" and sets the "Accept" header to
"application/alto-costmap+json,application/alto-error+json". See <xref target="i u-example"/> "application/alto-costmap+json,application/alto-error+json". See <xref target="i u-example"/>
for a concrete example.</t> for a concrete example.</t>
</section> </section>
<section anchor="response"> <section anchor="response">
<name>Response</name> <name>Response</name>
<t>If the request is valid (<tt>ug/&lt;i&gt;/&lt;j&gt;</tt> exists), the response is encoded <t>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> as a JSON object whose data format is indicated by the media type.</t>
<t>A client <bcp14>MAY</bcp14> conduct proactive fetching of future upda tes, by long polling <t>A client <bcp14>MAY</bcp14> conduct proactive fetching of future upda tes, by long polling
updates that have not been provided in the directory yet. For such updates, the updates that have not been provided in the directory yet. For such updates, the
client <bcp14>MUST</bcp14> indicate all media types that may appear. It is <bcp1 client <bcp14>MUST</bcp14> indicate all media types that might appear. It is <bc
4>RECOMMENDED</bcp14> that the p14>RECOMMENDED</bcp14> that the
server allows for at least the long polling of <tt>&lt;end-seq&gt; -&gt; &lt;end server allow for at least the long polling of &lt;end-seq&gt; -&gt; &lt;end-seq
-seq + 1&gt;</tt>.</t> + 1&gt;.</t>
<t>Hence, the server processing logic <bcp14>MUST</bcp14> be:</t> <t>Hence, the server processing logic <bcp14>MUST</bcp14> be:</t>
<span class="insert">1&amp;gt;.&lt;/t&gt;</span>
<ul spacing="normal"> <ul spacing="normal">
<li>If <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> exists: return content using en <li>If a resource with path "ug/&lt;i&gt;/&lt;j&gt;" exists, return co
coding.</li> ntent using encoding.</li>
<li>Else if long polling <tt>ug/&lt;i&gt;/&lt;j&gt;</tt> is acceptable <li>Else, if long polling "ug/&lt;i&gt;/&lt;j&gt;" is acceptable, put
: put request in a request in a
backlog queue, then either a response is triggered when the content is ready 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> or the request is interrupted (e.g., by a network error).</li>
<li>Else: return error.</li> <li>Else, return error.</li>
</ul> </ul>
<t>It is <bcp14>RECOMMENDED</bcp14> that the server uses the following H TTP codes to <t>It is <bcp14>RECOMMENDED</bcp14> that the server use the following HT TP codes to
indicate errors, with the media type "application/alto-error+json", indicate errors, with the media type "application/alto-error+json",
regarding update item requests.</t> regarding update item requests.</t>
<ul spacing="normal"> <dl spacing="normal">
<li>404 (Not Found): if the requested update does not exist, or the re <dt>404 (Not Found):</dt><dd>Indicates that the requested update does
quested not exist or the requested
TIPS view does not exist or is closed by the server.</li> TIPS view does not exist or is closed by the server.</dd>
<li>410 (Gone): if an update has a seq that is smaller than the start- <dt>410 (Gone):</dt><dd>Indicates an update has a seq that is smaller
seq.</li> than the &lt;start-seq&gt;.</dd>
<li>415 (Unsupported Media Type): if the media type(s) accepted by the <dt>415 (Unsupported Media Type):</dt><dd>Indicates the media type (or
types) accepted by the
client does not include the media type of the update chosen by the client does not include the media type of the update chosen by the
server.</li> server.</dd>
<li>425 (Too Early): if the seq exceeds the server long-polling window <dt>425 (Too Early):</dt><dd>Indicates the seq exceeds the server long
</li> polling window.</dd>
<li>429 (Too Many Requests): when the number of pending (long-poll) <dt>429 (Too Many Requests):</dt><dd>Indicates the number of pending (
requests exceeds the server threshold. The server <bcp14>MAY</bcp14> indicate wh long poll)
en to re-try requests exceeds the server threshold. The server <bcp14>MAY</bcp14> indicate wh
the request in the "Re-Try After" headers.</li> en to retry
</ul> the request in the "Re-Try After" headers.</dd>
</dl>
</section> </section>
<section anchor="iu-example"> <section anchor="iu-example">
<name>Example</name> <name>Example</name>
<t>Assume the client wants to get the contents of the update item on <t>Assume the client wants to get the contents of the update item on
edge 0 to 101. The format of the request is shown in <xref target="ex-get"/>.</ t> edge 0 to 101. The format of the request is shown in <xref target="ex-get"/>.</ t>
<figure anchor="ex-get"> <figure anchor="ex-get">
<name>GET Example</name> <name>GET Example</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
GET /tips/2718281828/ug/0/101 HTTP/1.1 GET /tips/2718281828/ug/0/101 HTTP/1.1
Host: alto.example.com Host: alto.example.com
Accept: application/alto-costmap+json, \ Accept: application/alto-costmap+json, \
application/alto-error+json application/alto-error+json
]]></artwork> ]]></sourcecode>
</figure> </figure>
<t>The response is shown in <xref target="ex-get-res"/>.</t> <t>The response is shown in <xref target="ex-get-res"/>.</t>
<figure anchor="ex-get-res"> <figure anchor="ex-get-res">
<name>Response to a GET Request</name> <name>Response to a GET Request</name>
<artwork align="left"><![CDATA[ <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/alto-costmap+json Content-Type: application/alto-costmap+json
Content-Length: 50 Content-Length: 50
{ ... full replacement of my-routingcost-map ... } { ... full replacement of my-routingcost-map ... }
]]></artwork> ]]></sourcecode>
</figure> </figure>
</section> </section>
<section anchor="new-next-edge-recommendation"> <section anchor="new-next-edge-recommendation">
<name>New Next Edge Recommendation</name> <name>New Next Edge Recommendation</name>
<t>While intended TIPS usage is for the client to receive a recommended <t>While intended TIPS usage is for the client to receive a recommended
starting edge in the TIPS summary, consume that edge, then construct starting edge in the TIPS summary, consume that edge, and then construct
all future URIs by incrementing the sequence count by 1, there may be 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 cases in which the client needs to request a new next edge to
consume. For example, if a client has an open TIPS view yet has not consume. For example, if a client has an open TIPS view but has not
polled in a while, the client may request the next logical polled in a while, the client might request the next logical
incremental URI but the server has compacted the updates graph so it 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 t o no longer exists. Thus, the client <bcp14>MAY</bcp14> request a new next edge t o
consume based on its current version of the resource.</t> consume based on its current version of the resource.</t>
<section anchor="request-1"> <section anchor="request-1">
<name>Request</name> <name>Request</name>
<t>An ALTO client requests that the server provide a next edge recomme ndation for a <t>An ALTO client requests that the server provide a next edge recomme ndation for a
given TIPS view by sending an HTTP POST request with the media type 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> h "application/alto-tipsparams+json". The URL of the request <bcp14>MUST</bcp14> h
ave the format of</t> ave the following format:</t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
<tips-view-path>/ug <tips-view-path>/ug
]]></artwork> ]]></sourcecode>
<t>and the <tt>HOST</tt> field <bcp14>MUST</bcp14> be the <tt>&lt;tips <t>and the "HOST" field <bcp14>MUST</bcp14> be "&lt;tips-view-host&gt;
-view-host&gt;</tt>.</t> ".</t>
<t>The POST body has the same format as the TIPSReq <xref target="fig- <t>The POST body has the same format as the TIPSReq in <xref target="f
open-req"/>. The ig-open-req"/>. The
<tt>resource-id</tt> <bcp14>MUST</bcp14> be the same as the resource ID used to "resource-id" field <bcp14>MUST</bcp14> be the same as the resource ID used to c
create the TIPS view, reate the TIPS view,
and the optional <tt>input</tt> field <bcp14>MUST NOT</bcp14> be present.</t> and the optional "input" field <bcp14>MUST NOT</bcp14> be present.</t>
</section> </section>
<section anchor="response-1"> <section anchor="response-1">
<name>Response</name> <name>Response</name>
<t>The response to a valid request <bcp14>MUST</bcp14> be a JSON merge <t>The response to a valid request <bcp14>MUST</bcp14> be a JSON merge
patch to the object of type patch to the object of the AddTIPSResponse type (defined in <xref target="open-
AddTIPSResponse (defined in <xref target="open-resp"/>), denoted as media type resp"/>), denoted as media type
"application/merge-patch+json". The "update-graph-summary" field <bcp14>MUST</bc "application/merge-patch+json". The "updates-graph-summary" field <bcp14>MUST</b
p14> be present cp14> be present
in the response and hence its parent field "tips-view-summary" <bcp14>MUST</bcp1 in the response; hence, its parent field "tips-view-summary" <bcp14>MUST</bcp14>
4> be present be present
as well.</t> as well.</t>
<t>If the <tt>tag</tt> field is present in the request, the server <bc <t>If the "tag" field is present in the request, the server <bcp14>MUS
p14>MUST</bcp14> check if any T</bcp14> check if any
version within the range [start-seq, end-seq] has the same tag value. If the version within the range [&lt;start-seq&gt;, &lt;end-seq&gt;] has the same tag v
version exists, e.g., denoted as tag-seq, the server <bcp14>MUST</bcp14> compute alue. If the
the paths from version exists (e.g., denoted as &lt;tag-seq&gt;), the server <bcp14>MUST</bcp14
both tag-seq and 0 to the end-seq, and choose the one with the minimal cost. The > compute the paths from
cost <bcp14>MAY</bcp14> be implementation specific, e.g., number of messages, ac both &lt;tag-seq&gt; and 0 to the &lt;end-seq&gt; and choose the one with the mi
cumulated data nimal cost. The
size, etc. The first edge of the selected path <bcp14>MUST</bcp14> be returned a cost <bcp14>MAY</bcp14> be implementation specific (e.g., number of messages, ac
s the cumulated data
recommended next edge.</t> size, etc.). The first edge of the selected path <bcp14>MUST</bcp14> be returned
<t>If the <tt>tag</tt> field is NOT present, it <bcp14>MUST</bcp14> be as the
interpreted as the tag-seq is 0.</t> recommended next edge.</t>
<t>It is <bcp14>RECOMMENDED</bcp14> that the server uses the following
HTTP codes to <t>If the "tag" field is not present, the interpretation <bcp14>MUST
</bcp14> be that the &lt;tag-seq&gt; is 0.</t>
<t>It is <bcp14>RECOMMENDED</bcp14> that the server use the following
HTTP code to
indicate errors, with the media type "application/alto-error+json", indicate errors, with the media type "application/alto-error+json",
regarding new next edge requests.</t> regarding new next edge requests.</t>
<ul spacing="normal"> <dl spacing="normal">
<li>404 (Not Found): if the requested TIPS view does not exist or is <dt>404 (Not Found):</dt><dd>Indicates that the requested TIPS view
closed by the server.</li> does not exist or has been
</ul> closed by the server.</dd>
</dl>
</section> </section>
<section anchor="example"> <section anchor="example">
<name>Example</name> <name>Example</name>
<t>We give an example of the new next edge recommendation service. Ass <t>In this section, we give an example of the new next edge recommenda
ume that a tion service. Assume that a
client already creates a TIPS view as in <xref target="open-example"/>, whose up client already creates a TIPS view (as in <xref target="open-example"/>) whose u
dates graph pdates graph
is as shown in <xref target="fig-ug"/>. Now assume that the client already has t is as shown in <xref target="fig-ug"/>. Now assume that the client already has t
ag 0881080 ag 0881080,
whose corresponding sequence number is 103, and sends the following new next whose corresponding sequence number is 103, and sends the following new next
edge recommendation request (authentication is omitted for simplicity):</t> edge recommendation request (authentication is omitted for simplicity):</t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
POST /tips/2718281828/ug HTTP/1.1 POST /tips/2718281828/ug HTTP/1.1
HOST alto.example.com HOST alto.example.com
Accept: application/merge-patch+json, application/alto-error+json Accept: application/merge-patch+json, application/alto-error+json
Content-Type: application/alto-tipsparams+json Content-Type: application/alto-tipsparams+json
Content-Length: 62 Content-Length: 62
{ {
"resource-id": "my-routingcost-map", "resource-id": "my-routingcost-map",
"tag": "0881080" "tag": "0881080"
} }
]]></artwork> ]]></sourcecode>
<t>According to <xref target="fig-ug"/>, there are 3 potential paths: <t>According to <xref target="fig-ug"/>, there are three potential pat
103 -&gt; 104 -&gt; 105 -&gt; 106, hs: 103 -&gt; 104 -&gt; 105 -&gt; 106,
103 -&gt; 105 -&gt; 106, and 0 -&gt; 105 -&gt; 106. Assume that the server choos 103 -&gt; 105 -&gt; 106, and 0 -&gt; 105 -&gt; 106. Assume that the server choos
es shortest es the shortest
update path by the accumulated data size and the best path is 103 -&gt; 105 -&gt ; 106. 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> Thus, the server responds with the following message:</t>
<artwork><![CDATA[ <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/merge-patch+json Content-Type: application/merge-patch+json
Content-Length: 193 Content-Length: 193
{ {
"tips-view-summary": { "tips-view-summary": {
"updates-graph-summary": { "updates-graph-summary": {
"start-seq": 101, "start-seq": 101,
"end-seq": 106, "end-seq": 106,
"start-edge-rec": { "start-edge-rec": {
"seq-i": 103, "seq-i": 103,
"seq-j": 105 "seq-j": 105
} }
} }
} }
} }
]]></artwork> ]]></sourcecode>
</section> </section>
</section> </section>
</section> </section>
<section anchor="ops-considerations"> <section anchor="ops-considerations">
<name>Operation and Processing Considerations</name> <name>Operation and Processing Considerations</name>
<t>TIPS has some common operational considerations as ALTO/SSE <xref targe t="RFC8895"/>, <t>TIPS has some common operational considerations as ALTO/SSE <xref targe t="RFC8895"/>,
including:</t> including:</t>
<ul spacing="normal"> <ul spacing="normal">
<li>server choosing update messages (<xref section="9.1" sectionFormat=" <li>the server choosing update messages (<xref section="9.1" sectionForm
of" target="RFC8895"/>);</li> at="of" target="RFC8895"/>);</li>
<li>client processing update messages (<xref section="9.2" sectionFormat <li>the client processing update messages (<xref section="9.2" sectionFo
="of" target="RFC8895"/>);</li> rmat="of" target="RFC8895"/>);</li>
<li>updates of filtered map services (<xref section="9.3" sectionFormat= <li>the updates of filtered map services (<xref section="9.3" sectionFor
"of" target="RFC8895"/>);</li> mat="of" target="RFC8895"/>); and</li>
<li>updates of ordinal mode costs (<xref section="9.4" sectionFormat="of <li>the updates of ordinal mode costs (<xref section="9.4" sectionFormat
" target="RFC8895"/>).</li> ="of" target="RFC8895"/>).</li>
</ul> </ul>
<t>There are also some operation considerations specific to TIPS, which we
discuss <t>There are also some operational considerations specific to TIPS, which
we discuss
below.</t> below.</t>
<section anchor="load-balancing"> <section anchor="load-balancing">
<name>Considerations for Load Balancing</name> <name>Considerations for Load Balancing</name>
<t>There are two levels of load balancing in TIPS. The first level is to <t>There are two levels of load balancing in TIPS: the first level is to
balance balance
the load of TIPS views for different clients, and the second is to balance the the load of TIPS views for different clients and the second is to balance the
load of incremental updates.</t> load of incremental updates.</t>
<t>Load balancing of TIPS views can be achieved either at the applicatio n layer or <t>Load balancing of TIPS views can be achieved either at the applicatio n layer or
at the infrastructure layer. For example, an ALTO server <bcp14>MAY</bcp14> set at the infrastructure layer. For example, an ALTO server <bcp14>MAY</bcp14> set
<tt>&lt;tips-view-host&gt;</tt> to different subdomains to distribute TIPS views &lt;tips-view-host&gt; to different subdomains to distribute TIPS views or simpl
, or simply y
use the same host of the TIPS service and rely on load balancers to distribute use the same host of the TIPS information resource and rely on load balancers to
the load.</t> distribute
the load.</t>
<t>TIPS allows a client to make concurrent pulls of incremental updates for the <t>TIPS allows a client to make concurrent pulls of incremental updates for the
same TIPS view potentially through different HTTP connections. As a consequence, same TIPS view, potentially through different HTTP connections. As a consequence
it introduces additional complexities when the ALTO server is being load ,
balanced. For example, a request may be directed to a wrong backend server and TIPS introduces additional complexities when the ALTO server balances the load b
get incorrectly processed if the following two conditions both hold:</t> y 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"> <ul spacing="normal">
<li>the backend servers are stateful, i.e., the TIPS view is created <li>these backend servers are stateful (i.e., the TIPS view is created
and stored only on a single server;</li> and stored only on a single server); and</li>
<li>the ALTO server is using layer-4 load balancing, i.e., the <li>the ALTO server is using Layer 4 load balancing (i.e., the
requests are distributed based on the TCP 5-tuple.</li> requests are distributed based on the TCP 5-tuple).</li>
</ul> </ul>
<t>Thus, additional considerations are required to enable correct load <t>Thus, additional considerations are required to enable correct load
balancing for TIPS, including:</t> balancing for TIPS, including:</t>
<ul spacing="normal"> <dl spacing="normal">
<li>Use a stateless architecture: One solution is to follow the <dt>Using a stateless architecture:</dt><dd>One solution is to follow
the
stateless computing pattern: states about the TIPS view are not stateless computing pattern: states about the TIPS view are not
maintained by the backend servers but are stored in a distributed maintained by the backend servers but are stored in a distributed
database. Thus, concurrent requests to the same TIPS view can be database. Thus, concurrent requests to the same TIPS view can be
processed on arbitrary stateless backend servers, which all processed on arbitrary stateless backend servers, which all
fetches data from the same database.</li> fetch data from the same database.</dd>
<li>Configure the load balancers properly: In case when the backend <dt>Configuring the load balancers properly:</dt><dd>In the case that
the backend
servers are stateful, the load balancers must be properly servers are stateful, the load balancers must be properly
configured to guarantee that requests of the same TIPS view always configured to guarantee that requests of the same TIPS view always
arrive at the same server. For example, an operator or a provider 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 of an ALTO server <bcp14>MAY</bcp14> configure Layer 7 load balancers that
distribute requests based on the tips-view-path component in the URI.</li> distribute requests based on the tips-view-path component in the URI.</dd>
</ul> </dl>
</section> </section>
<section anchor="cross-sched"> <section anchor="cross-sched">
<name>Considerations for Cross-Resource Dependency Scheduling</name> <name>Considerations for Cross-Resource Dependency Scheduling</name>
<t>Dependent ALTO resources result in cross-resource dependencies in <t>Dependent ALTO resources result in cross-resource dependencies in
TIPS. Consider the following pair of resources, where my-cost-map TIPS. Consider the following pair of resources, where my-cost-map
(C) is dependent on my-network-map (N). The updates graph for each (C) is dependent on my-network-map (N). The updates graph for each
resource is shown, along with links in between the respective updates resource is shown, along with links between the respective updates
graphs to show dependency:</t> graphs to show dependency:</t>
<figure anchor="fig-cross"> <figure anchor="fig-cross">
<name>Example Dependency Model</name> <name>Example Dependency Model</name>
<artwork type="drawing" align="center"><![CDATA[ <artwork type="drawing" align="center"><![CDATA[
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
my-network-map (N) | 0 |-->|89 |-->|90 |-->|91 |-->|92 | my-network-map (N) | 0 |-->|89 |-->|90 |-->|91 |-->|92 |
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| \ \ \ | \ \ \
| \ \ \ | \ \ \
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
skipping to change at line 1378 skipping to change at line 1408
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
|_______________________| |_______________________|
]]></artwork> ]]></artwork>
</figure> </figure>
<t>In <xref target="fig-cross"/>, the cost-map versions 101 and 102 (den oted as C101 and C102) <t>In <xref target="fig-cross"/>, the cost-map versions 101 and 102 (den oted as C101 and C102)
are dependent on the network-map version 89 (denoted as N89). The cost-map 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> version 103 (C103) is dependent on the network-map version 90 (N90), and so on.< /t>
<t>Thus, the client must decide the order in which to receive and apply the <t>Thus, the client must decide the order in which to receive and apply the
updates. The order may affect how fast the client can build a consistent view 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> and how long the client needs to buffer the update.</t>
<ul spacing="normal"> <dl spacing="normal">
<li>Example 1: The client requests N89, N90, N91, C101, C102 in that <dt>Example 1:</dt><dd>The client requests N89, N90, N91, C101, C102 i
n that
order. The client either gets no consistent view of the resources order. The client either gets no consistent view of the resources
or has to buffer N90 and N91.</li> or has to buffer N90 and N91.</dd>
<li>Example 2: The client requests C101, C102, C103, N89. The client <dt>Example 2:</dt><dd>The client requests C101, C102, C103, N89. The
either gets no consistent view or has to buffer C103.</li> client
</ul> either gets no consistent view or has to buffer C103.</dd>
</dl>
<t>To get consistent ALTO information, a client must process the updates following <t>To get consistent ALTO information, a client must process the updates following
the guidelines specified in <xref section="9.2" sectionFormat="of" target="RFC88 95"/>. If resource permits the guidelines specified in <xref section="9.2" sectionFormat="of" target="RFC88 95"/>. If resources permit
(i.e., sufficient updates can be buffered), an ALTO client can safely use long (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 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 quickly as the updates are already stored in the buffer. Otherwise, it is
<bcp14>RECOMMENDED</bcp14> to request</t> <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>
<section anchor="shared-tips-view"> <section anchor="shared-tips-view">
<name>Considerations for Managing Shared TIPS Views</name> <name>Considerations for Managing Shared TIPS Views</name>
<t>From a client's point of view, it sees only one copy of the TIPS view <t>From a client's point of view, it sees only one copy of the TIPS view
for any resource. However, on the server side, there are different for any resource. However, on the server side, there are different
implementation options, especially for common resources (e.g., implementation options, especially for common resources (e.g.,
network map or cost map) that may be frequently queried by many network maps or cost maps) that may be frequently queried by many
clients. Some potential options are listed below:</t> clients. Some potential options are listed below:</t>
<ul spacing="normal"> <ul spacing="normal">
<li>An ALTO server creates one TIPS view of the common resource for <li>An ALTO server creates one TIPS view of the common resource for
each client.</li> each client.</li>
<li> <li>
<t>An ALTO server maintains one copy of the TIPS view for each commo n <t>An ALTO server maintains one copy of the TIPS view for each commo n
resource and all clients requesting the same resources use the resource and all clients requesting the same resources use the
same copy. There are two ways to manage the storage for the same copy. There are two ways to manage the storage for the
shared copy: </t> shared copy:</t>
<ul spacing="normal"> <ul spacing="normal">
<li>the ALTO server maintains the set of clients that have sent a polling <li>the ALTO server maintains the set of clients that have sent a polling
request to the TIPS view, and only removes the view from the storage when request to the TIPS view and only removes the view from the storage when
the set becomes empty and no client immediately issues a new edge request;</li> the set becomes empty and no client immediately issues a new edge request; or</l
i>
<li>the TIPS view is never removed from the storage.</li> <li>the TIPS view is never removed from the storage.</li>
</ul> </ul>
</li> </li>
</ul> </ul>
<t>Developers may choose different implementation options depending on <t>Developers may choose different implementation options depending on
criteria such as request frequency, available resources of the ALTO criteria such as request frequency, available resources of the ALTO
server, the ability to scale, and programming complexity.</t> server, the ability to scale, and programming complexity.</t>
</section> </section>
<section anchor="considerations-for-offering-shortcut-incremental-updates" > <section anchor="considerations-for-offering-shortcut-incremental-updates" >
<name>Considerations for Offering Shortcut Incremental Updates</name> <name>Considerations for Offering Shortcut Incremental Updates</name>
<t>Besides the mandatory stepwise incremental updates (from i to i+1), <t>Besides the mandatory stepwise incremental updates (from i to i+1),
an ALTO server <bcp14>MAY</bcp14> optionally offer shortcut incremental updates, or 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; simple shortcuts, between two non-consecutive versions i and i+k (k &gt;
1). Such shortcuts offer alternative paths in the update graph and 1). Such shortcuts offer alternative paths in the updates graph and
can potentially speed up the transmission and processing of can potentially speed up the transmission and processing of
incremental updates, leading to faster synchronization of ALTO incremental updates, leading to faster synchronization of ALTO
information, especially when the client has limited bandwidth and information, especially when the client has limited bandwidth and
computation. However, implementors of an ALTO server must be aware computation. However, implementors of an ALTO server must be aware
that:</t> that:</t>
<ol spacing="normal" type="1"><li>Optional shortcuts may increase the si
ze of the update graph, in <ol spacing="normal" type="1"><li>optional shortcuts may increase the si
the worst case being the square of the number of updates (i.e., ze of the updates graph, worst case scenario being the square of the number of u
pdates (i.e.,
when a shortcut is offered for each version to all future when a shortcut is offered for each version to all future
versions).</li> versions).</li>
<li>Optional shortcuts require additional storage on the ALTO server.< <li>optional shortcuts require additional storage on the ALTO server.<
/li> /li>
<li>Optional shortcuts may reduce concurrency when the updates do not <li>optional shortcuts may reduce concurrency when the updates do not
overlap, e.g., when the updates apply to different parts of an overlap (e.g., when the updates apply to different parts of an
ALTO resource. In such a case, the total size of the original 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 is close to the size of the shortcut, but the original
updates can be transmitted concurrently while the shortcut is updates can be transmitted concurrently while the shortcut is
transmitted in a single connection.</li> transmitted in a single connection.</li>
</ol> </ol>
</section> </section>
</section> </section>
<section anchor="security-considerations"> <section anchor="security-considerations">
<name>Security Considerations</name> <name>Security Considerations</name>
<t>The security considerations (Section 15 of <xref target="RFC7285"/>) of <t>The security considerations of the base protocol (<xref
the base target="RFC7285" sectionFormat="of" section="15"/>) fully apply to this
protocol fully apply to this extension. For example, the same extension. For example, the same authenticity and integrity
authenticity and integrity considerations (Section 15.1 of <xref target="RFC7285 considerations (<xref target="RFC7285" sectionFormat="of"
"/>) section="15.1"/>) still fully apply; the same considerations for the
still fully apply; the same considerations for the privacy of ALTO privacy of ALTO users (<xref target="RFC7285" sectionFormat="of"
users (Section 15.4 of <xref target="RFC7285"/>) also still fully apply. Additio section="15.4"/>) also still fully apply. Additionally, operators of the
nally, ALTO servers <bcp14>MUST</bcp14> follow the guidelines in <xref
operators of the ALTO servers <bcp14>MUST</bcp14> follow the guidelines in <xref target="RFC9325"/> to avoid new TLS vulnerabilities discovered after
target="RFC9325"/> to avoid <xref target="RFC7285"/> was published.</t>
new TLS vulnerabilities discovered after <xref target="RFC7285"/> was published. <t>The additional services (the addition of update read service and update
</t>
<t>The additional services (addition of update read service and update
push service) provided by this extension extend the attack surface push service) provided by this extension extend the attack surface
described in Section 15.1.1 of <xref target="RFC7285"/>. The following sub-sect ions discuss the described in <xref target="RFC7285" sectionFormat="of" section="15.1.1"/>. The following subsections discuss the
additional risks and their remedies.</t> additional risks and their remedies.</t>
<section anchor="tips-denial-of-service-attacks"> <section anchor="tips-denial-of-service-attacks">
<name>TIPS: Denial-of-Service Attacks</name> <name>TIPS: Denial-of-Service Attacks</name>
<t>Allowing TIPS views enables new classes of Denial-of-Service attacks. In <t>Allowing TIPS views enables new classes of DoS attacks. In
particular, for the TIPS server, one or multiple malicious ALTO clients might 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 create an excessive number of TIPS views, to exhaust the server resource and/or
to block normal users from the accessing the service.</t> to block normal users from accessing the service.</t>
<t>To avoid such attacks, the server <bcp14>MAY</bcp14> choose to limit the number of active <t>To avoid such attacks, the server <bcp14>MAY</bcp14> choose to limit the number of active
views and reject new requests when that threshold is reached. TIPS allows 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 n umber of predictive fetching and the server <bcp14>MAY</bcp14> also choose to limit the n umber of
pending requests. If a new request exceeds the threshold, the server <bcp14>MAY< /bcp14> log 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> the event and return the HTTP status 429 (Too Many Requests).</t>
<t>It is important to note that the preceding approaches are not the onl y <t>It is important to note that the preceding approaches are not the onl y
possibilities. For example, it may be possible for TIPS to use somewhat more possibilities. For example, it might be possible for a TIPS server to use somewh at more
clever logic involving TIPS view eviction policies, IP reputation, clever logic involving TIPS view eviction policies, IP reputation,
rate-limiting, and compartmentalization of the overall threshold into smaller rate-limiting, and compartmentalization of the overall threshold into smaller
thresholds that apply to subsets of potential clients. If service availability 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 is a concern, ALTO clients <bcp14>MAY</bcp14> establish service level agreements with the ALTO
server.</t> server.</t>
</section> </section>
<section anchor="alto-client-update-overloading-or-instability"> <section anchor="alto-client-update-overloading-or-instability">
<name>ALTO Client: Update Overloading or Instability</name> <name>ALTO Client: Update Overloading or Instability</name>
<t>The availability of continuous updates can also cause overload for an ALTO <t>The availability of continuous updates can also cause overload for an ALTO
client, in particular, an ALTO client with limited processing capabilities. The client, in particular, an ALTO client with limited processing capabilities. The
current design does not include any flow control mechanisms for the client to 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 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 provide stream and connection flow control data limits, which might help prevent
the client from being overloaded. Under overloading, the client <bcp14>MAY</bcp1 4> choose to the client from being overloaded. Under overloading, the client <bcp14>MAY</bcp1 4> choose to
remove the information resources with high update rates.</t> remove the information resources with high update rates.</t>
<t>Also, under overloading, the client may no longer be able to detect <t>Also, under overloading, the client might no longer be able to detect
whether information is still fresh or has become stale. In such a 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 case, the client should be careful in how it uses the information to
avoid stability or efficiency issues.</t> avoid stability or efficiency issues.</t>
</section> </section>
</section> </section>
<section anchor="iana-considerations"> <section anchor="iana-considerations">
<name>IANA Considerations</name> <name>IANA Considerations</name>
<t>IANA is requested to register the following media types from the regist <t>IANA has registered the following media types from the registry availab
ry available at <xref target="IANA-Media-Type"/>:</t> le at <xref target="IANA-Media-Type"/>:</t>
<ul spacing="normal"> <ul spacing="normal">
<li>application/alto-tips+json: as described in <xref target="open-resp" />;</li> <li>application/alto-tips+json: as described in <xref target="open-resp" />;</li>
<li>application/alto-tipsparams+json: as described in <xref target="open -req"/>;</li> <li>application/alto-tipsparams+json: as described in <xref target="open -req"/>;</li>
</ul> </ul>
<ul empty="true">
<li>
<t>Note to the RFC Editor: Please replace This-Document with the RFC n
umber to be assigned to this document.</t>
</li>
</ul>
<section anchor="applicationalto-tipsjson-media-type"> <section anchor="applicationalto-tipsjson-media-type">
<name>application/alto-tips+json Media Type</name> <name>application/alto-tips+json Media Type</name>
<dl> <dl>
<dt>Type name:</dt> <dt>Type name:</dt>
<dd> <dd>application</dd>
<t>application</t>
</dd>
<dt>Subtype name:</dt> <dt>Subtype name:</dt>
<dd> <dd>alto-tips+json</dd>
<t>alto-tips+json</t>
</dd>
<dt>Required parameters:</dt> <dt>Required parameters:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Optional parameters:</dt> <dt>Optional parameters:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Encoding considerations:</dt> <dt>Encoding considerations:</dt>
<dd> <dd>Encoding considerations are identical to those specified for the
<t>Encoding considerations are identical to those specified for the "application/json" media type. See <xref target="RFC8259"/>.</dd>
"application/json" media type. See <xref target="RFC8259"/>.</t>
</dd>
<dt>Security considerations:</dt> <dt>Security considerations:</dt>
<dd> <dd>See the Security Considerations section of RFC 9569.</dd>
<t>See the Security Considerations section of This-Document.</t>
</dd>
<dt>Interoperability considerations:</dt> <dt>Interoperability considerations:</dt>
<dd> <dd>N/A</dd>
<t>N/A.</t>
</dd>
<dt>Published specification:</dt> <dt>Published specification:</dt>
<dd> <dd><xref target="open-resp"/> of RFC 9569.</dd>
<t><xref target="open-resp"/> of This-Document.</t>
</dd>
<dt>Applications that use this media type:</dt> <dt>Applications that use this media type:</dt>
<dd> <dd>ALTO servers and ALTO clients either stand alone or are embedded w
<t>ALTO servers and ALTO clients either stand alone or are embedded ithin other
within other applications.</dd>
applications.</t>
</dd>
<dt>Fragment identifier considerations:</dt> <dt>Fragment identifier considerations:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd> <dt>Additional information:</dt><dd>
<dt>Additional information:</dt> <t><br/></t>
<dd> <dl spacing="compact">
<t><br/>
</t>
<dl>
<dt>Deprecated alias names for this type:</dt> <dt>Deprecated alias names for this type:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Magic number(s):</dt> <dt>Magic number(s):</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>File extension(s):</dt> <dt>File extension(s):</dt>
<dd> <dd>RFC 9569 uses the media type to refer to protocol messages; th
<t>This document uses the media type to refer to protocol messag us, it
es and thus does not require a file extension.</dd>
does not require a file extension.</t>
</dd>
<dt>Macintosh file type code(s):</dt> <dt>Macintosh file type code(s):</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
</dl> </dl>
</dd> </dd>
<dt>Person and email address to contact for further information:</dt> <dt>Person &amp; email address to contact for further information:</dt
<dd> >
<t>See Authors' Addresses section.</t> <dd><br/>See the Authors' Addresses section of RFC 9569.</dd>
</dd>
<dt>Intended usage:</dt> <dt>Intended usage:</dt>
<dd> <dd>COMMON</dd>
<t>COMMON</t>
</dd>
<dt>Restrictions on usage:</dt> <dt>Restrictions on usage:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Author:</dt> <dt>Author:</dt>
<dd> <dd>See the Authors' Addresses section of RFC 9569.</dd>
<t>See Authors' Addresses section.</t>
</dd>
<dt>Change controller:</dt> <dt>Change controller:</dt>
<dd> <dd>Internet Engineering Task Force (iesg@ietf.org).</dd>
<t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
</dd>
<dt>Provisional registration?:</dt>
<dd>
<t>No</t>
</dd>
</dl> </dl>
</section> </section>
<section anchor="applicationalto-tipsparamsjson-media-type"> <section anchor="applicationalto-tipsparamsjson-media-type">
<name>application/alto-tipsparams+json Media Type</name> <name>application/alto-tipsparams+json Media Type</name>
<dl> <dl>
<dt>Type name:</dt> <dt>Type name:</dt>
<dd> <dd>application</dd>
<t>application</t>
</dd>
<dt>Subtype name:</dt> <dt>Subtype name:</dt>
<dd> <dd>alto-tipsparams+json</dd>
<t>alto-tipsparams+json</t>
</dd>
<dt>Required parameters:</dt> <dt>Required parameters:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Optional parameters:</dt> <dt>Optional parameters:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Encoding considerations:</dt> <dt>Encoding considerations:</dt>
<dd> <dd>Encoding considerations are identical to those specified for the
<t>Encoding considerations are identical to those specified for the "application/json" media type. See <xref target="RFC8259"/>.</dd>
"application/json" media type. See <xref target="RFC8259"/>.</t>
</dd>
<dt>Security considerations:</dt> <dt>Security considerations:</dt>
<dd> <dd>See the Security Considerations section of RFC 9569.</dd>
<t>See the Security Considerations section of This-Document.</t>
</dd>
<dt>Interoperability considerations:</dt> <dt>Interoperability considerations:</dt>
<dd> <dd>N/A</dd>
<t>N/A.</t>
</dd>
<dt>Published specification:</dt> <dt>Published specification:</dt>
<dd> <dd><xref target="open-req"/> of RFC 9569.</dd>
<t><xref target="open-req"/> of This-Document.</t>
</dd>
<dt>Applications that use this media type:</dt> <dt>Applications that use this media type:</dt>
<dd> <dd>ALTO servers and ALTO clients either stand alone or are embedded w
<t>ALTO servers and ALTO clients either stand alone or are embedded ithin other
within other applications.</dd>
applications.</t>
</dd>
<dt>Fragment identifier considerations:</dt> <dt>Fragment identifier considerations:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd> <dt>Additional information:</dt><dd>
<dt>Additional information:</dt> <t><br/></t>
<dd> <dl spacing="compact">
<t><br/>
</t>
<dl>
<dt>Deprecated alias names for this type:</dt> <dt>Deprecated alias names for this type:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Magic number(s):</dt> <dt>Magic number(s):</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>File extension(s):</dt> <dt>File extension(s):</dt>
<dd> <dd>RFC 9569 uses the media type to refer to protocol messages; th
<t>This document uses the media type to refer to protocol messag us, it
es and thus does not require a file extension.</dd>
does not require a file extension.</t>
</dd>
<dt>Macintosh file type code(s):</dt> <dt>Macintosh file type code(s):</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
</dl> </dl>
</dd> </dd>
<dt>Person and email address to contact for further information:</dt>
<dd> <dt>Person &amp; email address to contact for further information:<br/
<t>See Authors' Addresses section.</t> ></dt>
</dd> <dd><br/>See the Authors' Addresses section of RFC 9569.</dd>
<dt>Intended usage:</dt> <dt>Intended usage:</dt>
<dd> <dd>COMMON</dd>
<t>COMMON</t>
</dd>
<dt>Restrictions on usage:</dt> <dt>Restrictions on usage:</dt>
<dd> <dd>N/A</dd>
<t>N/A</t>
</dd>
<dt>Author:</dt> <dt>Author:</dt>
<dd> <dd>See the Authors' Addresses section of RFC 9569.</dd>
<t>See Authors' Addresses section.</t>
</dd>
<dt>Change controller:</dt> <dt>Change controller:</dt>
<dd> <dd>Internet Engineering Task Force (iesg@ietf.org).</dd>
<t>Internet Engineering Task Force (mailto:iesg@ietf.org).</t>
</dd>
<dt>Provisional registration?:</dt>
<dd>
<t>No</t>
</dd>
</dl> </dl>
</section> </section>
</section> </section>
</middle> </middle>
<back> <back>
<references> <references>
<name>References</name> <name>References</name>
<references> <references>
<name>Normative References</name> <name>Normative References</name>
<reference anchor="RFC2119">
<front> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.21
<title>Key words for use in RFCs to Indicate Requirement Levels</tit 19.xml"/>
le> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.72
<author fullname="S. Bradner" initials="S." surname="Bradner"/> 85.xml"/>
<date month="March" year="1997"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.82
<abstract> 59.xml"/>
<t>In many standards track documents several words are used to sig <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.81
nify the requirements in the specification. These words are often capitalized. T 74.xml"/>
his document defines these words as they should be interpreted in IETF documents <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.88
. This document specifies an Internet Best Current Practices for the Internet Co 95.xml"/>
mmunity, and requests discussion and suggestions for improvements.</t> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.91
</abstract> 12.xml"/>
</front> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.91
<seriesInfo name="BCP" value="14"/> 13.xml"/>
<seriesInfo name="RFC" value="2119"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.91
<seriesInfo name="DOI" value="10.17487/RFC2119"/> 14.xml"/>
</reference> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.39
<reference anchor="RFC7285"> 86.xml"/>
<front> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.93
<title>Application-Layer Traffic Optimization (ALTO) Protocol</title 25.xml"/>
>
<author fullname="R. Alimi" initials="R." role="editor" surname="Ali
mi"/>
<author fullname="R. Penno" initials="R." role="editor" surname="Pen
no"/>
<author fullname="Y. Yang" initials="Y." role="editor" surname="Yang
"/>
<author fullname="S. Kiesel" initials="S." surname="Kiesel"/>
<author fullname="S. Previdi" initials="S." surname="Previdi"/>
<author fullname="W. Roome" initials="W." surname="Roome"/>
<author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
<author fullname="R. Woundy" initials="R." surname="Woundy"/>
<date month="September" year="2014"/>
<abstract>
<t>Applications using the Internet already have access to some top
ology information of Internet Service Provider (ISP) networks. For example, view
s to Internet routing tables at Looking Glass servers are available and can be p
ractically downloaded to many network application clients. What is missing is kn
owledge 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 t
o distribute it.</t>
<t>The Application-Layer Traffic Optimization (ALTO) services defi
ned in this document provide network information (e.g., basic network location s
tructure and preferences of network paths) with the goal of modifying network re
source consumption patterns while maintaining or improving application performan
ce. 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 appli
cations to effectively utilize them. Additional services are built on top of the
maps.</t>
<t>This document describes a protocol implementing the ALTO servic
es. Although the ALTO services would primarily be provided by ISPs, other entiti
es, such as content service providers, could also provide ALTO services. Applica
tions 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 con
tent delivery networks.</t>
</abstract>
</front>
<seriesInfo name="RFC" value="7285"/>
<seriesInfo name="DOI" value="10.17487/RFC7285"/>
</reference>
<reference anchor="RFC8259">
<front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format
</title>
<author fullname="T. Bray" initials="T." role="editor" surname="Bray
"/>
<date month="December" year="2017"/>
<abstract>
<t>JavaScript Object Notation (JSON) is a lightweight, text-based,
language-independent data interchange format. It was derived from the ECMAScrip
t Programming Language Standard. JSON defines a small set of formatting rules fo
r the portable representation of structured data.</t>
<t>This document removes inconsistencies with other specifications
of JSON, repairs specification errors, and offers experience-based interoperabi
lity guidance.</t>
</abstract>
</front>
<seriesInfo name="STD" value="90"/>
<seriesInfo name="RFC" value="8259"/>
<seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC8174">
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti
tle>
<author fullname="B. Leiba" initials="B." surname="Leiba"/>
<date month="May" year="2017"/>
<abstract>
<t>RFC 2119 specifies common key words that may be used in protoco
l specifications. This document aims to reduce the ambiguity by clarifying that
only UPPERCASE usage of the key words have the defined special meanings.</t>
</abstract>
</front>
<seriesInfo name="BCP" value="14"/>
<seriesInfo name="RFC" value="8174"/>
<seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>
<reference anchor="RFC8895">
<front>
<title>Application-Layer Traffic Optimization (ALTO) Incremental Upd
ates Using Server-Sent Events (SSE)</title>
<author fullname="W. Roome" initials="W." surname="Roome"/>
<author fullname="Y. Yang" initials="Y." surname="Yang"/>
<date month="November" year="2020"/>
<abstract>
<t>The Application-Layer Traffic Optimization (ALTO) protocol (RFC
7285) provides network-related information, called network information resource
s, to client applications so that clients can make informed decisions in utilizi
ng 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 inc
remental, in that if only a small section of an information resource changes, th
e ALTO server can send just the changes and (2) updates can be immediate, in tha
t the ALTO server can send updates as soon as they are available.</t>
</abstract>
</front>
<seriesInfo name="RFC" value="8895"/>
<seriesInfo name="DOI" value="10.17487/RFC8895"/>
</reference>
<reference anchor="RFC9112">
<front>
<title>HTTP/1.1</title>
<author fullname="R. Fielding" initials="R." role="editor" surname="
Fielding"/>
<author fullname="M. Nottingham" initials="M." role="editor" surname
="Nottingham"/>
<author fullname="J. Reschke" initials="J." role="editor" surname="R
eschke"/>
<date month="June" year="2022"/>
<abstract>
<t>The Hypertext Transfer Protocol (HTTP) is a stateless applicati
on-level protocol for distributed, collaborative, hypertext information systems.
This document specifies the HTTP/1.1 message syntax, message parsing, connectio
n management, and related security concerns.</t>
<t>This document obsoletes portions of RFC 7230.</t>
</abstract>
</front>
<seriesInfo name="STD" value="99"/>
<seriesInfo name="RFC" value="9112"/>
<seriesInfo name="DOI" value="10.17487/RFC9112"/>
</reference>
<reference anchor="RFC9113">
<front>
<title>HTTP/2</title>
<author fullname="M. Thomson" initials="M." role="editor" surname="T
homson"/>
<author fullname="C. Benfield" initials="C." role="editor" surname="
Benfield"/>
<date month="June" year="2022"/>
<abstract>
<t>This specification describes an optimized expression of the sem
antics 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 excha
nges on the same connection.</t>
<t>This document obsoletes RFCs 7540 and 8740.</t>
</abstract>
</front>
<seriesInfo name="RFC" value="9113"/>
<seriesInfo name="DOI" value="10.17487/RFC9113"/>
</reference>
<reference anchor="RFC9114">
<front>
<title>HTTP/3</title>
<author fullname="M. Bishop" initials="M." role="editor" surname="Bi
shop"/>
<date month="June" year="2022"/>
<abstract>
<t>The QUIC transport protocol has several features that are desir
able in a transport for HTTP, such as stream multiplexing, per-stream flow contr
ol, and low-latency connection establishment. This document describes a mapping
of HTTP semantics over QUIC. This document also identifies HTTP/2 features that
are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3
.</t>
</abstract>
</front>
<seriesInfo name="RFC" value="9114"/>
<seriesInfo name="DOI" value="10.17487/RFC9114"/>
</reference>
<reference anchor="RFC3986">
<front>
<title>Uniform Resource Identifier (URI): Generic Syntax</title>
<author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee
"/>
<author fullname="R. Fielding" initials="R." surname="Fielding"/>
<author fullname="L. Masinter" initials="L." surname="Masinter"/>
<date month="January" year="2005"/>
<abstract>
<t>A Uniform Resource Identifier (URI) is a compact sequence of ch
aracters that identifies an abstract or physical resource. This specification de
fines the generic URI syntax and a process for resolving URI references that mig
ht be in relative form, along with guidelines and security considerations for th
e use of URIs on the Internet. The URI syntax defines a grammar that is a supers
et of all valid URIs, allowing an implementation to parse the common components
of a URI reference without knowing the scheme-specific requirements of every pos
sible identifier. This specification does not define a generative grammar for UR
Is; 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="RFC9325">
<front>
<title>Recommendations for Secure Use of Transport Layer Security (T
LS) 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>Transport Layer Security (TLS) and Datagram Transport Layer Sec
urity (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, inclu
ding attacks on the most commonly used cipher suites and their modes of operatio
n. This document provides the latest recommendations for ensuring the security o
f deployed services that use TLS and DTLS. These recommendations are applicable
to the majority of use cases.</t>
<t>RFC 7525, an earlier version of the TLS recommendations, was pu
blished when the industry was transitioning to TLS 1.2. Years later, this transi
tion 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, thi
s 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>
<references> <references>
<name>Informative References</name> <name>Informative References</name>
<reference anchor="RFC4122">
<front> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.95
<title>A Universally Unique IDentifier (UUID) URN Namespace</title> 62.xml"/>
<author fullname="P. Leach" initials="P." surname="Leach"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.92
<author fullname="M. Mealling" initials="M." surname="Mealling"/> 05.xml"/>
<author fullname="R. Salz" initials="R." surname="Salz"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.76
<date month="July" year="2005"/> 17.xml"/>
<abstract>
<t>This specification defines a Uniform Resource Name namespace fo <reference anchor="IANA-Media-Type" target="https://www.iana.org/assignm
r UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique ID ents/media-types">
entifier). A UUID is 128 bits long, and can guarantee uniqueness across space an
d time. UUIDs were originally used in the Apollo Network Computing System and la
ter in the Open Software Foundation\'s (OSF) Distributed Computing Environment (
DCE), and then in Microsoft Windows platforms.</t>
<t>This specification is derived from the DCE specification with t
he kind permission of the OSF (now known as The Open Group). Information from ea
rlier versions of the DCE specification have been incorporated into this documen
t. [STANDARDS-TRACK]</t>
</abstract>
</front>
<seriesInfo name="RFC" value="4122"/>
<seriesInfo name="DOI" value="10.17487/RFC4122"/>
</reference>
<reference anchor="RFC9205">
<front>
<title>Building Protocols with HTTP</title>
<author fullname="M. Nottingham" initials="M." surname="Nottingham"/
>
<date month="June" year="2022"/>
<abstract>
<t>Applications often use HTTP as a substrate to create HTTP-based
APIs. This document specifies best practices for writing specifications that us
e HTTP to define new application protocols. It is written primarily to guide IET
F efforts to define application protocols using HTTP for deployment on the Inter
net but might be applicable in other situations.</t>
<t>This document obsoletes RFC 3205.</t>
</abstract>
</front>
<seriesInfo name="BCP" value="56"/>
<seriesInfo name="RFC" value="9205"/>
<seriesInfo name="DOI" value="10.17487/RFC9205"/>
</reference>
<reference anchor="IANA-Media-Type" target="https://www.iana.org/assignm
ents/media-types/media-types.xhtml">
<front> <front>
<title>Media Types</title> <title>Media Types</title>
<author> <author>
<organization/> <organization>IANA</organization>
</author> </author>
<date year="2023" month="June"/>
</front> </front>
</reference> </reference>
</references> </references>
</references> </references>
<section anchor="sec-dep-model"> <section anchor="sec-dep-model">
<name>A High-Level Deployment Model</name> <name>A High-Level Deployment Model</name>
<t>Conceptually, the TIPS system consists of three types of resources:</t> <t>Conceptually, the TIPS system consists of three types of resources:</t>
<ul spacing="normal"> <dl spacing="normal">
<li>(R1) TIPS frontend to create TIPS views.</li> <dt>(R1):</dt><dd>The TIPS frontend to create TIPS views.</dd>
<li>(R2) TIPS view directory, which provides metadata (e.g., references) <dt>(R2):</dt><dd>The TIPS view directory, which provides metadata (e.g.
about the , references) about the
network resource data.</li> network resource data.</dd>
<li>(R3) The actual network resource data, encoded as complete ALTO netw <dt>(R3):</dt><dd>The actual network resource data, encoded as complete
ork ALTO network
resources (e.g., cost map, network map) or incremental updates.</li> resources (e.g., a cost map or a network map) or incremental updates.</dd>
</ul> </dl>
<figure anchor="fig-service-model"> <figure anchor="fig-service-model">
<name>Sample TIPS Deployment Model</name> <name>Sample TIPS Deployment Model</name>
<artwork type="drawing" align="center"><![CDATA[ <artwork type="drawing" align="center"><![CDATA[
+------------------------------------------------+ +------------------------------------------------+
| | | |
+------+ |R1: Frontend/Open R2: Directory/Meta R3: Data | +------+ |R1: Frontend/Open R2: Directory/Meta R3: Data |
| | "iget" base | +-----+ +-----+ +-----+ | | | "iget" base | +-----+ +-----+ +-----+ |
| | resource 1 | | | | | | | | | | resource 1 | | | | | | | |
| |-------------|---->| | | | | | | | |-------------|---->| | | | | | |
| | incremental | | | | |-------->| | | | | incremental | | | | |-------->| | |
skipping to change at line 1927 skipping to change at line 1752
| | incremental | | | | | | | | | | incremental | | | | | | | |
| | transfer | +-----+ | | ------->| | | | | transfer | +-----+ | | ------->| | |
| | resource | | | | | | | | resource | | | | | |
| |<------------|-----------------------| | | | | | |<------------|-----------------------| | | | |
+------+ | +-----+ +-----+ | +------+ | +-----+ +-----+ |
| | | |
+------------------------------------------------+ +------------------------------------------------+
]]></artwork> ]]></artwork>
</figure> </figure>
<t>Design Point: Component Resource Location</t> <t>Design Point: Component Resource Location</t>
<ul spacing="normal"> <dl spacing="normal">
<li>Design 1 (Single): all the three resource types at the same, single <dt>Design 1 (Single):</dt><dd>all the three resource types at the same
server (accessed via single server (accessed via
relative reference)</li> relative reference).</dd>
<li>Design 2 (Flexible): all three resource types can be at their own se <dt>Design 2 (Flexible):</dt><dd>all three resource types can be at thei
rver (accessed via r own server (accessed via
absolute reference)</li> absolute reference).</dd>
<li>Design 3 (Dir + Data): R2 and R3 must remain together, though R1 mig <dt>Design 3 (Dir + Data):</dt><dd>R2 and R3 must remain together, thoug
ht not be h R1 might not be
on the same server</li> on the same server.</dd>
</ul> </dl>
<t>This document supports Design 1 and Design 3. For Design 1, the TIPS se <t>This document supports Designs 1 and 3. For Design 1, the ALTO server
rvice
simply needs to always use the same host for the TIPS views. For Design 3, the simply needs to always use the same host for the TIPS views. For Design 3, the
TIPS service can set tips-view-host to a different server. Note that the ALTO server can set tips-view-host to a different server. Note that the
deployment flexibility is at the logical level, as these services deployment flexibility is at the logical level, as these services
can be distinguished by different paths and potentially be routed to different can be distinguished by different paths and potentially be routed to different
physical servers by layer-7 load balancing. See <xref target="load-balancing"/> physical servers by Layer 7 load balancing. See <xref target="load-balancing"/>
for a for a
discussion on load balancing considerations. Future documents may extend the discussion on load balancing considerations. Future documents could extend the
protocol to support Design 2.</t> protocol to support Design 2.</t>
</section> </section>
<section anchor="sec-bcp-http"> <section anchor="sec-bcp-http">
<name>Conformance to "Building Protocols with HTTP" Best Current Practices
</name> <name>Conformance with "Building Protocols with HTTP" (RFC 9205) Best Curr
ent Practices</name>
<t>This specification adheres fully to <xref target="RFC9205"/> as further elaborated below:</t> <t>This specification adheres fully to <xref target="RFC9205"/> as further elaborated below:</t>
<ul spacing="normal"> <ul spacing="normal">
<li>TIPS does not "redefine, refine, or overlay the semantics of
<li><t>TIPS does not (as described in <xref section="3.1" sectionFormat=
"of" target="RFC9205"/>):</t><blockquote>...redefine, refine, or overlay the sem
antics of
generic protocol elements such as methods, status codes, or generic protocol elements such as methods, status codes, or
existing header fields" and instead focuses on "protocol elements existing header fields.
that are specific to <tt>[the TIPS]</tt> application -- namely, <tt>[its]</tt> H
TTP </blockquote>
resources" (<xref section="3.1" sectionFormat="of" target="RFC9205"/>).</li> <t>and instead focuses on</t>
<blockquote>...protocol elements
that are specific to [the TIPS] application -- namely, [its] HTTP
resources.</blockquote></li>
<li>There are no statically defined URI components (<xref section="3.2" sectionFormat="of" target="RFC9205"/>).</li> <li>There are no statically defined URI components (<xref section="3.2" sectionFormat="of" target="RFC9205"/>).</li>
<li>No minimum version of HTTP is specified by TIPS which is <li>No minimum version of HTTP is specified by TIPS, which is
recommended (<xref section="4.1" sectionFormat="of" target="RFC9205"/>).</li> recommended (in <xref section="4.1" sectionFormat="of" target="RFC9205"/>).</li>
<li>The TIPS design follows the advice that "When specifying examples of <li>The TIPS design follows the advice (in <xref
protocol interactions, applications should document both the section="4.1" sectionFormat="of" target="RFC9205"/>) that:</li></ul>
request and response messages with complete header sections, <blockquote>When specifying examples of protocol interactions,
preferably in HTTP/1.1 format" (<xref section="4.1" sectionFormat="of" target="R applications should document both the request and response messages
FC9205"/>).</li> with complete header sections, preferably in HTTP/1.1 format...</blockquo
<li>TIPS uses URI templates which is recommended (<xref section="4.2" se te>
ctionFormat="of" target="RFC9205"/>).</li> <ul spacing="normal">
<li>TIPS follows the pattern that "a client will begin interacting <li>TIPS uses URI templates, which is recommended (in <xref section="4.2
with a given application server by requesting an initial document " sectionFormat="of" target="RFC9205"/>).</li>
that contains information about that particular deployment, <li>TIPS follows the pattern (in <xref section="4.4.1" sectionFormat="of
potentially including links to other relevant resources. Doing so " target="RFC9205"/>) that:</li></ul>
ensures that the deployment is as flexible as possible <blockquote>Generally, a client will begin interacting with a given
(potentially spanning multiple servers), allows evolution, and application server by requesting an initial document that contains
also allows the application to tailor the "discovery document" to the client" information about that particular deployment, potentially including
(<xref section="4.4.1" sectionFormat="of" target="RFC9205"/>).</li> 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>
<ul spacing="normal">
<li>TIPS uses existing HTTP schemes (<xref section="4.4.2" sectionFormat ="of" target="RFC9205"/>).</li> <li>TIPS uses existing HTTP schemes (<xref section="4.4.2" sectionFormat ="of" target="RFC9205"/>).</li>
<li>TIPS defines its errors "to use the most applicable status code" <li>TIPS defines its errors "to use the most applicable status code"
(<xref section="4.6" sectionFormat="of" target="RFC9205"/>).</li> (<xref section="4.6" sectionFormat="of" target="RFC9205"/>).</li>
<li>TIPS does not "make assumptions about the relationship between <li>TIPS does not (as in <xref section="4.11" sectionFormat="of"
separate requests on a single transport connection; doing so target="RFC9205"/>):</li></ul>
breaks many of the assumptions of HTTP as a stateless protocol and <blockquote>...make assumptions about the relationship between separate
will cause problems in interoperability, security, operability, requests on a single transport connection; doing so breaks many of the
and evolution" (<xref section="4.11" sectionFormat="of" target="RFC9205"/>). Th assumptions of HTTP as a stateless protocol and will cause problems in
e only relationship interoperability, security, operability, and
between requests is that a client must first discover where a TIPS view of evolution.</blockquote>
a resource will be served, which is consistent with the URI discovery in <t indent="3">The only relationship between requests is that a
<xref section="4.4.1" sectionFormat="of" target="RFC9205"/>.</li> client has to first discover where a TIPS view of a resource will be
</ul> served, which is consistent with the URI discovery in <xref
section="4.4.1" sectionFormat="of" target="RFC9205"/>.</t>
</section> </section>
<section anchor="push"> <section anchor="push">
<name>Push-mode TIPS using HTTP Server Push</name> <name>Push-Mode TIPS Using HTTP Server Push</name>
<t>TIPS allows ALTO clients to subscribe to incremental updates of an ALTO <t>TIPS allows ALTO clients to subscribe to incremental updates of an ALTO
resource, and the specification in this document is based on the current best resource, and the specification in this document is based on the current best
practice of building such a service using native HTTP. Earlier versions of this 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 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> taking advantage of the server push feature in HTTP/2 and HTTP/3).</t>
<t>In the ideal case, push-mode TIPS can potentially improve performance ( e.g., <t>In the ideal case, push-mode TIPS can potentially improve performance ( e.g.,
latency) in more dynamic environments and use cases, with wait-free message latency) in more dynamic environments and use cases with wait-free message
delivery. Using native server push also results in minimal changes to the 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 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 increased protocol complexity, push-mode TIPS remains a potential direction of
protocol improvement.</t> protocol improvement.</t>
</section> </section>
<section anchor="persistent-http-connections"> <section anchor="persistent-http-connections">
<name>Persistent HTTP Connections</name> <name>Persistent HTTP Connections</name>
<t>Previous versions of this document use persistent HTTP connections to d <t>Previous draft versions of this document use persistent HTTP connection
etect the s to detect the
liveness of clients. This design, however, does not conform well with the best liveness of clients. However, this design does not conform well with the best
current practice of HTTP. For example, if an ALTO client is accessing a TIPS 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 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 ALTO client and the ALTO server, but between the ALTO client and the proxy and
between the proxy and the ALTO server. Thus, using persistent connections may between the proxy and the ALTO server. Thus, using persistent connections might
not correctly detect the right liveness state.</t> not correctly detect the right liveness state.</t>
</section> </section>
<section numbered="false" anchor="acknowledgments"> <section numbered="false" anchor="acknowledgments">
<name>Acknowledgments</name> <name>Acknowledgments</name>
<t>The authors of this document would like to thank Mark Nottingham and Sp <t>The authors of this document would like to thank <contact
encer fullname="Mark Nottingham"/> and <contact fullname="Spencer Dawkins"/>
Dawkins for providing invaluable reviews of earlier versions of this document, for providing invaluable reviews of earlier draft versions of this documen
Adrian Farrel, Qin Wu, and Jordi Ros Giralt for their continuous feedback, Russ t;
White, Donald Eastlake, Martin Thomson, Bernard Adoba, Spencer Dawkins, Linda <contact fullname="Adrian Farrel"/>, <contact fullname="Qin Wu"/>, and
Dunbar and Sheng Jiang for the directorate reviews, Martin Duke for the Area <contact fullname="Jordi Ros Giralt"/> for their continuous feedback;
Director review, Francesca Palombini, Wesley Eddy, Roman Danyliw, Murray <contact fullname="Russ White"/>, <contact fullname="Donald Eastlake 3rd"/>,
Kucherawy and Zaheduzzaman Sarker for the telechat and IESG reviews, and Mohamed <contact fullname="Martin Thomson"/>, <contact fullname="Bernard
Boucadair for shepherding the document.</t> Adoba"/>, <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>
</back> </back>
<!-- ##markdown-source:
H4sIAAAAAAAAA+1963rbyLHgfzwFlv4x0jFJSZSvmtgbjWVPdOLbkeTMN8nM
NwZJiMSYBBgAlMzI3lfZfZbdF9u6dleDoCR7kpN8u0f5MpYA9K26urru1ev1
onExypN5ehCPy+S87mVpfd5LZnXRy9PLXl0mebUoyro3S+q0qqM6q2fwbeds
msaHL8/exGf6RXycnxflPKmzIo/fLoezbMS/n6blRTZKO1EyHJbpBTTmhsdv
TzsRfJNOinJ1EFf1OBrDXwfx1dHh2fPPUZQtyoO4LpdVPdjdfbw7iJIyTQ7M
iIfwd3RZlB8mZbFcHNCEoqiqk3z8SzIrcuhrlVbRIjuIYui/zEY1P4njUTGf
p3ld6d9ZPsv0+zhOx1md5ZODOC/gr7oY6Qv4tZgvEt8PPBini3p6EO9jL4sy
L+rsPEvH0raCeZbpuRunWs3tn43equXQPYHmUbKsp0WJs+/B/3GW0PKP/fj7
pKC/eeP+mGTuCawyTaF153XRH9yLTwvoAXZgRDux141/zKbLJI9PimTcoQaj
rAbgP5um+WS85CfFGDp9sLcLP/JgmdclfZXlCT0qSgDOaTaizt7l2UVaVtAR
vUvnSTY7iD8k2SQpfl+Nlv10vOyP8ihcxkk/Ph1Ni7o2KzkpZrB39rmu53ic
9E6mMLOqdwpI+X/+ZxoPzPyPknIO+z6u7QruDR7fDxfwfQoImq/8Eo7SZV2N
AJfP0ln6oZjbBfBk+jyZ39f8QX+cNtbxYx+X8mOST8xC8M/4BOCTlGP/Thdz
fy9+WxbVArYlPqVnZimv08v4D8lFmpulPDsL1/Hu9NCv4cdklm7Yg1W5+v2o
6q/gC9yExsxf9mH9s0uYZWqm/jJZlmkevvnqie8+uD/Y/bq5z2geAG+ex+83
L+KP6WyWlsESRlPYO/vin7MCmkb/A03DLCBnOnmR4sk+efFssLf3WH59OHh0
X359NLivTx/tPbynvz56rB883tsb+F/3/a/67f7jRw/06f4AmkWZ0mg39r29
getksEtdHx++Puy9AhqY9M5WC/oQCB0Tfnoc4+OKHyflBOE6retFdbCzc3l5
2c+SPOkDcHaSqsomOdHZnTn1V2ND+3v/47Sez6grJv6D3cF+b/dBFPV6vTgZ
wr4BNYwid9/A7iERnsVbMOMYwbUdz1KAfjJJq/gPZ2dvd/b6ezGSkayKgV7A
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
171lmT3dWU52fvfrU/j/3b2n751n7yqtmWmTTMmOREyLGSc9jRQJlwCbmR1q
iMBPbd67LQwMiyUwDE1nTrJ6dfgjQANDSiwSJpZ15o1a5shPEM2tVhUuhlLl
YHqjZRq5JGUAUxIrgNlzQYscnisciPH3qHjkcdd5H8uSosuM/Ns5xD0ty6Kk
9OnxPb5A+SBUPimszyQH7fi28rkt0chsQj3wcKC3b5AiFeWJruePJH0Kh4Tj
JJHvMb4AtBYah2WoSGPu7CoozpQ+wpVQzKPYN3X+leydkj36eJrgOcKAiyKX
qCrmre2aOI7pYy1bjtsDsgywbstszFe5nncSu8pihruPuRiqpnJeXDtu+mFy
2HzwJ4wHvKUSob/2ICJX3jcg6SD+EDHccYkNzI5x42cc0kOPtbH/wavbyfJ7
rSP/SfqSxhtdu+zP0/hTv2f/95S0Jp/ixjHu2gdCSp+2rFka32ps/C4Y/FNj
zV/0wwD7/vlZvGOmiuYbpkEZ0qCn1zW+1aTbIEgjm2ADNoGzSfumny8B2DoE
/5EAU6L9jwHYGuZ8ybR/U+P1rdKr7YbG/9ytui0Zam381T9f0JgIF9GgZ3Tt
wZRDfWrAhdygWnVOhl5UOuXUNngNCU1/C/2IxvUayUtYas7z4EjoTL/j167G
A6WldQya8uiVsvbEM7U5MHC62mSEWZEk0FIYo7aoqECBQUqFyDpdkdm+c5GV
9TKZoc8OZulgrmQrGf+ajChv5wzYp+3uepQaMU8tohIuQcQMCRysMBWfuhoS
BDJNkhqQf2CpAh7T5VducoGsRmuMu5ZWU51jmFlt7gRx31llOjBsz9Q6NpnO
eio4rdvmm8Qtjnd2WDxjz40i8MRETP70S7yc4C/wYag0orf0wa77nf4kyzI1
oNhF/NPpyBsf7psHP+GD+6ZbaNh8PZCOsU8gnvigNXOT72LQ7GI/eL3fnNG9
tRnJkM6pwkUGog2OJnGfJtFvG369O30Q/hXLgweR/Nrv95sWGNnXG6hF89Ab
a4xP38zBmaQbRV8m6RgrdqQ5Z3yA87VADTdL5FLOAVnnyBgWwqwVDnnbTRVx
QvI2M32iXIyCo9VMQs4CLk0JhFk3Iz2kdjwjt2n0XuhVR6aLb7JvSAVMv//6
TbspI0P7AkIed6JNgmPuiT6JjpameoOrC5S7LLdNqfD4qGok2HPiGkgCgSWm
oZhzUqK6h11nEECTX11Ee7sPt8mCpfukOl0kfwpGki1YcMcBicCg+xNafLqs
FaBsxtBv1BKt2FQpzZJKHM6s9k1tIoHDXySQoxlY8FFrp2BqGVC1E3fjve0b
dks+fep+w0aye63p8EKCnZA/Iebtymcro71d0Rt19uI84zhZyqSCjOQ8rafF
2CtHbSSUu6GP3BHcOj452o4P87xY5hKAfXUnK8ef+S6V5zq11vIFAtrWd+6s
RzTQmvs4291Mrs2Or7SF+VltTu8OJ2VFQtKJEs0nVLELt6/yxUwGdeOyopCy
7dbpVUzCv6hjKuPsUJFJ3Ou7v4Lk3OGRn9m041d3YMaatjNISM5OvzAXTTVO
LAen9eET5zKSROoV/ICdgm1Bh/XM0Y1xODucd4bORcVLYEDw4Ph2zgaP9dMr
5TgNorI9ncBMtdQsDeix4bxnqqR9y118jpvDfRvZoXoYXOGGcwh6fIQ33GmN
oROup2sm822kVxadRABI87aapWhaM04Ddk54SdGxp02ionPXrQ3Dt9FyJocC
qanaC/U0U29taUvXEl3zFnauH1F9xqWKSIpV/bATpqWJz/vcy8ZeY3WRzJap
OnRLVkqs4OGOBll5G7emTBQocLpIykRc+lHVmnBgCx/2ILOb8otkz1b05Gxe
dOPTKQfaHhwmSo/Wo/RofJzIRhx8go+DLzjp1vX9dK/vQbRYekSGBMdkLZ98
n9CUMmO6chl1QFc4GTAlCtkcOLO+05bwBSKITezpAvF5AMpxGaqYLzlnJ9lw
TKI5nzveyQXYC2MCp/bi4AO43IFJ7pKvSwVMGNyAo0oyA4g8oV/yGuYFqhUd
pySOyYhqU7okbQsstYP8BTqtMJyxDwkWQS0vPdvux+Ry0EWBj42lJukEXyk1
6/cBhMtZ7TE+DBNBuzWJs5SDRne2UcPCLbKtlz6SOjgiVPeFaymu7RViQUoA
JwcBTiSCr9f2IDs3uQAl8xmZ+JgiY3NThESvJyAlfSIrZuS1nLK+X3ErgNM6
Rsl0w9TZqK8ZXSWFG4pHvKku6wpfZe8wuQ5dXXzLxknNVTtSd4SxIEJZJitv
hzOkhxAXd3J1bdAVgZ9Zey9lWiqqUYSS3g3dkNCIQMOvKDV06jJrGG7im+ra
xFsVGWGxI82d5bXzJh0Y+mzAb8CuWDM+p9A0CcyjMI2mqxeHEWmV1EgTxyyx
QYh9w8LMZe4frSJ23oLTP80WyPCJT1em98w3uinYs6yg8j2d7Ik9T2oJwd/c
OWYXi7e47bb5fldcPhT5gv5B2FxSjBID6mQXGa7LFA8ZQGGvYe9yc/RuF5aX
1UJdGhiX1ZH0T95H3tcmbMIsuougs+ETYq7mDiNZJ1tcGPlrrb3hzD8gIaQo
ImDScAs04V5l7Y5LE5uxAaErqeIh6EPUcKgNPdUSuhTxCWdO3opiXCKETRKb
LhIYywup2pk7J0o1pM9iKKEnVu9F0WV7nrq7MKSEKsZEMAJyF3z9j7vOmdGa
g0ivYnxEEIccCGbZh5QTOg/TiO7YRmruQAJvXSl1yaToMFcNQhRRAZSxNoSD
6QO+8tgn8d9r8Mpd+CP92ENh5rNyQdiYk9YFp9arNdsq6Wktm64rxsfU2jPO
nfmqJ6iKHG3nwPG0HRAI4c+OVhtGEaIv0+8DV7UjzbBVV9sYGeggXpdAfBNm
aqgZl4CkmZSc+QbPx5fOBttAkx3Txa2nJW0NM0cj4mk4iP/SBNHP7otAxjsw
0kCHVoDj9bBKNncDwrhdYOdn+fxzEwrTYkH1r78WBNr+X3D9bmobF8/VUXvn
kruw91twQTvZ4U5/IzxQPb+oq+ta8ID/yXjUjRug7TbaszIL6xVgB+dwdaWt
0Gdi1oNpYrPqSyAudHCHG26Acw0yyg75O/S4+uDtYCt9UwsU7ObVBgAba1MT
1t3Guyahab4PjmDz5UYUle9us7E3SM322zYifb2wecNiD24jzm4Cxk2NXdvP
Bg3lmpJt74nXBfRVl8tb4SLprr4CIQFsl9cj5TVaslthJ37+X1j5r46VtwbW
7dG7FW215t/X0E5C8X8S6dxw4P4BSLPhYH8d1J3ylLnla1Wnz30lR1Xla/Wj
BhNNYZVvb2KiUfXqnRlZyqZrdjKtQSyhmhm2irkvpoLVqH2l3Ug1JKY6p+YN
p3wu61VVRGlSESpH9gyyoaHldDXrAcj4UgW43/Bv2IANXkbOPRzCzEqkFsmq
yCuOpJaMR4lraa43/7xyhVMxUStpQ6TKSuJ1FpQzIcyclBhn38ARAFV0IOBp
YiKRJilmwiXJYIlRkshqLgU1ImrqAi6ILFK1WHdZwS0N3BAtegHKBeI93VVN
4LQfhR/BBoWk5SJFfw5TeapFVYH67JqzOnP/zqV6m4XTN4s0p7JtuMyrOy4F
9Jp3sXPTdGJ3GJ7SoiaZZFhiyC0E3SxF+E0Y39mbcViMjQ7Oa6U3GKws2RLl
EvVgXP5NOEBgK4J1SgJZYylqGoqM4Sa2GsFv9YO/YPds0KFY0W9/dm/ecF/0
k+WLZS3v2HYEw3vrDuVNE2jfaOGBlkhdIgclH9NHyhm0fJmpklXnLFRotpYB
Iy2iqEOzFv0Z+gSRvvvqinQP2302FglOrOl0MSTOakPYgmsTx6QS1MXGWFdp
yGk97a0SeJ9rIchYD4IUfDEaVozbFXtWQ5vLYULfPz+jkCu/fqmlbRVIW2KX
ucD8RtuUJt1oVJtJjoLyGGqsksIRsSEEGgpElVw4kdu4mTDK2L7YVQC6wK66
XjWrsDj8UZSyaZCHyeXhmVByJMw9FscGiN9UG0fsx0HsIAygcIbesBeyTYyS
GSZc4rDb2IYtOCcH9hcR2uYCPQgcHNEAI4Uu/3aDNyASNm/DpVsiEmkFCRKZ
VzP30TYKR7QNZRhfkDoxwmiYiYCMqjJVfMK7apgKNojWojtE35k9CgmUC8KI
0RQDtC2tKem4gsfNKf2IAWNVQLfZM94T7mrhPRP5FY3H8Xd6mzkDSCuhPByP
meRo1IDxQTGuCNfd2ZupK3rNhD+Bv4nSWJwA+n6eSpSN/Uzcxb8VwtqYrtjk
m8My20sB9L5PFQnJk6bZb2MK7f367GyyGhcB9O2mL8SFRt9TmQXMwHWSjkwP
eIowLEhn07KA284o/Wsv2zgbfPurDmLn0npRVdf7IjS2wrkibLiwgp2nU2gD
3hxD5LgK9mVz9l86zHymCKHVo5ONom40sp0dEKycb0jM7nqAxCB+dQxuTdEO
0wkeoVdnpM0aXz6J6R8Qlg6AFwa69fP6h+QV+oScQ3UOQk4xlp+n4ZwKUCTs
ILfJwmFHTfy+UAeFnbqaVt7Iz7cPTqcbMwXFsqo4NpVUaNT6ONXKX/v9QX/Q
pX/2XWD7PtxtWvpp//GjBxTpFwotEvKjd4ROV9bDs3Z3D1tZKmse9p5hzjDO
1YoW5MSEhVXI95kqfVFBgoJdPMjClGQVxegC3tTE+I2wqjrjh8EI4Qg55eDh
6bPjY7QJYeglEFippKjx3lgHIZtk6J2KpcMcM0nhRLkru+6aqwuhXDvjAplw
miAQ8G1zZQvAGl4mND/gnIGNh7mJ6wW7Fb6MqXi73io0bXFSljF9YHlnWc64
MVwvcA9i39vs7+Fj1pqMEwkc6r7YlrzVpemQa9N/4wXOoKleLMCHZ76ysAg2
yl/AiNiZuMdKuroGWNTjplG7Ew2dlNRECiyR38G7HMuGViQBvaNyPfGxZrYs
4613746PuozD9/YGA4yBJaEEuLGpEBGtRaeI6uVJLhObUnVqvkHJjgabw+Zi
2Dbaknzki3OwxbvLtT5xbY0y4djPko1x0Lx2fi0aI29Lk5jZYGck31ARRS7g
pqhy3HC17Do9wKgoPmS8TQH7d/yWDvl4DPtSqcUTQctuKTj2eMn3uiW9ZH/F
k+I1DfMCuKvUs7nWw0BkflqWT/eYVF5Q57JfSBYk7QqCxvDMjYhdU1mrEYFg
Uv4qk5ZVxUyrPrlcITpJe+3IjU9XzzMnPebtfAGfqjPv6xy+FrqzHg5sCxr6
Kk22kFJrFRknTJAz8MYiSYRCgm++WKQLZQVUJudokXOuiTM2c1LeY7tpjCdx
D7Hai/xGcrLOOtgb0R03Yux8yWW1kvvFZ+zROVOMUMvANw7KIwrpcgPr4eYg
5baiyjipwEc7PDIwyiR1OUiwOzlU16ymj7VwTfZa9qXBapreCUMIfEgBG94o
iRXIVPiSkn7L+VJSJFVYbNrLeq2BAy64WRaY+LQ7RU6qSa5khlrhlKme9ifd
y12OE6uNVOKXrB4ruqNY7TMD2JVORHJ5G2Rvqq/ZGU8l1janH7+ppdRUI1FE
MGBjs4iPgqG8043eZ+yjuuKYalFHBNkxBMcx74DqtKLOvd3d+LtkrFq1TpDx
nWf+LT0gsu7T8RLTHIkrOD3UuA1qyYHdTq4TlsCydZF3ILnfHzTUEyB2/wFJ
SNcm52/pONIcxTqATwGRfuwNk7HqEl1wFPG8rqZyY/X08hlzgL2XaT6ppwfx
3v5e8Bwdnw/iNYGSJkYSJTPgxsQAQnLSObB2BLJtj9E2Enee/3L8+k+HL4+P
fnlx/Pzl0S/w+7vngckHPiKCjYYGoydqfkN8An4TWrZ27jQNEJ99pFEIpesF
JgT/cwK/iTHy2hGZI+vweS5cPFsDqViW8r6W8lHEl5EkqeU30pVhjzlVFmVt
OjacuU48zGeThHDifiTvts844IkQP5wDl5FMvIDz/vkvr45PT49ff887895d
c8H80A2P1CEcwtj1ApKdg6k+GpxHvKFcQcuV0xOSCGlX27Ig9nCVROWlsjBr
VTRkWEfXAghcv/wWxHxPpFPXqgBs2TBxJSbXNRLtio0LccrIyKNxS1e6VtNB
AKKv1YdZPRgT/i9ShbXowYyqkuVe1oW5vQw6xpCUrCIpiRIH0iK7YkUyJFuv
JRRUGuQ1VMdekountELRZL17Xj2zURQU6ygvCmQvliXeTPOiTFsccNdsKi2l
lcleMqKM73A1u0xL7MipF1SLFaVFUefpaod2+97gcbx1VhRoYVsp4a62D1jn
i935sDEjEqBSyJuFMNddOtaCps5nG0CIOVj6Te2yWwCPgbk6enW5Cq5fEqhp
d0/S3hm8pHRDnXiaJmOU4OG+vhGSyjXqBYx2W6dlVjU1kQhb1HgZ2h4knTnQ
Ar5q5dwpA2Xj3maUWyYyYHI5MjnVEecsxISZKJvUVHekqKqewzVfs3oMVzsl
e4sEpfhLVLKMJdKaPK3TcUMIFdseK4md7+kdVx7EPUJmkzwfslFWryQS26jm
Aw1GZRQP1E+ULOF3jEQQ3jUwDhEuAiKXqBGBy5me7nVEMVVVmHAw6kxTQHDE
yk7sEoEp8TainjFeaeViTw9oJAe/46N21xlKIZXkHDlQm4xAwJNno1qL4ML1
XSxC3oaslOSN4dgc5nmgb2BbGu4b9OqQfDBaeBqnJO9ey+9QHwDdosz+Rl8c
yNb9OPi4+PMP93dfnS2KP//wsRoOXlTj7x/98Tb8VMN62sqa3dsLea3gbjlo
hWwLA1RcryhWe7PxwEBUZauSS/yAvNCxpuM3OqNqSapBuAbX1WwmB1ikt2/I
wRYLOGqLDczrAJjXN7eG5WYoDu7fb4AxUHZf6/2DX+4MHu49GjzC/3vXnDXF
Reh106qWaDrbOK0DvMD8kfad6BTozYPueivVC3TisFP8AI0M0HC3u/78V+rQ
Jrj+HDV/a2OieaNuwCO5rW9GJCR++hWTsaOMakofBjQsir5LJfedBkmkvm+n
1QT0LVdhPyEthNNtCp2E78SS6WqpMepWDUuzL6jzqL/fv4+stZHlzqZBsREr
QbooSZwopbUIEV84w2UVFfOs1upg/hYwsQD/RfhuQ/ia8u9e/O714buzP7w5
Of7z8yN6+8MPP/QMosEcGWvcQYAbbzZ/0mmC1Mijfy0W8B76MM+S2QTgVE+h
5auj++ZFjiaRJ529h/vD+8kwuTeA/+0+TtNBMtpP7p2PHz5+eP54/NC0KBYJ
IDWMMNh/eH7+OBk+enB//+Hj5MHj8ePHj/f3HgzS8/v303ud6F8IMxpAVGbj
iWM2ul8AYKDLTzqhzyVDHYHeBnMA+W+BeD56sss/hgyPpJ8/n032X50d778+
ejF/dfQfu6//drwH/+6/+uH5/p/PXvz65/mr+6/OXmevBsdPglUyDXjSeZQ+
3n+YpA8ePxjt3d8bpPfOHz/ePU8GeyOYx/69r9v6f/5R+0dd149kRn34CZxI
gWqOhcBfcxFZRpsZ39bbpf0icmLJ1R31Fv7swkX5CphQLlWjuKNiaRqDtiH+
LDCWRGqnaI5pEjIgXHwQ93udzHtbMhEjT9XlRhw5MRBNLxnyEnPpdtU71I0m
Alf0PnQnpe0JhlEhAu1EyrAbYdhF8hWRhhtuWni81bh9AaztF9/22s1nHbG/
mM6teWh3b6JuN+DwBt/tVox++KBxxJLxOGQXaXf3Bvv4dO0EtmxP5zpXa0WV
2/pbv2JZOMgTyudGUaXDfkx5IIe7xDpoyCCdAe99uOGK6UFelRtY/ZwP2kH8
IU0XOPuLtGVL1raUgUxPrr3YFNj0OaZ+163g3/8O8kFLR00RQD+5UVbwH26S
GIIvWuSGlh7WpQf70boM0fLWShL29efGk/Bv+xcjbfSD6LXKRmlJMdQYe3rg
hkBUUVb7nn3aUVVRSanQW6Nqi6lLsmTcEolbEG4tdciXoNzfB1MsHjz80i0R
H38qXEvpjc5RJOrZ3IxwP1LCacnClrCdrJHL3lZKrkMhKSwhGjlLb7PYL9nK
g29tFiLTabTVtpOlMyxuc6y9WIFbEqWJmk5NZZxpidchkQy5z4blvFN8Rdww
M1SSB/nbnELMKvxVKCStqokocjH+pt5nkAbO2xmvWw0uwMw1dMxr88pzKpib
Mu0y8YZb+cCmKEN/t6fcyTUlPRrJ6XxBVZ/mMXQ48DUJWNCv16VtqZlgALW1
y6kM97DkOOZXMZEMQGVuCirmMpscvmLYm06T3iNMdndgGNakUk0N2k3mO1Q7
Tm2vHfI6dqTTj09J45wtewLTz58jTX4Rlqrta8ZUNh83beiu8O/We7+b78U2
KY5yVnXB7mzjKGkGcjBQkWioaTpIR2OjigjolLfdOMxjRQ/Ms+hKOXHqObLi
nIcVnKoudmezwLvKpj6XOSf3SV2qF+e45ZNCrtKaHTrIacr1jZTeOoo7Wwha
D4KsTDgYBR4tFmlSApZutHdIKQGlirRVmieEfB7MYnC9711WP8TaILEfFiIS
V4HQkEIOmdB8VkyykZKVA7UXtmzvgZrM9PCw8OESQXGZ5xlu/Hk4w6AzvKMJ
ufEyPYgXy9qYiNgZcJiMPsC08LwuU8kGI55ASagZK8klBU25atwyVX0pWgv7
c0mVHBKTI2i5XFDtd/bDJF9cjdeiw+NX5Jauz282Vd3e6PfV5j6sDz1JSorB
Cu8KtuLx/LFuwNZrQO8XIOiNtw+0KK73yZa2zkVAai+EUONUWZ6lCb8W+7rk
E5LTK0lLeRZ7u/HW90We8gT8jTwVR8K/xpqUiIuTUf44ua2UadWu7sdb73Kf
N86nWPSr8zDEKjWMcG5m3unIL0MzCq3fxOYOHSHVyk0vwRIH99nw+jwpZys/
FVyb2FMtguAJ6ekJAfwYF5fSze3ttwuJwNtynW3jrJpm3N9kxFUXBnNIr7Xi
Ig+kwuHVHXPlAAX3ta6VsdareSI+BU338pB5iYhd2eVSy3sS5ST3R7F2U4Wm
IhghtBMRk7LpPv7titDgdo5/Ckwp8bW6UWs3oVx214jhuAib0bhx/66BAC3T
v9lcZpfWqrC4vysKC0zbzC4uJqcbRT2vaQXp08/NxeN8b2c1Iv8TBId66nHy
99dAq15jPl0MhYF34jso9qEfptnMRC1IQuiE/TzX4t5iX6DDON9GYbScibxU
ua/r6v9wKXj4TG41l4g4Qm5B2BbKMD1ceclS7fTOcZgyI3gxtUxd9DN5dWc+
HZmbvcu151zZYiwNY5IdY1Urjelbz6Jm46Bz9hbxlwHmYsY3QEipHAyzTwnO
olF2iL3TG4VciAVJZkHqfHQHx9qlhnRRGjCu3peOW2SBqkB3fZ/ikdkWohIN
FxAkdzfDwYUUUDJKV9bLxlyakAhWBnvx78sjrv0cygBNJWMnB2B7oG+KwNaF
fX0QNgeuNAhqU/oTotuabFrlPdYGqFfge5T43rc4rr1vCoHvRfr0EeXqx0oi
r8/yrycNoC5yoIt5Z7tq9N4oQ99vlJ6tv8my4vglcVwJdUhuMc5r8z25igXL
Qp/FYapOgB4zVKgKqPTNIZ02hacota6P8sRM48b0bAo6bG8IAI2uT9DBSKGK
5FB71NhPWXTk4l5kSj4hKx4m9EunWoXYtEV3tdadZHn0Xt3v62Ty3nsIyneN
cJu2bKnp6ANzoKtIj7KvjRGXVGj5L47l7GqI588hCmJUNjliqrLBdaZ+uixV
GGhDE+5xbU4mHgZPDkdFc5lPaUTg29XdlymxW6jkfyWsyFNz6rM8m2OUW8El
dOFyIF8rzle6MVSLp+1ZTPG7wdSQI4lSwMgHENwjDCWABvVIY/WoCKeJo3CB
EuTfqlvKopTTv0U2jsWRwI0bzREr4kmc+bNCEt0CVRlOsaewg1a7/4oyW3jv
fKnUdr0oxiJOqzRmbJbAAKVkjmxYI/lmvtx8I7kEn4fGxzBRPUiYKCVMZKI+
LESUnDaqKwqhsKJKWBwm9sVhsM7g5Zp/Y2P0KZ+5ePfRo73dR7sRjxDUklwL
xYIRqZ4rK+NcTItDBwVK1AYUJd+3t1EetHnnhOJIQxB5Q6WxbymHrJkRbnTJ
+Dv4AzwYfLE/gHeKSyb4ieyY8UUEdmoEO8e5Vou4USYIY6Lh//vxoqAgxIQ9
6qsDX5LmnlamoX8eUN3jxiOhscHDEMENqWCqW3HxG+T3RFAlSicnrkkwOfZK
GYghogp9zkjXGDjyTKvzhiS0reKWMHyh0gc3mkY37G4TU1p3du/x/kY/yH+y
E+NGH0Y8zb/ZixENWm+c0ypu4FuvP30WOGtT8o6qF3pwq5ELKVJVzCnwbl7k
3hGWrumgm6Rq9eroRqyngoFJVWux0agB9dLGVD/qePiY8xC7rra/hfZCMo06
+NoeBus9GE8NTbdHSbHlhmh0sH9tB3TAMdEQRqVQZrKw9b2wNQsJcvgpYzcB
17sXN2DqygADBeGIH5aSL1HLX42WVRUN0V9UyqeEjZFyv8Sqr98lsyQfIaiu
7mAZ2N5QH3y286kvCy7QTSujerHuQ7zMNOm28k30Lem0C/kwjVjVn/jqLByD
EEb6Syy0T1jE5c7DrojR0q7aK9S9DKcYDikxE8loysmOVBvPNNFQkniWrJBx
LCN5l+XnZcI6DtRt0OtmXGyj9A7nQ4rWpUKKmveFE5ZDTtRQ8fNKSwLY3Ad6
366iIGECZfqwzkVh6enZCqV+s2kUu2QHcXvTbxiwbTlsDAsxaf/Q3l1tKgam
zlQ0Pc8uuRsNM5hP4eKcTA0IhDtVh5cKrys26iljAwQDhaK6LMZLqvbry0Zz
9O9HzqnklMuNIJFhyjaiZBwJJMZrUc3K97AOSixmqUSEXZZoCUKLTko8Fdu1
8nE04WoBrpC60CAUWs8btxueJcTpjI8iCUaowmZrFV2mQf9cLwSuiDqluAKu
7xEI8mSt4Dx+SOeJ36uLktQ9vPt4XeeTmV6/37qxWsNoCK979xoH3Qwd6OWp
FpLDpbFXNNEcn72N7/fqJVtjJS2/3bbwoihTjdkbc+EXclIRuNqdE1O9kL7w
HsEKG7hiBBnlqElKOOp1Sof2IH4DgmVVzJbKzmKxS9odZwdxDVmYxbGAm8Bs
Kwf8ErocFqLPC3PG5By0rXkPvcTS3FRUB/LG0kaRhtFAETtBNguB6ZR+QdZN
1cCZjCZ+KkzisBOPiYgG5TCrS3Te8WtsTKzrywFicy2dzsZtWxzBT49gDjcM
sLFLcf9oUBtNJ3OABWAorY07ojK8tz818b2lOyqZMExdtyQf6viEOJMlMPbA
8Jk4UC7kfd4GrWR2maxIykzKkgTI2n+m1QrXyDxfzUXJyVtE80n5JUxImE2S
4CDE5+vhGk2WhBmG+ruJB4eqkcIJsbTIjcKIC6O3X/vPKFDP16hzpVGopOR4
OWNmwMbzRZF+VYdJGiuTm6URKuhKrmSkwpeyHKEbr6eJiyQr2XFYOlZXInXz
xAIkW8+28biO3VwwXiUIfo+3Xm/3g0wookwnXzm4710kpTMnBWlIsCgNSfSa
mkWVfil7ZUinEXXKtX6wiq4vL3OwVpO19edur9e7e9O/0Hh9dTHWE93FgtRP
Pz16zP8+lr8f78m/Ayrg/JtGvuEHa5r+JL+7f2/X7PbtvgBKzuyGOCJDCVRA
CpN/B/Lvvvx77x8EpU+/tP98Cku+0oG5odyrmp7NKX2FBQ0p/lB1SNSR1hh2
kBANbkXVdJEjwHK6tmjnM30Bvwy2I65oaI4Wq8089qlKGNDOdvP60eNtDfqS
g6pfoh5gC3rfXz+3mzoHXN56/Xh3W5RWRUw14tZMXnQBYAzyWBOkIU3xlkJj
3OR8WTN2clABgebLjciHCVhQYC/wLJ+rV5KNr15mWEWJmZWKHHIoboHT2l2y
e1CbdXK4RN7WGPfECUd2de+A4dawqQFEuzEAAf+z16V9ov8OmLzzHUGTF1on
HYgYM0G3u7xozrZp4qvEl4gUi26qMCyBDEYO5zpon6ufHP13v4uzD6aFw9w0
s+YssCcuM458tfmcbh+TgMuGYyBKCLMTmFPdLUNSzmQJODOjAuhB2sHNigGy
ibh7Y4FZzuoqkjJ71dJVX9LxRLrkpaRjU43VoFSVnKecWYywJ1LXGS28rtH6
scFYVCCvy2WMnA2QVhHw0KMPs5VaD1yyJVIusErZc57Eh9F8gzRFlAwiauSJ
09xvG9gLyoSOKzmdJqUq9v9EYvfVnYqe9Rz7AlTsBbKUup5vgFMsMvapYCd3
8jxFfQrLMUhkFkExPz6JnFB8ZVMGu4xv6iUsadhhvlbN6sTPqFlscyFJ8+j6
Z5n1nFKpkLbLs0Cc+TCyNdToMy6bxmnQVJo8L7kOMvSF7ruSNXOO5juXqi4+
Rb2PV/7KRGi2mPQa26Bih0WdRvJLNVIgqIIUBXw3BFPXHIrIGGke+rY+fQ73
jRvgGCwZg+VDk8kb0VlLiwsGOT8Qm4ux0lSQJA8kcx6PCYrRRSG7zkoJzLvP
3QA2Jz6/M7VnFMQeOMtqb03k9WtjHCHUczXQnUMtWWMT53FL17z3hG5Y1WnB
hLBcz5P7ZjA5AUpmi2IQd6fjD9EMA23S+aJeUVdIMSX14JwsczWSjqyqlmSN
QiuOtbl9a5YaaAjylBXvjRqjMpU+cvkXgFgLkrAwpSXbYr2Cpv2EyMVOarY8
GpUgaJdZ4pIxKpgE9UeYysNlfDNJO32dSfEX5gtf63cirz1KZlK5Aeg88ODz
OQ7qND8r8ddroUpvcAlMlYqyHi1rW+ZYMxhjgH1FQYFkA3Uh8nDkFkgQWzVd
WwTHDOeX3d3bRpeKNcFPvSuQhNH9VuksWnqk6rtc8sV9h07fKpFcYoX7nHTy
KbxCHsexehkBJ7v7Id76ED+N9lAYOsV9cB3JBJKZpI69UCN9EDXh8zxGVDDU
qO2AGJKTLcuhGA1D+YbEkmBU78V51Lq6Gdw9etMBr4XQWOWjaVnkEjutyQei
4J43VNh7R3svLirrS7qnfHyZjWuZPKlvNAOMrzKqeIwpb9ZlddUuJJdAPqgA
KVAP9M98o14yHpycLJRDrfg0mYyEFphdThnE5xwuiqpmPQirJKnlX5eUQE0M
1s5nwWEacRzUh5Ql9mgk+yo2WSLELhNlEXtvPGqt6IImh0H7skQHZzV1SrGK
Nc0qdLO/GTowqeXIaI5HZgN1aeNC9WZU63eG5UvZdWPtU+Hlreoc6wnIPrLx
2KooNtQcrgtESrtZmmOZutDR1AvcadlMA11m13n2tXYh7KAclVoyIvmEqORV
GHQoDg9Bk8yocL2KnArQnGqy6ZDusWOWzURtieKWqxZxv5GM0eV8RY1TpOU5
ye115aFPaXR9Ge+GckyvdZ+FKZO7DB1bJjdMyJQYlSlFwC3Mgjl861mH0Tq5
J9+jMrtIRitHTTADQzjMvbWVs9mtOVYfE/lnSsK7ker9gkvLKS/Jhcfrk63A
oYnLH+8PYDg6mRdFNo7wBj97CRf1coYJqF1pCLTj4XlAQRsd0+1kgQWqOCN5
NU3H4mFoj6uzWOpDT0soliQwEvHzaLGspvp82wcPkQbb7jf/xga6pK6T0Qc4
YeV5MkojuD6BBRg2SpLAnq7tqnN4VyVgtRz2Ks3+LjZMYuXMssqs+lCpcTAj
bibFxN589SO7cxAfpTlcFL3ivHcqSzykOcKRONSxjDWQbQwV8VGjWVJVzI2s
98Ir5ezsSHMyTHlbdoNUbbHyLsgqYzI+rWE1T9BLplhWVhTEXICTaR25lJAU
4wD350V7Xrsu2UQ+TpNlFfhvWFZ7B9gHFAtnBexKjhfoLGbcdxyf5K93ftiu
DLggpJBLXm7o4YdqbHHRK/jSbdxWHL8WMWjZ/kjOnQhdpzUQqk5adgngkBAn
1Df3Y2ODBAoEG9wIivPGYTcrOrrXTi1SLtX5pnFOODOzIMTETW0NArOCdQkU
6yyL1KSNbMVE6wVsdQfDXzD6Zc7CKY/bce57wIgAyU9YkM+DyjMLVGCxO/SC
wgKnIr2jaxxdNiBgRIsC6xAIvWiWC3dSJ381S53BTPO9o4fBJYmnRYlxfymH
8mAIXZZfFLOLMAtCepHxeQY5CJUegBvHbzEWQnisblSiRy3BnuyFPm9zzWyg
YfFoDTAeKzocFmB9AYmZitxjTUevtw/Xpqdj6uVkJ0DDrjraxpIGiRDkgKcV
GbrhMcRdha1JiJy61uzFkEzKlLhF46tkxBQppE3p/6i3A5En4jfIyhTM7QLg
j3McgKfC1NpMjsTOAoMjlkgjLPPAmE1F1grp0dbqE8UBlXuwVKmhdBL7BnPJ
hk23tYjEsVYsjEDJs0m+HlOGqHyOt5tURo3nKVZSzKp5S5BJJOyfYYdL1sr5
UklsXgtw9+zZ264pOxj/x7vjZ5FLpk/5LQS5lBUKp0TWSlqtrySAlDaeprMF
VbxCjY+ZKU2HeXEFMhKidzmqiAu/kWuBF47kRCxYq5uIKxHgRVzagilMI4AE
xgLDDnfj5bVj4VH2wSAmewMWXhjVEZBU0rHaoanIIzEzeI5UzcoKBiRRs4A7
jjx3rIH+U8otC4ONgPIAR4Q4hgrvrPbexWE5hEgukNrhdekK1I9UaUFs6/Hh
68M1lpUeZk5pwLbcMp1kJCiGNkMbjeywib8tTZ0BtOVeXWHHPQqtJH/Bz59B
pPu3lsA1lxflgHPeGWYmCD34dnNz41J6TSd/pT6eSr0xli6ANYqfjzH7zEH8
dkYipQSakfa3d1SMlnN3mLWFXHBcowbYFzi06djx6GNpI7qRzQs2gadAntD1
G/OVYQEK0yaKTpfDOngZprCKTtR7w+dJxs9e7xxGkZMQW949l8DrBjuP7ze8
4hI9Y3ZNnvGC8Sh6tb5XBa4V++3YaHxJKIAa/8H9xxRQeNouN+F0TlM+5Bvk
LpcYCzk3u2t466Nxj8QHOR3rvQMw4MO3ytg7Nz9OKwcfBGjYNsihX6rcm6xS
zWyIDPYUZnjUcrF6JYrNBk4yqW+Fn0WYp4Bv47FkHMcaRvhhFOAWHvEXZTIh
bM186ZvW9UaRl68sOaHiJ78blk9JoXmUIkvEpUpnGYbnYZF52WP04qFVwYfS
J/z2KkFOhs/HVrXdePsC5W4n0vj3Z/bYeDpnYiKIJp3zmXMCsvMxdTks2Rrs
7k+nU0HXUjNyX+Y6Qt4HyDS9pXEwUqMx77ewV6JrS+dA4bRejpRLAY6dU0ef
c1LvJjgRdzlRYfUNSrXYNHUoKxhKsStL9sA+iNH48+Y1Hmx0ShHpDDNL6we8
g9TprYZ4RmWX9aoGPg9b0cnI0xoO+wRkZVbWniXVB+QLgP5t4WLr4gC4lMnv
s7Q+7xflBBVYb5EpqEQ4ZOJPq/3vNLWCqN5NZPq3kj4bRPAvSgD/n6SAf/3/
gAAq/bst+fsv6vdf1M9Qv16vRx6WyHEfxn8A4aP3kqRawKdZsaJNJo8itM6n
o944XVAZDUxl9gxF5QUX8rYFhlYV5q8QjwNRgpZpKqy49eIjE/XWyd42twQu
PWe9oYtH9rqtPn872LaxgJquaC1tJxbZISFP6g4SRqKLOOZHUddcwJxmyXKS
DGWo/W1SQALSwBLbv+xqzqdYovWpwBSRCfk+iuOmK4Cz/Xdj4xSwzQU52oIV
buEyiB5nX/SzyT3t0yavtU0/nyId/G74/GTvIH4hO7pDWWbjkwEmPpY923kF
ewTP9g84dR509Enn0Mkmad3hyoWfzALtEM0n7m/bkdutPV2a/W/c+sT9bToK
YEd/Pf26joItvmFGOt7T1o5qSTXY7OKLZ+Rg9Bs7+t0ajFp+ru2IFWQhCm6a
0a22fx2P1jva+NMKo8Fvm9E/BY+u72gdj9bPmja8FiHX8Wj95z8Fj9rp0YYZ
Xbdr1yzhC342dfQVNDtwEBY1NN/HNzgKn7KXJicqbVztHXLgJ2XuW/SuA67G
BQy4OICXhYo5vVg+3ou3TsnivH3g3BH5pvcFgejKN9ES3TDOKN5iWxPWQcwS
uiulMKS7sLfNiIN46wW68gzNmC3jafxeLUZAjKjfMF4ypEifDePtx1twXcV3
6YKCEU9Y23yyzz4gJTKZqNWckG4VeSAKWTvZE20y51mEYdTH0MeLSJZ0x0lL
grfKAxdH0nmw+ltfrVdzZIeglfcs5oiVeD0MMDBGMmNl+97n8K0gSpArD9XN
CuIU8GYCFEVP/9qaqaKxx7Vz2jmW6jKHFJINiW0pXXFHrZzVsYpkMzHmBTBn
yTLfcBX4d6CDErkXGUckzL1RLEVF7L04F9NVRQO6OKtVW7gNpngUobcR9vpZ
EhSJAZrk2LwZ8hqKcQBhznWlu82eL95I7t0oyHjFFb4U50kbjtFTWrUZvul8
h169ONJbaSnmA7SJdOLv0Fb5TOw0b7HsN5n6mYUfjhY9zNCNJQk4U78VoEFk
Qk/KShwcKP0AuiQMdtGpAFM6i+wEB3VYlEnD3ZQQxwl1nTLl3DzEgNO/hZgw
Es3TAWuC2VVSf1HLhjqApDOxrbnizVSBpuqqDZXSlZBTXBxzThAEi2SS5SKT
HXEtAbmEbGMjElthrZ21YTj/n5S2tiHU7/+ip+bn90EIMAhQKGqjCPT+L1ld
wWuqpRobxr9jI7v3XWg6A3WbnWq9A2te0NoQS2EHNLkRpghzgVxV2OGgrcPX
BWfFWc5tFi8yP2fWuX3IdSZFgmLfIpulxox0b+PUZeMZZW0d2GTsqy12KHk5
j7yiFHJsz9PNd7tB6W2SkThYW7WJ2pwc3eS8QUHEqVjcJRWT0zzQ+XAymiCI
+pN0eXy8BJIhes/mPqcE6wg6twEEZ9SDwai+dwpjkTFTQbsZrq07yEKxAaYE
mQo0Tbk6Stg+yXIPOZYUpXg2J1OzWCvX4dB5HUhiNUAYMpYrfN15cNXBrT1P
JemkNqbl2NN8hqohyi4OV0Lp4GBxpSq499OLJPd1K9HR/aggtx+q5pzm1bLU
vMIIC3OzcOacc+EM8Hf1aMCWW6F7apJTjS3neCP3AIZhMKDTC4n9Jf8ECvpE
C3ticNoAErWqSTaTW7WjLlkrB0FXQ5k3i9K8BFt/Iy45osauI5j3O8w0gX1s
RiAmIBVlIuNMTnFH/DtIc4d3uawIoWfI6vpcH2wexdF8SgRA2Yo0MMGFQjN3
B8+m2UI9ljmwFxXeNpzVhqT7qpLenP8tDOiRY1imyYeKvWjEdcROQMkeJ991
gc2O3Mg20zFiRwp4BbCYk0te1lBJd53TZDe2jzWy3uFPk2I0t5kJpwQCeMDQ
gsSb28EjUxeXIJyJk2kozklIbFh7kmblGWSt7UBYP+56ymQChJz1GImYR2j2
T74Oc4lTebusplxpVzDYYe4p0xz8gOohVNNGPYRAvS5uPGQaJ+/59kpB6uVi
CvCo81fA1pD/umW4s0bMtLq1YKYi4MeYZ8IRhspqiZOwssW8MnGSxwX2KRcy
avGdwz0hI1ypbtRpgozIBRLcSaKJPb2XFqEvORxS1HMASk2vMFxFdfKB6PUY
SWZiU9Bxkk2E8HmaEM+pNxmLLvTrPqmy2TtjnKJrFHl2hMPFTc9+kDBKdGAB
lHesqMQ24S2Xj1bbOBi6isXjFfBEwDil+UVWFjlzcORIiknJMG2rZJO7TLK6
d44ynNzTETrDIr7143cWwHZpRI85spxOqEv+R7pzTXngHJX0nPdjToBLdbHH
BaXIHi+dd8UM3VSL82Ak5cWRQviKKY5w+NCSNeixbFhRUJB6oLG6mhkxz/IL
XNUJI0YjhpxEOja+xE+FCv30grxEmygW2GRwj4I+TNYU7xNEQEJg50gNfVyT
xBIyM9dFhx4Oi3AkfsTCCOWo9NSCDo6HuT9AfDbWkuyG/meSKJ+dzpiERUzC
OIUKrwMg9XGlgczOtUtqnTsHPdzXTBKtmEj9yI6nVMLY+NhR34b2tzWgKRBC
2C/d07XgB0nNwdTC7IvdEpAGIwas5ofxOxSXpEpw+0T3FyHK4ehDXlzO0vGE
RZerAzbmpeMnnXM4Iy5HdsIGp3VU4drgs+yDHIIk/xC/SsoPKMQjxzEVN7rT
BWpGyugoufyQiQ89m1o4vxPmBpV4LamvDVRsAy10o3ejw3GZwc6+SGDVIPv/
BxzlH5ZMwP8ds2PFJ0UVf5+VyczpLbLSukGep+kYrVfd+ATzWf2ASVy6wDbm
CSzreVLVM+BFurikGpNQTYs55QX8DmObynF8OC6GSVdXF8vquvHLLB8n0dEy
HyYlrx/klkn87zDZiVOgqO2J2RZxv5aRjpYfXKBhfAhUI1Krh3zajV+USECr
URK/TWbFfAgkrBv/kFazdBU/H48ByU8KoLEwqXw1y6DBKzhZgCZ/hEsIeI5L
RrY/J5iS429/S/DTU9g5lHllXORyRsQzwIfHz0+/99PEJ68K2N10HH1XLEfJ
GPNrULrGabqA/sfq/O3dw/4v99pmRPMjAQA=
</rfc> </rfc>
 End of changes. 257 change blocks. 
1664 lines changed or deleted 964 lines changed or added

This html diff was produced by rfcdiff 1.48.