RFC 9275

An Extension for Application-Layer Traffic Optimization (ALTO): Path Vector

๐Ÿ“… published September 2022, from ietf

Part 1 of 12 ๐ŸŽ€

RFC 9275: An Extension for Application-Layer Traffic Optimization (ALTO): Path Vector ๐Ÿฆ‹

Okay bestie, this is RFC 9275, an Experimental doc from the Internet Engineering Task Force (IETF), published in September 2022 (ISSN 2070-1721) ๐Ÿ’–

The authors are K. Gao (Sichuan University), Y. Lee (Samsung), S. Randriamasy (Nokia Bell Labs), Y. Yang (Yale University), and J. Zhang (Tongji University) ๐Ÿซถ The title block doesn't list anything it obsoletes or updates, so this one stands on its own โœจ

Abstract

Okay so this doc extends the base Application-Layer Traffic Optimization (ALTO) protocol ๐ŸŒธ It upgrades the ALTO cost map and ALTO property map services so an app can pick which endpoint(s) to connect to, and it doesn't just look at numerical or ordinal cost values. It also looks at fine-grained abstract info about the paths themselves ๐Ÿ‘€ This is super useful for apps whose performance depends on specific parts of the network along the end-to-end paths. For example, they can figure out that several paths share common links and dodge traffic bottlenecks by avoiding those paths ๐Ÿšง

The extension adds a brand-new abstraction called the "Abstract Network Element" (ANE) to represent those parts. A network path gets encoded as a vector of ANEs ๐Ÿงš The result is a more complete, but still abstract, graph of the underlying network(s), so traffic optimization among endpoints can be informed and iconic ๐Ÿ’…

Status of This Memo

Not gonna lie, this section is the official "this isn't a standard" disclaimer ๐Ÿ™ˆ This document is not an Internet Standards Track specification. It's published for examination, experimental implementation, and evaluation ๐Ÿงช

It defines an Experimental Protocol for the Internet community, and it's a product of the IETF. It represents the consensus of the IETF community, it got public review, and the Internet Engineering Steering Group (IESG) approved it for publication ๐ŸŽ‰ Not every doc the IESG approves is a candidate for any level of Internet Standard, so see Section 2 of RFC 7841 for the deets ๐Ÿ“š

For the current status, any errata, and how to give feedback, check https://www.rfc-editor.org/info/rfc9275 ๐Ÿ”—

Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved. ๐Ÿ’œ

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as in effect on the date of publication. Please read these carefully, because they describe your rights and restrictions for this document ๐Ÿ“œ Code Components pulled out of this document must include Revised BSD License text, as described in Section 4.e of the Trust Legal Provisions, and they come without warranty, as described in the Revised BSD License โš–๏ธ

Table of Contents

   1.  Introduction
   2.  Requirements Language
   3.  Terminology
   4.  Requirements and Use Cases
     4.1.  Design Requirements
     4.2.  Sample Use Cases
       4.2.1.  Exposing Network Bottlenecks
       4.2.2.  Resource Exposure for CDNs and Service Edges
   5.  Path Vector Extension: Overview
     5.1.  Abstract Network Element (ANE)
       5.1.1.  ANE Entity Domain
       5.1.2.  Ephemeral and Persistent ANEs
       5.1.3.  Property Filtering
     5.2.  Path Vector Cost Type
     5.3.  Multipart Path Vector Response
       5.3.1.  Identifying the Media Type of the Object Root
       5.3.2.  References to Part Messages
   6.  Specification: Basic Data Types
     6.1.  ANE Name
     6.2.  ANE Entity Domain
       6.2.1.  Entity Domain Type
       6.2.2.  Domain-Specific Entity Identifier
       6.2.3.  Hierarchy and Inheritance
       6.2.4.  Media Type of Defining Resource
     6.3.  ANE Property Name
     6.4.  Initial ANE Property Types
       6.4.1.  Maximum Reservable Bandwidth
       6.4.2.  Persistent Entity ID
       6.4.3.  Examples
     6.5.  Path Vector Cost Type
       6.5.1.  Cost Metric: "ane-path"
       6.5.2.  Cost Mode: "array"
     6.6.  Part Resource ID and Part Content ID
   7.  Specification: Service Extensions
     7.1.  Notation
     7.2.  Multipart Filtered Cost Map for Path Vector
       7.2.1.  Media Type
       7.2.2.  HTTP Method
       7.2.3.  Accept Input Parameters
       7.2.4.  Capabilities
       7.2.5.  Uses
       7.2.6.  Response
     7.3.  Multipart Endpoint Cost Service for Path Vector
       7.3.1.  Media Type
       7.3.2.  HTTP Method
       7.3.3.  Accept Input Parameters
       7.3.4.  Capabilities
       7.3.5.  Uses
       7.3.6.  Response
   8.  Examples
     8.1.  Sample Setup
     8.2.  Information Resource Directory
     8.3.  Multipart Filtered Cost Map
     8.4.  Multipart Endpoint Cost Service Resource
     8.5.  Incremental Updates
     8.6.  Multi-Cost
   9.  Compatibility with Other ALTO Extensions
     9.1.  Compatibility with Legacy ALTO Clients/Servers
     9.2.  Compatibility with Multi-Cost Extension
     9.3.  Compatibility with Incremental Update Extension
     9.4.  Compatibility with Cost Calendar Extension
   10. General Discussion
     10.1.  Constraint Tests for General Cost Types
     10.2.  General Multi-Resource Query
   11. Security Considerations
   12. IANA Considerations
     12.1.  "ALTO Cost Metrics" Registry
     12.2.  "ALTO Cost Modes" Registry
     12.3.  "ALTO Entity Domain Types" Registry
     12.4.  "ALTO Entity Property Types" Registry
       12.4.1.  New ANE Property Type: Maximum Reservable Bandwidth
       12.4.2.  New ANE Property Type: Persistent Entity ID
   13. References
     13.1.  Normative References
     13.2.  Informative References
   Acknowledgments
   Authors' Addresses

1. Introduction โœจ

Network performance metrics are crucial for assessing the Quality of Experience (QoE) of apps, so they matter a LOT ๐Ÿ“Š The Application-Layer Traffic Optimization (ALTO) protocol lets Internet Service Providers (ISPs) give guidance to overlay applications, such as the topological distances between different end hosts ๐Ÿ—บ๏ธ With that, overlay apps can improve their perceived QoE by orchestrating their traffic so it uses the resources in the underlying network infrastructure better ๐Ÿฆ‹

The existing ALTO cost map (Section 11.2.3 of [RFC7285]) and Endpoint Cost Service (Section 11.5 of [RFC7285]) only give cost info for an end-to-end path defined by its <source, destination> endpoints. The base protocol [RFC7285] lets these services expose the topological distances of end-to-end paths ๐Ÿ“ Plenty of extensions try to level them up, like expressing other performance metrics [ALTO-PERF-METRICS], querying multiple costs at once [RFC8189], and getting time-varying values [RFC8896] ๐Ÿ”ฅ

Numerical or ordinal cost values for end-to-end paths, as the existing extensions provide, are enough to optimize the QoE of many overlay apps ๐Ÿ’ฏ But some overlay apps also depend on the properties of particular components along the paths. For example, job completion time is a major QoE metric for a large-scale data analytics app, and it gets hit by shared bottleneck links inside the carrier network, since link capacity can affect the rate of data input and output for the job ๐Ÿ˜ญ The doc calls these components of a network Abstract Network Elements (ANEs) ๐Ÿงฉ

Predicting this info can get super complex without help from ISPs ๐Ÿคฏ For instance, [BOXOPT] has shown that finding the optimal bandwidth reservation for multiple flows can be NP-hard without more information than whether a reservation succeeds ๐Ÿ’€ With proper guidance from the ISP, an overlay app may be able to schedule its traffic for better QoE ๐Ÿ’– Meanwhile, it can also help ISPs if apps avoid using bottlenecks or hammering the network with badly scheduled traffic ๐Ÿซถ

Despite the claimed benefits, ISPs aren't likely to expose raw details about their network paths. First, ISPs have requirements to hide their network topologies. Second, these details may increase volume and computation overhead. And last, apps don't necessarily need all the network path details, and they're likely not able to understand them ๐Ÿ™ˆ

So it's beneficial for both ISPs and apps if an ALTO server gives ALTO clients an "abstract network state." That state gives apps the info they need, while hiding network complexity and confidential info ๐Ÿ•ต๏ธโ€โ™€๏ธ An "abstract network state" is a selected set of abstract representations of the ANEs traversed by the paths between <source, destination> pairs, combined with properties of those ANEs that are relevant to the overlay apps' QoE ๐ŸŒˆ Both the app (through its ALTO client) and the ISP (through the ALTO server) can get better confidentiality and resource utilization by abstracting the relevant ANEs appropriately ๐Ÿ’… Server scalability also improves when ANEs and their properties come back in a single response โญ

This document extends the ALTO base protocol [RFC7285] so an ALTO server can convey "abstract network state" for paths defined by their <source, destination> pairs ๐ŸŽ€ To do this, it introduces a new cost type called a "Path Vector," following the cost metric registration specified in [RFC7285] and the updated cost mode registration specified in [RFC9274] ๐ŸŒธ A Path Vector is an array of identifiers, and each identifier names an ANE that can be associated with various properties ๐Ÿงš The associations between ANEs and their properties are encoded in an ALTO information resource called the "entity property map," which is specified in [RFC9240] ๐Ÿ—‚๏ธ

For better confidentiality, this document tries to minimize information exposure from an ALTO server when it provides Path Vector services ๐Ÿ”’ In particular, it enables the capability, and it also recommends that 1) ANEs be constructed on demand and 2) an ANE only be associated with properties that an ALTO client requested ๐Ÿ’œ A Path Vector response involves two ALTO maps: the cost map, which holds the Path Vector results, and the up-to-date entity property map, which holds the properties requested for these ANEs ๐Ÿ“ฆ To enforce consistency and improve server scalability, this document uses the "multipart/related" content type defined in [RFC2387] to return both maps in a single response ๐Ÿฆ‹

A single ISP may not know the full Internet paths between arbitrary endpoints, so this document is mainly applicable when:

  • there is a single ISP between the requested source and destination Provider-defined Identifiers (PIDs) or endpoints, for example ISP-hosted Content Delivery Network (CDN) / edge, tenant interconnection in a single public cloud platform, etc., or
  • the Path Vectors are generated from end-to-end measurement data.
Translation: this is mostly for setups where one ISP sees the whole path, or where the path info comes from actual end-to-end measurements ๐Ÿ“ก

2. Requirements Language ๐Ÿ’…

Here's the BCP 14 part, which tells you how to read the requirement words. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFD2119] [RFC8174] when, and only when, they appear in all capitals, as shown here ๐Ÿ™Œ

Only the all-caps versions count as BCP 14 keywords, so lowercase words like "must" or "may" are just regular English โœจ

3. Terminology โœจ

okay so bestie, this section is where we pin down the vocab we're gonna use the whole way through, and it's lowkey so important ๐Ÿซถ This document builds on the ALTO base protocol [RFC7285] and the entity property map extension [RFC9240], so all the terms from those are still in play. On top of that, we've got a few new ones of our own ๐Ÿฆ‹

Abstract Network Element (ANE): an abstract representation of a component in a network that handles data packets and whose properties can potentially have an impact on the end-to-end performance of traffic. An ANE can be a physical device like a router, a link, or an interface ๐Ÿ”Œ, or an aggregation of devices like a subnetwork or a data center ๐Ÿข.

The definition of an ANE is giving network element vibes from [RFC2216], because they both abstractly represent specific components of a network ๐Ÿ’œ. The difference is how they pick those components. A network element has to be capable of exercising QoS control, while an ANE just has to have an impact on end-to-end performance ๐ŸŒธ. Less strict, more vibes.

ANE name: a string that uniquely identifies an ANE in a specific scope ๐ŸŽ€. An ANE can be built ahead of time or on demand based on what's been requested, so different ANEs may only be valid within a particular scope, either ephemeral or persistent. Within each scope, an ANE is uniquely identified by an ANE name, as defined in Section 6.1. Also, and this is important bestie, an ALTO client must not assume that ANEs in different scopes but with the same ANE name refer to the same component(s) of the network ๐Ÿšซ Same name, different scope, different thing. Don't mix them up!

Path Vector (or ANE Path Vector): a JSON array of ANE names ๐Ÿงš. It's a generalization of a BGP path vector. A standard BGP path vector (Section 5.1.2 of [RFC4271]) specifies a sequence of Autonomous Systems (ASes) for a destination IP prefix, but the Path Vector in this extension specifies a sequence of ANEs for either 1) a source PID and a destination PID, like in the CostMapData object (Section 11.2.3.6 of [RFC7285]), or 2) a source endpoint and a destination endpoint, like in the EndpointCostMapData object (Section 11.5.1.6 of [RFC7285]) ๐Ÿ’…

Path Vector resource: an ALTO information resource (Section 8.1 of [RFC7285]) that supports the extension defined in this document ๐ŸŒˆ

Path Vector cost type: a special cost type, specified in Section 6.5 ๐Ÿ“. When this cost type shows up in an Information Resource Directory (IRD) entry, it means the information resource is a Path Vector resource. When it shows up in a filtered cost map request or an Endpoint Cost Service request, it means each cost value must be interpreted as a Path Vector ๐Ÿ‘‘

Path Vector request: the POST message sent to an ALTO Path Vector resource ๐Ÿ“ฎ

Path Vector response: refers to the multipart/related message returned by a Path Vector resource ๐Ÿ’Œ


4. Requirements and Use Cases โœจ

4.1. Design Requirements ๐ŸŽ€

okay this part is my fave because it's a real-life example of why this whole extension exists ๐Ÿ˜ญ It walks through how an overlay application can benefit from what this document defines.

Picture an app that controls a bunch of flows. Some of those flows go through shared links and nodes and share bottlenecks ๐Ÿšง. The app wants to schedule traffic across all of them to get better performance, and knowing the constraints on feasible rate allocations would totally help with that scheduling. The catch? Regular cost maps from [RFC7285] can't reveal that info ๐Ÿ’€.

