<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.25 (Ruby 2.7.0) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-giraltyellamraju-alto-bsg-requirements-03" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.1 -->
  <front>
    <title>Supporting Bottleneck Structure Graphs in ALTO: Use Cases and Requirements</title>
    <seriesInfo name="Internet-Draft" value="draft-giraltyellamraju-alto-bsg-requirements-03"/>
    <author initials="J." surname="Ros-Giralt" fullname="Jordi Ros-Giralt">
      <organization>Qualcomm</organization>
      <address>
        <email>jros@qti.qualcomm.com</email>
      </address>
    </author>
    <author initials="S." surname="Yellamraju" fullname="Sruthi Yellamraju">
      <organization>Qualcomm</organization>
      <address>
        <email>yellamra@qti.qualcomm.com</email>
      </address>
    </author>
    <author initials="Q." surname="Wu" fullname="Qin Wu">
      <organization>Huawei</organization>
      <address>
        <email>bill.wu@huawei.com</email>
      </address>
    </author>
    <author initials="L.M." surname="Contreras" fullname="Luis Miguel Contreras">
      <organization>Telefonica</organization>
      <address>
        <email>luismiguel.contrerasmurillo@telefonica.com</email>
      </address>
    </author>
    <author initials="R." surname="Yang" fullname="Richard Yang">
      <organization>Yale University</organization>
      <address>
        <email>yry@cs.yale.edu</email>
      </address>
    </author>
    <author initials="K." surname="Gao" fullname="Kai Gao">
      <organization>Sichuan University</organization>
      <address>
        <email>kaigao@scu.edu.cn</email>
      </address>
    </author>
    <date year="2022" month="September" day="23"/>
    <area>Application</area>
    <workgroup>ALTO</workgroup>
    <keyword>ALTO</keyword>
    <abstract>
      <t>This document proposes an extension to the base Application-Layer
Traffic Optimization (ALTO) protocol to support bottleneck structures
as an efficient representation of the state of a network.
Bottleneck structures are efficient computational graphs that allow
network operators and application service
providers to optimize application performance in a
variety of communication problems including routing, flow control,
flow scheduling, bandwidth
prediction, and network slicing, among others.  This document
introduces a new abstraction called Bottleneck Structure Graph (BSG)
and the necessary requirements to integrate it into the
ALTO standard.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://giralt.github.io/draft-ietf-alto-gradient-graph/draft-giraltyellamraju-alto-bsg-requirements.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-giraltyellamraju-alto-bsg-requirements/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        WG Working Group mailing list (<eref target="mailto: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/giralt/draft-ietf-alto-gradient-graph"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Bottleneck structures have been recently introduced in <xref target="G2-SIGCOMM"/> and
<xref target="G2-SIGMETRICS"/> as efficient computational graphs that embed information about
the topology, routing and flow information of a network. These
computational graphs allow network operators and application service
providers to compute network derivatives that can be used
to make traffic optimization decisions. For instance, using
the bottleneck structure of a network, a real-time communication (RTC)
application can efficiently infer the multi-hop end-to-end available
bandwidth, and use that information to tune the encoder's transmission
rate and optimize the user's Quality of Experience (QoE).
Bottleneck structures can be used by the application to address a wide
variety of communication optimization problems, including routing,
flow control, flow scheduling, bandwidth prediction, and network slicing,
among others.</t>
      <t>This document introduces a new abstraction called Bottleneck Structure Graph
(BSG) and the necessary requirements to integrate it into the existing
ALTO services (Network Map, Cost Map, Entity Property Map and Endpoint
Cost Map) exposing the properties of the bottleneck structure
to help optimize application performance. Use cases are also introduced
to motivate the relevancy of bottleneck structures in the context of the
ALTO standard and support the description of the integration requirements.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
    </section>
    <section anchor="brief-introduction-to-bottleneck-structures">
      <name>Brief Introduction to Bottleneck Structures</name>
      <t><xref target="G2-SIGMETRICS"/> and <xref target="G2-SIGCOMM"/> introduce a new mathematical
framework to optimize network performance called the
Quantitative Theory of Bottleneck Structures (QTBS).
The core building block of QTBS is a computational graph called
<em>bottleneck structure</em>, which allows to qualify and quantify the
forces of interactions that flows and bottleneck links exert on
each other. QTBS builds the bottleneck structure by assuming that
flows in a network aim at maximizing throughput while ensuring
fairness. This general principle holds for all the relevant
congestion control algorithms used in IP networks
(e.g., TCP Cubic, BBR, QUIC, etc.).</t>
      <section anchor="bs_example">
        <name>Example of Bottleneck Structure</name>
        <t>Consider as an example the following network configuration:</t>
        <figure anchor="net">
          <name>Network configuration example.</name>
          <artwork><![CDATA[
                         f3 f6 f1
                          | | |
                          | | |
                       +--+-+-+---+
                       |  | | |   |
                       |  | | +---+---   l1
                       |  | |     |      c1=25
                       |  | |     |
                       +--+-+-----+
                          | |
                          | | +----- f2
                          | | |
                       +--+-+-+---+
                       |  | | |   |
                   ----+--+ | |   |      l2
                       |    | |   |      c2=50
                f4 ----+--+ | |   |
                       |    | |   |
                       +--+-+-+---+
                          | | |
                          | | +-----
                          | |
                       +--+-+-----+
                       |  | |     |
                   ----+--+ +-----+----  l3
                       |          |      c3=100
                   ----+----+     |
                       |    |     |
                       +----+-----+
                            |
                            |
                       +----+-----+
                       |    |     |      l4
                 f5 ---+----+     |      c4=75
                       |          |
                       |          |
                       +----------+
]]></artwork>
        </figure>
        <t>Each link li is represented by a squared box and has a capacity ci.
For instance, link l1 is represented by the top most squared box
and has a capacity of c1=25 units of bandwidth. In addition, each
flow is represented by a line that passes through the set of links it
traverses. For instance, flow f6 traverses links l1, l2 and l3.</t>
        <t>The bottleneck structure of this network corresponds to the following
digraph (see <xref target="G2-TREP"/> for details on how a bottleneck structure is
computed):</t>
        <figure anchor="fgg">
          <name>Bottleneck structure of the network in Figure 1.</name>
          <artwork><![CDATA[
   +------+  +------+               +------+
   |      |  |      |               |      |
   |  f1  <-->  l1  <--------------->  f6  |
   |      |  |      |  +------------+      |
   +------+  +--^---+  |            +---+--+
                |      |                |
                |      |                |
             +--v---+  |                |
             |      |  |                |
             |  f3  |  |                |
             |      |  |                |
             +--+---+  |                |
                |      |                |
                |      |                |
             +--v---+  |  +------+   +--v---+  +------+
             |      <--+  |      |   |      |  |      |
             |  l2  <---->|  f4  +--->  l3  |  |  l4  |
             |      |     |      |   |      |  |      |
             +--^---+     +------+   +--^---+  +---^--+
                |                       |          |
             +--v---+                   | +------+ |
             |      |                   | |      | |
             |  f2  |                   +->  f5  <-+
             |      |                     |      |
             +------+                     +------+
]]></artwork>
        </figure>
        <t>The bottleneck structure is interpreted as follows:</t>
        <ul spacing="normal">
          <li>Links and flows are represented by vertices in the graph.</li>
          <li>There is a directed edge from a link l to a flow f if and only if flow f is bottlenecked at link l.</li>
          <li>There is a directed edge from a flow f to a link l if and only if flow f traverses link l.</li>
        </ul>
        <t>For instance, in <xref target="fgg"/> we have that flow f3 is bottlenecked at link l1 (since there is a directed edge from
l1 to f3) and it traverses links l1 and l2 (since there is a directed edge from f3 to l1 and from f3
to l2). Note that when a flow is bottlenecked at a link, then the edge connecting them in the bottleneck
structure must necessarily be bidirectional. This is because a flow that is bottlenecked at a link,
must necessarily traverse that link too. Indeed, in <xref target="fgg"/> we can see that all the directed edges
from a link to a flow, are in fact bidirectional edges. This is important to ensure that
bottleneck structures correctly model how perturbations in a network propagate, as we explain in the
next section.</t>
      </section>
      <section anchor="propagation-properties">
        <name>Propagation Properties</name>
        <t>Under the assumption of max-min fairness <xref target="GALLAGER"/>, QTBS demonstrates the following two properties <xref target="G2-SIGMETRICS"/>:</t>
        <ul spacing="normal">
          <li>
            <strong>Property 1. Flow perturbation</strong>. An infinitesimal change in the transmission rate of a flow f will have an effect on the transmission rate
of a flow f' if and only if the bottleneck structure has a directed path from flow f to flow f'.</li>
          <li>
            <strong>Property 2. Link perturbation</strong>. An infinitesimal change in the capacity of a link l will have an effect on the transmission rate
of a flow f' if and only if the bottleneck structure has a directed path from link l to flow f.</li>
        </ul>
        <t>The above two properties qualitatively relate to the classic question in chaos theory: Can the flap of a butterfly's wings
in Brazil set off a tornado in Texas? <xref target="LORENZ"/> Obviously a butterfly alone cannot create a tornado, but every element
is interconnected in a distributed system, and even the flap of a butterfly's wings in Brazil will have an effect in Texas.
Bottleneck structures are graphs that characterize and quantify such type of effects in a communication network.
In particular, a bottleneck structure reveals how a perturbation propagates through the network,
describing which flows will be affected and by what magnitude.</t>
      </section>
      <section anchor="forces-of-interaction-among-flows-and-links">
        <name>Forces of Interaction among Flows and Links</name>
        <t>Bottleneck structures are powerful computational graphs because they are able to capture the forces of interaction
that flows and bottleneck links exert on each other. These forces of interaction are in general non-intuitive,
even for a small simple network configuration like the one in <xref target="net"/>. For instance, from Property 2, the bottleneck structure reveals
that a small variation in the capacity of link l2 (e.g., in a wireless network, a variation in the capacity of a link
could be due to a change in the signal to noise ratio of the communication channel) will propagate through the network
and have an impact on the transmission rate of flows f2, f4 and f5 (since from Property 2, the bottleneck structure
has a directed path from link l2 to each of these flows). However, such a perturbation will have no effect
on the transmission rate of flows f1, f3 and f6 (since there is no path from l2 to any of these other flows). Similarly,
from property 1, a small perturbation on the rate of flow f4 (e.g., this could be due to the effect of a traffic
shaper altering the transmission rate of flow f4), will have an impact on the rate of flows f2 and f5, but it
will have no effect on the rate of flows f1, f3 and f6.</t>
      </section>
      <section anchor="ripple-effects-in-a-communication-network">
        <name>Ripple Effects in a Communication Network</name>
        <t>As another example, given the network in Figure 1, it is also not
