[alto] ALTO service query spanning multiple domains (ECS)

"Y. Richard Yang" <yry@cs.yale.edu> Tue, 13 September 2022 02:51 UTC

Return-Path: <yang.r.yang@gmail.com>
X-Original-To: alto@ietfa.amsl.com
Delivered-To: alto@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id B84D8C15257F for <alto@ietfa.amsl.com>; Mon, 12 Sep 2022 19:51:03 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.409
X-Spam-Level:
X-Spam-Status: No, score=-1.409 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, FREEMAIL_FORGED_FROMDOMAIN=0.248, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, HTML_MESSAGE=0.001, RCVD_IN_MSPIKE_H2=-0.001, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_BLOCKED=0.001, URIBL_ZEN_BLOCKED_OPENDNS=0.001] autolearn=no autolearn_force=no
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id XOjw56qzt_Tm for <alto@ietfa.amsl.com>; Mon, 12 Sep 2022 19:50:59 -0700 (PDT)
Received: from mail-oa1-f48.google.com (mail-oa1-f48.google.com [209.85.160.48]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id E0686C1526F6 for <alto@ietf.org>; Mon, 12 Sep 2022 19:50:59 -0700 (PDT)
Received: by mail-oa1-f48.google.com with SMTP id 586e51a60fabf-127dca21a7dso28535889fac.12 for <alto@ietf.org>; Mon, 12 Sep 2022 19:50:59 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date; bh=PC00TsI09ENpxDx5zGW4IAgdj2VmT/t5uU+03mqp9hk=; b=X9DDEyu3dxo6/4ksLCLDtM/RTRXpQSQHu2igzDAsNlNgKJ1eCGkmn1J+YULInxGgzR V58rTd8R+Ue01mN3oT6uSOqP6SaixpHps/ProXldoLix/rza8S98ebOTYaEDnyAzOWZM ig/mQ8XV116kOPnoIVdiTYfymhiF1a8t6g6NTJXwaK10yRbFRPEaKbZ/wAo4SG/fVS63 WWodaHsvSJUxsG4bn7mmb2lxHnAUeYE0NlzyHnKcAnyJX+DpRuqzY2zeE8A9bgrpSZbM fJvdyVMwnew7NYxgsTrrc3xBSXQmtrUplwL+OT4inNFT5pGMaYopR/gGtnpsamZds9wz JO5g==
X-Gm-Message-State: ACgBeo2r8xJlQo3znYzdQ/SS7UrHcLlhzWzUNRfAIwkPr4tOwvZ0GT/+ nUvzKkP3X/iim+ox+QSi0P7OzgmwinYLnkMaHnhAvd1XxPA=
X-Google-Smtp-Source: AA6agR7q06R9GCszPwZfmGb+CdA4DZVzEKFhLrY7vMRjmZMLjzuBYWMkXeQo96iP+TwIA9/TeSmCnvRmB3Wb5v1vYsc=
X-Received: by 2002:a05:6870:2395:b0:12b:cdce:c8a2 with SMTP id e21-20020a056870239500b0012bcdcec8a2mr785777oap.158.1663037458674; Mon, 12 Sep 2022 19:50:58 -0700 (PDT)
MIME-Version: 1.0
From: "Y. Richard Yang" <yry@cs.yale.edu>
Date: Mon, 12 Sep 2022 22:50:47 -0400
Message-ID: <CANUuoLq5ma=y4ke91B6CPcX4roEzBWsc1J8JrvgKrKtB0jzoOQ@mail.gmail.com>
To: IETF ALTO <alto@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000f8fb4705e88614b0"
Archived-At: <https://mailarchive.ietf.org/arch/msg/alto/GAC6kcBZPyAO5ZwOBIuUfSCDhTs>
Subject: [alto] ALTO service query spanning multiple domains (ECS)
X-BeenThere: alto@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: "Application-Layer Traffic Optimization \(alto\) WG mailing list" <alto.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/alto>, <mailto:alto-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/alto/>
List-Post: <mailto:alto@ietf.org>
List-Help: <mailto:alto-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/alto>, <mailto:alto-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 13 Sep 2022 02:51:03 -0000

Hi all,

During the weekly meeting last week, we went over the details when
deploying ALTO in a multi-domain setting, say the FTS/Rucio setting
supporting the TCN deployment [1]. Below is the endpoint cost service (ECS)
case, and it was suggested that we post it to the WG mailing list to update
the WG and get potential feedback.

Problem: An ALTO client queries the endpoint cost from srcIP to dstIP for a
given performance metric (e.g., latency). Consider the case that the srcIP
and dstIP belong to different networks, with the whole layer-3 path as the
list [ip[0], ip[1], ..., ip[N]], where ip[0] = srcIP and ip[N] = dstIP.
Define Net(ip) as the function that maps an IP address to the network that
owns the IP---ignore the complexity such as anycast since the deployment
does not have this case. Then Net(srcIP) != Net(dstIP), if it is
multi-domain. Consider the initial deployment that we have only an ALTO
server for each network; that is, it provides ALTO service for only
Net(srcIP) == Net(dstIP). Then, there is not a single ALTO server that can
provide the answer.

Basic solution (one src-dst flow): Map the list [ip[0], ..., ip[N]] to a
list of segments, where each segment starts with an IP address, and ends
with the first IP address in the sequence that leaves the network of the
start IP address. Hence, the basic query framework at an aggreation ALTO
client:
- alto-ecs(srcIP, dstIP, metric)
  metrics = EMPTY
  ingressIP = srcIP
  do {
      alto-server = server-discovery(ingressIP)
      (metricVal, egressIP) = alto-server.query(ingressIP, srcIP, dstIP,
metric)
      metrics.add(metricVal)
      ingressIP = egressIP
  } while (egressIP != dstIP)

The preceding assumes a procedure that collects segment attributes, and it
can be a single pass composition using a metric-dependent function (e.g.,
latency is addition, and bw is min).

Multi-flow queries: ALTO ECS supports the querying of multiple src-dst
pairs. A simple solution is to query each src-dst pair one-by-one. Such a
query is necessary because the routing can be dependent on packet
attributes (srcIP, dstIP) and a pseudo packet attribute (ingressIP), and
the ALTO client cannot reuse the results. To allow reuse (both in
multi-flow queries and caching of past queries), it helps that the ALTO
server indicates equivalent classes, which Kai and Jensen investigated.

A revision of the protocol using caching and equivalent class is:
alto-server-cache: indexed by ALTO server, <attribute, mask> pairs
- alto-ecs(srcIP, dstIP, metric)
  metrics = EMPTY
  ingressIP = srcIP
  do {
      alto-server = server-discovery(ingressIP)
      if (alto-server-cache.match(alto-server, ingressIP, srcIP, dstIP)
         use cache results
      else
         (metricVal, egressIP; ingressIPMask, srcIPMask, dstIPMask)
                 = alto-server.query(ingressIP, srcIP, dstIP, metric)
         alto-server-cache.add(alto-server, <ingressIP, ingressIPMask>,
                    <srcIP, srcIPMask>, <dstIP, dstIPMask>
      metrics.add(metricVal)
      ingressIP = egressIP
  } while (egressIP != dstIP)

The mask design is a special case. For the general case, the most flexible
equivalent class may be using predicates (e.g., supporting identifying the
lower entries of longest prefix matching). It is an issue that can benefit
from more benchmarking, or if there are any related pointers, the team will
appreciate the pointers.

In the next email, Kai and Jensen will post a slightly different design
supporting a map oriented service.

Cheers,

[1] Transport control networking: optimizing efficiency and control of data
transport for data-intensive networks,
https://dl.acm.org/doi/abs/10.1145/3538401.3548550