So check out the example network in Figure 1. It has seven switches, "sw1" to "sw7", arranged as a dumbbell topology ๐Ÿฆ‹. "sw1", "sw2", "sw3", and "sw4" are access switches, and "sw5-sw7" make up the backbone. End hosts "eh1" to "eh4" hook up to access switches "sw1" to "sw4", respectively. The bandwidth of link "eh1 -> sw1" and link "sw1 -> sw5" is 150 Mbps, and every other link is 100 Mbps.

                             +-----+
                             |     |
                           --+ sw6 +--
                          /  |     |  \
    PID1 +-----+         /   +-----+   \          +-----+  PID2
    eh1__|     |_       /               \     ____|     |__eh2
192.0.2.2 | sw1 | \   +--|--+         +--|--+ /    | sw2 | 192.0.2.3
          +-----+  \  |     |         |     |/     +-----+
                    \_| sw5 +---------+ sw7 |
    PID3 +-----+   / |     |         |     |\     +-----+  PID4
    eh3__|     |__/  +-----+         +-----+ \____|     |__eh4
192.0.2.4 | sw3 |                                  | sw4 | 192.0.2.5
          +-----+                                  +-----+

bw(eh1--sw1) = bw(sw1--sw5) = 150 Mbps
bw(eh2--sw2) = bw(eh3--sw3) = bw(eh4--sw4) = 100 Mbps
bw(sw1--sw5) = bw(sw3--sw5) = bw(sw2--sw7) = bw(sw4--sw7) = 100 Mbps
bw(sw5--sw6) = bw(sw5--sw7) = bw(sw6--sw7) = 100 Mbps

                    Figure 1: Raw Network Topology

The base ALTO topology abstraction of that network is in Figure 2 ๐Ÿ‘€. Here the cost map gives back a made-up cost type for the available bandwidth between a source and a destination.

                      +----------------------+
             {eh1}    |                      |     {eh2}
             PID1     |                      |     PID2
               +------+                      +------+
                      |                      |
                      |                      |
             {eh3}    |                      |     {eh4}
             PID3     |                      |     PID4
               +------+                      +------+
                      |                      |
                      +----------------------+

             Figure 2: Base Topology Abstraction

Now say the app wants to maximize the total rate of traffic across a set of <source, destination> pairs, like "eh1 -> eh2" and "eh1 -> eh4" ๐Ÿ”ฅ. Let "x" be the transmission rate of "eh1 -> eh2", and "y" be the rate of "eh1 -> eh4". The objective function is:

max(x + y).

With the ALTO cost map, the costs between PID1 and PID2 and between PID1 and PID4 are both 100 Mbps. The client can get a capacity region of:

x <= 100 Mbps
y <= 100 Mbps.

Based on that, the client might think it can hit a maximum total rate of 200 Mbps ๐Ÿ˜ฌ. Nope! That rate is infeasible, because there are only two potential cases:

Case 1: "eh1 -> eh2" and "eh1 -> eh4" take different path segments from "sw5" to "sw7". For example, if "eh1 -> eh2" uses path "eh1 -> sw1 -> sw5 -> sw6 -> sw7 -> sw2 -> eh2" and "eh1 -> eh4" uses path "eh1 -> sw1 -> sw5 -> sw7 -> sw4 -> eh4", then the shared bottleneck links are "eh1 -> sw1" and "sw1 -> sw5". In this case, the capacity region is:

x     <= 100 Mbps
y     <= 100 Mbps
x + y <= 150 Mbps

and the real optimal total rate is 150 Mbps ๐Ÿฅฒ

Case 2: "eh1 -> eh2" and "eh1 -> eh4" take the same path segment from "sw5" to "sw7". For example, if "eh1 -> eh2" uses path "eh1 -> sw1 -> sw5 -> sw7 -> sw2 -> eh2" and "eh1 -> eh4" also uses path "eh1 -> sw1 -> sw5 -> sw7 -> sw4 -> eh4", then the shared bottleneck link is "sw5 -> sw7". In this case, the capacity region is:

x     <= 100 Mbps
y     <= 100 Mbps
x + y <= 100 Mbps

and the real optimal total rate is 100 Mbps ๐Ÿ’…

Honestly, the more accurate and fine-grained the info, the better the app can predict its traffic and organize its resources ๐Ÿง . To get that info, the network has to expose abstract information beyond a simple cost map. Specifically:

  • The ALTO server must expose abstract information about the network paths that the traffic between a source and a destination goes through, beyond a simple numerical value. That lets the overlay app tell Case 1 from Case 2 and compute the optimal total rate ๐ŸŽฏ.
  • The ALTO server must let the client distinguish the common ANE shared by "eh1 -> eh2" and "eh1 -> eh4", for example "eh1--sw1" and "sw1--sw5" in Case 1 ๐Ÿ‘ฏ.
  • The ALTO server must expose abstract information on the properties of the ANEs used by "eh1 -> eh2" and "eh1 -> eh4". For example, a server can either expose the available bandwidth between "eh1--sw1", "sw1--sw5", "sw5--sw7", "sw5--sw6", "sw6--sw7", "sw7--sw2", "sw7--sw4", "sw2--eh2", and "sw4--eh4" in Case 1, or expose three abstract elements "A", "B", and "C", which represent the linear constraints that define the same capacity region in Case 1 โœจ.

Generally speaking, to support multiple flow scheduling, the ALTO framework must be extended to satisfy the following additional requirements (ARs) ๐Ÿ“œ:

  • AR1: An ALTO server must provide the ANEs that are important for assessing the QoE of the overlay application on the path of a <source, destination> pair ๐ŸŒธ.
  • AR2: An ALTO server must provide information to identify how ANEs are shared on the paths of different <source, destination> pairs ๐Ÿ”—.
  • AR3: An ALTO server must provide information on the properties that are important for assessing the QoE of the application for ANEs ๐Ÿ’–.

The extension in this document is the solution that exposes that abstract info ๐ŸŽ.

4.2. Sample Use Cases ๐ŸŒˆ

Multiple flow scheduling is what we used to figure out the additional requirements, but this extension works for a whole bunch of applications ๐Ÿ™Œ. This section highlights some of the reported use cases, so stay tuned, bestie ๐Ÿ’œ.

4.2.1. Exposing Network Bottlenecks โœจ

okay so the big one here is exposing network bottlenecks ๐Ÿ”ฅ Path Vector is super useful for apps doing huge data transfers, because they can get smart about resource limits even when their goals are totally different. The bestie example is the Worldwide LHC Computing Grid (WLCG) (where "LHC" means "Large Hadron Collider") ๐ŸŒˆ, which is the biggest distributed computing collab in research and education. literally iconic ๐Ÿ˜ญ

Figure 3 shows an ALTO Path Vector acting as the go-between for a data analytics system's job optimizer and the network manager ๐Ÿ’…. Here the job optimizer's goal is to minimize the job completion time โฑ๏ธ

So the network-aware job optimizer (e.g., [CLARINET]) takes a query and whips up multiple query execution plans (QEPs) ๐Ÿงš. It can encode those QEPs as Path Vector requests and send them to an ALTO server. The server looks up the routing info for the flows in a QEP and finds links, routers, or middleboxes (e.g., a stateful firewall) that could become bottlenecks for that QEP (e.g., see [NOVA] and [G2] for mechanisms to identify bottleneck links under different settings) ๐Ÿฆ‹. The resource constraint info goes back in a Path Vector response to the ALTO client ๐Ÿ’–

Once the network constraints are in, the job optimizer may pick the QEP with the best job completion time to run ๐ŸŽ€ Now, ngl, the ALTO framework itself does not control traffic ๐Ÿ™ˆ Certain network managers might offer ways to enforce resource guarantees, like on-demand tunnels (e.g., [SWAN]) or demand vectors (e.g., [HUG], [UNICORN]), etc. But those traffic control interfaces and mechanisms are out of scope for this document ๐Ÿซถ

                                     Data schema      Queries
                                          |             |
                                          \             /
       +-------------+                   +-----------------+
       | ALTO Client | <===============> |  Job Optimizer  |
       +-------------+                   +-----------------+
PV          |   ^ PV                                    |
Request     |   | Response                              |
            |   |                  On-demand resource   |
(Potential  |   | (Network         allocation, demand   |
Data        |   | Resource         vectors, etc.        |
Transfers)  |   | Constraints)     (Non-ALTO interfaces)|
            v   |                                       v
       +-------------+                   +-----------------+
       | ALTO Server | <===============> | Network Manager |
       +-------------+                   +-----------------+
                                           /      |      \
                                           |      |      |
                                          WAN    DC1    DC2

            Figure 3: Example Use Case for Data Analytics

Another example is Figure 4 ๐ŸŒธ Picture a network with multiple sites and a non-blocking core network, which means the core links have enough bandwidth that they won't become a bottleneck for the data transfers ๐Ÿ’œ

               Ongoing transfers    New transfer requests
                             \----\        |
                                  |        |
                                  v        v
   +-------------+               +---------------+
   | ALTO Client | <===========> | Data Transfer |
   +-------------+               |   Scheduler   |
     ^ |      ^ | PV Request     +---------------+
     | |      | \--------------\
     | |      \--------------\ |
     | v       PV Response   | v
   +-------------+          +-------------+
   | ALTO Server |          | ALTO Server |
   +-------------+          +-------------+
         ||                       ||
     +---------+              +---------+
     | Network |              | Network |
     | Manager |              | Manager |
     +---------+              +---------+
      .                           .
     .             _~_  __         . . .
    .             (   )(  )             .___
  ~v~v~       /--(         )------------(   )
 (     )-----/    (       )            (     )
  ~w~w~            ~^~^~^~              ~v~v~
 Site 1        Non-blocking Core        Site 2

    Figure 4: Example Use Case for Cross-Site Bottleneck Discovery

So with the Path Vector extension, a site can show the bottlenecks inside its own network, along with necessary info like link capacities, to the ALTO client ๐Ÿง That's way better than handing over the full topology and routing info, or sharing zero bottleneck info at all ๐Ÿ™Œ The bottleneck info can then be used to analyze the impact of adding or removing data transfer flows, e.g., using the framework defined in [G2] ๐Ÿ“Š For example, say hosts "a", "b", and "c" are in Site 1, and hosts "d", "e", and "f" are in Site 2, and there are three flows across the two sites: "a -> b", "c -> d", and "e -> f" (Figure 5) ๐Ÿ“

Site 1:

[c]
 .
 ........................................> [d]
  +---+ 10 Gbps +---+ 10 Gbps +----+ 50 Gbps
  | A |---------| B |---------| GW |--------- Core
  +---+         +---+         +----+
 ...................
 .                 .
 .                 v
[a]               [b]

Site 2:

[d] <........................................ [c]
  +---+ 5 Gbps +---+ 10 Gbps +----+ 20 Gbps
  | X |--------| Y |---------| GW |--------- Core
  +---+        +---+         +----+
             ....................
             .                  .
             .                  v
            [e]                [f]

             Figure 5: Example: Three Flows in Two Sites

For these flows, Site 1 returns:

a: { b: [ane1] },
c: { d: [ane1, ane2, ane3] }

ane1: bw = 10 Gbps (link: A->B)
ane2: bw = 10 Gbps (link: B->GW)
ane3: bw = 50 Gbps (link: GW->Core)

and Site 2 returns:

c: { d: [anei, aneii, aneiii] }
e: { f: [aneiv] }

anei: bw = 5 Gbps (link Y->X)
aneii: bw = 10 Gbps (link GW->Y)
aneiii: bw = 20 Gbps (link Core->GW)
aneiv: bw = 10 Gbps (link Y->GW)

With all that info, the data transfer scheduler can use algorithms like the theory on bottleneck structure [G2] to predict the potential throughput of the flows ๐Ÿง โœจ

4.2.2. Resource Exposure for CDNs and Service Edges ๐ŸŒ

At the time of writing, a big trend in apps is bringing storage and computation closer to end users for better QoE ๐Ÿš€ Think CDNs, augmented reality / virtual reality, and cloud gaming, as reported in various documents (e.g., [SEREDGE] and [MOWIE]) ๐ŸŽฎ ISPs may deploy multiple layers of CDN caches or, more generally, service edges, with different latencies and available resources, including the number of CPU cores, memory, and storage ๐Ÿ’ป

Figure 6 shows a typical edge-cloud setup where memory is measured in gigabytes (GB) and storage is measured in terabytes (TB) ๐ŸŽ€ The "on-premise" edge nodes are closest to the end hosts and have the lowest latency, while the site-radio edge node and access central office (CO) have higher latencies but more available resources ๐ŸŒท

      +-------------+              +----------------------+
      | ALTO Client | <==========> | Application Provider |
      +-------------+              +----------------------+
PV         |   ^ PV                      |
Request    |   | Response                | Resource allocation,
           |   |                         | service establishment,