intuitive to foresee that flows f1 and f5 are related to each
other by the forces of interaction inherent to the communication
network, even though they do not traverse any common link.
Specifically, flow f1 traverses link l1, while flow f5 traverses links
l3 and l4. In between both flows, there is an additional hop
(link l2) further separating them.  Despite not being directly
connected, the bottleneck structure reveals that a small perturbation
on the performance of flow f1 (i.e., a change in its transmission
rate), will create a ripple effect that will reach flow f5, affecting
its transmission rate.  In particular, the perturbation on flow f1 will
propagate through the bottleneck structure and reach flow f5
via the following two paths:</t>
        <artwork><![CDATA[
f1 -> l1 -> f3 -> l2 -> f4 -> l3 -> f5

f1 -> l1 -> f6 -> l3 -> f5
]]></artwork>
        <t>It is also not intuitive to see that the reverse is not true.  That
is, a small perturbation on flow f5, will have no effect on flow f1,
since the bottleneck structure has no direct path from vertex f5 to
vertex f1.  In <xref target="G2-SIGMETRICS"/>, extensive empirical validation of
these results is presented for a variety congestion-controlled
IP networks.</t>
      </section>
      <section anchor="not-all-bottleneck-links-are-born-equal">
        <name>Not all Bottleneck Links Are Born Equal</name>
        <t>Bottleneck structures also reveal that not all bottleneck links have the same
relevancy.  In Figure 2, links at the top of the graph have a higher
impact on the overall performance of the network than links at the
bottom.  For instance, consider link l1.  A variation on its
capacity will create a ripple effect that will impact the performance
of all the flows in the network, since all flow vertices are
reachable from vertex l1 according to the bottleneck structure.  In
contrast, link l3 has a much smaller impact on the overall
performance of the network, since a variation of its capacity will
affect flow f5, but have no impact on any of the other flows.  This
information is valuable to network operators and application service
providers as it can be used to make informed network optimization
decisions. For instance, in edge computing, an operator could choose
to place a containerized service (e.g., for extended reality, XR)
on compute nodes that would yield communication paths traversing
bottleneck links with lower impact on the overall performance of
the network (See the use case in <xref target="placement_use_case"/> for more
details). Similarly, in network slicing (or capacity planning
in general), operators could choose to allocate more bandwidth on
those links that are more influential (i.e., those links that
are at lower levels in the bottleneck structure)
according to the expected traffic pattern in the network slice.
<!--
TOBEUNCOMMENTED
(See the use case in {{slicing}} for more details).
-->
        </t>
        <t>Overall, bottleneck structures provide a mechanism to rank bottleneck
links according to their impact on the overall performance of the network.
This information can be used in a variety of optimization problems, such
as traffic engineering, routing, capacity planning, or resilience analysis,
among others.</t>
      </section>
      <section anchor="quantifying">
        <name>Quantifying the Ripple Effects</name>
        <t>Bottleneck structures not only allow network operators to reason
about the qualitative nature of the forces that flows and links exert
on each other, but they also provide a mathematical framework to quantify
such forces. In particular, the Quantitative Theory of Bottleneck
Structures (QTBS) introduced in <xref target="G2-TREP"/> provides a mathematical
framework that uses bottleneck structures as efficient computational
graphs to quantify the impact that perturbations in a network have
on all of its flows.</t>
        <t>One of the core building blocks of the QTBS framework