(End hosts |   | (Edge nodes             | etc.
and cloud  |   | and metrics)            |
servers)   |   |                         |
           v   |                         v
      +-------------+             +---------------------+
      | ALTO Server | <=========> | Cloud-Edge Provider |
      +-------------+             +---------------------+
       ____________________________________/\___________
      /                                                 \
      |           (((o                                  |
                     |
                    /_\             _~_            __   __
  a               (/\_/\)          (   )          (  )~(  )_
   \      /------(      )---------(     )----\\---(          )
   _|_   /        (______)         (___)          (          )
   |_| -/         Site-radio     Access CO       (__________)
  /---\          Edge Node 1         |             Cloud DC
On premise                           |
                           /---------/
           (((o           /
              |          /
 Site-radio  /_\        /
Edge Node 2(/\_/\)-----/
          /(_____)\
   ___   /         \   ---
b--|_| -/           \--|_|--c
  /---\               /---\
On premise          On premise

         Figure 6: Example Use Case for Service Edge Exposure

With the extension defined in this document, an ALTO server can selectively reveal the CDNs and service edges that sit along the paths between different end hosts and/or cloud servers ๐Ÿ—บ๏ธ It can also share their properties, like storage capabilities or Graphics Processing Unit (GPU) capabilities, and available Service Level Agreement (SLA) plans ๐Ÿ’œ Figure 7 shows a query made for sources [a, b] and destinations [b, c, DC] ๐Ÿฆ‹ Each ANE is a service edge, and the properties include access latency, available resources, etc. Just a heads up: those properties are only there for illustration and are not part of this extension ๐Ÿ™ˆ

a: { b: [ane1, ane2, ane3, ane4, ane5],
     c: [ane1, ane2, ane3, ane4, ane6],
     DC: [ane1, ane2, ane3] }
b: { c: [ane5, ane4, ane6], DC: [ane5, ane4, ane3] }

ane1: latency = 5 ms  cpu = 2  memory = 8 GB  storage = 10 TB
(On premise, a)

ane2: latency = 20 ms  cpu = 4  memory = 8 GB  storage = 10 TB
(Site-radio Edge Node 1)

ane3: latency = 100 ms  cpu = 8  memory = 128 GB  storage = 100 TB
(Access CO)

ane4: latency = 20 ms  cpu = 4  memory = 8 GB  storage = 10 TB
(Site-radio Edge Node 2)

ane5: latency = 5 ms  cpu = 2  memory = 8 GB  storage = 10 TB
(On premise, b)

ane6: latency = 5 ms  cpu = 2  memory = 8 GB  storage = 10 TB
(On premise, c)

             Figure 7: Example Service Edge Query Results

With the service edge info, an ALTO client may do better at CDN request routing, or offload functions from the user equipment to the service edge, with considerations in place for customized quality of experience ๐Ÿซถโœจ

5. Path Vector Extension: Overview ๐Ÿฆ‹

okay so this bit is a non-normative overview, which means it's the friendly tour and not the official rulebook ๐Ÿ’… It's assumed you already know the base protocol [RFC7285] and the entity property map extension [RFC9240], so if you don't, go catch up first bestie ๐Ÿงš

To satisfy the additional requirements listed in Section 4.1, this extension:

  1. introduces the concept of an ANE as the abstraction of components in a network whose properties may have an impact on end-to-end performance of the traffic handled by those components,
  2. extends the cost map and Endpoint Cost Service to convey the ANEs traversed by the path of a <source, destination> pair as Path Vectors, and
  3. uses the entity property map to convey the association between the ANEs and their properties.

So basically โœจ an ALTO client can learn about the ANEs that matter for assessing the QoE of different <source, destination> pairs by checking the matching Path Vector value (AR1). It can also (1) spot common ANEs when one ANE shows up in the Path Vectors of multiple <source, destination> pairs (AR2) and (2) pull up the properties of the ANEs by searching the entity property map (AR3). iconic ๐Ÿ‘‘


5.1. Abstract Network Element (ANE)

this extension introduces the ANE as an indirect and network-agnostic way to specify a component, or an aggregation of components, in a network whose properties affect end-to-end performance for application traffic between endpoints ๐ŸŒธ

ANEs let ALTO servers focus on the common properties of totally different types of network components. Like, the throughput of a flow can be constrained by a bunch of different things: the capacity of a physical link, the maximum throughput of a firewall, the reserved bandwidth of an MPLS tunnel, and so on. In the example below, assume the firewall's throughput is 100 Mbps and the capacity for link (A, B) is also 100 Mbps. They both put the same constraint on the total throughput of f1 and f2, so they're identical when treated as an ANE. it's giving consistency ๐ŸŽ€

      f1 |      ^                  f1
         |      |                 ----------------->
       +----------+                +---+     +---+
       | Firewall |                | A |-----| B |
       +----------+                +---+     +---+
         |      |                 ----------------->
         v      | f2               f2

When an ANE is defined by an ALTO server, the server assigns it an identifier, i.e., a string of type ANEName as specified in Section 6.1, plus a set of associated properties ๐Ÿฆ‹

5.1.1. ANE Entity Domain

in this extension, the associations between ANEs and their properties are conveyed in an entity property map. So ANEs must constitute an "entity domain" (Section 5.1 of [RFC9240]), and each ANE property must be an entity property (Section 5.2 of [RFC9240]) ๐Ÿ’–

specifically, this document defines a new entity domain called ane as specified in Section 6.2. Section 6.4 defines two initial property types for the ANE entity domain โœจ

5.1.2. Ephemeral and Persistent ANEs

by design, ANEs are ephemeral and not to be used in further requests to other ALTO resources. More precisely, the corresponding ANE names are no longer valid beyond the scope of a Path Vector response, or the incremental update stream for a Path Vector request. compared with globally unique ANE names, ephemeral ANEs have several benefits, including better privacy for the ISP's internal structure and more flexible ANE computation ๐Ÿ™ˆ

for example, an ALTO server may define an ANE for each aggregated bottleneck link between the sources and destinations specified in the request. For requests with different sources and destinations, the bottlenecks may be different but can safely reuse the same ANE names. The client can still adjust its traffic based on the information, but it's difficult to infer the underlying topology from multiple queries. bestie that's so clever ๐Ÿ˜ญ

however, sometimes an ISP may intend to selectively reveal some "persistent" network components that, as opposed to being ephemeral, have a longer life cycle. For example, an ALTO server may define an ANE for each service edge cluster. Once a client chooses to use a service edge (e.g., by deploying some user-defined functions), it may want to stick with that edge to avoid the complexity of state transition or synchronization, and keep querying the properties of the edge cluster ๐Ÿงš

persistent ANEs are the long-term ones. They have a persistent ID that is registered in a property map together with its properties, so they're not the same vibe as the disposable ephemeral ones ๐ŸŒˆ

This document provides a mechanism to expose such network components as persistent ANEs. A persistent ANE has a persistent ID that is registered in a property map, together with its properties. See Sections 6.2.4 and 6.4.2 for more detailed instructions on how to identify ephemeral ANEs and persistent ANEs ๐Ÿ’œ

5.1.3. Property Filtering

resource-constrained ALTO clients (see Section 4.1.2 of [RFC7285]) may benefit from filtering Path Vector query results at the ALTO server, since an ALTO client may only require a subset of the available properties. literally a glow-up for small devices ๐Ÿซถ

specifically, the available properties for a given resource are announced in the Information Resource Directory (IRD) as a new filtering capability called ane-property-names. The properties a client picks as being of interest are specified in the subsequent Path Vector queries using the ane-property-names filter. The response only includes the selected properties for the ANEs ๐ŸŽ€

the ane-property-names capability for the cost map and the Endpoint Cost Service is specified in Sections 7.2.4 and 7.3.4, respectively. The ane-property-names filter for the cost map and the Endpoint Cost Service is specified in Sections 7.2.3 and 7.3.3 accordingly ๐Ÿ’…


5.2. Path Vector Cost Type

for an ALTO client to correctly interpret the Path Vector, this extension specifies a new cost type called the "Path Vector cost type" ๐Ÿ‘‘

The Path Vector cost type must convey both the interpretation and semantics, in the cost-mode and cost-metric parameters respectively. Unfortunately, a single cost-mode value can't fully specify the interpretation of a Path Vector, since it's a compound data type. For example, in programming languages such as C++, if there existed a JSON array type named JSONArray, a Path Vector would have the type JSONArray<ANEName> ๐Ÿค“

instead of extending the "type system" of ALTO, this document takes a simple and backward-compatible approach ๐Ÿ“ Specifically, the cost-mode of the Path Vector cost type is array, which indicates that the value is a JSON array. Then an ALTO client must check the value of the cost-metric parameter. If the value is ane-path, it means the JSON array should be further interpreted as a path of ANENames. two-step check, very responsible ๐Ÿ’…

The Path Vector cost type is specified in Section 6.5 โœจ


5.3. Multipart Path Vector Response

for a basic ALTO information resource, a response contains only one type of ALTO resource, e.g., a network map, a cost map, or a property map. So only one round of communication is required: an ALTO client sends a request to an ALTO server, and the ALTO server returns a response, as shown in Figure 8 ๐ŸŒธ

            ALTO client                              ALTO server
                 |-------------- Request ---------------->|
                 |<------------- Response ----------------|

               Figure 8: A Typical ALTO Request and Response

the extension defined in this document, on the other hand, involves two types of information resources ๐Ÿ˜ญ Those are Path Vectors, conveyed in an InfoResourceCostMap data component (defined in Section 11.2.3.6 of [RFC7285]) or an InfoResourceEndpointCostMap data component (defined in Section 11.5.1.6 of [RFC7285]), and ANE properties, conveyed in an InfoResourceProperties data component (defined in Section 7.6 of [RFC9240]).

Instead of two consecutive message exchanges, this extension enforces one round of communication ๐Ÿงš The ALTO client must include the source and destination pairs and the requested ANE properties in a single request, and the ALTO server must return a single response containing both the Path Vectors and the properties associated with the ANEs in those Path Vectors, as shown in Figure 9. Since the two parts are bundled together in one response message, their orders are interchangeable. See Sections 7.2.6 and 7.3.6 for details ๐ŸŽ€

            ALTO client                              ALTO server
                 |------------- PV Request -------------->|
                 |<----- PV Response (Cost Map Part) -----|
                 |<--- PV Response (Property Map Part) ---|

          Figure 9: The Path Vector Extension Request and Response

this design is based on the following considerations ๐Ÿซถ

  1. ANEs may be constructed on demand and, potentially, based on the requested properties (see Section 5.1 for more details). If sources and destinations are not in the same request as the properties, an ALTO server either cannot construct ANEs on demand or must wait until both requests are received. so the bundling makes total sense ๐Ÿง 
  2. As ANEs may be constructed on demand, mappings of each ANE to its underlying network devices and resources can be specific to the request. In order to respond to the property map request correctly, an ALTO server must store the mapping of each Path Vector request until the client fully retrieves the property information. This "stateful" behavior may substantially harm server scalability and potentially lead to denial-of-service attacks. ๐Ÿ’€ this part is serious, so don't skip it

One approach for realizing the one-round communication is to define a new media type to contain both objects, but this violates modular design. This document follows the standard-conforming usage of the multipart/related media type as defined in [RFC2387] to combine the objects elegantly ๐Ÿ’œ Path Vectors are encoded in an InfoResourceCostMap data component or an InfoResourceEndpointCostMap data component, and the property map is encoded in an InfoResourceProperties data component. They're encapsulated as parts of a multipart message. This modular composition lets ALTO servers and clients reuse the data models of the existing information resources, which is so smart ๐ŸŒˆ

specifically, this document addresses the following practical issues using multipart/related:

5.3.1. Identifying the Media Type of the Object Root

ALTO uses a media type to indicate the type of an entry in the IRD (e.g., application/alto-costmap+json for the cost map and application/alto-endpointcost+json for the Endpoint Cost Service). Simply using multipart/related as the media type, however, makes it impossible for an ALTO client to identify the type of service provided by related entries. that's the plot twist we needed ๐Ÿ˜ญ

to address this issue, this document uses the type parameter to indicate the object root of a multipart/related message. For a cost map resource, the media-type field in the IRD entry is multipart/related with the parameter type=application/alto-costmap+json. For an Endpoint Cost Service, the parameter is type=application/alto-endpointcost+json โœจ

5.3.2. References to Part Messages ๐Ÿ’Œ

okay so the Path Vector response is a multipart message with TWO different parts, and every part needs its own name tag ๐Ÿท๏ธ or nobody can tell them apart ๐Ÿ˜ญ. Following the design from [RFC8895], this extension requires that an ALTO server give each part of the multipart response a unique identifier. That identifier is called a Part Resource ID (see Section 6.6 for details), and it shows up in the part message's Content-ID header field. Then you just stick the Part Resource ID onto the end of the Path Vector request's identifier, and boom, an ALTO server or client can uniquely identify the Path Vector part or the property map part ๐Ÿฆ‹โœจ.

6. Specification: Basic Data Types ๐ŸŽ€

6.1. ANE Name

An ANE name is encoded as a JSON string with the same format as that of the type PIDName (Section 10.1 of [RFC7285]). So it's basically giving PIDName realness ๐Ÿ’–

The type ANEName is used in this document to mean a string of this format.

6.2. ANE Entity Domain

The ANE entity domain attaches property values to the ANEs in a property map. That means the ANE entity domain always depends on a property map ๐Ÿ—บ๏ธ

Okay, quick heads up, bestie: the word "domain" here does NOT mean a network domain ๐Ÿ™…โ€โ™€๏ธ It's inherited from the entity domain as defined in Section 3.2 of [RFC9240]. The entity domain is the set of valid entities defined by an ALTO information resource (called the "defining information resource").

6.2.1. Entity Domain Type

The entity domain type is "ane" โœจ

6.2.2. Domain-Specific Entity Identifier

The entity identifiers are the ANE names in the associated property map ๐Ÿชช

6.2.3. Hierarchy and Inheritance

No family tree here ๐ŸŒณ There is no hierarchy or inheritance for properties associated with ANEs. Every ANE is its own main character ๐Ÿ‘‘

6.2.4. Media Type of Defining Resource

The defining resource for entity domain type "ane" MUST be a property map, i.e., the media type of defining resources is:

application/alto-propmap+json

Specifically, for ephemeral ANEs that show up in a Path Vector response, their entity domain names MUST be exactly ".ane", and the defining resource of these ANEs is the property map part of the multipart response. Meanwhile, for any persistent ANE whose defining resource is a property map resource, its entity domain name MUST have the format "PROPMAP.ane", where PROPMAP is the resource ID of the defining resource. ๐Ÿง  Persistent entities are "persistent" because an ALTO client can make standalone queries to their defining resource(s) even after the connection to the Path Vector service is closed. Iconic, honestly ๐Ÿฅน

For example, the defining resource of an ephemeral ANE whose entity identifier is ".ane:NET1" is the property map part that contains this identifier. The defining resource of a persistent ANE whose entity identifier is "dc-props.ane:DC1" is the property map with the resource ID "dc-props" ๐Ÿ“

6.3. ANE Property Name

An ANE property name is encoded as a JSON string with the same format as that of an entity property name (Section 5.2.2 of [RFC9240]) ๐Ÿ’…

6.4. Initial ANE Property Types

Two initial ANE property types are specified: "max-reservable-bandwidth" and "persistent-entity-id" ๐ŸŒˆ

Note that these property types do not depend on any information resources. As such, the "EntityPropertyName" parameter MUST only have the EntityPropertyType part. Keep it simple, babe ๐Ÿซถ

6.4.1. Maximum Reservable Bandwidth

The maximum reservable bandwidth property ("max-reservable-bandwidth") stands for the maximum bandwidth that can be reserved for all the traffic that traverses an ANE. The value MUST be encoded as a non-negative numerical cost value as defined in Section 6.1.2.1 of [RFC7285], and the unit is bits per second (bps). If this property is requested by the ALTO client but is not present for an ANE in the server response, it MUST be interpreted as meaning that the property is not defined for the ANE ๐Ÿ™ˆ

This property can be offered in a setting where the ALTO server is part of a network system that provides on-demand resource allocation and the ALTO client is part of a user application. One existing example is [NOVA]: the ALTO server is part of a Software-Defined Networking (SDN) controller and exposes a list of traversed network elements and associated link bandwidth to the client. The encoding in [NOVA] differs from the Path Vector response defined in this document in that the Path Vector part and property map part are placed in the same JSON object. Different vibes, same energy โšก

In such a framework, the ALTO server exposes resource availability information (e.g., reservable bandwidth) to the ALTO client. How the client makes resource requests based on that information, and how the resource allocation is achieved, depend on interfaces between the management system and the users or a higher-layer protocol (e.g., SDN network intents [INTENT-BASED-NETWORKING] or MPLS tunnels). Those are out of scope for this document, so we're not touching them today ๐Ÿ™…โ€โ™€๏ธ

6.4.2. Persistent Entity ID

This document enables the discovery of a persistent ANE by exposing its entity identifier as the persistent entity ID property of an ephemeral ANE in the path vector response. The value of this property is encoded with the EntityID format defined in Section 5.1.3 of [RFC9240] ๐Ÿฆ‹

In this format, the entity ID combines:

  • a defining information resource for the ANE on which a "persistent-entity-id" is queried, which is the property map resource defining the ANE as a persistent entity, together with the properties.
  • the persistent name of the ANE in that property map.

With this format, the client has all the info it needs for further standalone query properties on the persistent ANE ๐ŸŽ

6.4.3. Examples

To illustrate the use of "max-reservable-bandwidth", picture the following network with five nodes. Say the client wants to query the maximum reservable bandwidth from H1 to H2. An ALTO server may split the network into two ANEs: "ane1", which represents the subnetwork with routers A, B, and C; and "ane2", which represents the subnetwork with routers B, D, and E. The maximum reservable bandwidth for "ane1" is 15 Mbps (using path A->C->B), and the maximum reservable bandwidth for "ane2" is 20 Mbps (using path B->D->E) ๐Ÿงฉ

                     20 Mbps  20 Mbps
          10 Mbps +---+   +---+    +---+
             /----| B |---| D |----| E |---- H2
       +---+/     +---+   +---+    +---+
H1 ----| A | 15 Mbps|
       +---+\     +---+
             \----| C |
          15 Mbps +---+

To illustrate the use of "persistent-entity-id", consider the scenario in Figure 6. Service edges usually have looong life cycles ๐Ÿ’€, so they may hold information that isn't specific to the query. That kind of info can be stored in an individual entity property map and accessed later by an ALTO client ๐Ÿ“ฆ

For example, "ane1" in Figure 7 represents the on-premise service edge closest to host "a". Assume the properties of the service edges are provided in an entity property map called "se-props", and the ID of the on-premise service edge is "9a0b55f7-7442-4d56-8a2c-b4cc6a8e3aa1". The "persistent-entity-id" setting for "ane1" will then be "se-props.ane:9a0b55f7-7442-4d56-8a2c-b4cc6a8e3aa1". With this persistent entity ID, an ALTO client may send queries to the "se-props" resource with the entity ID ".ane:9a0b55f7-7442-4d56-8a2c-b4cc6a8e3aa1" ๐ŸŒธ

6.5. Path Vector Cost Type

This document defines a new cost type, referred to as the Path Vector cost type. An ALTO server MUST offer this cost type if it supports the extension defined in this document ๐Ÿ’œ

6.5.1. Cost Metric: "ane-path"

The cost metric "ane-path" indicates that the value of such a cost type conveys an array of ANE names, where each ANE name uniquely represents an ANE traversed by traffic from a source to a destination ๐Ÿ›ค๏ธ

An ALTO client MUST interpret the Path Vector as if the traffic between a source and a destination logically traverses the ANEs in the same order as they appear in the Path Vector. Order matters, fr fr ๐Ÿ‘‘

When the Path Vector procedures defined in this document are in use, an ALTO server using the "ane-path" cost metric and the "array" cost mode (see Section 6.5.2) MUST return as the cost value a JSON array of data type ANEName, and the client MUST also check that each element contained in the array is an ANEName (Section 6.1). Otherwise, the client MUST discard the response, and SHOULD follow the guidance in Section 8.3.4.3 of [RFC7285] to handle the error ๐Ÿ’€

6.5.2. Cost Mode: "array"

The cost mode "array" indicates that every cost value in the response body of a (filtered) cost map or an Endpoint Cost Service MUST be interpreted as a JSON array object. While this cost mode can be applied to all cost metrics, additional specifications will be needed to clarify the semantics of the "array" cost mode when combined with cost metrics other than "ane-path" ๐ŸŽ€

6.6. Part Resource ID and Part Content ID

A Part Resource ID is encoded as a JSON string with the same format as that of the type ResourceID (Section 10.2 of [RFC7285]) ๐Ÿซง

Even though the "client-id" assigned to a Path Vector request and the Part Resource ID MAY contain up to 64 characters by their own definition, their concatenation (see Section 5.3.2) MUST also conform to the same length constraint. The same requirement applies to the resource ID of the Path Vector resource, too. Thus, it is RECOMMENDED to limit the length of the resource ID and client ID related to a Path Vector resource to 31 characters. Keep those IDs short and sweet ๐Ÿฌ

A Part Content ID conforms to the format of "msg-id" as specified in [RFC2387] and [RFC5322]. Specifically, it has the following format:

"<" PART-RESOURCE-ID "@" DOMAIN-NAME ">"
  • PART-RESOURCE-ID: PART-RESOURCE-ID has the same format as the Part Resource ID. It is used to identify whether a part message is a Path Vector or a property map ๐Ÿ”
  • DOMAIN-NAME: DOMAIN-NAME has the same format as "dot-atom-text" as specified in Section 3.2.3 of [RFC5322]. It must be the domain name of the ALTO server ๐ŸŒ

7. Specification: Service Extensions ๐Ÿฆ„

7.1. Notation

This document uses the same syntax and notation as those introduced in Section 8.2 of [RFC7285] to specify the extensions to existing ALTO resources and services ๐Ÿ“

7.2. Multipart Filtered Cost Map for Path Vector

This document introduces a new ALTO resource called the "multipart filtered cost map resource", which lets an ALTO server provide other ALTO resources associated with the cost map resource in the same response. Bundle energy ๐ŸŽ

7.2.1. Media Type

The media type of the multipart filtered cost map resource is "multipart/related", and the required "type" parameter MUST have a value of "application/alto-costmap+json" ๐ŸŒท

7.2.2. HTTP Method

The multipart filtered cost map is requested using the HTTP POST method ๐Ÿ’Œ

7.2.3. Accept Input Parameters โœจ

okay so the input parameters for the multipart filtered cost map get sent in the body of an HTTP POST request ๐Ÿ“ฎ this doc extends those inputs to a filtered cost map, which is a JSON object of type ReqFilteredCostMap from Section 4.1.2 of [RFC8189]. it uses the data format labelled application/alto-costmapfilter+json, and the new object is called PVReqFilteredCostMap ๐ŸŽ€

object {
  [EntityPropertyName ane-property-names<0..*>;]
} PVReqFilteredCostMap : ReqFilteredCostMap;

it has one field:

  • ane-property-names: a list of the selected ANE properties that should show up in the response. every property here MUST match one of the supported ANE properties listed in the resource's ane-property-names capability (Section 7.2.4). if the field isn't there at all, it MUST be interpreted as an empty list ๐Ÿ’…

Example: picture the network in Figure 1 ๐Ÿฆ‹ if an ALTO client wants to check the max-reservable-bandwidth setting between PID1 and PID2, it can send something like this:

POST /costmap/pv HTTP/1.1
Host: alto.example.com
Accept: multipart/related;type=application/alto-costmap+json,
        application/alto-error+json
Content-Length: 212
Content-Type: application/alto-costmapfilter+json

{
  "cost-type": {
    "cost-mode": "array",
    "cost-metric": "ane-path"
  },
  "pids": {
    "srcs": [ "PID1" ],
    "dsts": [ "PID2" ]
  },
  "ane-property-names": [ "max-reservable-bandwidth" ]
}

7.2.4. Capabilities ๐ŸŒธ

the multipart filtered cost map resource builds on the capabilities from Section 4.1.1 of [RFC8189]. its capabilities are a JSON object of type PVFilteredCostMapCapabilities:

object {
  [EntityPropertyName ane-property-names<0..*>;]
} PVFilteredCostMapCapabilities : FilteredCostMapCapabilities;

with this field:

  • ane-property-names: a list of ANE properties that can be returned. if the field isn't present, it MUST be interpreted as an empty list, which means the ALTO server cannot provide any ANE properties ๐Ÿ™ˆ

this extension also adds some extra restrictions for these fields:

  • cost-type-names: this field MUST include the Path Vector cost type, unless a future extension explicitly documents otherwise. that also means the Path Vector cost type MUST be defined in the cost-types of the IRD's meta field ๐Ÿงš
  • cost-constraints: if cost-type-names includes the Path Vector cost type, then cost-constraints MUST be either false or not present, unless a future document specifically says otherwise โœจ
  • testable-cost-type-names (Section 4.1.1 of [RFC8189]): if cost-type-names includes the Path Vector cost type AND testable-cost-type-names is present, the Path Vector cost type MUST NOT be included in testable-cost-type-names unless a future document specifically instructs it ๐Ÿ’€

7.2.5. Uses ๐Ÿ“

this member MUST include the resource ID of the network map that the PIDs are defined on. if this resource supports persistent-entity-id, it MUST also include the defining resources of the persistent ANEs that may show up in the response ๐Ÿ‘‘

7.2.6. Response ๐Ÿ’œ

if the request is invalid, the response MUST indicate an error, using ALTO Protocol error handling as defined in Section 8.5 of [RFC7285] ๐Ÿšซ

the Content-Type header field of the response MUST be multipart/related as defined by [RFC2387], with these parameters:

  • type: this one is mandatory and MUST be application/alto-costmap+json. heads up, [RFC2387] allows parameters both with and without double quotes ๐ŸŽ€
  • start: this one is as defined in [RFC2387] and is optional. if it's present, it MUST have the same value as the Content-ID header field of the Path Vector part ๐Ÿฆ‹
  • boundary: this one is as defined in Section 5.1.1 of [RFC2046] and is mandatory ๐ŸŒˆ

the body of the response MUST consist of two parts ๐Ÿ‘ฏโ€โ™€๏ธ

  • the Path Vector part: its header MUST include Content-ID and Content-Type. the Content-Type MUST be application/alto-costmap+json. the value of Content-ID MUST have the same format as the Part Content ID specified in Section 6.6.

the Path Vector part's body MUST be a JSON object with the same format as the one defined in Section 11.2.3.6 of [RFC7285] when the cost-type field is present in the input parameters. if the multi-cost-types field is present instead, the body MUST be a JSON object with the same format as the one defined in Section 4.1.3 of [RFC8189]. the JSON object MUST include the vtag field in the meta field, which gives the version tag of the returned CostMapData object ๐Ÿท๏ธ

the resource ID of that version tag MUST follow this format:

resource-id '.' part-resource-id

where resource-id is the resource ID of the Path Vector resource, and part-resource-id has the same value as the PART-RESOURCE-ID in the Content-ID of the Path Vector part ๐Ÿงฉ

the meta field MUST also include the dependent-vtags field. it's a single-element array that holds the version tag of the network map that was used, where the network map is specified in the uses attribute of the multipart filtered cost map resource in the IRD ๐Ÿซถ

  • the entity property map part: its header MUST also include Content-ID and Content-Type. the Content-Type MUST be application/alto-propmap+json. the value of Content-ID MUST have the same format as the Part Content ID specified in Section 6.6 ๐ŸŒธ

the body of the entity property map part is a JSON object with the same format as the one defined in Section 7.6 of [RFC9240]. the JSON object MUST include the dependent-vtags field in the meta field. the value of dependent-vtags MUST be an array of VersionTag objects as defined in Section 10.3 of [RFC7285]. the vtag of the Path Vector part MUST be included in dependent-vtags. if persistent-entity-id is requested, the version tags of the dependent resources that may expose the entities in the response MUST also be included ๐Ÿ’–

the PropertyMapData object has one member for each ANEName that shows up in the Path Vector part. an ANEName is an entity identifier that belongs to the self-defined entity domain, as defined in Section 5.1.2.3 of [RFC9240] ๐Ÿ”ฅ

each EntityProps object for an ANE has one member for each property that is BOTH 1) associated with the ANE AND 2) specified in the ane-property-names field of the request. if the Path Vector cost type isn't included in the cost-type field or the multi-cost-type field, then the property-map field MUST be present, and its value MUST be an empty object ({}) ๐Ÿง

a complete and valid response MUST include both the Path Vector part and the property map part in the multipart message. if any part is not present, the client MUST discard the received information and send another request if necessary ๐Ÿ˜ญ

the Path Vector part has the same media type as the type parameter of the multipart response message. it's the root body part as defined in [RFC2387], so it's the element the application processes first ๐Ÿ‘‘. even though the start parameter lets it go anywhere in the part sequence, it is RECOMMENDED that the parts arrive in the same order they're processed. that means the Path Vector part is always first, followed by the property map part. when it's done that way, an ALTO server MAY choose not to set the start parameter, which implies the first part is the object root โœจ

Example: picture the network in Figure 1 again ๐Ÿฆ‹ the response to the example request in Section 7.2.3 looks like this, where "ANE1" stands for the aggregation of all the switches in the network.

HTTP/1.1 200 OK
Content-Length: 911
Content-Type: multipart/related; boundary=example-1;
              type=application/alto-costmap+json

--example-1
Content-ID: <costmap@alto.example.com>
Content-Type: application/alto-costmap+json

{
  "meta": {
    "vtag": {
      "resource-id": "filtered-cost-map-pv.costmap",
      "tag": "fb20b76204814e9db37a51151faaaef2"
    },
    "dependent-vtags": [
      {
        "resource-id": "my-default-networkmap",
        "tag": "75ed013b3cb58f896e839582504f6228"
      }
    ],
    "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" }
  },
  "cost-map": {
    "PID1": { "PID2": [ "ANE1" ] }
  }
}
--example-1
Content-ID: <propmap@alto.example.com>
Content-Type: application/alto-propmap+json

{
  "meta": {
    "dependent-vtags": [
      {
        "resource-id": "filtered-cost-map-pv.costmap",
        "tag": "fb20b76204814e9db37a51151faaaef2"
      }
    ]
  },
  "property-map": {
    ".ane:ANE1": { "max-reservable-bandwidth": 100000000 }
  }
}
--example-1

7.3. Multipart Endpoint Cost Service for Path Vector ๐Ÿฆ‹

this doc brings in a brand-new ALTO resource called the "multipart Endpoint Cost Service" ๐ŸŽ€ it lets an ALTO server send other ALTO resources that are tied to the Endpoint Cost Service resource, all in the same response ๐Ÿ’…

7.3.1. Media Type ๐Ÿ’œ

the media type of the multipart Endpoint Cost Service resource is multipart/related, and its required type parameter MUST have the value application/alto-endpointcost+json ๐Ÿท๏ธ

7.3.2. HTTP Method ๐ŸŒˆ

the multipart Endpoint Cost Service resource gets requested with the HTTP POST method ๐Ÿ“ฎ

7.3.3. Accept Input Parameters โœจ

the input parameters of the multipart Endpoint Cost Service resource get sent in the body of an HTTP POST request. this doc extends those inputs to an Endpoint Cost Service, which is a JSON object of type ReqEndpointCostMap from Section 4.2.2 of [RFC8189]. it uses the data format labelled application/alto-endpointcostparams+json, and the new object is called PVReqEndpointCostMap ๐Ÿงš

object {
  [EntityPropertyName ane-property-names<0..*>;]
} PVReqEndpointCostMap : ReqEndpointCostMap;

with this field:

  • ane-property-names: this doc defines the ane-property-names field in PVReqEndpointCostMap as being the same as in PVReqFilteredCostMap. see Section 7.2.3 ๐Ÿซถ

Example: picture the network in Figure 1 ๐ŸŒธ if an ALTO client wants to check the max-reservable-bandwidth setting between "eh1" and "eh2", it can send this:

POST /ecs/pv HTTP/1.1
Host: alto.example.com
Accept: multipart/related;type=application/alto-endpointcost+json,
        application/alto-error+json
Content-Length: 238
Content-Type: application/alto-endpointcostparams+json

{
  "cost-type": {
    "cost-mode": "array",
    "cost-metric": "ane-path"
  },
  "endpoints": {
    "srcs": [ "ipv4:192.0.2.2" ],
    "dsts": [ "ipv4:192.0.2.18" ]
  },
  "ane-property-names": [ "max-reservable-bandwidth" ]
}

7.3.4. Capabilities ๐Ÿ“

the capabilities of the multipart Endpoint Cost Service resource are a JSON object of type PVEndpointCostCapabilities. that's defined as being the same as PVFilteredCostMapCapabilities, so see Section 7.2.4 ๐ŸŒŸ

7.3.5. Uses ๐ŸŒธ

Okay so, if this resource supports persistent-entity-id, it MUST also include the defining resources of persistent ANEs that may appear in the response. Bestie, that's the link that lets the client find where those persistent entities are defined. ๐Ÿ”—

7.3.6. Response ๐Ÿ’Œ

Okay, error check first: the response MUST indicate an error, using ALTO Protocol error handling as defined in Section 8.5 of [RFC7285], if the request is invalid. So if something's off with the request, the server has to say so properly. ๐Ÿ™…โ€โ™€๏ธ

The Content-Type header field of the response MUST be multipart/related as defined by [RFC2387], with the following parameters:

  • type: The type parameter MUST be application/alto-endpointcost+json and is mandatory.
  • start: The start parameter is as defined in Section 7.2.6.
  • boundary: The boundary parameter is as defined in Section 5.1.1 of [RFC2046] and is mandatory.

The body of the response MUST consist of two parts, and they're both giving main character energy ๐Ÿ‘‘:

  • The Path Vector part MUST include Content-ID and Content-Type in its header. The Content-Type MUST be application/alto-endpointcost+json. The value of Content-ID MUST have the same format as the Part Content ID as specified in Section 6.6.
    • The body of the Path Vector part MUST be a JSON object with the same format as that defined in Section 11.5.1.6 of [RFC7285] when the cost-type field is present in the input parameters, and MUST be a JSON object with the same format as that defined in Section 4.2.3 of [RFC8189] if the multi-cost-types field is present. โœจ
    • The JSON object MUST include the vtag field in the meta field, which provides the version tag of the returned EndpointCostMapData object. ๐Ÿท๏ธ
    • The resource ID of the version tag MUST follow the format of:
resource-id '.' part-resource-id
  • Here, resource-id is the resource ID of the Path Vector resource, and part-resource-id has the same value as the PART-RESOURCE-ID in the Content-ID of the Path Vector part. It's giving matching energy ๐Ÿซถ
  • The entity property map part MUST also include Content-ID and Content-Type in its header. The Content-Type MUST be application/alto-propmap+json. The value of Content-ID MUST have the same format as the Part Content ID as specified in Section 6.6.
    • The body of the entity property map part MUST be a JSON object with the same format as that defined in Section 7.6 of [RFC9240]. The JSON object MUST include the dependent-vtags field in the meta field. ๐Ÿ“ฆ
    • The value of the dependent-vtags field MUST be an array of VersionTag objects as defined by Section 10.3 of [RFC7285]. The vtag of the Path Vector part MUST be included in the dependent-vtags field. If persistent-entity-id is requested, the version tags of the dependent resources that may expose the entities in the response MUST also be included. ๐Ÿงฉ
    • The PropertyMapData object has one member for each ANEName that appears in the Path Vector part, which is an entity identifier belonging to the self-defined entity domain as defined in Section 5.1.2.3 of [RFC9240]. ๐Ÿ—๏ธ
    • The EntityProps object for each ANE has one member for each property that is both 1) associated with the ANE and 2) specified in the ane-property-names field in the request. ๐Ÿ’…
    • If the Path Vector cost type is not included in the cost-type field or the multi-cost-type field, the property-map field MUST be present and the value MUST be an empty object ({}). ๐Ÿ™ˆ

A complete and valid response MUST include both the Path Vector part and the property map part in the multipart message. If any part is not present, the client MUST discard the received information and send another request if necessary. Bestie, no half-baked responses allowed ๐Ÿ’€

The Path Vector part, whose media type is the same as the type parameter of the multipart response message, is the root body part as defined in [RFC2387]. So it's the element that the application processes first ๐Ÿ‘‘. Even though the start parameter allows it to be placed anywhere in the part sequence, it is RECOMMENDED that the parts arrive in the same order as they are processed, i.e., the Path Vector part is always placed as the first part, followed by the property map part. When doing so, an ALTO server MAY choose not to set the start parameter, which implies that the first part is the object root. ๐Ÿงš

Example: Consider the network in Figure 1. The response to the example request in Section 7.3.3 is as follows. ๐Ÿฆ‹

   HTTP/1.1 200 OK
   Content-Length: 899
   Content-Type: multipart/related; boundary=example-1;
                 type=application/alto-endpointcost+json

   --example-1
   Content-ID: <ecs@alto.example.com>
   Content-Type: application/alto-endpointcost+json

   {
     "meta": {
       "vtag": {
         "resource-id": "ecs-pv.ecs",
         "tag": "ec137bb78118468c853d5b622ac003f1"
       },
       "dependent-vtags": [
         {
           "resource-id": "my-default-networkmap",
           "tag": "677fe5f4066848d282ece213a84f9429"
         }
       ],
       "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" }
     },
     "cost-map": {
       "ipv4:192.0.2.2": { "ipv4:192.0.2.18": [ "ANE1" ] }
     }
   }
   --example-1
   Content-ID: <propmap@alto.example.com>
   Content-Type: application/alto-propmap+json

   {
     "meta": {
       "dependent-vtags": [
         {
           "resource-id": "ecs-pv.ecs",
           "tag": "ec137bb78118468c853d5b622ac003f1"
         }
       ]
     },
     "property-map": {
       ".ane:ANE1": { "max-reservable-bandwidth": 100000000 }
     }
   }
   --example-1

8. Examples ๐ŸŽ€

This section lists some examples of Path Vector queries and the corresponding responses. Some long lines are truncated for better readability. Bestie, don't panic about the cut-off lines, it's just for the vibes ๐Ÿ™ˆ

8.1. Sample Setup ๐Ÿ—บ๏ธ

Figure 10 illustrates the network properties and thus the message contents. There are three subnetworks (NET1, NET2, and NET3) and two interconnection links (L1 and L2). It is assumed that each subnetwork has sufficiently large bandwidth to be reserved. โšก

                                         ----- L1
                                        /
            PID1   +----------+ 10 Gbps +----------+    PID3
     192.0.2.0/28+-+ +------+ +---------+          +--+192.0.2.32/28
                   | | MEC1 | |         |          |   2001:db8::3:0/16
                   | +------+ |   +-----+          |
            PID2   |          |   |     +----------+
    192.0.2.16/28+-+          |   |         NET3
                   |          |   | 15 Gbps
                   |          |   |        \
                   +----------+   |         -------- L2
                       NET1       |
                                +----------+
                                | +------+ |   PID4
                                | | MEC2 | +--+192.0.2.48/28
                                | +------+ |   2001:db8::4:0/16
                                +----------+
                                    NET2

                   Figure 10: Examples of ANE Properties