is the concept of <em>link and flow equations</em>,
which mathematically characterize how a perturbation in a network
propagates through each of the link and flow vertices in the
bottleneck structure. (See <xref target="G2-TREP"/> for an exact mathematical formulation.)
Because quantifying the effect of a perturbation on a system is nothing more
than computing a derivative of the system's performance with respect to
the parameter that's been perturbed, bottleneck structures can be used as
efficient and scalable computational graphs to calculate
flow and link derivatives in a communication network.</t>
        <t>Consider for instance the computation of the following derivative:</t>
        <artwork><![CDATA[
dF()/dri
]]></artwork>
        <t>where F() represents the total throughput of the network (the sum of
all flows' throughput) and ri is the transmission rate of flow fi.
For example, this expression can be used
to compute the effect of traffic shaping
a flow (slightly reducing its rate) on the total throughput of the network.
Computing this derivative using a traditional calculus approach is
both very complex and costly, since it requires modeling the
congestion control algorithm in the function F(), for which there is
no closed form solution. Using bottleneck structures, however, the
computation of this derivative is both simple and inexpensive.  It is
simple because it can be done by applying an infinitesimal
change to the rate of flow fi and then using the link and flow
equations to measure how this perturbation propagates through the
bottleneck structure <xref target="G2-TREP"/>, <xref target="G2-SIGCOMM"/>.
It is also very efficient because the computation is
performed by applying delta calculations on the bottleneck structure,
without involving links and flows that are not affected by the
perturbation.  For instance, in Figure 1, the computation of dF()/df4
only requires recomputing the transmission rates of flows f2
and f5, without the need to recompute the rates of f1, f3 and f6,
since these other flows are not affected by the perturbation.  In
practice, QTBS provides a methodology to
compute network derivatives two or three orders of magnitude faster than
general purpose methods such as liner programming <xref target="G2-SC"/>.</t>
        <t>We finish this brief introduction to QTBS by stating the monotonic
bandwidth allocation property that all bottleneck structures satisfy:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Property 3. Monotonic bandwidth allocation (MBA).</strong> Let si be
the transmission rate of the flows bottlenecked at link li.
Then, for any path in the bottleneck structure of the form  </t>
            <artwork><![CDATA[
  l1 -> f1 -> l2 -> f2 -> (...) -> ln -> fn
]]></artwork>
            <t>
we have that  </t>
            <artwork><![CDATA[
  s1 < s2 < (...) < sn
]]></artwork>
          </li>
        </ul>
        <t>The MBA property is relevant in that it states that bottlenecks located
at higher levels in the bottleneck structure will have more
bandwidth available than those located at lower levels. For instance,
this property indicates that an application requiring high bandwidth
should route its traffic through paths that involve links at higher levels
in the bottleneck structure. We will be
using the MBA property to reason about application performance in some
of the examples described in this document.</t>
      </section>
      <section anchor="types_bs">
        <name>Types of Bottleneck Structures</name>
        <t>While QTBS introduces a core definition of bottleneck structure (see
<xref target="bs_example"/>), there exist multiple types of bottleneck structures
that can be computed depending on the level of granularity and
information desired by the operator. Next, we introduce
three types of bottleneck structures that will be used in this document
and that are suitable to optimize application performance in the
context of the ALTO standard:</t>
        <ul spacing="normal">
          <li>
            <strong>Flow gradient graph (FGG)</strong>. This type of bottleneck structure
corresponds to the base definition introduced in <xref target="bs_example"/>. The
FGG has the finest level of granularity, including a vertex in
each graph for each link and flow in the network. Therefore,
an FGG can be relatively large (e.g, with millions of vertices).</li>
          <li>
            <strong>Path gradient graph (PGG)</strong>. One technique to reduce the size
of the bottleneck structure without affecting its accuracy is
to collapse all the vertices of the flows that follow the same
path into a single vertex called a <em>path vertex</em>.
The resulting bottleneck structure
is called the path gradient graph (PGG). A PGG usually has 2 or 3
orders of magnitude less vertices than the FGG.</li>
          <li>
            <strong>QoS-Path gradient graph (Q-PGG)</strong>. Some networks assign different
types of traffic to different QoS classes. A Q-PGG can model QoS
by collapsing all the vertices of the flows that follow the
same path and have the same QoS class into a single vertex called
a <em>Q-path vertex</em>. A
Q-PGG is slightly larger than a PGG (with about |Q| times more vertices,
where |Q| is the number of QoS classes supported by the network) but
still significantly smaller than the FGG.</li>
        </ul>
        <t>For most of the applications, it is recommended to use a PGG,
or a Q-PGG if the network supports QoS classes, since these
bottleneck structures are significantly smaller and faster to
process than an FGG, and it is often the case that the operator
does not need to know flow-level information in order to
make proper application performance optimization decisions.
Note also that the PGG and the Q-PGG provide the additional
security advantage of hiding flow-level information
from the graph. This can be important to operators that are
sensitive about security and privacy.</t>
      </section>
      <section anchor="computing-optimized-network-reconfigurations">
        <name>Computing Optimized Network Reconfigurations</name>
        <t>A central element to the theory of bottleneck structures is
the ability to efficiently compute derivatives on a network.
Derivatives are a core building block of the optimization
framework, as they reveal the directions (gradients) in the
feasible set that can help bring the network to a higher
level of performance. In this document, we will refer to these
directions in the feasible set as <em>network reconfigurations</em>,
since that's what they effectively are in the physical world.</t>
        <t>For instance, an example of network reconfiguration can be
the action of rate limiting a flow carrying XR traffic to
match the available bandwidth along its path with the goal
to improve its QoE. Another example of network reconfiguration
is the action of rerouting traffic through a new path in order
to accelerate the transfer of a large backup data set
between two cloud data centers. A third example can be
the deployment of a new network slice in a 5G network in order
to ensure the QoS of a V2X service. In each of these actions,
the network configuration is moved along a direction
(a gradient, if the change maximally improves
the performance objective) within the feasible set of possible
configurations.</t>
        <t>While derivatives describe how the performance of a network
changes when a very small (infinitesimal) change is applied
to its configuration, network reconfigurations can accept
changes to the network that are arbitrarily large. For instance,
traffic shaping a set of flows to reduce their rates by 10 Mbps
is a network reconfiguration that is not infinitesimal.
We note that bottleneck structures can also be used to compute
optimized network reconfigurations consisting of non-infinitesimal
changes in the network. This can be done by first computing
derivatives using the bottleneck structure
to find a direction (gradient) in the feasible set, and then reconfiguring
the network by following that direction. This process can be repeated iteratively
until a final optimized reconfiguration is achieved. (See for example
<xref target="G2-SIGCOMM"/> and <xref target="G2-TREP"/> for examples of algorithms using
this technique.)</t>
        <t>In the next section, we summarize some of the network reconfigurations
that can be optimized by using bottleneck structures.</t>
      </section>
      <section anchor="types_reconfigurations">
        <name>Types of Network Reconfigurations</name>
        <t>The following is a list of some of the network reconfigurations
that can be efficiently computed and optimized using bottleneck structures:</t>
        <ul spacing="normal">
          <li>
            <strong>Flow routing</strong>. Both the operation of routing a new flow or
rerouting an existing flow on a network can be modeled as a perturbation,
whose impact can be efficiently measured using bottleneck structures.
In particular, QTBS can be used to resolve the joint congestion
control and routing optimization problem for individual
flows (see Section 3.1 in <xref target="G2-TREP"/>).</li>
          <li>
            <strong>Traffic shaping</strong>. Traffic shaping a flow corresponds to the action
of taking a derivative with respect to the rate of the flow. Bottleneck
structures can be used by network operators and application service
providers to compute such perturbations. For instance, to accelerate
a large scale data transfer, an application can use bottleneck structures
to identify optimal traffic shaping configurations (see Section 3.3 in
<xref target="G2-TREP"/>).</li>
          <li>
            <strong>Bandwidth enforcement</strong>. In high-performance networks that target
close to 100% link utilization such as Google's B4 network <xref target="B4-SIGCOMM"/>,
a centralized SDN controller is used collect the state of the network
and compute an optimized multipath bandwidth allocation vector. The
solution is then deployed at the edge of the network using a technique
known as bandwidth enforcement <xref target="BE-SIGCOMM"/>. By using bottleneck structures
to efficiently compute changes in the bandwidth allocated to each flow path,
operators can efficiently derive improved bandwidth allocation vectors.</li>
          <li>
            <strong>Flow scheduling</strong>. When a flow initiates transmitting data on a network,
it uses bandwidth along its path, creating a ripple effect that impacts
the performance of other flows in the network. Similarly, the termination
of a flow frees bandwidth along its path, creating another perturbation
that propagates through the network. Bottleneck structures can efficiently
model and compute the effect of flow arrival and departure in a communication
network by using simple delta calculations according to the link and flow
equations (see <xref target="quantifying"/> and <xref target="G2-SIGCOMM"/>). This information can be used by
applications that need to perform bulk data transfer to decide when
to schedule a flow.  More in particular, it can be used to enhance the
ALTO Cost Calendar service <xref target="RFC8896"/>.</li>
          <li>
            <strong>Service placement</strong>. Deploying application services in a network
requires deciding the location of the compute and storage resources
needed to run the service. For instance, in edge computing, an extended
reality (XR) server could be deployed at the distributed unit (DU), the central
unit (CU), the mobile core (MC) or the central cloud <xref target="PETERSON"/>. Bottleneck
structures can be used to measure the effect of placing a service on each of the
candidate locations, helping the application service provider to make
optimized decisions.</li>
          <li>
            <strong>Multi-job scheduling</strong>. Running a job on a network implies a number
of flows will be initiated and terminated throughout the execution of the job.
the ripple effects generated from the execution of a job can also be measured
using bottleneck structures. This can be used to decide when to optimally
launch one or more jobs. For instance, in a data center, bottleneck structure
analysis can help the application decide how to optimally schedule multiple AI
training or inference jobs that are sharing the same interconnect <xref target="G2-SIGCOMM"/>.</li>
          <li>
            <strong>Link capacity upgrades</strong>. In capacity planning, operators often
have a fixed budget and need to decide how to optimally add capacity
to a network in order to maximize its performance. The effect of a link
upgrade operation can be computed as a derivative with respect to a change
(an increase) in the capacity of a link. Through the processing of historical
flow information from the network (e.g., NetFlow logs), bottleneck structures
can efficiently compute the effect of each link upgrade and identify
those that yield maximal performance.</li>
          <li>
            <strong>Path shortcuts</strong>. Operators in wide area networks need to
decide whether a communication path should be set up as purely optical (bypassing layer 3
routing) or undergo an optical-to-electrical-to-optical (OEO) conversion at certain
routers in order to perform layer 3 routing <xref target="SH-SIGCOMM"/>.
The trade-off is one of cost-efficiency versus
better routing control of the network. Bottleneck structures can be used
to search for paths that are optimally suitable for being offloaded to
a purely optical path. These are also known in the literature
as path shortcuts <xref target="SH-SIGCOMM"/>.</li>
        </ul>
      </section>
    </section>
    <section anchor="use_cases">
      <name>ALTO Bottleneck Structure Service Use Cases</name>
      <t>Applications of bottleneck structure analysis expand through
a broad class of optimization problems that include traffic
engineering, routing, flow scheduling, resiliency analysis,
network slicing, service level agreement (SLA) management,
network design and capacity planning, to name only a few.
In this section, we briefly describe some of
the use cases that relate to the objectives of the
IETF ALTO Standard.</t>
      <section anchor="rate_limiting">
        <name>Application Rate Limiting for CDN and Edge Cloud Applications</name>
        <t>In applications such as CDN, XR or gaming, it is important
to throttle the transmission rate of flows to match the true available
capacity along their communication path. Transmitting at a lower rate
than the available bandwidth leads to lower
quality of experience (QoE). Transmitting at a higher rate increases
packet losses, which wastes network resources and also leads to a
lower QoE.</t>
        <t>Estimating the available bandwidth for a flow is complex because
it depends on multiple factors including the network topology, the
routing configuration and the set of dynamic flows using the
network resources. Bottleneck structures capture in a single digraph
these three factors, creating a model that allows to estimate
the performance of each flow. See for instance Sections 3.1 and
3.2 in <xref target="G2-TREP"/> for examples on how bottleneck structures can be
used to estimate the available bandwidth of an application.</t>
        <t>An ALTO server could help the application service provider obtain
the available bandwidth on a given path by exposing the bottleneck
structure of the network. With this information alone, the
provider could directly obtain the available bandwidth.
Alternatively, the application service could query the
ALTO server by passing the path for which the available
bandwidth needs to be computed,
and the ALTO server could return this value without the need to
share the complete bottleneck structure.</t>
      </section>
      <section anchor="time-bound-constrained-flow-acceleration-for-large-data-set-transfers">
        <name>Time-bound Constrained Flow Acceleration for Large Data Set Transfers</name>
        <t>Bulk data transfer is an important application to both commercial and
government supported networks. For instance, Google's B4 network supports
large-scale data push synchronizing state across multiple global
data centers <xref target="B4-SIGCOMM"/>. Another common use case is found in
science networks, where massive data sets such as those originated
from the Large Hadron Collider at CERN, Switzerland, need to be shared
with scientific labs around the world. In this section, we show how
bottleneck structures can be used to reconfigure a network towards
accelerating a given data transfer with the goal to meet a certain
time constraint.</t>
        <t>To illustrate this use case, we will assume the simple bottleneck
structure shown in <xref target="flowaccel"/>.</t>
        <figure anchor="flowaccel">
          <name>Reducing the rate of flow f1 maximally accelerates flow f5.</name>
          <artwork><![CDATA[
            +------+
            |      |
            |  l1  <-----------+
            |      |           |
            +--^---+           |
               | -1            | +1
               |               |
            +--v---+           |
            |      |           |
            |  f1  |           |
            |      |           |
            +------+           |
                               |
            +------+        +--v---+
            |      |   +1   |      |
            |  l2  <--------+  f2  |
            |      |        |      |
            +--^---+        +--+---+
               | -1            | +1
               |               |
            +--v---+        +--v---+
            |      |        |      |
            |  f3  |        |  l3  |
            |      |        |      |
            +--+---+        +--^---+
               | -1            | -1
               |               |
            +--v---+        +--v---+
            |      |   -1   |      |
            |  l4  <--------+  f4  |
            |      |        |      |
            +--^---+        +------+
               | +2
               |
            +--v---+
            |      |
            |  f5  |
            |      |
            +------+
]]></artwork>
        </figure>
        <t>Suppose our goal is to accelerate flow f5. To achieve this objective,
we will also assume that we are allowed to traffic shape (reduce) the
rate of any of the other flows. Effectively, for each flow fi
different than f5, we need to compute the following derivative</t>
        <artwork><![CDATA[
-dr5/d_ri
]]></artwork>
        <t>and then pick the maximum value. Note that in the above expression,
we take the left-derivative (d_), since a traffic shaper reduces
the rate of a flow. We also negate the derivative (-d), since we
are interested in a positive impact induced on flow f5 when
reducing the rate of another flow fi.</t>
        <t>Such a calculation can be efficiently performed using the
bottleneck structure. As an example, <xref target="flowaccel"/> illustrates how the
value of (-dr5/d_r1) is computed. First, we reduce the rate of
flow f1 by 1 unit. This perturbation propagates through the
bottleneck structure reaching flow f5 via two paths:</t>
        <artwork><![CDATA[
l1 -> f2 -> l2 -> f3 -> l4 -> f5

l1 -> f2 -> l3 -> f4 -> l4 -> f5
]]></artwork>
        <t>Using the link and flow equations (<xref target="quantifying"/>),
each path simply flips the
sign of the perturbation every time a link vertex is
traversed. (The reason why the sign is flipped at each link vertex
is explained by the link and flow equations that dictate how perturbations
propagate through the bottleneck structure. Further mathematical
descriptions to explain this effect are outside the scope of this
document. For detailed mathematical derivations and additional
examples, please see <xref target="G2-TREP"/>).</t>
        <t>When reaching vertex f5, we find that each path
contributes 1 unit of bandwidth. Thus we have:</t>
        <artwork><![CDATA[
-dr5/d_r1 = 1 + 1 = 2
]]></artwork>
        <t>In fact, it can be seen that this derivative is maximal. That
is, traffic shaping any other flow would yield a smaller
increase in the rate of f5. Thus, an operator can conclude
that traffic shaping flow f1 yields an optimal strategy
to maximally accelerate the rate of flow f5. Note also that
in this case, there is a positive multiplier effect, since
reducing flow f1's rate by 1 unit, leads to an increase
on flow f5's rate by more than 1 unit.
This is known as a power gradient <xref target="G2-SIGCOMM"/>.</t>
        <t>While left outside the scope
of this document, bottleneck structures can also be used
to efficiently compute the value of the optimal traffic
shaper (i.e., in our example, to find by how much we should
traffic shape flow f1) and to quantify the impact on the
flow being accelerated. This information can also be used by
the application to estimate the flow's completion time.</t>
        <t>An ALTO server could help the application service provider identify
an optimized traffic shaping strategy by exposing the bottleneck
structure of the network. With this information alone, the
provider could efficiently compute an optimized set of traffic
shapers. Alternatively, the application service could query the
ALTO server by passing the set of flows that are allowed
to be traffic shaped and the flow that needs to be accelerated,
and the ALTO server could return the set of recommended
traffic shapers.</t>
      </section>
      <section anchor="application-performance-optimization-through-ai-modeling">
        <name>Application Performance Optimization Through AI Modeling</name>
        <t>A relevant and emerging area in the field of application
performance is AI-based network modeling. Several global
initiatives are been undertaken to apply AI to the field
of understanding and predicting network performance. For
instance, OpenNetLab <xref target="BE-ONL"/> provides a distributed networking
platform with many collaborative nodes (universities and
companies) and common benchmarking datasets for
researchers to collect real networking data and
train their AI models for various networking
environments, including the Internet, cloud, and
wireless networks. There also exist global
benchmarks and challenges to foster innovation in this field,
such as the ACM MMSys Challenge <xref target="MMSYS"/>, which focuses
on novel AI-based bandwidth estimation algorithms to
enable superior overall QoE on a global production
testbed built for real-time communications (RTC) of video
and audio.</t>
        <t>Modeling communication networks using purely AI frameworks
such as deep learning is challenging as it requires
very large production data sets that often times are not
available. They also require many years of intense, global
collaborative R&amp;D. To address these challenges, it has been
seen that hybrid models built by combining AI with a
"physics" model of the network can outperform purely
AI models, as they may require less training data to achieve
the same or better performance. For instance, the top two
winners of the ACM MMSys 2021 Bandwidth Prediction Challenge
<xref target="MMSYS"/> were based on hybrid models.</t>
        <t>Because bottleneck structures provide a "physics" model
of the network that can both qualify and quantify the
forces of interactions among flows and links, they can be
used in combination with AI to enable better performance
than purely AI-based models. For instance, this
area is being discussed in the IETF ALTO WG (e.g., <xref target="BE-ONL"/>) as a
potential use case in the ALTO Standard to help optimize the performance
of RTC applications. In particular, a key building block to optimize the QoE
performance of RTC applications is the bandwidth estimation
module. This module runs on the endpoint
of a real-time video application and aims at dynamically adapting the video
bitrate to stay within the available network capacity.
A limitation in the current algorithms, however, is their lack of
network state visibility. This requires the algorithms
to rely entirely on local indicators such as packet loss or latency,
which leads to poor training and inference performance.
Information provided by the bottleneck structure (which includes
topological, routing and flow information of the network in a single
digraph) exposed via the ALTO service could help unlock a richer set of
machine learning algorithms to optimize application performance.</t>
        <t>An ALTO server could help the application service provider implement
AI-assisted prediction algorithms by exposing the bottleneck
structure of the network. Alternatively, ALTO could implement
an AI-assisted prediction module with the help of bottleneck
structures. The application would then query the ALTO server
to obtain the predicted value.</t>
      </section>
      <section anchor="joint_use_case">
        <name>Optimized Joint Routing and Congestion Control</name>
        <t>In traditional IP networks, the problems of flow routing and congestion
control are separately resolved by following a two-step process:
first, a routing protocol is used to
determine the path between any two nodes in a network; then, flows are
routed according to such paths and their transmission rates are regulated
using a congestion control algorithm. This layered
and disjoint approach is known to be scalable but suboptimal because
the routing algorithm identifies paths without taking into account the
flow transmission rates assigned by the congestion control algorithm.</t>
        <t>Suppose that an application is trying to launch a new flow between
two endpoints with the goal to maximize the available
bandwidth. One can be tempted to think that, to identify the path
with maximal available bandwidth, it suffices to look at the current
state of the network and find the least congested path offering
the highest capacity. This approach, however, is naive since it does
not take into account the fact that the placement of the new flow
onto the network will itself create a perturbation in the network,
potentially making the chosen path suboptimal or, even more troublesome,
negatively affecting the performance of other priority flows.</t>
        <t>The goal of the joint routing and congestion control
problem between two given endpoints E1 and E2 consists in finding the path
from E1 to E2 that will yield the highest throughput <em>after</em> the flow is
placed on the network (i.e., taking into account the effect of placing
the flow).</t>
        <t>The solution to this problem is introduced in <xref target="G2-TREP"/> by employing a
strategy that combines the strengths of both the Dijkstra algorithm
and the insights revealed by the bottleneck structure. The algorithm
can both compute the optimal path and measure the overall network-wide
impact of deploying the new flow on the path. It also enables a framework
to identify new good-performing paths that have a limited
negative impact on the rest of the flows in the network.
This allows network and application providers to identify paths that
can both provide good performance to the newly added application flow
while preserving the performance of the existing high-priority flows.</t>
        <t>An ALTO server could help the application service provider optimize the
path selection decision by exposing the bottleneck structure of the
network. With this information alone, the provider could efficiently
compute the optimal path (e.g., using the algorithm introduced
in <xref target="G2-TREP"/>). Alternatively,
the application service could query the ALTO server by passing the
information of the two endpoints that need to be connected, and the
ALTO server could return a list of the top-N paths with the
highest throughput and their expected performance.</t>
      </section>
      <section anchor="placement_use_case">
        <name>Service Placement for Edge Computing</name>
        <t>Determining the proper location to deploy an application service in the
edge cloud is critical to ensure a good quality of experience
(QoE) for its users. Yet the service placement problem is known to
be NP-Hard <xref target="JSP-INFOCOM"/>, requiring heuristics to compute good (albeit
suboptimal) solutions.</t>
        <t>In <xref target="G2-SIGCOMM"/>, it is shown that Bottleneck structures can also be
used as highly scalable network simulators to evaluate the performance
of a network reconfiguration such as the placement of a new
service on a edge cloud. In particular, bottleneck structures
can very efficiently (1) compute the performance of each flow
in the network and (2) quantify the effects of the arrival (departure) of
new (existing) flows to (from) the network. This allows to simulate the
full transmission of an application traffic pattern very efficiently,
three or more orders of magnitude faster than traditional packet
simulators.</t>
        <t>Network and application providers can use this capability in two ways:</t>
        <ul spacing="normal">
          <li>Given a set of possible placement strategies, bottleneck structures
can be used to simulate them in real time, helping the operator
select the one that provides the best performance
while guaranteeing the service level agreements (SLAs) of the other
existing applications.</li>
          <li>Despite the server placement problem being intractable, bottleneck
structures provide a framework to identify good candidate solutions.
In particular, by capturing the topology, routing, and flow information
in a single computational graph, they can be used to efficiently explore
directions in the feasible set that yield incrementally better
performance.  By moving in these incremental directions, the placement
algorithm can progress within the enormous feasible set towards the
optimal solution.</li>
        </ul>
        <t>An ALTO server could help the application service provider optimize the
placement decision by exposing the bottleneck structure of the network.
With this information alone, the provider could compute the effect of
placing the service in one location versus another. Alternatively,
the application service could query the ALTO server by passing the
information of the possible locations where it can be placed, and the
ALTO server could return an ordered list of the locations and their
expected performance.</t>
      </section>
      <section anchor="training-neural-networks-and-ai-inference-for-edge-clouds-data-centers-and-planet-scale-networks">
        <name>Training Neural Networks and AI Inference for Edge Clouds, Data Centers and Planet-Scale Networks</name>
        <t>Neural network training and inference using distributed computing
systems are the subject of intense research and one of the leading
target applications in today's communication networks.
<xref target="TOPOOPT-MIT"/> <xref target="FLEXFLOW-STFORD"/> <xref target="SINGULARITY-MSFT"/>. To illustrate
this use case, we will focus our discussion on three types of
networks: edge clouds, data centers and planet-scale networks.</t>
        <t>5G and Edge Clouds enable for the first time the ability
to provide intelligence at the edge of the network. This capability
is disruptive in that humans and machines will have access to
unprecedented compute power to perform AI inference in real time.
For instance, using augmented reality (AR), humans will be able to
make better informed decisions as they navigate through an environment
by leveraging AI-inference on video and audio signals captured
in real time from their user equipments (UEs).
Similarly, machines such as vehicles
or factory robots will be able to use AI inference to optimize their
actions.</t>
        <t>Two resources are needed to perform inference:
(1) Input data from the environment (e.g., image and
audio signals captured from a video camera) and (2) compute
(typically in the form of GPUs and CPUs). The input data needs to be
transmitted from the location where it is captured (e.g., a micro-camera
running on a human's glasses) to the location where it is to be
processed for inference. The transmission of the input data requires
communication resources, whereas the inference process requires
computing resources. Since computing resources in the edge
cloud (<xref target="mec"/>) are distributed across the user equipment (UE),
the radio unit (RU), the distributed unit (DU) and the central unit
(CU) <xref target="PETERSON"/>, the problem of efficiently performing AI-inference is
one of optimizing the trade-off communication-compute as follows:
compute (communication) power is more scarce (abundant) if the
inference is performed closer to the UE, and more abundant (scarce)
if performed closer to the CU. For instance, if an AR application
running on a UE needs to perform an inference task at a time when the
communication path from the RU to the DU is highly congested,
then it will have an incentive to perform such a task directly
in the UE or in the RU. If instead the network offers an uncongested
path to the DU and the CU, it will
have an incentive to run the inference task on these other
nodes since they offer more compute power.</t>
        <figure anchor="mec">
          <name>An AI-inference application in the edge cloud needs to place the inference task on a compute node location (UE, RU, DU or CU) that will perform well from both a compute and a communication standpoint.</name>
          <artwork><![CDATA[
   +------+       +------+       +------+       +------+
   |      |       |      |       |      |       |      |
   |  UE  +-------+  RU  +-------+  DU  +-------+  CU  +
   |      |       |      |       |      |       |      |
   +------+  Air  +------+       +------+       +------+
          Interface      Fronthaul       Backhaul
]]></artwork>
        </figure>
        <t>Using ALTO path vector <xref target="I-D.ietf-alto-path-vector"/> and performance
metrics <xref target="I-D.ietf-alto-performance-metrics"/> features,
the application could retrieve
the amount of compute resources located in the RU, DU and CU.
By extending ALTO to support bottleneck structures, the application
would also be able to estimate in real-time the available
bandwidth for the paths UE-RU, UE-RU-DU, and UE-RU-DU-CU.
Further, using bottleneck structure methods described in <xref target="G2-SIGCOMM"/>,
the application would be able to estimate the time to complete
the inference task for each of the four possible scenarios (running in
the UE, the RU, the DU or, or the CU) and choose the
configuration with the fastest execution.</t>
        <t>Similar joint compute-communication optimization problems appear when
performing neural network training in large-scale data centers.
Large-scale data centers with millions
of compute nodes are used to train gigantic neural networks (with
potentially trillions of parameters). Such a massive task needs
to be broken down into smaller subtasks that are then executed on
the nodes. Once again, compute and communication need to
be jointly optimized (see <xref target="TOPOOPT-MIT"/> and <xref target="FLEXFLOW-STFORD"/>)
in order to ensure regions in the network don't become bottlenecks.
By exposing bottleneck structure information using ALTO, the
AI-training application can make better subtask placement decisions
that avoid potential network bottlenecks.</t>
        <t>Finally, AI-training using planet-scale networks generalizes
the same joint compute and communication problem to an Internet level
<xref target="SINGULARITY-MSFT"/>, with the need to implement a global
scheduler that is responsible for placing workloads
onto clusters of globally-distributed compute nodes.
Here too enabling better network state visibility using ALTO
and bottleneck structure graphs could help the scheduler make
better task placement decisions.</t>
      </section>
      <section anchor="slicing">
        <name>5G Network Slicing</name>
        <t>Bottleneck structures can also be used by network operators and
application service providers to compute optimized network slices.
In a simplified form, given a network topology consisting of a set of
routers interconnected via links each with a given capacity, the
problem of computing a network slice consists in identifying a subset
of the routers, links, and a fraction of the capacity in each link,
that can cover a certain demand of traffic generated by a given
application service. The slice provides a virtual cut of the
network, enabling isolation and ensuring a fix amount of resources
to the application service. Examples of application services include
a vehicle network service, the Internet of Things, an industrial
logistical service, or the metaverse, to name a few.</t>
        <t><xref target="G2-SIGCOMM"/> shows how bottleneck structures can be used to
compute optimized bandwidth allocations in data centers to optimally
meet a certain traffic demand. Similar frameworks can be used to
compute network slices in a virtualized networking environment.</t>
      </section>
    </section>
    <section anchor="req_example">
      <name>Example: Application Layer Traffic Optimization using Bottleneck Structures</name>
      <t>In this section we provide an example illustrating how bottleneck
structures can be used to optimize application performance. This
example will then be referenced in <xref target="requirements"/> to discuss and
introduce the necessary requirements to integrate the BSG service
into the ALTO standard. It is worth noticing that, as shown in
<xref target="use_cases"/>, bottleneck structures have numerous applications.
This section provides a complete example for just one of the use
cases. In particular, the focus of the next example is on the
joint routing and congestion control use case <xref target="joint_use_case"/>.</t>
      <t><xref target="b4"/> provides a view of Google's B4 network as presented in
<xref target="B4-SIGCOMM"/>, providing connectivity to 12
data centers distributed across the world (two in Asia, six
in America and four in Europe).</t>
      <figure anchor="b4">
        <name>Google's B4 network introduced in [B4-SIGCOMM].</name>
        <artwork><![CDATA[
    +-----+   +-----+  +-----+  +-----+   +------+    +------+
    |     |   |     |  |     |  |     |   |      |    |      |
    | DC1 +---+ DC3 +--+ DC4 +--+ DC7 +---+ DC11 +----+ DC12 |
    |     |   |     |  |     |  |     |   |      |    |      |
    +---+-+   +--+--+  +--+-++  +----++   +-+--+-+    +----+-+
        |        |        | |      | |      |  |           |
        |        +------+ | +----+ | |      |  +--------+  |
        |               | |      | | |      |           |  |
        |               | |      | | |      |           |  |
        |        +------|-+ +----|-+ |      |   +-------|--+
        |        |      |   |    |   |      |   |       |
    +---+-+   +--+--+  ++---++  ++---++   +-+---++    +-+---+
    |     |   |     |  |     |  |     |   |      |    |     |
    | DC2 +---+ DC5 +--+ DC6 +--+ DC8 +---+ DC10 +----+ DC9 |
    |     |   |     |  |     |  |     |   |      |    |     |
    +-----+   +-----+  +-----+  +-----+   +------+    +-----+

    |-----|   |-----------------------|   |-----------------|
      Asia                 America                 Europe
]]></artwork>
      </figure>
      <t>The 12 data centeres are connected via a total of 19 links, labeled
l1, l2, ... l19. <xref target="b4_links"/> presents the pair of data centers that
each link is connected to.</t>
      <table anchor="b4_links">
        <name>Link connectivity (adjacency matrix) in the B4 network.</name>
        <thead>
          <tr>
            <th align="right">Link</th>
            <th align="left">Adjacent data centers</th>
            <th align="right">Link</th>
            <th align="left">Adjacent data centers</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">l1</td>
            <td align="left">DC1, DC2</td>
            <td align="right">l11</td>
            <td align="left">DC10, DC12</td>
          </tr>
          <tr>
            <td align="right">l2</td>
            <td align="left">DC1, DC3</td>
            <td align="right">l12</td>
            <td align="left">DC4, DC5</td>
          </tr>
          <tr>
            <td align="right">l3</td>
            <td align="left">DC3, DC4</td>
            <td align="right">l13</td>
            <td align="left">DC5, DC6</td>
          </tr>
          <tr>
            <td align="right">l4</td>
            <td align="left">DC2, DC5</td>
            <td align="right">l14</td>
            <td align="left">DC11, DC12</td>
          </tr>
          <tr>
            <td align="right">l5</td>
            <td align="left">DC3, DC6</td>
            <td align="right">l15</td>
            <td align="left">DC4, DC7</td>
          </tr>
          <tr>
            <td align="right">l6</td>
            <td align="left">DC6, DC7</td>
            <td align="right">l16</td>
            <td align="left">DC4, DC8</td>
          </tr>
          <tr>
            <td align="right">l7</td>
            <td align="left">DC7, DC8</td>
            <td align="right">l17</td>
            <td align="left">DC7, DC8</td>
          </tr>
          <tr>
            <td align="right">l8</td>
            <td align="left">DC8, DC10</td>
            <td align="right">l18</td>
            <td align="left">DC9, DC11</td>
          </tr>
          <tr>
            <td align="right">l9</td>
            <td align="left">DC9, DC10</td>
            <td align="right">l19</td>
            <td align="left">DC10, DC11</td>
          </tr>
          <tr>
            <td align="right">l10</td>
            <td align="left">DC7, DC11</td>
            <td align="right"> </td>
            <td align="left"> </td>
          </tr>
        </tbody>
      </table>
      <t>For the sake of illustration, we will assume a simple configuration
consisting of a pair of flows
(one for each direction) connecting every data center in the US
with every data center in Europe, with all flows routed along a
shortest path from source to destination. Since there are six data
centers in the US and four in Europe, this configuration has
a total of 48 flows. All links are assumed to have a capacity of
10 Gbps except for the transatlantic links (DC7-DC11 and DC8-DC10),
which are configured at 25 Gbps.</t>
      <t>The next Figure presents the bottleneck structure of Google's B4 network
with the assumed flow configuration.
Please see <xref target="bs_example"/> for a description of how to interpret the
bottleneck structure. (See also <xref target="G2-SC"/>, <xref target="G2-TREP"/> for details
on the algorithm used to compute the bottleneck structure.)</t>
      <figure anchor="b4fgg">
        <name>Bottleneck structure of Google's B4 network example.</name>
        <artwork><![CDATA[
   +--------+    +--------+
   |        |    |        |
   |  l15   |    |   l7   |
   |        |    |        |
   +-^----^-+    +--^--^--+
     |    |         |  |
     |    |         |  +--------------------------+
     |    |         |                             |
     |    +---------|------------------+          |
     |              |                  |          |
   +-v------+    +--v----+        +---v---+  +---v---+
   |        |    |       |        |       |  |       |
   |   f1   |    |  f2   |        |  f3   |  |  f10  | (...)
   |        |    |       |        |       |  |       |
   +-+-+-+--+    +-+---+-+        +--+--+-+  +-------+
     | | |         |   |             |  |
     | | +---------|---|-------------|--|--------------+
     | |           |   |             |  |              |
     | | +---------+   +-----------+ |  |              |
     | | |                         | |  |              |
     | +-|---------+    +----------|-+  +---------+    |
     |   |         |    |          |              |    |
     |   |         |    |          |              |    |
   +-v---v--+    +-v----v-+      +-v----+       +-v----v-+
   |        |    |        |      |      |       |        |
   |   l8   |    |  l10   |      |  l5  |       |   l3   |
   |        |    |        |      |      |       |        |
   +-^---^--+    +-^---^--+      +------+       +--------+
     |   |         |   |
     |   |         |   +-----------------------+
     |   |         |                           |
     |   +---------|---------------+           |
     |             |               |           |
   +-v----+    +---v---+       +---v---+   +---v---+
   |      |    |       |       |       |   |       |
   |  f6  |    |   f9  |       |  f23  |   |  f18  | (...)
   |      |    |       |       |       |   |       |
   +------+    +-------+       +-------+   +-------+
]]></artwork>
      </figure>
      <t>For the sake of compactness,
<xref target="b4fgg"/> only includes the bottleneck links
and a subset of the flow vertices that are part of the complete bottleneck
structure. In particular, out of the 19 links that are part of B4,
six links (l15, l7, l8, l10, l5, l3) are bottlenecks.</t>
      <t>The bottleneck structure graph shows the existence of two
bottleneck levels in our configuration example:</t>
      <ul spacing="normal">
        <li>The first level at the top of the bottleneck structure includes
links l15 and l7. Flows f1, f2, f3, f10, etc. are bottlenecked
at this level.</li>
        <li>The second level of the bottleneck structure includes links l8, l10,
l5 and l3. Flows f6, f9, f23, f18, etc. are bottlenecked at this level.</li>
      </ul>
      <t>From the MBA Property (Property 3), we know that flows bottlenecked by
a link at level 2 will enjoy higher available bandwidth than flows
bottlenecked at level 2. For instance, consider the following directed
path in the bottleneck structure:</t>
      <artwork><![CDATA[
l15 -> f1 -> l8 -> f6
]]></artwork>
      <t>Using the MBA property, we have that since l15 precedes l8, it must be
that s15 &lt; s8, where s15 is the rate of flow f1 bottlenecked
at l15 and s8 is the rate of flow f6 bottlenecked at l8.</t>
      <!--
The Perturbation Property (Property 2) also tells us that links at
level 1 will have a higher influence to the overall performance of
the network than links at level 2. Consider a level-1 link, for instance
l15. In {{b4fgg}}, we can see that flows f1, f3, etc. from level 1
and flows f6, f9, f23, f18, etc. from level 2 will be impacted
by the performance of link l15 (since there is a directed path
from l15 to all of these flows). Consider now a level-2 link, for
instance l8. Only flows f6, f23, etc. at level 2 will be impacted
by the performance of link l8.
-->

<t>Suppose now that an application needs to place a new flow on Google's
B4 network to transfer a large data set from data center 11 (DC11)
to data center 4 (DC4). The application needs to select and
configure a path
from DC11 to DC4 (for instance, this could be done by using
SR <xref target="RFC8402"/>). The shortest path DC11 -&gt; l10 -&gt;
DC7 -&gt; l15 -&gt; DC4 is often used as the default option.
Doing so, however, implies that the flow will be bottlenecked at
link l15 at the upper level of the bottleneck structure, leading to
a lower transmission rate. If instead we choose the non-shortest path
DC11 -&gt; l19 -&gt; DC10 -&gt; l8 -&gt; DC8 -&gt; l16 -&gt; DC4, now the flow
will be bottlenecked at link l8 (at the lower level of the
bottleneck structure), leading to a higher transmission rate.</t>
      <t>Using QTBS, we can also numerically compute the transmission rate of the flow
on each of the two path options.  (See Section 3.1 in <xref target="G2-TREP"/> for a detailed
description of how to compute the transmission rate assigned to
the flow on each of these paths.) In particular, we obtain that when the
application chooses the shortest path (bottlenecked at level 1 of the
bottleneck structure), it gets a transmission rate of 1.429 Gbps.
If instead the application chooses the slightly longer path (bottlenecked at
level 2 of the bottleneck structure), then it gets a transmission
rate of 2.5 Gbps, an increase of 74.95% with respect to the
shortest path solution.</t>
      <t><xref target="G2-TREP"/> introduces also a very efficient routing algorithm that
uses the bottleneck structure to find the maximal throughput path
for a flow in O(V+E*log(V)) steps, where V is the number of routers
and E is the number of links in the network.</t>
      <t>Overall, this example illustrates that, equipped with knowledge
about the bottleneck structure of a network, an application
can make better informed decisions on how to route a flow. In
the next sections, we will use this example to support a discussion
on the requirements for integrating the Bottleneck Structure Graph
(BSG) service into the ALTO standard.</t>
    </section>
    <section anchor="requirements">
      <name>Requirements</name>
      <t>This section provides a discussion on the necessary requirements
to integrate the BSG service into the ALTO standard.</t>
      <section anchor="requirement-1-bottleneck-structure-graph-bsg-abstraction">
        <name>Requirement 1: Bottleneck Structure Graph (BSG) Abstraction</name>
        <t>The first base requirement consists in extending the ALTO
server with the capability to compute bottleneck structures.
For instance, with this capability, given the network
configuration in <xref target="b4"/>, the ALTO server would be able to
compute the bottleneck structure shown in <xref target="b4fgg"/>:</t>
        <ul spacing="normal">
          <li>Requirement 1A (R1A). The ALTO server <bcp14>MUST</bcp14> compute the
bottleneck structure graph to allow applications optimize
their performance using the BSG service.</li>
        </ul>
        <t>We note that the alternative, which would consists in ALTO
simply providing the necessary information for applications
to compute their own bottleneck structures, would not scale
due to the following issues:</t>
        <ul spacing="normal">
          <li>Suppose that 1 ALTO server is providing support to N ALTO
clients. Then, requiring each application to compute the
bottleneck structure would imply performing N identical
and redundant computations. By computing the bottleneck structure
in the ALTO server, a one-time computation can be leveraged
by all N clients. We also note that <xref target="G2-SC"/> demonstrates
that bottleneck structures can be efficiently computed in
real time by the server even for large scale networks.</li>
          <li>A production-ready high-speed implementation of
QTBS is relatively sophisticated.
Requiring the applications to implement their own QTBS
optimization library would impose unnecessary and (perhaps
more importantly) out-of-scope requirements to the application,
which should focus on providing its service rather than implementing
a network optimization math library.</li>
        </ul>
        <t>The next requirement focuses on the type of bottleneck structure
an ALTO server must compute:</t>
        <ul spacing="normal">
          <li>Requirement 1B (R1B). The ALTO server <bcp14>MUST</bcp14> at least support
the computation of one bottleneck structure type from <xref target="types_bs"/>.
Depending on the network information available (e.g., presence of QoS
class information), the ALTO server <bcp14>MAY</bcp14> support all the three
bottleneck structure types, in which case the ALTO client <bcp14>MAY</bcp14>
be able to choose the bottleneck structure type for retrieval.
Also, it is <bcp14>RECOMMENDED</bcp14> that the ALTO server supports the
computation of the path gradient graph (PGG)
as the default bottleneck structure implementation for retrieval
by the ALTO clients.</li>
        </ul>
      </section>
      <section anchor="requirement-2-information-received-from-the-network">
        <name>Requirement 2: Information Received from the Network</name>
        <t>To compute a bottleneck structure, two pieces of information
are required:</t>
        <ul spacing="normal">
          <li>
            <t>Topology Object (T). The T Object is a data structure
that includes:  </t>
            <t>
(1) A Topology Graph (V, E), where V is the set of routers and E
 is the set of links connecting the routers in the network.  </t>
            <t>
(2) A Capacity Dictionary (C), a key-value table mapping each link
 with its capacity (in bps).</t>
          </li>
          <li>Flow Dictionary (F). The F Dictionary is a key-value table
mapping every flow with the set of links it traverses.</li>
        </ul>
        <t>As shown in <xref target="G2-TREP"/>, the above information is enough to compute
the bottleneck structure. In fact, with only the F and C dictionaries,
one can compute the bottleneck structure. The topology graph (V, E) is
needed to perform optimal routing computations (for instance, to find new
paths in the network that yield higher throughput, as illustrated
in <xref target="req_example"/>).</t>
        <t>The above discussion leads to the following requirement:</t>
        <ul spacing="normal">
          <li>Requirement 2A (R2A). The ALTO server <bcp14>MUST</bcp14> collect information about
(1) the set of routers and links in a network, (2) the capacity of each
link and (3) the set of links traversed by each flow.</li>
        </ul>
        <t>Information about the set of routers, links and link capacity is
typically available from protocols and technologies such as
SNMP, BGP-LS, SDN, or domain specific topology logs. This
information is enough to construct the T Object.
Information about the set of links traversed by each flow can
be obtained from protocols such as NetFlow, sFlow, IPFIX, etc.
See <xref target="FLOWDIR"/> and <xref target="G2-SC"/> for examples of how requirement R2A
is implemented in real-world production networks.</t>
      </section>
      <section anchor="requirement-3-information-passed-to-the-application">
        <name>Requirement 3: Information Passed to the Application</name>
        <t>The following requirement is necessary so that applications
can optimize their performance using bottleneck structure
information:</t>
        <ul spacing="normal">
          <li>Requirement 3A (R3A). The ALTO client <bcp14>MUST</bcp14> be able to query the
ALTO server to obtain the current bottleneck structure
of the network, represented as a digraph.</li>
        </ul>
        <!--
- Requirement 3B (R3B). The ALTO client MUST be able to query
the ALTO server to obtain the resulting effect of a network
reconfiguration (see {{types_reconfigurations}}).

For example, an application may be interested in finding a
high-throughput path. Using requirement R3A, it can obtain
a copy of the bottleneck structure, and use it to
select a few paths that comply with the application
constraints and that are located at the higher levels of the
bottleneck structure (since from the MBA property,
these yield higher performance). Then using requirement R3B,
it could query the ALTO server again to obtain the expected
performance on each of the selected paths.
-->

<t>In addition, the current ALTO services can be extended with
additional information obtained from the bottleneck structure:</t>
        <ul spacing="normal">
          <li>Requirement 3B (R3B). One or more ALTO services (the Network
Map, the Cost Map, the Entity Property Map or the Endpoint Cost
Map) <bcp14>MUST</bcp14> support reporting to ALTO
clients additional network state information derived from
the bottleneck structure to the ALTO client.</li>
        </ul>
        <t>For example, the ALTO Cost Map Service can be extended with
a new cost metric that corresponds to the estimated available
bandwidth between two endpoints according to the bottleneck
structure model.</t>
      </section>
      <section anchor="requirement-4-features-needed-to-support-the-use-cases">
        <name>Requirement 4: Features Needed to Support the Use Cases</name>
        <t>Bottleneck structures offer a rich framework to optimize
application performance for a variety of use cases.
In addition to the base requirement to construct the bottleneck
structure graph (see R1A), in this section we enumerate additional
capabilities that must be supported by the ALTO BSG service
to ensure it is effective in helping applications optimize
their performance for each of the supported use cases.</t>
        <ul spacing="normal">
          <li>Requirement 4A (R4A). The ALTO BSG service <bcp14>MUST</bcp14> be able to
compute the effect of network reconfigurations using bottleneck
structure analysis and according to the types described in
<xref target="types_reconfigurations"/>.</li>
        </ul>
        <t>For example, an extended reality (XR) application might need to
choose where to place a containerized instance of
the XR service among a set of possible server racks located
in various edge cloud locations. The application would
query the ALTO BSG service to obtain the projected performance
results of placing the new service instance on each possible
location, allowing it to select the one that would yield
the highest performance.</t>
        <t>The following requirement is necessary to ensure that the
information provided by the BSG service is not stale:</t>
        <t>Requirement 4B (R4B). The BSG service <bcp14>MUST</bcp14> be able to update
the bottleneck structure graph in near-real time, at least
once a minute or less.</t>
        <t>In <xref target="G2-SC"/> it is shown that bottleneck structures can be computed
in a fraction of a session for a production US wide network
with about 100 routers and 500 links.
Thus, the above requirement should be achievable with a good
implementation of the bottleneck structure algorithm <xref target="G2-TREP"/>.</t>
        <!--

# Bottleneck Structure Graph Extension: Overview

TODO

# Specification: Basic Data Types

TODO

# Specification: Service Extensions

TODO

# Compatibility with Other ALTO Services and Extensions

TODO

# General Discussions

TODO

# Examples

TODO

-->

</section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Future versions of this document may extend the base ALTO
protocol, so the Security Considerations <xref target="RFC7285"/> of the
base ALTO protocol fully apply when this proposed extension
is provided by an ALTO server.</t>
      <t>The Bottleneck Structure Graph extension requires additional scrutiny
on three security considerations discussed in the base protocol:
Confidentiality of ALTO information (Section 15.3 of <xref target="RFC7285"/>),
potential undesirable guidance from authenticated ALTO information
(Section 15.2 of <xref target="RFC7285"/>), and availability of ALTO service
(Section 15.5 of <xref target="RFC7285"/>).</t>
      <t>For confidentiality of ALTO information, a network operator should be
aware that this extension may introduce a new risk:
As the Bottleneck Structure information may reveal more fine-grained
internal network structures than the base protocol, an attacker may
identify the bottleneck link and start a distributed denial-of-service
(DDoS) attack involving minimal flows to conduct in-network
congestion. Given the potential risk of leaking sensitive
information, the BSG extension is mainly applicable in
scenarios where:</t>
      <ul spacing="normal">
        <li>The properties of the Bottleneck Structure Graph
do not impose security risks to the ALTO service provider, e.g., by
not carrying sensitive information.</li>
        <li>The ALTO server and client have
established a reliable trust relationship, for example, operated in
the same administrative domain, or managed by business partners with
legal contracts and proper authentication and privacy protocols.</li>
        <li>The ALTO server implements protection mechanisms to reduce
information exposure or obfuscate the real
information. Implementations involving reduction or
obfuscation of the Bottleneck Structure information <bcp14>SHOULD</bcp14> consider
reduction/obfuscation mechanisms that can preserve the integrity of
ALTO information, for example, by using minimal feasible region
compression algorithms <xref target="NOVA"/> or obfuscation protocols
<xref target="MERCATOR">RESA</xref>. We note that these obfuscation methods are
experimental and their practical applicability to
the generic capability provided by this extension is not fully
assessed.</li>
      </ul>
      <t>We note that for operators that are sensitive about disclosing
flow-level information (even if it is anonymized), then
they <bcp14>SHOULD</bcp14> consider using the Path Gradient Graph (PGG) or
the QoS-Path Gradient Graph (Q-PGG) since these objects provide
the additional security advantage of hiding flow-level
information from the graph.</t>
      <t>For undesirable guidance, the ALTO server must be aware that,
if information reduction/obfuscation methods are implemented,
they may lead to potential misleading information from
Authenticated ALTO Information. In such cases, the Protection
Strategies described in Section 15.2.2 of <xref target="RFC7285"/> <bcp14>MUST</bcp14> be considered.</t>
      <t>For availability of ALTO service, an ALTO server should be cognizant
that using Bottleneck Structures might have a new risk: frequently
querying the BSG service might consume intolerable amounts of
computation and storage on the server side.
For example, if an ALTO server implementation dynamically computes
the Bottleneck Structure for each request, the BSG service
may become an entry point for denial-of-service attacks on the
availability of an ALTO server.</t>
      <t>To mitigate this risk, an ALTO server may consider using
optimizations such as precomputation-and-projection mechanisms
<xref target="MERCATOR"/> to reduce the overhead for processing each query.
An ALTO server may also protect itself from malicious clients by
monitoring the behaviors of clients and stopping serving clients with
suspicious behaviors (e.g., sending requests at a high frequency).</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>Future versions of this document may register new entries
to the ALTO Cost Metric Registry, the ALTO Cost Mode Registry,
the ALTO Domain Entity Type Registry and the
ALTO Entity Property Type Registry.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC7285">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Protocol</title>
            <author fullname="R. Alimi" initials="R." role="editor" surname="Alimi">
              <organization/>
            </author>
            <author fullname="R. Penno" initials="R." role="editor" surname="Penno">
              <organization/>
            </author>
            <author fullname="Y. Yang" initials="Y." role="editor" surname="Yang">
              <organization/>
            </author>
            <author fullname="S. Kiesel" initials="S." surname="Kiesel">
              <organization/>
            </author>
            <author fullname="S. Previdi" initials="S." surname="Previdi">
              <organization/>
            </author>
            <author fullname="W. Roome" initials="W." surname="Roome">
              <organization/>
            </author>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov">
              <organization/>
            </author>
            <author fullname="R. Woundy" initials="R." surname="Woundy">
              <organization/>
            </author>
            <date month="September" year="2014"/>
            <abstract>
              <t>Applications using the Internet already have access to some topology information of Internet Service Provider (ISP) networks.  For example, views to Internet routing tables at Looking Glass servers are available and can be practically downloaded to many network application clients.  What is missing is knowledge of the underlying network topologies from the point of view of ISPs.  In other words, what an ISP prefers in terms of traffic optimization -- and a way to distribute it.</t>
              <t>The Application-Layer Traffic Optimization (ALTO) services defined in this document provide network information (e.g., basic network location structure and preferences of network paths) with the goal of modifying network resource consumption patterns while maintaining or improving application performance.  The basic information of ALTO is based on abstract maps of a network.  These maps provide a simplified view, yet enough information about a network for applications to effectively utilize them.  Additional services are built on top of the maps.</t>
              <t>This document describes a protocol implementing the ALTO services. Although the ALTO services would primarily be provided by ISPs, other entities, such as content service providers, could also provide ALTO services.  Applications that could use the ALTO services are those that have a choice to which end points to connect.  Examples of such applications are peer-to-peer (P2P) and content delivery networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7285"/>
          <seriesInfo name="DOI" value="10.17487/RFC7285"/>
        </reference>
        <reference anchor="RFC8402">
          <front>
            <title>Segment Routing Architecture</title>
            <author fullname="C. Filsfils" initials="C." role="editor" surname="Filsfils">
              <organization/>
            </author>
            <author fullname="S. Previdi" initials="S." role="editor" surname="Previdi">
              <organization/>
            </author>
            <author fullname="L. Ginsberg" initials="L." surname="Ginsberg">
              <organization/>
            </author>
            <author fullname="B. Decraene" initials="B." surname="Decraene">
              <organization/>
            </author>
            <author fullname="S. Litkowski" initials="S." surname="Litkowski">
              <organization/>
            </author>
            <author fullname="R. Shakir" initials="R." surname="Shakir">
              <organization/>
            </author>
            <date month="July" year="2018"/>
            <abstract>
              <t>Segment Routing (SR) leverages the source routing paradigm.  A node steers a packet through an ordered list of instructions, called "segments".  A segment can represent any instruction, topological or service based.  A segment can have a semantic local to an SR node or global within an SR domain.  SR provides a mechanism that allows a flow to be restricted to a specific topological path, while maintaining per-flow state only at the ingress node(s) to the SR domain.</t>
              <t>SR can be directly applied to the MPLS architecture with no change to the forwarding plane.  A segment is encoded as an MPLS label.  An ordered list of segments is encoded as a stack of labels.  The segment to process is on the top of the stack.  Upon completion of a segment, the related label is popped from the stack.</t>
              <t>SR can be applied to the IPv6 architecture, with a new type of routing header.  A segment is encoded as an IPv6 address.  An ordered list of segments is encoded as an ordered list of IPv6 addresses in the routing header.  The active segment is indicated by the Destination Address (DA) of the packet.  The next active segment is indicated by a pointer in the new routing header.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8402"/>
          <seriesInfo name="DOI" value="10.17487/RFC8402"/>
        </reference>
        <reference anchor="RFC8896">
          <front>
            <title>Application-Layer Traffic Optimization (ALTO) Cost Calendar</title>
            <author fullname="S. Randriamasy" initials="S." surname="Randriamasy">
              <organization/>
            </author>
            <author fullname="R. Yang" initials="R." surname="Yang">
              <organization/>
            </author>
            <author fullname="Q. Wu" initials="Q." surname="Wu">
              <organization/>
            </author>
            <author fullname="L. Deng" initials="L." surname="Deng">
              <organization/>
            </author>
            <author fullname="N. Schwan" initials="N." surname="Schwan">
              <organization/>
            </author>
            <date month="November" year="2020"/>
            <abstract>
              <t>This document is an extension to the base Application-Layer Traffic Optimization (ALTO) protocol.  It extends the ALTO cost information service so that applications decide not only 'where' to connect but also 'when'.  This is useful for applications that need to perform bulk data transfer and would like to schedule these transfers during an off-peak hour, for example.  This extension introduces the ALTO Cost Calendar with which an ALTO Server exposes ALTO cost values in JSON arrays where each value corresponds to a given time interval.  The time intervals, as well as other Calendar attributes, are specified in the Information Resources Directory and ALTO Server responses.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8896"/>
          <seriesInfo name="DOI" value="10.17487/RFC8896"/>
        </reference>
        <reference anchor="I-D.ietf-alto-path-vector">
          <front>
            <title>An ALTO Extension: Path Vector</title>
            <author fullname="Kai Gao" initials="K." surname="Gao">
              <organization>Sichuan University</organization>
            </author>
            <author fullname="Young Lee" initials="Y." surname="Lee">
              <organization>Samsung</organization>
            </author>
            <author fullname="Sabine Randriamasy" initials="S." surname="Randriamasy">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Y. Richard Yang" initials="Y. R." surname="Yang">
              <organization>Yale University</organization>
            </author>
            <author fullname="Jingxuan Zhang" initials="J." surname="Zhang">
              <organization>Tongji University</organization>
            </author>
            <date day="20" month="March" year="2022"/>
            <abstract>
              <t>   This document is an extension to the base Application-Layer Traffic
   Optimization (ALTO) protocol.  It extends the ALTO Cost Map and ALTO
   Property Map services so that an application can decide which
   endpoint(s) to connect based on not only numerical/ordinal cost
   values but also fine-grained abstract information of the paths.  This
   is useful for applications whose performance is impacted by specified
   components of a network on the end-to-end paths, e.g., they may infer
   that several paths share common links and prevent traffic bottlenecks
   by avoiding such paths.  This extension introduces a new abstraction
   called Abstract Network Element (ANE) to represent these components
   and encodes a network path as a vector of ANEs.  Thus, it provides a
   more complete but still abstract graph representation of the
   underlying network(s) for informed traffic optimization among
   endpoints.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-alto-path-vector-25"/>
        </reference>
        <reference anchor="I-D.ietf-alto-performance-metrics">
          <front>
            <title>ALTO Performance Cost Metrics</title>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <author fullname="Y. Richard Yang" initials="Y. R." surname="Yang">
              <organization>Yale University</organization>
            </author>
            <author fullname="Young Lee" initials="Y." surname="Lee">
              <organization>Samsung</organization>
            </author>
            <author fullname="Dhruv Dhody" initials="D." surname="Dhody">
              <organization>Huawei</organization>
            </author>
            <author fullname="Sabine Randriamasy" initials="S." surname="Randriamasy">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Luis M. Contreras" initials="L. M." surname="Contreras">
              <organization>Telefonica</organization>
            </author>
            <date day="21" month="March" year="2022"/>
            <abstract>
              <t>   The cost metric is a basic concept in Application-Layer Traffic
   Optimization (ALTO), and different applications may use different
   types of cost metrics.  Since the ALTO base protocol (RFC 7285)
   defines only a single cost metric (namely, the generic "routingcost"
   metric), if an application wants to issue a cost map or an endpoint
   cost request in order to identify a resource provider that offers
   better performance metrics (e.g., lower delay or loss rate), the base
   protocol does not define the cost metric to be used.

   This document addresses this issue by extending the specification to
   provide a variety of network performance metrics, including network
   delay, delay variation (a.k.a, jitter), packet loss rate, hop count,
   and bandwidth.

   There are multiple sources (e.g., estimation based on measurements or
   service-level agreement) to derive a performance metric.  This
   document introduces an additional "cost-context" field to the ALTO
   "cost-type" field to convey the source of a performance metric.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-alto-performance-metrics-28"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="G2-SIGMETRICS">
          <front>
            <title>On the Bottleneck Structure of Congestion-Controlled Networks</title>
            <author initials="J." surname="Ros-Giralt" fullname="Jordi Ros-Giralt">
              <organization>Reservoir Labs / Qualcomm</organization>
            </author>
            <author initials="A." surname="Bohara">
              <organization/>
            </author>
            <author initials="S." surname="Yellamraju">
              <organization/>
            </author>
            <author initials="H." surname="Langston">
              <organization/>
            </author>
            <author initials="R." surname="Lethin">
              <organization/>
            </author>
            <author initials="Y." surname="Jiang">
              <organization/>
            </author>
            <author initials="L." surname="Tassiulas">
              <organization/>
            </author>
            <author initials="J." surname="Li">
              <organization/>
            </author>
            <author initials="Y." surname="Tan">
              <organization/>
            </author>
            <author initials="M." surname="Veeraraghavan">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="ACM SIGMETRICS" value=""/>
        </reference>
        <reference anchor="G2-SIGCOMM">
          <front>
            <title>Designing data center networks using bottleneck structures</title>
            <author initials="J." surname="Ros-Giralt" fullname="Jordi Ros-Giralt">
              <organization>Reservoir Labs</organization>
            </author>
            <author initials="N." surname="Amsel">
              <organization/>
            </author>
            <author initials="S." surname="Yellamraju">
              <organization/>
            </author>
            <author initials="J." surname="Ezick">
              <organization/>
            </author>
            <author initials="R." surname="Lethin">
              <organization/>
            </author>
            <author initials="Y." surname="Jiang">
              <organization/>
            </author>
            <author initials="A." surname="Feng">
              <organization/>
            </author>
            <author initials="L." surname="Tassiulas">
              <organization/>
            </author>
            <author initials="Z." surname="Wu">
              <organization/>
            </author>
            <author initials="K." surname="Bergman">
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="ACM SIGCOMM" value=""/>
        </reference>
        <reference anchor="G2-TREP">
          <front>
            <title>A Quantitative Theory of Bottleneck Structures for Data Networks</title>
            <author initials="J." surname="Ros-Giralt" fullname="Jordi Ros-Giralt">
              <organization>Reservoir Labs</organization>
            </author>
            <author initials="N." surname="Amsel">
              <organization/>
            </author>
            <author initials="S." surname="Yellamraju">
              <organization/>
            </author>
            <author initials="J." surname="Ezick">
              <organization/>
            </author>
            <author initials="R." surname="Lethin">
              <organization/>
            </author>
            <author initials="Y." surname="Jiang">
              <organization/>
            </author>
            <author initials="A." surname="Feng">
              <organization/>
            </author>
            <author initials="L." surname="Tassiulas">
              <organization/>
            </author>
            <author initials="Z." surname="Wu">
              <organization/>
            </author>
            <author initials="K." surname="Bergman">
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="Reservoir Labs (Qualcomm) Technical Report" value=""/>
        </reference>
        <reference anchor="G2-SC">
          <front>
            <title>Computing Bottleneck Structures at Scale for High-Precision Network Performance Analysis</title>
            <author initials="N." surname="Amsel" fullname="Noah Amsel">
              <organization>Reservoir Labs</organization>
            </author>
            <author initials="J." surname="Ros-Giralt">
              <organization/>
            </author>
            <author initials="S." surname="Yellamraju">
              <organization/>
            </author>
            <author initials="B." surname="von Hoffe">
              <organization/>
            </author>
            <author initials="R." surname="Lethin">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="IEEE International Workshop on Innovating the Network for Data Intensive Science (INDIS), Supercomputing" value=""/>
        </reference>
        <reference anchor="LORENZ">
          <front>
            <title>Does the flap of a butterfly's wings in Brazil set off a tornado in Texas?</title>
            <author initials="E." surname="Lorenz">
              <organization/>
            </author>
            <date year="1972"/>
          </front>
          <seriesInfo name="American Association for the Advancement of Science, 139th Meeting" value=""/>
        </reference>
        <reference anchor="GALLAGER">
          <front>
            <title>Data Networks</title>
            <author initials="R." surname="Gallager">
              <organization/>
            </author>
            <author initials="D." surname="Bertsekas">
              <organization/>
            </author>
            <date year="1992"/>
          </front>
        </reference>
        <reference anchor="B4-SIGCOMM">
          <front>
            <title>B4: Experience with a Globally-Deployed Software Defined WAN</title>
            <author initials="S." surname="Jain et al">
              <organization/>
            </author>
            <date year="2013"/>
          </front>
          <seriesInfo name="ACM SIGCOMM" value=""/>
        </reference>
        <reference anchor="BE-SIGCOMM">
          <front>
            <title>BwE: Flexible, Hierarchical Bandwidth Allocation for WAN Distributed Computing</title>
            <author initials="A." surname="Kumar et al">
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="ACM SIGCOMM" value=""/>
        </reference>
        <reference anchor="SH-SIGCOMM">
          <front>
            <title>Cost-effective capacity provisioning in wide area networks with Shoofly</title>
            <author initials="R." surname="Singh et al">
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="ACM SIGCOMM" value=""/>
        </reference>
        <reference anchor="PETERSON">
          <front>
            <title>5G Mobile Networks: A Systems Approach</title>
            <author initials="L." surname="Peterson">
              <organization/>
            </author>
            <author initials="O." surname="Sunay">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="Open Networking Foundation" value=""/>
        </reference>
        <reference anchor="MMSYS" target="https://2021.acmmmsys.org/rtc_challenge.php">
          <front>
            <title>Bandwidth Estimation for Real-Time Communications</title>
            <author>
              <organization/>
            </author>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="BE-ONL" target="https://datatracker.ietf.org/meeting/112/materials/slides-112-alto-bandwidth-estimation-service-00">
          <front>
            <title>Bandwidth Estimation on OpenNetLab</title>
            <author>
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="IETF Plenary 112, IETF ALTO WG" value=""/>
        </reference>
        <reference anchor="FLOWDIR">
          <front>
            <title>Steering Hyper-Giants' Traffic at Scale</title>
            <author initials="E." surname="Pujol" fullname="Enric Pujol">
              <organization>BENOCS</organization>
            </author>
            <author initials="I." surname="Poese">
              <organization/>
            </author>
            <author initials="J." surname="Zerwas">
              <organization/>
            </author>
            <author initials="G." surname="Smaragdakis">
              <organization/>
            </author>
            <author initials="A." surname="Feldmann">
              <organization/>
            </author>
            <date year="2019"/>
          </front>
          <seriesInfo name="ACM CoNEXT" value=""/>
        </reference>
        <reference anchor="JSP-INFOCOM">
          <front>
            <title>Joint Service Placement and Request Routing in Multi-cell Mobile Edge Computing Networks</title>
            <author initials="D." surname="Poularakis et al">
              <organization>Yale University</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="NOVA" target="https://doi.org/10.1109/IWQoS.2017.7969117">
          <front>
            <title>An objective-driven on-demand network abstraction for adaptive applications</title>
            <author initials="K." surname="Gao">
              <organization/>
            </author>
            <author initials="Q." surname="Xiang">
              <organization/>
            </author>
            <author initials="X." surname="Wang">
              <organization/>
            </author>
            <author initials="Y." surname="Yang">
              <organization/>
            </author>
            <author initials="J." surname="Bi">
              <organization/>
            </author>
            <date year="2019"/>
          </front>
          <seriesInfo name="IEEE/ACM" value="IEEE/ACM Transactions on Networking (TON) Vol 27, no. 2 (2019): 805-818."/>
        </reference>
        <reference anchor="MERCATOR" target="https://doi.org/10.1109/JSAC.2019.2927073">
          <front>
            <title>Toward Fine- Grained, Privacy-Preserving, Efficient Multi-Domain Network Resource Discovery</title>
            <author initials="Q." surname="Xiang">
              <organization/>
            </author>
            <author initials="J." surname="Zhang">
              <organization/>
            </author>
            <author initials="X." surname="Wang">
              <organization/>
            </author>
            <author initials="C." surname="Guok">
              <organization/>
            </author>
            <author initials="F." surname="Le">
              <organization/>
            </author>
            <author initials="J." surname="MacAuley">
              <organization/>
            </author>
            <author initials="H." surname="Newman">
              <organization/>
            </author>
            <author initials="Y." surname="Yang">
              <organization/>
            </author>
            <date year="2019"/>
          </front>
          <seriesInfo name="IEEE/ACM" value="IEEE/ACM IEEE Journal on Selected Areas of Communication 37(8): 1924-1940"/>
        </reference>
        <reference anchor="SINGULARITY-MSFT" target="https://arxiv.org/pdf/2202.07848.pdf">
          <front>
            <title>Singularity: Planet-Scale, Preemptive and Elastic Scheduling of AI Workloads</title>
            <author initials="D." surname="Shukla et al">
              <organization>Microsoft</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TOPOOPT-MIT" target="https://arxiv.org/pdf/2202.00433.pdf">
          <front>
            <title>TOPOOPT: Optimizing the Network Topology for Distributed DNN Training</title>
            <author initials="W." surname="Wang et al">
              <organization>MIT, Facebook, CMU, Telescent</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="FLEXFLOW-STFORD" target="https://arxiv.org/pdf/1807.05358.pdf[">
          <front>
            <title>Beyond Data And Model Parallelism For Deep Neural Networks</title>
            <author initials="Z." surname="Jia et al">
              <organization>Stanford</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <!--
# Acknowledgments
{:numbered="false"}

TODO acknowledge.
-->



  </back>
  <!-- ##markdown-source:
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
R7G9MuEAyf8G8SvFxTIuAQA=

-->

</rfc>