8.2. Information Resource Directory ๐Ÿ“š

To give a comprehensive example of the extension defined in this document, we consider the network in Figure 10. Assume that the ALTO server provides the following information resources:

  • my-default-networkmap: A network map resource that contains the PIDs in the network.
  • filtered-cost-map-pv: A multipart filtered cost map resource for the Path Vector. Exposes the max-reservable-bandwidth property for the PIDs in my-default-networkmap.
  • ane-props: A filtered entity property resource that exposes the information for persistent ANEs in the network.
  • endpoint-cost-pv: A multipart Endpoint Cost Service for the Path Vector. Exposes the max-reservable-bandwidth and persistent-entity-id properties.
  • update-pv: An update stream service that provides the incremental update service for the endpoint-cost-pv service.
  • multicost-pv: A multipart Endpoint Cost Service with both the Multi-Cost extension and Path Vector extension enabled.

Below is the IRD of the example ALTO server. To enable the extension defined in this document, the Path Vector cost type (Section 6.5), represented by path-vector below, is defined in the cost-types of the meta field and is included in the cost-type-names of resources filtered-cost-map-pv and endpoint-cost-pv. ๐ŸŒˆ

   {
     "meta": {
       "cost-types": {
         "path-vector": {
           "cost-mode": "array",
           "cost-metric": "ane-path"
         },
         "num-rc": {
           "cost-mode": "numerical",
           "cost-metric": "routingcost"
         }
       }
     },
     "resources": {
       "my-default-networkmap": {
         "uri": "https://alto.example.com/networkmap",
         "media-type": "application/alto-networkmap+json"
       },
       "filtered-cost-map-pv": {
         "uri": "https://alto.example.com/costmap/pv",
         "media-type": "multipart/related;
                        type=application/alto-costmap+json",
         "accepts": "application/alto-costmapfilter+json",
         "capabilities": {
           "cost-type-names": [ "path-vector" ],
           "ane-property-names": [ "max-reservable-bandwidth" ]
         },
         "uses": [ "my-default-networkmap" ]
       },
       "ane-props": {
         "uri": "https://alto.example.com/ane-props",
         "media-type": "application/alto-propmap+json",
         "accepts": "application/alto-propmapparams+json",
         "capabilities": {
           "mappings": {
             ".ane": [ "cpu" ]
           }
         }
       },
       "endpoint-cost-pv": {
         "uri": "https://alto.exmaple.com/endpointcost/pv",
         "media-type": "multipart/related;
                        type=application/alto-endpointcost+json",
         "accepts": "application/alto-endpointcostparams+json",
         "capabilities": {
           "cost-type-names": [ "path-vector" ],
           "ane-property-names": [
             "max-reservable-bandwidth", "persistent-entity-id"
           ]
         },
         "uses": [ "ane-props" ]
       },
       "update-pv": {
         "uri": "https://alto.example.com/updates/pv",
         "media-type": "text/event-stream",
         "uses": [ "endpoint-cost-pv" ],
         "accepts": "application/alto-updatestreamparams+json",
         "capabilities": {
           "support-stream-control": true
         }
       },
       "multicost-pv": {
         "uri": "https://alto.exmaple.com/endpointcost/mcpv",
         "media-type": "multipart/related;
                        type=application/alto-endpointcost+json",
         "accepts": "application/alto-endpointcostparams+json",
         "capabilities": {
           "cost-type-names": [ "path-vector", "num-rc" ],
           "max-cost-types": 2,
           "testable-cost-type-names": [ "num-rc" ],
           "ane-property-names": [
             "max-reservable-bandwidth", "persistent-entity-id"
           ]
         },
         "uses": [ "ane-props" ]
       }
     }
   }

8.3. Multipart Filtered Cost Map

okay so this example is about asking the "filtered-cost-map-pv" resource for a filtered map, and the answer comes back as a multipart message ๐Ÿ’Œ The request uses the "path-vector" cost type in the "cost-type" field. The "ane-property-names" field is missing, which tells the server the client only wants the Path Vector and not any ANE properties ๐Ÿฆ‹

The response has two parts, and I'm obsessed with how neatly they split:

  • The first part returns the array of data type ANEName for each source and destination pair. There are two ANEs here: "L1" stands for interconnection link L1, and "L2" stands for interconnection link L2 ๐Ÿ”—
  • The second part returns the property map. The properties of the ANE entries are equal to the literal string "{}" (see Section 8.3 of [RFC9240]) ๐Ÿงš
POST /costmap/pv HTTP/1.1
Host: alto.example.com
Accept: multipart/related;type=application/alto-costmap+json,
        application/alto-error+json
Content-Length: 163
Content-Type: application/alto-costmapfilter+json

{
  "cost-type": {
    "cost-mode": "array",
    "cost-metric": "ane-path"
  },
  "pids": {
    "srcs": [ "PID1" ],
    "dsts": [ "PID3", "PID4" ]
  }
}

HTTP/1.1 200 OK
Content-Length: 952
Content-Type: multipart/related; boundary=example-1;
              type=application/alto-costmap+json

--example-1
Content-ID: <costmap@alto.example.com>
Content-Type: application/alto-costmap+json

{
  "meta": {
    "vtag": {
      "resource-id": "filtered-cost-map-pv.costmap",
      "tag": "d827f484cb66ce6df6b5077cb8562b0a"
    },
    "dependent-vtags": [
      {
        "resource-id": "my-default-networkmap",
        "tag": "c04bc5da49534274a6daeee8ea1dec62"
      }
    ],
    "cost-type": {
      "cost-mode": "array",
      "cost-metric": "ane-path"
    }
  },
  "cost-map": {
    "PID1": {
      "PID3": [ "L1" ],
      "PID4": [ "L1", "L2" ]
    }
  }
}
--example-1
Content-ID: <propmap@alto.example.com>
Content-Type: application/alto-propmap+json

{
  "meta": {
    "dependent-vtags": [
      {
        "resource-id": "filtered-cost-map-pv.costmap",
        "tag": "d827f484cb66ce6df6b5077cb8562b0a"
      }
    ]
  },
  "property-map": {
    ".ane:L1": {},
    ".ane:L2": {}
  }
}
--example-1

8.4. Multipart Endpoint Cost Service Resource

this one is a whole glow-up โœจ It shows the request to the "endpoint-cost-pv" resource and the response that comes back. The request uses the "path-vector" cost type in the "cost-type" field, and it asks for two things: the maximum reservable bandwidth ANE property and the persistent entity ID property. It covers two IPv4 source and destination pairs (192.0.2.34 -> 192.0.2.2 and 192.0.2.34 -> 192.0.2.50) and one IPv6 pair (2001:db8::3:1 -> 2001:db8::4:1) ๐Ÿ’…

The response is also multipart, with two parts:

  • The first part returns the array of data type ANEName for each valid source and destination pair. As one can see in Figure 10, the flow 192.0.2.34 -> 192.0.2.2 goes through NET3, L1, and NET1. The flows 192.0.2.34 -> 192.0.2.50 and 2001:db8::3:1 -> 2001:db8::4:1 both go through NET2, L2, and NET3 ๐ŸŒธ
  • The second part returns the requested properties of the ANEs. Picture this: NET1, NET2, and NET3 have plenty of bandwidth, so their "max-reservable-bandwidth" values are set to a super large number (50 Gbps in this case). Meanwhile, there are no prior reservations on L1 and L2, so their "max-reservable-bandwidth" values equal the link capacity (10 Gbps for L1 and 15 Gbps for L2) ๐Ÿซถ

Both NET1 and NET2 have a mobile edge deployed: MEC1 lives in NET1 and MEC2 lives in NET2. The ANEName values for MEC1 and MEC2 are "MEC1" and "MEC2", and their properties can be fetched from the property map "ane-props". So the "persistent-entity-id" property values for NET1 and NET2 are "ane-props.ane:MEC1" and "ane-props.ane:MEC2", respectively ๐Ÿงš

POST /endpointcost/pv HTTP/1.1
Host: alto.example.com
Accept: multipart/related;
        type=application/alto-endpointcost+json,
        application/alto-error+json
Content-Length: 383
Content-Type: application/alto-endpointcostparams+json

{
  "cost-type": {
    "cost-mode": "array",
    "cost-metric": "ane-path"
  },
  "endpoints": {
    "srcs": [
      "ipv4:192.0.2.34",
      "ipv6:2001:db8::3:1"
    ],
    "dsts": [
      "ipv4:192.0.2.2",
      "ipv4:192.0.2.50",
      "ipv6:2001:db8::4:1"
    ]
  },
  "ane-property-names": [
    "max-reservable-bandwidth",
    "persistent-entity-id"
  ]
}

HTTP/1.1 200 OK
Content-Length: 1508
Content-Type: multipart/related; boundary=example-2;
              type=application/alto-endpointcost+json

--example-2
Content-ID: <ecs@alto.example.com>
Content-Type: application/alto-endpointcost+json

{
  "meta": {
    "vtags": {
      "resource-id": "endpoint-cost-pv.ecs",
      "tag": "bb6bb72eafe8f9bdc4f335c7ed3b10822a391cef"
    },
    "cost-type": {
      "cost-mode": "array",
      "cost-metric": "ane-path"
    }
  },
  "endpoint-cost-map": {
    "ipv4:192.0.2.34": {
      "ipv4:192.0.2.2":   [ "NET3", "L1", "NET1" ],
      "ipv4:192.0.2.50":   [ "NET3", "L2", "NET2" ]
    },
    "ipv6:2001:db8::3:1": {
      "ipv6:2001:db8::4:1": [ "NET3", "L2", "NET2" ]
    }
  }
}
--example-2
Content-ID: <propmap@alto.example.com>
Content-Type: application/alto-propmap+json

{
  "meta": {
    "dependent-vtags": [
      {
        "resource-id": "endpoint-cost-pv.ecs",
        "tag": "bb6bb72eafe8f9bdc4f335c7ed3b10822a391cef"
      },
      {
        "resource-id": "ane-props",
        "tag": "bf3c8c1819d2421c9a95a9d02af557a3"
      }
    ]
  },
  "property-map": {
    ".ane:NET1": {
      "max-reservable-bandwidth": 50000000000,
      "persistent-entity-id": "ane-props.ane:MEC1"
    },
    ".ane:NET2": {
      "max-reservable-bandwidth": 50000000000,
      "persistent-entity-id": "ane-props.ane:MEC2"
    },
    ".ane:NET3": {
      "max-reservable-bandwidth": 50000000000
    },
    ".ane:L1": {
      "max-reservable-bandwidth": 10000000000
    },
    ".ane:L2": {
      "max-reservable-bandwidth": 15000000000
    }
  }
}
--example-2

plot twist ๐Ÿ‘€ In situations where the traversal order doesn't really matter, an ALTO server can choose not to follow the physical traversal order strictly. It can even blur that order on purpose, to keep its own privacy or to follow its own policies. For example, a server might aggregate NET1 and L1 into a new ANE called "AGGR1", and aggregate NET2 and L2 into a new ANE called "AGGR2". The "max-reservable-bandwidth" property of "AGGR1" takes the value of L1, which is smaller than that of NET1, while the "persistent-entity-id" property of "AGGR1" takes the value of NET1. The properties of "AGGR2" get worked out in a similar way, and the obfuscated response is shown below ๐Ÿฆ‹

Note that obfuscating Path Vector responses is implementation specific and out of scope for this document. Developers can check out Section 11 for further references ๐Ÿ“š

HTTP/1.1 200 OK
Content-Length: 1333
Content-Type: multipart/related; boundary=example-2;
              type=application/alto-endpointcost+json

--example-2
Content-ID: <ecs@alto.example.com>
Content-Type: application/alto-endpointcost+json

{
  "meta": {
    "vtags": {
      "resource-id": "endpoint-cost-pv.ecs",
      "tag": "bb975862fbe3422abf4dae386b132c1d"
    },
    "cost-type": {
      "cost-mode": "array",
      "cost-metric": "ane-path"
    }
  },
  "endpoint-cost-map": {
    "ipv4:192.0.2.34": {
      "ipv4:192.0.2.2":   [ "NET3", "AGGR1" ],
      "ipv4:192.0.2.50":   [ "NET3", "AGGR2" ]
    },
    "ipv6:2001:db8::3:1": {
      "ipv6:2001:db8::4:1": [ "NET3", "AGGR2" ]
    }
  }
}
--example-2
Content-ID: <propmap@alto.example.com>
Content-Type: application/alto-propmap+json

{
  "meta": {
    "dependent-vtags": [
      {
        "resource-id": "endpoint-cost-pv.ecs",
        "tag": "bb975862fbe3422abf4dae386b132c1d"
      },
      {
        "resource-id": "ane-props",
        "tag": "bf3c8c1819d2421c9a95a9d02af557a3"
      }
    ]
  },
  "property-map": {
    ".ane:AGGR1": {
      "max-reservable-bandwidth": 10000000000,
      "persistent-entity-id": "ane-props.ane:MEC1"
    },
    ".ane:AGGR2": {
      "max-reservable-bandwidth": 15000000000,
      "persistent-entity-id": "ane-props.ane:MEC2"
    },
    ".ane:NET3": {
      "max-reservable-bandwidth": 50000000000
    }
  }
}
--example-2

8.5. Incremental Updates

in this example, an ALTO client subscribes to incremental updates for the multipart Endpoint Cost Service resource "endpoint-cost-pv". It's like signing up for the group chat notifications so you never miss a single update ๐Ÿ””

POST /updates/pv HTTP/1.1
Host: alto.example.com
Accept: text/event-stream
Content-Type: application/alto-updatestreamparams+json
Content-Length: 120

{
  "add": {
    "ecspvsub1": {
      "resource-id": "endpoint-cost-pv",
      "input": <ecs-input>
    }
  }
}

Based on the server-side process defined in [RFC8895], the ALTO server sends the "control-uri" first, using a Server-Sent Event (SSE), and then sends the full response of the multipart message ๐Ÿ’œ

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/event-stream

event: application/alto-updatestreamcontrol+json
data: {"control-uri": "https://alto.example.com/updates/streams/123"}

event: multipart/related;boundary=example-3;
       type=application/alto-endpointcost+json,ecspvsub1
data: --example-3
data: Content-ID: <ecsmap@alto.example.com>
data: Content-Type: application/alto-endpointcost+json
data:
data: <endpoint-cost-map-entry>
data: --example-3
data: Content-ID: <propmap@alto.example.com>
data: Content-Type: application/alto-propmap+json
data:
data: <property-map-entry>
data: --example-3--

when the contents change ๐ŸŒˆ the ALTO server publishes the updates for each node in this tree separately, based on Section 6.7.3 of [RFC8895]. So each piece gets its own little update, like a tiny gossip for each part of the tree ๐Ÿ’–

event: application/merge-patch+json,
   ecspvsub1.ecsmap@alto.example.com
data: <Merge patch for endpoint-cost-map-update>

event: application/merge-patch+json,
   ecspvsub1.propmap@alto.example.com
data: <Merge patch for property-map-update>

8.6. Multi-Cost

okay so this one is the big boss example ๐Ÿ’… It shows a request to the "multicost-pv" resource and what comes back. ๐Ÿฆ‹

The request asks for two cost types. The first is the Path Vector cost type, and the second is a numerical routing cost. It also asks for the maximum reservable bandwidth ANE property and the persistent entity ID property, for two IPv4 source and destination pairs (192.0.2.34 -> 192.0.2.2 and 192.0.2.34 -> 192.0.2.50) and one IPv6 pair (2001:db8::3:1 -> 2001:db8::4:1). โœจ

The response comes in two parts:

  • The first part is a JSONArray with two JSONValue entries for each requested source and destination pair. The first JSONValue is a JSONArray of ANENames, which is the value of the Path Vector cost type. The second JSONValue is a JSONNumber, which is the value of the routing cost. ๐ŸŒธ
  • The second part is a property map that maps the ANEs to their requested properties. ๐Ÿงš
POST /endpointcost/mcpv HTTP/1.1
Host: alto.example.com
Accept: multipart/related;
        type=application/alto-endpointcost+json,
        application/alto-error+json
Content-Length: 454
Content-Type: application/alto-endpointcostparams+json

{
  "multi-cost-types": [
    { "cost-mode": "array", "cost-metric": "ane-path" },
    { "cost-mode": "numerical", "cost-metric": "routingcost" }
  ],
  "endpoints": {
    "srcs": [
      "ipv4:192.0.2.34",
      "ipv6:2001:db8::3:1"
    ],
    "dsts": [
      "ipv4:192.0.2.2",
      "ipv4:192.0.2.50",
      "ipv6:2001:db8::4:1"
    ]
  },
  "ane-property-names": [
    "max-reservable-bandwidth",
    "persistent-entity-id"
  ]
}

HTTP/1.1 200 OK
Content-Length: 1419
Content-Type: multipart/related; boundary=example-4;
              type=application/alto-endpointcost+json

--example-4
Content-ID: <ecs@alto.example.com>
Content-Type: application/alto-endpointcost+json

{
  "meta": {
    "vtags": {
      "resource-id": "endpoint-cost-pv.ecs",
      "tag": "84a4f9c14f9341f0983e3e5f43a371c8"
    },
    "multi-cost-types": [
      { "cost-mode": "array", "cost-metric": "ane-path" },
      { "cost-mode": "numerical", "cost-metric": "routingcost" }
    ]
  },
  "endpoint-cost-map": {
    "ipv4:192.0.2.34": {
      "ipv4:192.0.2.2":   [[ "NET3", "AGGR1" ], 3],
      "ipv4:192.0.2.50":   [[ "NET3", "AGGR2" ], 2]
    },
    "ipv6:2001:db8::3:1": {
      "ipv6:2001:db8::4:1": [[ "NET3", "AGGR2" ], 2]
    }
  }
}
--example-4
Content-ID: <propmap@alto.example.com>
Content-Type: application/alto-propmap+json

{
  "meta": {
    "dependent-vtags": [
      {
        "resource-id": "endpoint-cost-pv.ecs",
        "tag": "84a4f9c14f9341f0983e3e5f43a371c8"
      },
      {
        "resource-id": "ane-props",
        "tag": "be157afa031443a187b60bb80a86b233"
      }
    ]
  },
  "property-map": {
    ".ane:AGGR1": {
      "max-reservable-bandwidth": 10000000000,
      "persistent-entity-id": "ane-props.ane:MEC1"
    },
    ".ane:AGGR2": {
      "max-reservable-bandwidth": 15000000000,
      "persistent-entity-id": "ane-props.ane:MEC2"
    },
    ".ane:NET3": {
      "max-reservable-bandwidth": 50000000000
    }
  }
}
--example-4

9. Compatibility with Other ALTO Extensions ๐ŸŽ€

9.1. Compatibility with Legacy ALTO Clients/Servers

okay, good news bestie: the multipart filtered cost map resource and the multipart Endpoint Cost Service resource have no backward-compatibility issues with legacy ALTO clients and servers ๐Ÿซถ They reuse the media types from the base ALTO Protocol for the "Accept" input parameters, but they use different media types for responses. So if the ALTO server offers these resources and the ALTO client doesn't support them, the client just ignores them and nothing breaks. ๐Ÿ˜Œ

9.2. Compatibility with Multi-Cost Extension

this extension plays nicely with the multi-cost extension [RFC8189] ๐Ÿ’– Such a resource has a media type of either "multipart/related; type=application/alto-costmap+json" or "multipart/related; type=application/alto-endpointcost+json". Its "cost-constraints" field has to be either "false" or not present at all, and the Path Vector cost type has to show up in the "cost-type-names" capability field but must not be in the "testable-cost-type-names" field, as specified in Sections 7.2.4 and 7.3.4. โœจ

9.3. Compatibility with Incremental Update Extension

this extension is compatible with the incremental update extension [RFC8895] ๐Ÿฆ‹ ALTO clients and servers MUST follow the specifications given in Sections 5.2 and 6.7.3 of [RFC8895] to support incremental updates for a Path Vector resource. No skipping this one, periodt ๐Ÿ’…

9.4. Compatibility with Cost Calendar Extension

the extension specified here is compatible with the Cost Calendar extension [RFC8896] ๐ŸŒˆ When you use it together with the Cost Calendar extension, the cost value between a source and a destination is an array of Path Vectors, where the k-th Path Vector refers to the abstract network paths traversed in the k-th time interval by traffic from the source to the destination. โฐ

When you use time-varying properties, like maximum reservable bandwidth, a property of a single ANE can also have different values in different time intervals. In that case, if such an ANE has different property values in two time intervals, it MUST be treated as two different ANEs, meaning it gets different entity identifiers. However, if it has the same property values in two time intervals, it MAY use the same identifier. ๐Ÿ™ˆ

This rule lets the Path Vector extension represent both changes of ANEs and changes of the ANEs' properties in one uniform way. The Path Vector part is calendared in a compatible way, and the property map part isn't affected by the Cost Calendar extension at all. ๐Ÿ“

Together, the two extensions can provide historical network correlation information for a set of source and destination pairs. A network broker or client may use this information to derive other resource requirements such as Time-Block-Maximum Bandwidth, Bandwidth-Sliding-Window, and Time-Bandwidth-Product (TBP) (see [SENSE] for details). ๐Ÿ‘‘


10. General Discussion ๐ŸŒธ

10.1. Constraint Tests for General Cost Types

the constraint test is a simple way to query the data ๐Ÿ“ It lets users filter query results by specifying some boolean tests, and the ALTO Protocol already uses this approach. ALTO clients are permitted to specify either the "constraints" test [RFC7285] [RFC8189] or the "or-constraints" test [RFC8189] to filter results more precisely. โœจ

Here's the tea though: the current syntax can only test scalar cost types, so it can't easily express constraints on complex cost types, like the Path Vector cost type defined in this document. ๐Ÿ˜ญ

Building a bespoke language for general-purpose boolean tests can be a complex undertaking, and it's conceivable that such implementations already exist (the authors have not done an exhaustive search to determine whether such implementations exist). One avenue could be exploring extensions of current query languages like XQuery [XQuery] or JSONiq [JSONiq] and integrating them with ALTO. ๐Ÿงš

Filtering the Path Vector results, or developing a more sophisticated filtering mechanism, is beyond the scope of this document. ๐Ÿ™…โ€โ™€๏ธ

10.2. General Multi-Resource Query

querying multiple ALTO information resources continuously is a general requirement, and it's a big deal ๐Ÿซถ Making that work has to handle things like efficiency and consistency. The incremental update extension [RFC8895] lets you submit multiple queries in a single request and gives flexible control over those queries. It doesn't cover the case in this document, though, where multiple resources are needed for a single request. ๐Ÿฆ‹

This extension gives an example of using a multipart message to encode the responses from two specific ALTO information resources: a filtered cost map or an Endpoint Cost Service, and a property map. By packing multiple resources into a single response, servers may proactively push related information resources to clients. ๐Ÿ’œ

So it's worth looking into extending the SSE mechanism used in the incremental update extension [RFC8895], or upgrading to HTTP/2 [RFC9113] and HTTP/3 [RFC9114], which can multiplex queries and let servers proactively send related information resources. ๐ŸŒˆ

A general multi-resource query mechanism is out of scope for this document. โญ

11. Security Considerations โœจ

okay bestie, this section is SERIOUS ๐Ÿซถ but it's also where the fun stuff lives, so let's go. This extension is built on top of the base ALTO Protocol, so the security considerations from the base protocol [RFC7285] fully apply whenever an ALTO server offers this extension ๐Ÿ”

The Path Vector extension needs extra side-eye on three of the base protocol's security considerations: confidentiality of ALTO information (Section 15.3 of [RFC7285]), potential undesirable guidance from authenticated ALTO information (Section 15.2 of [RFC7285]), and availability of ALTO services (Section 15.5 of [RFC7285]) ๐Ÿ‘€

Let's start with confidentiality ๐Ÿ•ต๏ธโ€โ™€๏ธ A network operator should know that this extension can bring in a brand new risk. Path Vector info, when it's combined with sensitive ANE properties like the capacities of bottleneck links, can make network attacks way easier ๐Ÿ˜ฌ For example, Path Vectors can reveal more fine-grained internal network structure than the base protocol does, so an attacker could figure out the bottleneck link or links and kick off a distributed denial-of-service (DDoS) attack using minimal flows, which triggers in-network congestion. Scary, right? ๐Ÿ’€ Because of that leak risk, the Path Vector extension is mainly a good fit in two situations: 1) the ANE structures and ANE properties don't create security risks for the ALTO service provider (like when they don't carry sensitive info), or 2) the ALTO server and client have a solid, trusted relationship (for example, they're in the same administrative domain or they're managed by business partners with legal contracts) ๐Ÿค

Three risk types are called out in Section 15.3.1 of [RFC7285]:

(1) excess disclosure of the ALTO service provider's data to an unauthorized ALTO client,

(2) disclosure of the ALTO service provider's data (e.g., network topology information or endpoint addresses) to an unauthorized third party, and

(3) excess retrieval of the ALTO service provider's data by collaborating ALTO clients.

To handle these, an ALTO server MUST follow the guidelines in Section 15.3.2 of [RFC7285]. On top of that, an ALTO server MUST follow the following additional protections strategies for risk types (1) and (3). Non-negotiable, bestie ๐Ÿšจ

For risk type (1), an ALTO server MUST use the authentication methods specified in Section 15.3.2 of [RFC7285] to authenticate the identity of an ALTO client, and it needs to apply access control techniques so unprivileged ALTO clients can't retrieve sensitive Path Vector information ๐Ÿ”’ If the ALTO server and client aren't in the same trust domain, the ALTO server should reach agreements with the ALTO client about protecting confidentiality before it grants access to Path Vector services that include sensitive info. Those agreements can be legal contracts or Digital Rights Management (DRM) techniques ๐Ÿ“œ And if that's not in place, the ALTO server MUST NOT offer Path Vector services that carry sensitive information to clients, unless the potential risks have been fully assessed and mitigated. No shortcuts, periodt ๐Ÿ’…

For risk type (3), an ALTO service provider must be aware that persistent ANEs can be used as "landmarks" in collaborative inferences ๐Ÿ—บ๏ธ So they should only be used when exposing public service access points (e.g., API gateways, CDN Interconnections) and/or when the granularity is coarse (e.g., when an ANE represents an AS, a data center, or a WAN). Otherwise, an ALTO server MUST use dynamic mappings from ephemeral ANE names to the underlying physical entities. Specifically, for the same physical entity, an ALTO server SHOULD assign a different ephemeral ANE name when that entity shows up in responses to different clients, or even for different requests from the same client ๐ŸŽญ A RECOMMENDED assignment strategy is to generate ANE names from random numbers ๐ŸŽฒ

Next up, protecting the network topology from graph reconstruction ๐Ÿงฉ (for example, through isomorphic graph identification [BONDY]). The ALTO server SHOULD consider protection mechanisms that reduce information exposure or obfuscate the real information. But here's the catch: the ALTO server must be aware that reduction or obfuscation can lead to a potential risk of undesirable guidance from authenticated ALTO information (Section 15.2 of [RFC7285]). It's a balancing act, bestie โš–๏ธ

So implementations that reduce or obfuscate Path Vector information SHOULD consider reduction/obfuscation mechanisms that can preserve the integrity of ALTO information. Examples include minimal feasible region compression algorithms [NOVA] or obfuscation protocols [RESA] [MERCATOR]. Heads up though: these obfuscation methods are experimental, and their practical applicability to the generic capability provided by this extension has not been fully assessed ๐Ÿงช The ALTO server MUST carefully verify that the deployment scenario satisfies the security assumptions of these methods before applying them to protect Path Vector services with sensitive network information. Double-check before you apply anything, okay? ๐Ÿซ 

Now for availability ๐Ÿ–ฅ๏ธ An ALTO server should be cognizant that using a Path Vector extension might introduce a new risk: frequent requests for Path Vectors might consume intolerable amounts of server-side computation and storage. That can break the ALTO server ๐Ÿ˜ฑ For example, if an ALTO server implementation dynamically computes the Path Vectors for each request, the service providing them can become an entry point for denial-of-service attacks on the availability of the ALTO server.

To mitigate this, an ALTO server may consider optimizations such as precomputation-and-projection mechanisms [MERCATOR] to reduce the overhead of processing each query โšก An ALTO server may also protect itself from malicious clients by monitoring client behavior and stopping service to clients that act suspicious (e.g., sending requests at a high frequency). Block the sus ones ๐Ÿšซ

Last one, and it's a subtle one ๐Ÿ‘€ The ALTO service providers must be aware that providing incremental updates of max-reservable-bandwidth may reveal information about other consumers of the network. For example, a change in value may indicate that one or more reservations have been made or changed. To mitigate this risk, an ALTO server can batch the updates and/or add a random delay before publishing them ๐ŸŽ€


12. IANA Considerations ๐ŸŒธ

12.1. "ALTO Cost Metrics" Registry

This document registers a new entry in the "ALTO Cost Metrics" registry, per Section 14.2 of [RFC7285]. The new entry is shown below in Table 1, and it's giving clean registry energy ๐Ÿ’–

              +============+====================+===========+
              | Identifier | Intended Semantics | Reference |
              +============+====================+===========+
              | ane-path   | See Section 6.5.1  | RFC 9275  |
              +------------+--------------------+-----------+

                   Table 1: "ALTO Cost Metrics" Registry

12.2. "ALTO Cost Modes" Registry

This document registers a new entry in the "ALTO Cost Modes" registry, per Section 5 of [RFC9274]. The new entry is shown below in Table 2 โœจ

    +============+=========================+=============+===========+
    | Identifier | Description             | Intended    | Reference |
    |            |                         | Semantics   |           |
    +============+=========================+=============+===========+
    | array      | Indicates that the cost | See Section | RFC 9275  |
    |            | value is a JSON array   | 6.5.2       |           |
    +------------+-------------------------+-------------+-----------+

                   Table 2: "ALTO Cost Modes" Registry

12.3. "ALTO Entity Domain Types" Registry

This document registers a new entry in the "ALTO Entity Domain Types" registry, per Section 12.3 of [RFC9240]. The new entry is shown below in Table 3 ๐Ÿงš

   +============+============+=============+===================+=======+
   | Identifier |Entity      |Hierarchy and| Media Type of     |Mapping|
   |            |Identifier  |Inheritance  | Defining Resource |to ALTO|
   |            |Encoding    |             |                   |Address|
   |            |            |             |                   |Type   |
   +============+============+=============+===================+=======+
   | ane        |See Section |None         | application/alto- |false  |
   |            |6.2.2       |             | propmap+json      |       |
   +------------+------------+-------------+-------------------+-------+

                Table 3: "ALTO Entity Domain Types" Registry

Identifier: See Section 6.2.1.

Entity Identifier Encoding: See Section 6.2.2.

Hierarchy: None

Inheritance: None

Media Type of Defining Resource: See Section 6.2.4.

Mapping to ALTO Address Type: This entity type does not map to an ALTO address type.

Security Considerations: In some usage scenarios, ANE addresses carried in ALTO Protocol messages may reveal information about an ALTO client or an ALTO service provider ๐Ÿ‘€ If a naming schema is used to generate ANE names, whether private or standardized by a future extension, how (or if) that schema relates to private information and network proximity has to be explained to ALTO implementers and service providers. Spill the tea, but make sure it's explained ๐Ÿต

12.4. "ALTO Entity Property Types" Registry

Two initial entries, "max-reservable-bandwidth" and "persistent-entity-id", are registered for the ALTO domain "ane" in the "ALTO Entity Property Types" registry, per Section 12.4 of [RFC9240] ๐Ÿ’œ The two new entries are shown below in Table 4, and their details can be found in Sections 12.4.1 and 12.4.2 of this document.

   +==========================+====================+===================+
   | Identifier               | Intended           | Media Type of     |
   |                          | Semantics          | Defining Resource |
   +==========================+====================+===================+
   | max-reservable-bandwidth | See Section        | application/alto- |
   |                          | 6.4.1              | propmap+json      |
   +--------------------------+--------------------+-------------------+
   | persistent-entity-id     | See Section        | application/alto- |
   |                          | 6.4.2              | propmap+json      |
   +--------------------------+--------------------+-------------------+

     Table 4: Initial Entries for the "ane" Domain in the "ALTO
                          Property Types" Registry

12.4.1. New ANE Property Type: Maximum Reservable Bandwidth

Identifier: max-reservable-bandwidth

Intended Semantics: See Section 6.4.1.

Media Type of Defining Resource: application/alto-propmap+json

Security Considerations: To make better choices about bandwidth reservation, this property is essential for applications such as large-scale data transfers or overlay network interconnection ๐Ÿš€ It may reveal the bandwidth usage of the underlying network, and it can potentially be leveraged to reduce the cost of conducting denial-of-service attacks. So the ALTO server MUST consider protection mechanisms such as providing the information to authorized clients only, and applying information reduction and obfuscation as discussed in Section 11. Guard that bandwidth data like it's your last slice of pizza ๐Ÿ•๐Ÿ”

12.4.2. New ANE Property Type: Persistent Entity ID โœจ

okay bestie, this one's a fun new property type ๐ŸŽ€ Here's the lineup:

Identifier: persistent-entity-id

Intended Semantics: See Section 6.4.2. ๐Ÿฆ‹

Media Type of Defining Resource: application/alto-propmap+json

Security Considerations: ngl this one needs a serious moment ๐Ÿ˜ญ This property is useful when an ALTO server wants to selectively expose certain service points, and then applications can keep querying their detailed properties. But as mentioned in Section 12.3.2 of [RFC9240], the entity IDs may reveal sensitive information about the underlying network. So an ALTO server should follow the security considerations provided in Section 11 of [RFC9240]. Be careful with those IDs, babe ๐Ÿ”’๐Ÿ’œ


13. References ๐Ÿ“š

13.1. Normative References

[RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types", RFC 2046, DOI 10.17487/RFC2046, November 1996, <https://www.rfc-editor.org/info/rfc2046>.

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC2387] Levinson, E., "The MIME Multipart/Related Content-type", RFC 2387, DOI 10.17487/RFC2387, August 1998, <https://www.rfc-editor.org/info/rfc2387>.

[RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322, DOI 10.17487/RFC5322, October 2008, <https://www.rfc-editor.org/info/rfc5322>.

[RFC7285] Alimi, R., Ed., Penno, R., Ed., Yang, Y., Ed., Kiesel, S., Previdi, S., Roome, W., Shalunov, S., and R. Woundy, "Application-Layer Traffic Optimization (ALTO) Protocol", RFC 7285, DOI 10.17487/RFC7285, September 2014, <https://www.rfc-editor.org/info/rfc7285>.

[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8189] Randriamasy, S., Roome, W., and N. Schwan, "Multi-Cost Application-Layer Traffic Optimization (ALTO)", RFC 8189, DOI 10.17487/RFC8189, October 2017, <https://www.rfc-editor.org/info/rfc8189>.

[RFC8895] Roome, W. and Y. Yang, "Application-Layer Traffic Optimization (ALTO) Incremental Updates Using Server-Sent Events (SSE)", RFC 8895, DOI 10.17487/RFC8895, November 2020, <https://www.rfc-editor.org/info/rfc8895>.

[RFC8896] Randriamasy, S., Yang, R., Wu, Q., Deng, L., and N. Schwan, "Application-Layer Traffic Optimization (ALTO) Cost Calendar", RFC 8896, DOI 10.17487/RFC8896, November 2020, <https://www.rfc-editor.org/info/rfc8896>.

[RFC9240] Roome, W., Randriamasy, S., Yang, Y., Zhang, J., and K. Gao, "An Extension for Application-Layer Traffic Optimization (ALTO): Entity Property Maps", RFC 9240, DOI 10.17487/RFC9240, July 2022, <https://www.rfc-editor.org/info/rfc9240>.

[RFC9274] Boucadair, M. and Q. Wu, "A Cost Mode Registry for the Application-Layer Traffic Optimization (ALTO) Protocol", RFC 9274, DOI 10.17487/RFC9274, July 2022, <https://www.rfc-editor.org/info/rfc9274>.

13.2. Informative References

[ALTO-PERF-METRICS] Wu, Q., Yang, Y., Lee, Y., Dhody, D., Randriamasy, S., and L. Contreras, "ALTO Performance Cost Metrics", Work in Progress, Internet-Draft, draft-ietf-alto-performance-metrics-28, 21 March 2022, <https://datatracker.ietf.org/doc/html/draft-ietf-alto-performance-metrics-28>.

[BONDY] Bondy, J.A. and R.L. Hemminger, "Graph reconstruction--a survey", Journal of Graph Theory, Volume 1, Issue 3, pp. 227-268, DOI 10.1002/jgt.3190010306, 1977, <https://onlinelibrary.wiley.com/doi/10.1002/jgt.3190010306>.

[BOXOPT] Xiang, Q., Yu, H., Aspnes, J., Le, F., Kong, L., and Y.R. Yang, "Optimizing in the Dark: Learning an Optimal Solution through a Simple Request Interface", Proceedings of the AAAI Conference on Artificial Intelligence 33, 1674-1681, DOI 10.1609/aaai.v33i01.33011674, July 2019, <https://ojs.aaai.org//index.php/AAAI/article/view/3984>.

[CLARINET] Viswanathan, R., Ananthanarayanan, G., and A. Akella, "CLARINET: WAN-aware optimization for analytics queries", Proceedings of the 12th USENIX conference on Operating Systems Design and Implementation (OSDI'16), Savannah, GA, pp. 435-450, November 2016, <https://dl.acm.org/doi/abs/10.5555/3026877.3026911>.

[G2] Ros-Giralt, J., Bohara, A., Yellamraju, S., Langston, M.H., Lethin, R., Jiang, Y., Tassiulas, L., Li, J., Tan, Y., and M. Veeraraghavan, "On the Bottleneck Structure of Congestion-Controlled Networks", Proceedings of the ACM on Measurement and Analysis of Computing Systems, Volume 3, Issue 3, pp. 1-31, DOI 10.1145/3366707, December 2019, <https://dl.acm.org/doi/10.1145/3366707>.

[HUG] Chowdhury, M., Liu, Z., Ghodsi, A., and I. Stoica, "HUG: multi-resource fairness for correlated and elastic demands", Proceedings of the 13th USENIX Conference on Networked Systems Design and Implementation (NSDI'16), Santa Clara, CA, pp. 407-424, March 2016, <https://dl.acm.org/doi/10.5555/2930611.2930638>.

[INTENT-BASED-NETWORKING] Clemm, A., Ciavaglia, L., Granville, L. Z., and J. Tantsura, "Intent-Based Networking - Concepts and Definitions", Work in Progress, Internet-Draft, draft-irtf-nmrg-ibn-concepts-definitions-09, 24 March 2022, <https://datatracker.ietf.org/doc/html/draft-irtf-nmrg-ibn-concepts-definitions-09>.

[JSONiq] JSONiq, "The JSON Query Language", 2022, <https://www.jsoniq.org/>.

[MERCATOR] Xiang, Q., Zhang, J., Wang, X., Liu, Y., Guok, C., Le, F., MacAuley, J., Newman, H., and Y.R. Yang, "Toward Fine-Grained, Privacy-Preserving, Efficient Multi-Domain Network Resource Discovery", IEEE/ACM, IEEE Journal on Selected Areas in Communications, Volume 37, Issue 8, pp. 1924-1940, DOI 10.1109/JSAC.2019.2927073, August 2019, <https://ieeexplore.ieee.org/document/8756056>.

[MOWIE] Zhang, Y., Li, G., Xiong, C., Lei, Y., Huang, W., Han, Y., Walid, A., Yang, Y.R., and Z. Zhang, "MoWIE: Toward Systematic, Adaptive Network Information Exposure as an Enabling Technique for Cloud-Based Applications over 5G and Beyond", Proceedings of the Workshop on Network Application Integration/CoDesign (NAI '20), ACM, Virtual Event USA, pp. 20-27, DOI 10.1145/3405672.3409489, August 2020, <https://dl.acm.org/doi/10.1145/3405672.3409489>.

[NOVA] Gao, K., Xiang, Q., Wang, X., Yang, Y.R., and J. Bi, "An Objective-Driven On-Demand Network Abstraction for Adaptive Applications", IEEE/ACM Transactions on Networking (TON) Vol. 27, Issue 2, pp. 805-818, DOI 10.1109/TNET.2019.2899905, April 2019, <https://doi.org/10.1109/TNET.2019.2899905>.

[RESA] Xiang, Q., Zhang, J., Wang, X., Liu, Y., Guok, C., Le, F., MacAuley, J., Newman, H., and Y.R. Yang, "Fine-Grained, Multi-Domain Network Resource Abstraction as a Fundamental Primitive to Enable High-Performance, Collaborative Data Sciences", SC18: International Conference for High Performance Computing, Networking, Storage and Analysis, pp. 58-70, DOI 10.1109/SC.2018.00008, November 2018, <https://ieeexplore.ieee.org/document/8665783>.

[RFC2216] Shenker, S. and J. Wroclawski, "Network Element Service Specification Template", RFC 2216, DOI 10.17487/RFC2216, September 1997, <https://www.rfc-editor.org/info/rfc2216>.

[RFC4271] Rekhter, Y., Ed., Li, T., Ed., and S. Hares, Ed., "A Border Gateway Protocol 4 (BGP-4)", RFC 4271, DOI 10.17487/RFC4271, January 2006, <https://www.rfc-editor.org/info/rfc4271>.

[RFC9113] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, DOI 10.17487/RFC9113, June 2022, <https://www.rfc-editor.org/info/rfc9113>.

[RFC9114] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, June 2022, <https://www.rfc-editor.org/info/rfc9114>.

[SENSE] ESnet, "Software Defined Networking (SDN) for End-to-End Networked Science at the Exascale", 2019, <https://www.es.net/network-r-and-d/sense/>.

[SEREDGE] Contreras, L., Baliosian, J., Martรญnez-Julia, P., and J. Serrat, "Computing at the Edge: But, what Edge?", Proceedings of NOMS 2020 - 2020 IEEE/IFIP Network Operations and Management Symposium, pp. 1-9, DOI 10.1109/NOMS47738.2020.9110342, April 2020, <https://ieeexplore.ieee.org/document/9110342>.

[SWAN] Hong, C., Kandula, S., Mahajan, R., Zhang, M., Gill, V., Nanduri, M., and R. Wattenhofer, "Achieving high utilization with software-driven WAN", Proceedings of the ACM SIGCOMM 2013 conference on SIGCOMM (SIGCOMM '13), New York, NY, pp. 15-26, DOI 10.1145/2486001.2486012, August 2013, <https://dl.acm.org/doi/10.1145/2486001.2486012>.

[UNICORN] Xiang, Q., Wang, T., Zhang, J., Newman, H., Yang, Y.R., and Y. Liu, "Unicorn: Unified resource orchestration for multi-domain, geo-distributed data analytics", Future Generation Computer Systems, Volume 93, pp. 188-197, DOI 10.1016/j.future.2018.09.048, April 2019, <https://www.sciencedirect.com/science/article/abs/pii/S0167739X18302413?via%3Dihub>.

[XQuery] Robie, J., Ed., Dyck, M., Ed., and J. Spiegel, Ed., "XQuery 3.1: An XML Query Language", W3C Recommendation, March 2017, <https://www.w3.org/TR/xquery-31/>.

Acknowledgments ๐Ÿซถ

The authors would like to thank Andreas Voellmy, Erran Li, Haibin Song, Haizhou Du, Jiayuan Hu, Tianyuan Liu, Xiao Shi, Xin Wang, and Yan Luo for fruitful discussions. The authors thank Greg Bernstein, Dawn Chen, Wendy Roome, and Michael Scharf for their contributions to earlier draft versions of this document.

The authors would also like to thank Tim Chown, Luis Contreras, Roman Danyliw, Benjamin Kaduk, Erik Kline, Suresh Krishnan, Murray Kucherawy, Warren Kumari, Danny Lachos, Francesca Palombini, ร‰ric Vyncke, Samuel Weiler, and Qiao Xiang, whose feedback and suggestions were invaluable for improving the practicability and conciseness of this document; and Mohamed Boucadair, Martin Duke, Vijay Gurbani, Jan Seedorf, and Qin Wu, who provided great support and guidance. ๐Ÿ’–

Authors' Addresses โœจ

okay bestie, meet the squad ๐Ÿซถ these are the five brilliant minds behind this RFC, and yes, every single one of them is giving main character energy ๐Ÿ‘‘ here are their addresses so you can slide into their inboxes (professionally, obviously ๐Ÿ’…).

Kai Gao ๐ŸŒธ

Kai Gao
Sichuan University
No.24 South Section 1, Yihuan Road
Chengdu
610000
China
Email: kaigao@scu.edu.cn

Young Lee ๐Ÿ’œ

Young Lee
Samsung
Republic of Korea
Email: younglee.tx@gmail.com

Sabine Randriamasy ๐Ÿฆ‹

Sabine Randriamasy
Nokia Bell Labs
Route de Villejust
91460 Nozay
France
Email: sabine.randriamasy@nokia-bell-labs.com

Yang Richard Yang ๐ŸŽ€

Yang Richard Yang
Yale University
51 Prospect Street
New Haven, CT 06511
United States of America
Email: yry@cs.yale.edu

Jingxuan Jensen Zhang ๐Ÿงš

Jingxuan Jensen Zhang
Tongji University
4800 Caoan Road
Shanghai
201804
China
Email: jingxuan.n.zhang@gmail.com
the whole crew is literally the reason ALTO is iconic, so if you ever have questions, these are the people to ask ๐Ÿ™ˆ periodt ๐Ÿ’–

that's the whole document, bestie โœจ๐ŸŒˆ๐Ÿ’–

๐Ÿ“ฆ where this page comes from