<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.34 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-quic-load-balancers-22" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="QUIC-LB">QUIC-LB: Generating Routable QUIC Connection IDs</title>

    <author initials="M." surname="Duke" fullname="Martin Duke">
      <organization>Google</organization>
      <address>
        <email>martin.h.duke@gmail.com</email>
      </address>
    </author>
    <author initials="N." surname="Banks" fullname="Nick Banks">
      <organization>Netflix</organization>
      <address>
        <email>nickbanks@netflix.com</email>
      </address>
    </author>
    <author initials="C." surname="Huitema" fullname="Christian Huitema">
      <organization>Private Octopus Inc.</organization>
      <address>
        <email>huitema@huitema.net</email>
      </address>
    </author>

    <date />

    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    

    <abstract>


<?line 53?>

<t>QUIC address migration allows clients to change their IP address while
maintaining connection state. To reduce the ability of an observer to link two
IP addresses, clients and servers use new connection IDs when they communicate
via different client addresses. This poses a problem for traditional "layer-4"
load balancers that route packets via the IP address and port 4-tuple. This
specification provides a standardized means of securely encoding routing
information in the server's connection IDs so that a properly configured load
balancer can route packets with migrated addresses correctly. As it proposes a
structured connection ID format, it also provides a means of connection IDs
self-encoding their length to aid some hardware offloads.</t>



    </abstract>



  </front>

  <middle>


<?line 66?>

<section anchor="introduction"><name>Introduction</name>

<t>QUIC packets <xref target="RFC9000"/> usually contain a connection ID to allow endpoints to
associate packets with different address/port 4-tuples to the same connection
context. This feature makes connections robust in the event of NAT rebinding.
QUIC endpoints usually designate the connection ID which peers use to address
packets. Server-generated connection IDs create a potential need for out-of-band
communication to support QUIC.</t>

<t>QUIC allows servers (or load balancers) to encode useful routing information for
load balancers in connection IDs.  It also encourages servers, in packets
protected by cryptography, to provide additional connection IDs to the client.
This allows clients that know they are going to change IP address or port to use
a separate connection ID on the new path, thus reducing linkability as clients
move through the world.</t>

<t>There is a tension between the requirements to provide routing information and
mitigate linkability.  Ultimately, because new connection IDs are provided in
protected packets, they must be generated at the server if the load balancer
does not have access to the connection keys. However, it is the load balancer
that has the context necessary to generate a connection ID that encodes useful
routing information. In the absence of any shared state between load balancer
and server, the load balancer must maintain a relatively expensive table of
server-generated connection IDs, and will not route packets correctly if they
use a connection ID that was originally communicated in a protected
NEW_CONNECTION_ID frame.</t>

<t>This specification provides common algorithms for encoding the server mapping in
a connection ID given some shared parameters. The mapping is generally only
discoverable by observers that have the parameters, preserving unlinkability as
much as possible. These algorithms both enable interoperability between servers
and load balancers from different vendors, and provide an example of
successful compliance with <xref target="RFC9000"/>.</t>

<t>As this document proposes a structured QUIC Connection ID, it also proposes a
system for self-encoding connection ID length in all packets, so that crypto
offload can efficiently obtain key information.</t>

<t>While this document describes a small set of configuration parameters to make
the server mapping intelligible, the means of distributing these parameters
between load balancers, servers, and other trusted intermediaries is out of its
scope. There are numerous well-known infrastructures for distribution of
configuration. However, an appendix does provide a YANG model for the
configuration parameters.</t>

<section anchor="terminology"><name>Terminology</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in RFC 2119 <xref target="RFC2119"/>.</t>

<t>In this document, these words will appear with that interpretation only when in
ALL CAPS.  Lower case uses of these words are not to be interpreted as carrying
significance described in RFC 2119.</t>

<t>In this document, "client" and "server" refer to the endpoints of a QUIC
connection unless otherwise indicated.  A "load balancer" is an intermediary for
that connection that does not possess QUIC connection keys, but it may rewrite
IP addresses, conduct other IP or UDP processing, and inspect the public parts
of QUIC headers. A "configuration agent" is the entity that determines the
QUIC-LB configuration parameters for the network and leverages some system to
distribute that configuration.</t>

<t>Note that stateful load balancers that act as reverse proxies, by terminating a
QUIC connection with the client and then retrieving data from the server using
QUIC or another protocol, are treated as a server with respect to this
specification.</t>

<t>For brevity, "Connection ID" will often be abbreviated as "CID".</t>

</section>
<section anchor="notation"><name>Notation</name>

<t>All wire formats will be depicted using the notation defined in Section 1.3 of
<xref target="RFC9000"/>.</t>

</section>
</section>
<section anchor="overview"><name>Overview</name>

<t>In QUIC-LB, load balancers and servers have a common understanding of how to
encode each server and the keys, if any, to encrypt that information.</t>

<t>There are three algorithms. One is simple to configure but does not obscure the
server mapping. The others have similar privacy properties, but one is more
computationally expensive to enable a shorter connection ID.</t>

<t>This specification describes three participants: the configuration agent, the
load balancer, and the server. For any given QUIC-LB configuration that enables
connection-ID-aware load balancing, there must be a choice of (1) routing
algorithm, (2) server ID allocation strategy, and (3) algorithm parameters.</t>

<t>Fundamentally, servers generate connection IDs that encode their server ID.
Load balancers decode the server ID from the CID in incoming packets to route
to the correct server.</t>

<t><xref target="RFC8999"/> specifies that endpoints generate their own connection IDs,
implying that all QUIC versions will have a mechanism to communicate their
connection IDs to the peer. In QUIC version 1 and 2, the server does so using
the Source Connection ID field of its long header packets for the first
connection ID, and NEW_CONNECTION_ID frames for subsequent CIDs.</t>

<t>There are situations where a server pool might be operating two or more routing
algorithms or parameter sets simultaneously.  The load balancer uses the first
three bits of the connection ID to multiplex incoming Destination Connection IDs
(DCIDs) over these schemes (see <xref target="config-rotation"/>).</t>

</section>
<section anchor="first-octet"><name>First CID octet</name>

<t>The Connection ID construction schemes defined in this document reserve the
first octet of a CID for two special purposes: one mandatory (config rotation)
and one optional (length self-description).</t>

<t>Subsequent sections of this document refer to the contents of this octet as the
"first octet."</t>

<section anchor="config-rotation"><name>Config Rotation</name>

<t>The first three bits of any connection ID MUST encode an identifier for the
configuration that the connection ID uses. This enables incremental deployment
of new QUIC-LB settings (e.g., keys). A configuration MUST NOT use the
reserved identifier 0b111 (see <xref target="config-failover"/> below).</t>

<t>When new configuration is distributed to servers, there will be a transition
period when connection IDs reflecting old and new configuration coexist in the
network.  The rotation bits allow load balancers to apply the correct routing
algorithm and parameters to incoming packets.</t>

<t>Configuration Agents SHOULD deliver new configurations to load balancers before
doing so to servers, so that load balancers are ready to process CIDs using the
new parameters when they arrive.</t>

<t>A Configuration Agent SHOULD NOT use a codepoint to represent a new
configuration until it takes precautions to make sure that all connections using
CIDs with an old configuration at that codepoint have closed or transitioned.</t>

<t>Servers MUST NOT generate new connection IDs using an old configuration after
receiving a new one from the configuration agent. Servers MUST use that QUIC
version's methods to update the client with CIDs (e.g., NEW_CONNECTION_ID
frames) using the new configuration and retire CIDs using the old configuration.
See <xref target="retiring"/> for details.</t>

<t>It also possible to use these bits for more long-lived distinction of different
configurations, but this has privacy implications (see <xref target="multiple-configs"/>).</t>

</section>
<section anchor="config-failover"><name>Configuration Failover</name>

<t>In some deployments, an infrastructure will not receive traffic unless all
servers have received a configuration, and load balancers have a superset of all
configurations that are active in the server pool, thus guaranteeing that any
CID generated by a server is decodable by any load balancer. Servers and load
balancers deployed under all of these assumptions can ignore the provisions in
this subsection.</t>

<t>Load balancers treat connection IDs for which they have no corresponding config
ID as unroutable (see <xref target="unroutable"/>). If they have no configuration at all,
then all connection IDs are unroutable.</t>

<t>Servers with no active configuration MUST issue connection IDs with the reserved
value of the three most significant bits set to 0b111 to signify the connection
ID is unroutable. These connection IDs MUST self-encode their length (see
<xref target="length-self-description"/>).</t>

<t>Servers with no active configuration SHOULD provide the client exactly one CID
over the life of the connection, except for any second CID provided in the
preferred_address transport parameter. In QUIC versions 1 and 2, therefore,
servers SHOULD NOT send any NEW_CONNECTION_ID frames, instead delivering a
single CID via the Source Connection ID of long headers it sends.</t>

<t>Servers with no active configuration SHOULD send the "disable_active_migration"
transport parameter, or a similar message in future QUIC versions.</t>

<t>When using codepoint 0b111, all bytes but the first SHOULD have no larger of a
chance of collision as random bytes. The connection ID SHOULD be of at least
length 8 to provide 7 bytes of entropy after the first octet with a low chance
of collision.</t>

</section>
<section anchor="length-self-description"><name>Length Self-Description</name>

<t>Local hardware cryptographic offload devices may accelerate QUIC servers by
receiving keys from the QUIC implementation indexed to the connection ID.
However, on physical devices operating multiple QUIC servers, it might be
impractical to efficiently lookup keys if the connection ID varies in length and
does not self-encode its own length.</t>

<t>Note that this is a function of particular server devices and is irrelevant to
load balancers. As such, load balancers MAY omit this from their configuration.
However, the remaining 5 bits in the first octet of the Connection ID are
reserved to express the length of the following connection ID, not including
the first octet.</t>

<t>A server not using this functionality SHOULD choose the five bits so as to have
no observable relationship to previous connection IDs issued for that
connection.</t>

</section>
<section anchor="format"><name>Format</name>

<figure title="First Octet Format" anchor="first-octet-format"><artwork><![CDATA[
First Octet {
  Config Rotation (3),
  CID Len or Random Bits (5),
}
]]></artwork></figure>

<t>The first octet has the following fields:</t>

<t>Config Rotation: Indicates the configuration used to interpret the CID.</t>

<t>CID Len or Random Bits: Encodes the length of the Connection ID following the
First Octet, if applicable. Otherwise, bits indistinguisable from random,
which can be used for internal server purposes.</t>

</section>
</section>
<section anchor="unroutable"><name>Unroutable Connection IDs</name>

<section anchor="definition"><name>Definition</name>

<t>QUIC-LB servers with a valid configuration will generate Connection IDs that are
decodable to extract a server ID in accordance with a specified algorithm and
parameters.  However, QUIC often uses client-generated Connection IDs prior to
receiving a packet from the server.</t>

<t>Furthermore, servers without a valid configuration, or a configuration not
present at the load balancer, will also generate connection IDs that are not
decodable, and these CIDs are likely to persist for the duration of the
connection.</t>

<t>These CIDs might not conform to the expectations of the routing algorithm and
therefore not be routable by the load balancer. Those that are not routable are
"unroutable DCIDs" and receive similar treatment regardless of why they're
 unroutable:</t>

<t><list style="symbols">
  <t>The config rotation bits (<xref target="config-rotation"/>) do not correspond to an active
configuration. Note: a packet with a DCID with config ID codepoint 0b111 (see
<xref target="config-failover"/>) is always unroutable.</t>
  <t>If the packet header encodes the DCID length, the DCID is not long enough for
the decoder to process.</t>
  <t>The extracted server mapping does not correspond to an active server.</t>
</list></t>

<t>If the load balancer has knowledge that all servers in the pool are encoding
CID length in the first octet (see <xref target="length-self-description"/>), it MAY
perform additional checks based on that self-encoded length:</t>

<t><list style="symbols">
  <t>In a long header, verify that the self-encoded length is consistent with the
CID length field in the header (i.e. the self-encoded length is one less)</t>
  <t>Verify that the self-encoded length is consistent with the QUIC version, if
known.</t>
  <t>Verify that the self-encoded length is large enough for the decoder to process
using the indicated config ID.</t>
</list></t>

<t>DCIDs that do not meet any of these criteria are routable.</t>

</section>
<section anchor="load-balancer-forwarding"><name>Load Balancer Forwarding</name>

<t>Load balancers execute the following steps in order until one results in a
routing decision. The steps refer to state that some load balancers will
maintain, depending on the deployment's underlying assumptions. See
<xref target="fallback-algorithm"/> for further discussion of this state.</t>

<t><list style="numbers" type="1">
  <t>If the packet contains a routable CID, route the packet accordingly.</t>
  <t>If the packet has a long header and matches an entry in a table of routing
decisions indexed by a concatenation of 4-tuple and Source CID, route the packet
accordingly.</t>
  <t>If the packet matches an entry in a table of routing decisions by destination
CID, route the packet accordingly.</t>
  <t>If packet matches an entry in a table of routing decisions by 4-tuple, route
the packet accordingly.</t>
  <t>Use the fallback algorithm to make a routing decision and, if applicable,
record the results in the tables indexed by 4-tuple and/or CID. In some cases,
described below, the load balancer might buffer the packet to defer a decision.</t>
</list></t>

</section>
<section anchor="fallback-algorithm"><name>Fallback Algorithms</name>

<t>There are conditions described above where a load balancer routes a packet using
a "fallback algorithm." A standardized algorithm design is not necessary for
interoperability, so load balancers can implement any algorithm that meets the
relevant requirements below.</t>

<t>There is a baseline case that has relatively simple requirements of the chosen
fallback algorithm, and an advanced case with more capabilities and more complex
requirements.</t>

<section anchor="baseline-fallback-algorithm"><name>Baseline Fallback Algorithm</name>

<t>All load balancers MUST implement a baseline fallback algorithm that takes only
the 4-tuple as an input and outputs a routing decision.</t>

<t>If it is impossible for the server to generate CIDs that the load balancer
cannot decode (see <xref target="config-failover"/>), there are no further requirements in
this subsection.</t>

<t>Otherwise, the load balancer SHOULD maintain a table of 4-tuples that carried
unroutable DCIDs and the resulting routing decision. Provided the table does
not overflow, and the load balancer does not lose state, this allows connections
to survive when the server pool changes, which would sometimes change the output
of the fallback algorithm.</t>

<t>The load balancer MAY maintain a table of observed unroutable DCIDs and the
resulting routing decision. Provided the table does not overflow, these
connections will be robust to NAT rebinding.</t>

<t>Load balancers SHOULD store only 4-tuples and unroutable DCIDs observed in Short
Header packets. During the handshake, the 4-tuple is constant and the baseline
fallback algorithm is extremely likely to produce consistent results. Omitting
long header results reduces resource consumption in the very likely case that
the handshake produces a routable CID.</t>

<t>Load balancers SHOULD maintain per-flow timers to periodically purge state in
the tables described above.</t>

</section>
<section anchor="advanced-fallback-algorithm"><name>Advanced Fallback Algorithm</name>

<t>Some architectures might require a load balancer to choose a server pool based
on deep packet inspection of a client packet. For example, it may use the TLS
1.3 Server Name Indication (SNI) (<xref target="RFC6066"/>) field. The advanced fallback
algorithm enables this capability but levies several additional requirements to
make consistent routing decisions.</t>

<t>For packets not known to belong to a QUIC version the load balancer can parse,
load balancers MUST use the baseline fallback algorithm if the DCID is
unroutable.</t>

<t>For known QUIC versions, the fallback algorithm MAY parse packets and use that
information to make a routing decision.</t>

<t>If so, it MUST have the ability to buffer packets with unroutable DCIDs to await
further packets that allow it to make a routing decision, as the fields of
interest can be an arbitary number of packets into the connection.</t>

<t>4-tuple routing is not sufficient for this use case, because a client can use
the same 4-tuple for two connections that should be routed differently (e.g.
because they target different SNIs), as long as the packet contains a source
connection ID of nonzero length.</t>

<t>Therefore, the load balancer SHOULD maintain two tables that map different
values to a routing decision:</t>

<t><list style="symbols">
  <t>a table indexed by a concatenation of the 4-tuple and source CID, which might
be zero-length, to route subsequent long header packets that do not contain the
server-generated connection ID;</t>
  <t>a table indexed by destination CID, if and only if it is possible for the
server to generate unroutable CIDs. This table can be shared with the one in use
for the baseline fallback algorithm.</t>
</list></t>

<t>If either table overflows, or if the load balancer loses state, it is likely the
load balancer will misroute packets.</t>

<t>Load balancers SHOULD maintain per-flow timers to periodically purge state in
the tables described above.</t>

<t>Note that the client might choose a connection ID that successfully decrypts to
a server ID that is valid for the destination IP address, but not valid for the
server pool chosen by the Advanced Fallback algorithm. For example, the SNI
might not be served by the server identified in the CID. One mitigation is to
sparsely populate the server ID space to make these instances rare. A more
robust solution is to inspect long-header client packets even if their CID
successfully decrypts, if the flow is not in the table(s) described in this
section.</t>

</section>
</section>
</section>
<section anchor="server-id-encoding-in-connection-ids"><name>Server ID Encoding in Connection IDs</name>

<section anchor="sid-allocation"><name>Server ID Allocation</name>

<t>Load Balancer configurations include a mapping of server IDs to forwarding
addresses. The corresponding server configurations contain one or
more unique server IDs.</t>

<t>The configuration agent chooses a server ID length for each configuration that
MUST be at least one octet.</t>

<t>A QUIC-LB configuration MAY significantly over-provision the server ID space
(i.e., provide far more codepoints than there are servers) to increase the
probability that a randomly generated Destination Connection ID is unroutable.</t>

<t>The configuration agent SHOULD provide a means for servers to express the
number of server IDs it can usefully employ, because a single routing address
actually corresponds to multiple server entities (see <xref target="lb-chains"/>).</t>

<t>Conceptually, each configuration has its own set of server ID allocations,
though two static configurations with identical server ID lengths MAY use a
common allocation between them.</t>

<t>A server encodes one of its assigned server IDs in any CID it generates using
the relevant configuration.</t>

</section>
<section anchor="cid-format"><name>CID format</name>

<t>All connection IDs use the following format:</t>

<figure title="CID Format" anchor="plaintext-cid-format"><artwork><![CDATA[
QUIC-LB Connection ID {
    First Octet (8),
    Plaintext Block (40..152),
    Server Use (..),
}
Plaintext Block {
    Server ID (8..),
    Nonce (32..),
}
]]></artwork></figure>

<t>The First Octet field serves one or two purposes, as defined in <xref target="first-octet"/>.</t>

<t>The Server ID field encodes the information necessary for the load balancer to
route a packet with that connection ID. It is often encrypted.</t>

<t>The server varies the Nonce field to make sure that each connection ID it
generates is unique, even though they all use the same Server ID.</t>

<t>The Server Use field is an optional field that can be used for server-specific
functions. See <xref target="server-actions"/> for details.</t>

</section>
<section anchor="configuration-agent-actions"><name>Configuration Agent Actions</name>

<t>The configuration agent assigns a server ID to every server in its pool in
accordance with <xref target="sid-allocation"/>, and determines a server ID length (in
octets) sufficiently large to encode all server IDs, including potential future
servers.</t>

<t>Each configuration specifies the length of the Server ID and Nonce fields, with
limits defined for each algorithm. Note that in general, load balancers might
have different values for these lengths than servers, though they MUST agree
on the sum of the two lengths. See <xref target="lb-chains"/> and <xref target="demultiplexing"/> for
examples of why this might be useful.</t>

<t>Optionally, it also defines a 16-octet key. Note that failure to define a key
means that observers can determine the assigned server of any connection,
significantly increasing the linkability of QUIC address migration.</t>

<t>The nonce length MUST be at least 4 octets. The server ID length MUST be at
least 1 octet.</t>

<t>As QUIC version 1 limits connection IDs to 20 octets, the server ID and nonce
lengths MUST sum to 19 octets or less to be compatible with versions 1 or 2.
Note that a combined length of 19 prevents the server from using bytes for
internal use, which could have operational effects.</t>

</section>
<section anchor="server-actions"><name>Server Actions</name>

<t>The server writes the first octet and its server ID into their respective
fields.</t>

<t>If there is no key in the configuration, the server MUST fill the Nonce field
with bytes that have no observable relationship to the field in previously
issued connection IDs. If there is a key, the server fills the nonce field with
a nonce of its choosing. See <xref target="cid-entropy"/> for details.</t>

<t>The server MAY append additional bytes to the connection ID, up to the limit
specified in that version of QUIC, for its own use. These bytes MUST NOT
provide observers with any information that could link two connection IDs to
the same connection, client, or server. In particular, all servers using a
configuration MUST consistently add the same length to each connection ID,
to preserve the linkability objectives of QUIC-LB. See <xref target="demultiplexing"/> for
an example where this field could be useful.</t>

<t>If there is no key in the configuration, the Connection ID is complete.
Otherwise, there are further steps, as described in the two following
subsections.</t>

<t>Encryption below uses the AES-128-ECB cipher <xref target="NIST-AES-ECB"/>. Future standards
could add new algorithms that use other ciphers to provide cryptographic agility
in accordance with <xref target="RFC7696"/>. QUIC-LB implementations SHOULD be extensible to
support new algorithms.</t>

<section anchor="special-case-single-pass-encryption"><name>Special Case: Single Pass Encryption</name>

<t>When the nonce length and server ID length sum to exactly 16 octets, the server
MUST use a single-pass encryption algorithm. All connection ID octets except the
first form an AES-ECB block. This block is encrypted once, and the result forms
the second through seventeenth most significant bytes of the connection ID.</t>

</section>
<section anchor="general-case-four-pass-encryption"><name>General Case: Four-Pass Encryption</name>

<t>Any other field length requires four passes for encryption and at least three
for decryption. To understand this algorithm, it is useful to define four
functions that minimize the amount of bit-shifting necessary in the event that
there are an odd number of octets.</t>

<t>When configured with both a key, and a nonce length and server ID length that
sum to any number other than 16, the server MUST follow the algorith below to
encrypt the connection ID.</t>

<section anchor="overview-1"><name>Overview</name>

<t>The 4-pass algorithm is a four-round Feistel Network with the round function
being AES-ECB. Most modern applications of Feistel Networks have more than four
rounds. The implications of this choice, which is meant to limit the per-packet
compute overhead at load balancers, are discussed in
<xref target="distinguishing-attacks"/>.</t>

<t>The server concatenates the server ID and nonce into a single field, which is
then split into equal halves. In successive passes, one of these halves is
expanded into a 16B plaintext, encrypted with AES-ECB, and the result XORed with
the other half. The diagram below shows the conceptual processing of a plaintext
server ID and nonce into a connection ID. 'FO' stands for 'First Octet'.</t>

<figure><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="560" width="392" viewBox="0 0 392 560" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,32 L 8,64" fill="none" stroke="black"/>
<path d="M 8,496 L 8,528" fill="none" stroke="black"/>
<path d="M 32,64 L 32,488" fill="none" stroke="black"/>
<path d="M 56,32 L 56,64" fill="none" stroke="black"/>
<path d="M 56,112 L 56,144" fill="none" stroke="black"/>
<path d="M 56,416 L 56,448" fill="none" stroke="black"/>
<path d="M 56,496 L 56,528" fill="none" stroke="black"/>
<path d="M 80,144 L 80,408" fill="none" stroke="black"/>
<path d="M 120,448 L 120,488" fill="none" stroke="black"/>
<path d="M 152,32 L 152,64" fill="none" stroke="black"/>
<path d="M 160,192 L 160,224" fill="none" stroke="black"/>
<path d="M 160,288 L 160,320" fill="none" stroke="black"/>
<path d="M 200,64 L 200,144" fill="none" stroke="black"/>
<path d="M 200,416 L 200,448" fill="none" stroke="black"/>
<path d="M 264,240 L 264,272" fill="none" stroke="black"/>
<path d="M 264,336 L 264,368" fill="none" stroke="black"/>
<path d="M 272,448 L 272,488" fill="none" stroke="black"/>
<path d="M 320,144 L 320,408" fill="none" stroke="black"/>
<path d="M 344,32 L 344,64" fill="none" stroke="black"/>
<path d="M 344,112 L 344,144" fill="none" stroke="black"/>
<path d="M 344,416 L 344,448" fill="none" stroke="black"/>
<path d="M 344,496 L 344,528" fill="none" stroke="black"/>
<path d="M 8,32 L 344,32" fill="none" stroke="black"/>
<path d="M 8,64 L 344,64" fill="none" stroke="black"/>
<path d="M 56,112 L 344,112" fill="none" stroke="black"/>
<path d="M 56,144 L 344,144" fill="none" stroke="black"/>
<path d="M 160,192 L 224,192" fill="none" stroke="black"/>
<path d="M 80,208 L 152,208" fill="none" stroke="black"/>
<path d="M 240,208 L 312,208" fill="none" stroke="black"/>
<path d="M 160,224 L 224,224" fill="none" stroke="black"/>
<path d="M 200,240 L 264,240" fill="none" stroke="black"/>
<path d="M 88,256 L 184,256" fill="none" stroke="black"/>
<path d="M 272,256 L 320,256" fill="none" stroke="black"/>
<path d="M 200,272 L 264,272" fill="none" stroke="black"/>
<path d="M 160,288 L 224,288" fill="none" stroke="black"/>
<path d="M 80,304 L 152,304" fill="none" stroke="black"/>
<path d="M 240,304 L 312,304" fill="none" stroke="black"/>
<path d="M 160,320 L 224,320" fill="none" stroke="black"/>
<path d="M 200,336 L 264,336" fill="none" stroke="black"/>
<path d="M 88,352 L 184,352" fill="none" stroke="black"/>
<path d="M 272,352 L 320,352" fill="none" stroke="black"/>
<path d="M 200,368 L 264,368" fill="none" stroke="black"/>
<path d="M 56,416 L 344,416" fill="none" stroke="black"/>
<path d="M 56,448 L 344,448" fill="none" stroke="black"/>
<path d="M 8,496 L 344,496" fill="none" stroke="black"/>
<path d="M 8,528 L 344,528" fill="none" stroke="black"/>
<path d="M 224,192 C 232.83064,192 240,199.16936 240,208" fill="none" stroke="black"/>
<path d="M 224,224 C 232.83064,224 240,216.83064 240,208" fill="none" stroke="black"/>
<path d="M 200,240 C 191.16936,240 184,247.16936 184,256" fill="none" stroke="black"/>
<path d="M 200,272 C 191.16936,272 184,264.83064 184,256" fill="none" stroke="black"/>
<path d="M 224,288 C 232.83064,288 240,295.16936 240,304" fill="none" stroke="black"/>
<path d="M 224,320 C 232.83064,320 240,312.83064 240,304" fill="none" stroke="black"/>
<path d="M 200,336 C 191.16936,336 184,343.16936 184,352" fill="none" stroke="black"/>
<path d="M 200,368 C 191.16936,368 184,360.83064 184,352" fill="none" stroke="black"/>
<polygon class="arrowhead" points="328,408 316,402.4 316,413.6" fill="black" transform="rotate(90,320,408)"/>
<polygon class="arrowhead" points="328,292 316,286.4 316,297.6" fill="black" transform="rotate(90,320,292)"/>
<polygon class="arrowhead" points="328,196 316,190.4 316,201.6" fill="black" transform="rotate(90,320,196)"/>
<polygon class="arrowhead" points="316,304 304,298.4 304,309.6" fill="black" transform="rotate(0,308,304)"/>
<polygon class="arrowhead" points="316,208 304,202.4 304,213.6" fill="black" transform="rotate(0,308,208)"/>
<polygon class="arrowhead" points="280,488 268,482.4 268,493.6" fill="black" transform="rotate(90,272,488)"/>
<polygon class="arrowhead" points="280,352 268,346.4 268,357.6" fill="black" transform="rotate(180,272,352)"/>
<polygon class="arrowhead" points="280,256 268,250.4 268,261.6" fill="black" transform="rotate(180,272,256)"/>
<polygon class="arrowhead" points="208,104 196,98.4 196,109.6" fill="black" transform="rotate(90,200,104)"/>
<polygon class="arrowhead" points="160,304 148,298.4 148,309.6" fill="black" transform="rotate(0,152,304)"/>
<polygon class="arrowhead" points="160,208 148,202.4 148,213.6" fill="black" transform="rotate(0,152,208)"/>
<polygon class="arrowhead" points="128,488 116,482.4 116,493.6" fill="black" transform="rotate(90,120,488)"/>
<polygon class="arrowhead" points="100,352 88,346.4 88,357.6" fill="black" transform="rotate(180,92,352)"/>
<polygon class="arrowhead" points="100,256 88,250.4 88,261.6" fill="black" transform="rotate(180,92,256)"/>
<polygon class="arrowhead" points="88,408 76,402.4 76,413.6" fill="black" transform="rotate(90,80,408)"/>
<polygon class="arrowhead" points="88,340 76,334.4 76,345.6" fill="black" transform="rotate(90,80,340)"/>
<polygon class="arrowhead" points="88,244 76,238.4 76,249.6" fill="black" transform="rotate(90,80,244)"/>
<polygon class="arrowhead" points="40,488 28,482.4 28,493.6" fill="black" transform="rotate(90,32,488)"/>
<circle cx="80" cy="256" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="74" y1="256" x2="86" y2="256" stroke="black"/><line x1="80" y1="250" x2="80" y2="262" stroke="black"/><circle cx="80" cy="352" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="74" y1="352" x2="86" y2="352" stroke="black"/><line x1="80" y1="346" x2="80" y2="358" stroke="black"/><circle cx="320" cy="208" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="314" y1="208" x2="326" y2="208" stroke="black"/><line x1="320" y1="202" x2="320" y2="214" stroke="black"/><circle cx="320" cy="304" r="6" class="xordot" fill="white" stroke="black"/>
<line x1="314" y1="304" x2="326" y2="304" stroke="black"/><line x1="320" y1="298" x2="320" y2="310" stroke="black"/><g class="text">
<text x="28" y="52">FO</text>
<text x="92" y="52">Server</text>
<text x="132" y="52">ID</text>
<text x="248" y="52">Nonce</text>
<text x="132" y="132">left_0</text>
<text x="280" y="132">right_0</text>
<text x="200" y="212">AES-ECB</text>
<text x="360" y="244">right_1</text>
<text x="224" y="260">AES-ECB</text>
<text x="116" y="292">left_1</text>
<text x="200" y="308">AES-ECB</text>
<text x="224" y="356">AES-ECB</text>
<text x="132" y="436">left_2</text>
<text x="280" y="436">right_2</text>
<text x="28" y="516">FO</text>
<text x="196" y="516">Ciphertext</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
   +-----+-----------+-----------------------+
   | FO  | Server ID |         Nonce         |
   +--+--+-----------+-----+-----------------+
      |                    |
      |                    V
      |  +-----------------+-----------------+
      |  |      left_0     |      right_0    |
      |  +--+--------------+--------------+--+
      |     |                             |
      |     |                             |
      |     |         .--------.          V
      |     +-------->| AES-ECB +-------->⊕
      |     |         '--------'          |
      |     V             .--------.      | right_1
      |     ⊕<-----------+ AES-ECB |<-----+
      |     |             '--------'      |
      |     | left_1  .--------.          V
      |     +-------->| AES-ECB +-------->⊕
      |     |         '--------'          |
      |     V             .--------.      |
      |     ⊕<-----------+ AES-ECB |<-----+
      |     |             '--------'      |
      |     |                             |
      |     V                             V
      |  +-----------------+-----------------+
      |  |      left_2     |      right_2    |
      |  +-------+---------+--------+--------+
      |          |                  |
      V          V                  V
   +-----+-----------------------------------+
   | FO  |            Ciphertext             |
   +-----+-----------------------------------+
]]></artwork></artset></figure>

</section>
<section anchor="useful-functions"><name>Useful functions</name>

<t>Two functions are useful to define:</t>

<t>The expand(length, pass, input_bytes) function concatenates three arguments and
outputs 16 zero-padded octets.</t>

<t>The output of expand is as follows:</t>

<figure><sourcecode type="pseudocode"><![CDATA[
ExpandResult {
     input_bytes(...),
     ZeroPad(...),
     length(8),
     pass(8)
}
]]></sourcecode></figure>

<t>in which:</t>

<t><list style="symbols">
  <t>'input_bytes' is drawn from one half of the plaintext. It forms the N most
significant octets of the output, where N is half the 'length' argument, rounded
up, and thus a number between 3 and 10, inclusive.</t>
  <t>'Zeropad' is a set of 14-N octets set to zero.</t>
  <t>'length' is an 8-bit integer that reports the sum of the configured nonce
length and server id length in octets, and forms the fifteenth octet of the
output. The 'length' argument MUST NOT exceed 19 and MUST NOT be less than 5.</t>
  <t>'pass' is an 8-bit integer that reports the 'pass' argument of the algorithm,
and forms the sixteenth (least significant) octet of the output. It guarantees
that the cryptographic input of every pass of the algorithm is unique.</t>
</list></t>

<t>For example,</t>

<figure><sourcecode type="pseudocode"><![CDATA[
expand(0x06, 0x02, 0xaaba3c) = 0xaaba3c00000000000000000000000602
]]></sourcecode></figure>

<t>Similarly, truncate(input, n) returns the first n octets of 'input'.</t>

<figure><sourcecode type="pseudocode"><![CDATA[
truncate(0x2094842ca49256198c2deaa0ba53caa0, 4) = 0x2094842c
]]></sourcecode></figure>

<t>Let 'half_len' be equal to 'plaintext_len' / 2, rounded up.</t>

</section>
<section anchor="algorithm-description"><name>Algorithm Description</name>

<t>The example at the end of this section helps to clarify the steps described
below.</t>

<t><list style="numbers" type="1">
  <t>The server concatenates the server ID and nonce to create plaintext_CID. The
length of the result in octets is plaintext_len.</t>
  <t>The server splits plaintext_CID into components left_0 and right_0 of equal
length half_len. If plaintext_len is odd, right_0 clears its first four bits,
and left_0 clears its last four bits. For example, 0x7040b81b55ccf3 would split
into a left_0 of 0x7040b810 and right_0 of 0x0b55ccf3.</t>
  <t>Encrypt the result of expand(plaintext_len, 1, left_0) using an AES-ECB-128
cipher to obtain a ciphertext.</t>
  <t>XOR the first half_len octets of the ciphertext with right_0 to form right_1.
Steps 3 and 4 can be summarized as</t>
</list></t>

<figure><sourcecode type="psuedocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 1, left_0))
    right_1 = XOR(right_0, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="5" type="1">
  <t>If the plaintext_len is odd, clear the first four bits of right_1.</t>
  <t>Repeat steps 3 and 4, but use them to compute left_1 by expanding and
encrypting right_1 with pass = 2, and XOR the results with left_0.</t>
</list></t>

<figure><sourcecode type="psuedocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 2, right_1))
    left_1 = XOR(left_0, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="7" type="1">
  <t>If the plaintext_len is odd, clear the last four bits of left_1.</t>
  <t>Repeat steps 3 and 4, but use them to compute right_2 by expanding and
encrypting left_1 with pass = 3, and XOR the results with right_1.</t>
</list></t>

<figure><sourcecode type="pseudocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 3, left_1))
    right_2 = XOR(right_1, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="9" type="1">
  <t>If the plaintext_len is odd, clear the first four bits of right_2.</t>
  <t>Repeat steps 3 and 4, but use them to compute left_2 by expanding and
encrypting right_2 with pass = 4, and XOR the results with left_1.</t>
</list></t>

<figure><sourcecode type="psuedocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 4, right_2))
    left_2 = XOR(left_1, truncate(result, half_len))
]]></sourcecode></figure>

<t><list style="numbers" start="11" type="1">
  <t>If the plaintext_len is odd, clear the last four bits of left_2.</t>
  <t>The server concatenates left_2 with right_2 to form the ciphertext CID,
which it appends to the first octet. If plaintext_len is odd, the four
least significant bits of left_2 and four most significant bits of right_2,
which are all zero, are stripped off before concatenation to make the
resulting ciphertext the same length as the original plaintext.</t>
</list></t>

</section>
<section anchor="encryption-example"><name>Encryption Example</name>

<t>The following example executes the steps for the provided inputs. Note that the
plaintext is of odd octet length, so the middle octet will be split evenly
left_0 and right_0.</t>

<figure><sourcecode type="pseudocode"><![CDATA[
server_id = 0x31441a
nonce = 0x9c69c275
key = 0xfdf726a9893ec05c0632d3956680baf0

// step 1
plaintext_CID = 0x31441a9c69c275
plaintext_len = 7

// step 2
half_len = 4
left_0 = 0x31441a90
right_0 = 0x0c69c275

// step 3
aes_input = 0x31441a90000000000000000000000701
aes_output = 0xa255dd8cdacf01948d3a848c3c7fee23

// step 4
right_1 = 0x0c69c275 ^ 0xa255dd8c = 0xae3c1ff9

// step 5 (clear bits)
right_1 = 0x0e3c1ff9

// step 6
aes_input = 0x0e3c1ff9000000000000000000000702
aes_output = 0xe5e452cb9e1bedb0b2bf830506bf4c4e
left_1 = 0x31441a90 ^ 0xe5e452cb = 0xd4a0485b

// step 7 (clear bits)
left_1 = 0xd4a04850

// step 8
aes_input = 0xd4a04850000000000000000000000703
aes_output = 0xb7821ab3024fed0913b6a04d18e3216f
right_2 = 0x0e3c1ff9 ^ 0xb7821ab3 = 0xb9be054a

// step 9 (clear bits)
right_2 = 0x09be054a

// step 10
aes_input = 0x09be054a000000000000000000000704
aes_output = 0xb334357cfdf81e3fafe180154eaf7378
left_2 = 0xd4a04850 ^ 0xb3e4357c = 0x67947d2c

// step 11 (clear bits)
left_2 = 0x67947d20

// step 12
cid = first_octet || left_2 || right_2 = 0x0767947d29be054a
]]></sourcecode></figure>

</section>
</section>
</section>
<section anchor="load-balancer-actions"><name>Load Balancer Actions</name>

<t>On each incoming packet, the load balancer extracts consecutive octets,
beginning with the second octet. If there is no key, the first octets
correspond to the server ID.</t>

<t>If there is a key, the load balancer takes one of two actions:</t>

<section anchor="special-case-single-pass-encryption-1"><name>Special Case: Single Pass Encryption</name>

<t>If server ID length and nonce length sum to exactly 16 octets, they form a
ciphertext block. The load balancer decrypts the block using the AES-ECB key
and extracts the server ID from the most significant bytes of the resulting
plaintext.</t>

</section>
<section anchor="general-case-four-pass-encryption-1"><name>General Case: Four-Pass Encryption</name>

<t>First, split the ciphertext CID (excluding the first octet) into its equal-
length components left_2 and right_2. Then follow the process below:</t>

<figure><sourcecode type="pseudocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 4, right_2))
    left_1 = XOR(left_2, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_last_bits(left_1, 4)

    result = AES_ECB(key, expand(plaintext_len, 3, left_1))
    right_1 = XOR(right_2, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_first_bits(left_1, 4)

    result = AES_ECB(key, expand(plaintext_len, 2, right_1))
    left_0 = XOR(left_1, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_last_bits(left_0, 4)
]]></sourcecode></figure>

<t>As the load balancer has no need for the nonce, it can conclude after 3 passes
as long as the server ID is entirely contained in left_0 (i.e., the nonce is at
least as large as the server ID). If the server ID is longer, a fourth pass
is necessary:</t>

<figure><sourcecode type="pseudocode"><![CDATA[
    result = AES_ECB(key, expand(plaintext_len, 1, left_0))
    right_0 = XOR(right_1, truncate(result, half_len))
    if (plaintext_len_is_odd()) clear_first_bits(right_0, 4)
]]></sourcecode></figure>

<t>and the load balancer has to concatenate left_0 and right_0 to obtain the
complete server ID.</t>

</section>
</section>
</section>
<section anchor="implementation-considerations"><name>Implementation Considerations</name>

<section anchor="per-connection-state"><name>Per-connection state</name>

<t>The encodings QUIC-LB defines require no connection state at the load balancer,
with a few conditional exceptions described in <xref target="unroutable"/>. Otherwise, the
load balancer can extract the server ID from the connection ID of each incoming
packet and route that packet accordingly.</t>

<t>However, once a routing decision has been made, the load balancer MAY
associate the 4-tuple or connection ID with the decision. This has two
advantages:</t>

<t><list style="symbols">
  <t>The load balancer only extracts the server ID once until the 4-tuple or
connection ID changes. When the CID is encrypted, this might reduce
computational load.</t>
  <t>Incoming Stateless Reset packets and ICMP messages are easily routed to the
correct origin server.</t>
</list></t>

<t>In addition to the increased state requirements, however, load balancers cannot
detect the packets that indicate the end of the connection, so they rely on a
timeout to delete connection state. There are numerous considerations around
setting such a timeout.</t>

<t>In the event a connection ends, freeing an IP and port, and a different
connection migrates to that IP and port before the timeout, the load balancer
will misroute the different connection's packets to the original server. A short
timeout limits the likelihood of such a misrouting.</t>

<t>Furthermore, if a short timeout causes premature deletion of state, the routing
is easily recoverable by decoding an incoming Connection ID. However, a short
timeout also reduces the chance that an incoming Stateless Reset is correctly
routed.</t>

<t>Note that some heuristics to purge state early can introduce Denial of Service
vulnerabilities. For example, one heuristic might delete flow state once the
load balancer observes a routable CID on that flow. An attacker that can observe
a target flow can store a routable CID from a previous connection and spoof the
target flow's 4-tuple with the routable CID, causing premature deletion of that
state.</t>

<t>Servers MAY implement the technique described in <xref section="14.4.1" sectionFormat="of" target="RFC9000"/>
in case the load balancer is stateless, to increase the likelihood a Source
Connection ID is included in ICMP responses to Path Maximum Transmission Unit
(PMTU) probes.  Load balancers MAY parse the echoed packet to extract the Source
Connection ID, if it contains a QUIC long header, and extract the Server ID as
if it were in a Destination CID.</t>

</section>
<section anchor="retiring"><name>Retiring Old Connection IDs</name>

<t>A server running long-lived connections might need to request retirement of all
of its connection IDs because the load balancer will no longer support the key
it used, that key was compromised, or due to policy regarding the maximum
lifetime of ciphertext using that key.</t>

<t><xref section="5.1.2" sectionFormat="of" target="RFC9000"/> explicitly anticipates replacing all active
connection IDs at once. To do so, the endpoint sends a batch of
NEW_CONNECTION_ID frames, each with Retire Prior To set to the sequence number
of the first replacement connection ID. This requests retirement of all previously
issued connection IDs while supplying their replacements.</t>

<t>However, some implementations update path-to-connection-ID bindings while
processing each NEW_CONNECTION_ID frame and discard paths that cannot
immediately be assigned a replacement connection ID. Processing the first frame
can therefore cause these implementations to discard backup paths or abort
ongoing path validation, even if subsequent frames in the same packet supply
enough connection IDs to preserve all paths.</t>

<t>To mitigate this behavior, an endpoint can increase Retire Prior To incrementally
across the batch, replacing one old connection ID with each frame. This departs
from the recommendation in Section 5.1.2 of RFC 9000 to wait for all retirements
requested by the previous Retire Prior To value before increasing it again.</t>

<t>Alternatively, an endpoint can replace connection IDs one at a time, waiting for
the corresponding RETIRE_CONNECTION_ID frame before requesting the next
retirement. This avoids the temporary shortage caused by bulk retirement, but
requires multiple exchanges over a connection that might otherwise be idle.</t>

</section>
<section anchor="lb-chains"><name>Load balancer chains</name>

<t>Some network architectures may have multiple tiers of low-state load balancers,
where a first tier of devices makes a routing decision to the next tier, and so
on, until packets reach the server.</t>

<t>If each load balancer is assigned a range of server IDs that is a subset of the
range of IDs assigned to devices that are closer to the client, then the first
devices to process an incoming packet can extract the server ID and then map it
to the correct forwarding address. Note that this solution is extensible to
arbitrarily large numbers of load-balancing tiers, as the maximum server ID
space is quite large.</t>

<t>If the number of necessary server IDs per next hop is roughly uniform, a simple
implementation would use successively longer server IDs at each tier of load
balancing, and the server configuration would match the last tier. Load
balancers closer to the client can then treat any parts of the server ID they
did not use as part of the nonce.</t>

</section>
<section anchor="demultiplexing"><name>Server Process Demultiplexing</name>

<t>QUIC servers might have QUIC running on multiple processes or threads listening
on the same address, and need to demultiplex between them. Conceptually, this
demultiplexer is a Layer 4 load balancer, and the guidance in <xref target="lb-chains"/>
applies. However, in many deployments the demultiplexer lacks the capability to
perform decryption operations. Internal server coordination is out of scope of
this specification, but this non-normative section proposes some approaches
that could work given certain server capabilities:</t>

<t><list style="symbols">
  <t>Some bytes of the server ID are reserved to encode the process ID. The
demultiplexer might operate based on the 4-tuple or other legacy indicator, but
the receiving server process extracts the server ID, and if it does not match
the one for that process, the process could "toss" the packet to the correct
destination process.</t>
  <t>Each process could register the connection IDs it generates with the
demultiplexer, which routes those connection IDs accordingly.</t>
  <t>In a combination of the two approaches above, the demultiplexer generally
routes by 4-tuple. After a migration, the process tosses the first flight of
packets and registers the new connection ID with the demultiplexer. This
alternative limits the bandwidth consumption of tossing and the memory footprint
of a full connection ID table.</t>
  <t>When generating a connection ID, the server writes the process ID to the
random field of the first octet, or if this is being used for length encoding,
in an octet it appends after the ciphertext. It then applies a keyed hash (with
a key locally generated for the sole use of that server). The hash result is
used as a bitmask to XOR with the bits encoding the process ID. On packet
receipt, the demultiplexer applies the same keyed hash to generate the same
mask and recoversthe process ID. (Note that this approach is conceptually
similar to QUIC header protection). It is important that the server also appends
the process ID to the server ID in the plaintext, so that different processes do
not generate the same ciphertext. The load balancer will consider this data to
be part of the nonce.</t>
</list></t>

</section>
<section anchor="moving-connections-between-servers"><name>Moving connections between servers</name>

<t>Some deployments may transparently move a connection from one server to another.
The means of transferring connection state between servers is out of scope of
this document.</t>

<t>To support a handover, a server involved in the transition could issue CIDs that
map to the new server via a NEW_CONNECTION_ID frame, and retire CIDs associated
with the old server using the "Retire Prior To" field in that frame.</t>

</section>
</section>
<section anchor="version-invariance"><name>Version Invariance of QUIC-LB</name>

<t>The server ID encodings, and requirements for their handling, are designed to be
QUIC version independent (see <xref target="RFC8999"/>). A QUIC-LB load balancer will
generally not require changes as servers deploy new versions of QUIC. However,
there are several unlikely future design decisions that could impact the
operation of QUIC-LB.</t>

<t>A QUIC version might define limits on connection ID length that make some or all
of the mechanisms in this document unusable.  For example, a maximum connection
ID length could be below the minimum necessary to use all or part of this
specification; or, the minimum connection ID length could be larger than the
largest value in this specification. Similarly, the length self-encoding
specification cannot accommodate connection IDs longer than 32 bytes.</t>

<t>The advanced fallback implementation supports a requirement to inspect version-
specific elements of packets to make a routing decision, such as the Server Name
Indication (SNI) extension in the TLS Client Hello.  The format and
cryptographic protection of this information may change in future versions or
extensions of TLS or QUIC, and therefore this functionality is inherently
version-dependent. Such a load balancer, when it receives packets from an
unknown QUIC version, might misdirect initial packets to the wrong tenant. While
this can be inefficient, the design in this document preserves the ability for
tenants to deploy new versions provided they have an out-of-band means of
providing a connection ID for the client to use.</t>

<t><xref target="load-balancer-forwarding"/> provides guidance about how load balancers should
handle unroutable DCIDs. This guidance, and the implementation of an algorithm
to handle these DCIDs, rests on some assumptions about packets that contain
client-generated DCIDs that are not specified in RFC 8999:</t>

<t><list style="numbers" type="1">
  <t>they do not have short headers;</t>
  <t>the 4-tuple remains constant;</t>
  <t>if the load balancer uses the Advanced Fallback Algorithm, the packets have
a constant Source Connection ID.</t>
</list></t>

<t>While this document does not update the commitments in <xref target="RFC8999"/>, the
additional assumptions are minimal and narrowly scoped, and provide a likely
set of constants that load balancers can use with minimal risk of version-
dependence.</t>

<t>If these assumptions are not valid, this specification is likely to lead to loss
of packets that contain unroutable DCIDs, and in extreme cases connection
failure.  A QUIC version that violates the assumptions in this section therefore
cannot be safely deployed with a load balancer that follows this specification.
An updated or alternative version of this specification might address these
shortcomings for such a QUIC version.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>QUIC-LB is intended to prevent linkability.  Attacks would therefore attempt to
subvert this purpose.</t>

<t>Note that without a key for the encoding, QUIC-LB makes no attempt to obscure
the server mapping, and therefore does not address these concerns. Without a
key, QUIC-LB merely allows consistent CID encoding for compatibility across a
network infrastructure, which makes QUIC robust to NAT rebinding. Servers that
are encoding their server ID without a key algorithm SHOULD only use it to
generate new CIDs for the Server Initial Packet and SHOULD NOT send CIDs in QUIC
NEW_CONNECTION_ID frames, except that it sends one new Connection ID in the
event of config rotation (<xref target="config-rotation"/>). Doing so might falsely suggest
to the client that said CIDs were generated in a secure fashion.</t>

<t>A linkability attack would find some means of determining that two connection
IDs route to the same server. Due to the limitations of measures at QUIC layer,
there is no scheme that strictly prevents linkability for all traffic patterns.</t>

<t>To see why, consider two limits. At one extreme, one client is connected to the
server pool and migrates its address. An observer can easily link the two
addresses, and there is no remedy at the QUIC layer.</t>

<t>At the other extreme, a very large number of clients are connected to each
server, and they all migrate address constantly. At this limit, even an
unencrypted server ID encoding is unlikely to definitively link two addresses.</t>

<t>Therefore, efforts to frustrate any analysis of server ID encoding have
diminishing returns. Nevertheless, this specification seeks to minimize the
probability two addresses can be linked.</t>

<section anchor="attackers-not-between-the-load-balancer-and-server"><name>Attackers not between the load balancer and server</name>

<t>Any attacker might open a connection to the server infrastructure and
aggressively simulate migration to obtain a large sample of IDs that map to the
same server. It could then apply analytical techniques to try to obtain the
server encoding.</t>

<t>An encrypted encoding provides robust protection against this. An unencrypted
one provides none.</t>

<t>Were this analysis to obtain the server encoding, then on-path observers might
apply this analysis to correlating different client IP addresses.</t>

</section>
<section anchor="attackers-between-the-load-balancer-and-server"><name>Attackers between the load balancer and server</name>

<t>Attackers in this privileged position are intrinsically able to map two
connection IDs to the same server. These algorithms ensure that two connection
IDs for the same connection cannot be identified as such as long as the server
chooses the first octet and any plaintext nonce correctly.</t>

</section>
<section anchor="multiple-configs"><name>Multiple Configuration IDs</name>

<t>During the period in which there are multiple deployed configuration IDs (see
<xref target="config-rotation"/>), there is a slight increase in linkability. The server
space is effectively divided into segments with CIDs that have different config
rotation bits. Entities that manage servers SHOULD strive to minimize these
periods by quickly deploying new configurations across the server pool.</t>

</section>
<section anchor="limited-configuration-scope"><name>Limited configuration scope</name>

<t>A simple deployment of QUIC-LB in a cloud provider might use the same global
QUIC-LB configuration across all its load balancers that route to customer
servers. An attacker could then simply become a customer, obtain the
configuration, and then extract server IDs of other customers' connections at
will.</t>

<t>To avoid this, the configuration agent SHOULD issue QUIC-LB configurations to
mutually distrustful servers that have different keys for encryption
algorithms. In many cases, the load balancers can distinguish these
configurations by external IP address.</t>

<t>However, assigning multiple entities to an IP address is complimentary with
concealing DNS requests (e.g., DoH <xref target="RFC8484"/>) and the TLS Server Name
Indicator (SNI) (<xref target="I-D.ietf-tls-esni"/>) to obscure the ultimate destination
of traffic. While the load balancer's fallback algorithm
(<xref target="fallback-algorithm"/>) can use the SNI to make a routing decision on the
first packet, there are three ways to route subsequent packets:</t>

<t><list style="symbols">
  <t>all co-tenants can use the same QUIC-LB configuration, leaking the server
mapping to each other as described above;</t>
  <t>co-tenants can be issued one of up to seven configurations distinguished by
the config rotation bits (<xref target="config-rotation"/>), exposing information about the
target domain to the entire network;</t>
  <t>tenants can be assigned the Plaintext CID algorithm (in which case they SHOULD
disable migration in their connections), which will prevent migration but
preserve privacy; or</t>
  <t>tenants are assigned different keys, and the load balancer trial-decrypts the
connection ID with every key assigned to that codepoint and IP address and
routes according to the success of each attempt. Keeping per-connection-ID state
might reduce the compute cost of this approach.</t>
</list></t>

<t>When configuring QUIC-LB, administrators evaluate the privacy and performance
tradeoff by considering the relative value of each of these properties, given
the trust model between tenants, the presence of methods to obscure the domain
name, and value of address migration in the tenant use cases.</t>

<t>In the case that the administrating entity also controls a reverse proxy between
the load balancer and the tenants, the reverse proxy generates the external
CIDs, and there is no tradeoff.</t>

</section>
<section anchor="stateless-reset-oracle"><name>Stateless Reset Oracle</name>

<t>Section 21.9 of <xref target="RFC9000"/> discusses the Stateless Reset Oracle attack.  For a
server deployment to be vulnerable, an attacking client must be able to cause
two packets with the same Destination CID to arrive at two different servers
that share the same cryptographic context for Stateless Reset tokens. As QUIC-LB
requires deterministic routing of DCIDs over the life of a connection, it is a
sufficient means of avoiding an Oracle without additional measures.</t>

<t>Note also that when a server starts using a new QUIC-LB config rotation
codepoint, new CIDs might not be unique with respect to previous configurations
that occupied that codepoint, and therefore different clients may have observed
the same CID and stateless reset token. A straightforward method of managing
stateless reset keys is to maintain a separate key for each config rotation
codepoint, and replace each key when the configuration for that codepoint
changes. Thus, a server transitions from one config to another, it will be able
to generate correct tokens for connections using either type of CID.</t>

</section>
<section anchor="cid-entropy"><name>Connection ID Entropy</name>

<t>If a server ever reuses a nonce in generating a CID for a given configuration,
it risks exposing sensitive information. Given the same server ID, the CID will
be identical (aside from a possible difference in the first octet).  This can
risk exposure of the QUIC-LB key. If two clients receive the same connection ID,
they also have each other's stateless reset token unless that key has changed in
the interim.</t>

<t>The encrypted mode needs to generate different cipher text for each generated
Connection ID instance to protect the Server ID. To do so, at least four octets
of the CID are reserved for a nonce that, if used only once, will result in
unique cipher text for each Connection ID.</t>

<t>If servers simply increment the nonce by one with each generated connection ID,
then it is safe to use the existing keys until any server's nonce counter
exhausts the allocated space and rolls over. To maximize entropy, servers SHOULD
start with a random nonce value, in which case the configuration is usable until
the nonce value wraps around to zero and then reaches the initial value again.</t>

<t>Whether or not it implements the counter method, the server MUST NOT reuse a
nonce until it switches to a configuration with new keys.</t>

<t>Servers are forbidden from generating linkable plaintext nonces, because
observable correlations between plaintext nonces would provide trivial
linkability between individual connections, rather than just to a common server.</t>

<t>For any algorithm, configuration agents SHOULD implement an out-of-band method
to discover when servers are in danger of exhausting their nonce space, and
SHOULD respond by issuing a new configuration. A server that has exhausted its
nonces MUST either switch to a different configuration, or if none exists, use
the 4-tuple routing config rotation codepoint.</t>

<t>When sizing a nonce that is to be randomly generated, the configuration agent
SHOULD consider that a server generating a N-bit nonce will create a duplicate
about every 2^(N/2) attempts, and therefore compare the expected rate at which
servers will generate CIDs with the lifetime of a configuration.</t>

</section>
<section anchor="distinguishing-attacks"><name>Distinguishing Attacks</name>

<t>The Four Pass Encryption algorithm is structured as a 4-round Feistel network
with non-bijective round function. As such, it does not offer a very high
security level against distinguishing attacks, as explained in <xref target="Patarin2008"></xref>.
Attackers can mount these attacks if they are in possession of O(SQRT(len/2))
pairs of ciphertext and known corresponding plain text, where "len" is the
sum of the lengths of the Server ID and the Nonce.</t>

<t>The authors considered increasing the number of passes from 4 to 12,
which would definitely block these attacks. However, this would require
12 rounds of AES decryption by load balancers accessing the CID, a cost deemed
prohibitive in the planned deployments.</t>

<t>The attacks described in <xref target="Patarin2008"></xref> rely on known plain text. In a normal
deployment, the plain text is only known by the server that generates the ID
and by the load balancer that decrypts the content of the CID. Attackers
would have to compensate by guesses about the allocation of server identifiers
or the generation of nonces. These attacks are thus mitigated by making nonces
hard to guess, as specified in <xref target="cid-entropy"/>. Furthermore, deployments that
use both cleartext and encrypted CIDs MUST use different server ID allocations
for those two types.</t>

<t>These attacks cannot be mounted against the Single Pass Encryption algorithm.</t>

</section>
<section anchor="early-deletion-of-load-balancer-connection-state"><name>Early deletion of load balancer connection state</name>

<t>Potential vulnerabilities related to heuristics that delete per-connection state
are described in <xref target="per-connection-state"/>. Under certain assumptions about
server configuration and fallback algorithm, this state might be critical to
maintaining connectivity. Under other assumptions, the state provides robustness
to improbable network events.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>There are no IANA requirements.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

<reference anchor="NIST-AES-ECB" target="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf">
  <front>
    <title>Recommendation for Block Cipher Modes of Operation: Methods and Techniques</title>
    <author initials="M." surname="Dworkin">
      <organization></organization>
    </author>
    <date year="2021"/>
  </front>
<refcontent>NIST Special Publication 800-38A</refcontent></reference>


<reference anchor="RFC9000">
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
    <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9000"/>
  <seriesInfo name="DOI" value="10.17487/RFC9000"/>
</reference>
<reference anchor="RFC8999">
  <front>
    <title>Version-Independent Properties of QUIC</title>
    <author fullname="M. Thomson" initials="M." surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the properties of the QUIC transport protocol that are common to all versions of the protocol.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8999"/>
  <seriesInfo name="DOI" value="10.17487/RFC8999"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="Patarin2008" target="https://eprint.iacr.org/2008/036.pdf">
  <front>
    <title>Generic Attacks on Feistel Schemes - Extended Version</title>
    <author initials="J." surname="Patarin" fullname="Jacques Patarin">
      <organization>PRiSM, University of Versailles</organization>
    </author>
    <date year="2008"/>
  </front>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC6066">
  <front>
    <title>Transport Layer Security (TLS) Extensions: Extension Definitions</title>
    <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
    <date month="January" year="2011"/>
    <abstract>
      <t>This document provides specifications for existing TLS extensions. It is a companion document for RFC 5246, "The Transport Layer Security (TLS) Protocol Version 1.2". The extensions specified are server_name, max_fragment_length, client_certificate_url, trusted_ca_keys, truncated_hmac, and status_request. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6066"/>
  <seriesInfo name="DOI" value="10.17487/RFC6066"/>
</reference>
<reference anchor="RFC7696">
  <front>
    <title>Guidelines for Cryptographic Algorithm Agility and Selecting Mandatory-to-Implement Algorithms</title>
    <author fullname="R. Housley" initials="R." surname="Housley"/>
    <date month="November" year="2015"/>
    <abstract>
      <t>Many IETF protocols use cryptographic algorithms to provide confidentiality, integrity, authentication, or digital signature. Communicating peers must support a common set of cryptographic algorithms for these mechanisms to work properly. This memo provides guidelines to ensure that protocols have the ability to migrate from one mandatory-to-implement algorithm suite to another over time.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="201"/>
  <seriesInfo name="RFC" value="7696"/>
  <seriesInfo name="DOI" value="10.17487/RFC7696"/>
</reference>
<reference anchor="RFC8484">
  <front>
    <title>DNS Queries over HTTPS (DoH)</title>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <author fullname="P. McManus" initials="P." surname="McManus"/>
    <date month="October" year="2018"/>
    <abstract>
      <t>This document defines a protocol for sending DNS queries and getting DNS responses over HTTPS. Each DNS query-response pair is mapped into an HTTP exchange.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8484"/>
  <seriesInfo name="DOI" value="10.17487/RFC8484"/>
</reference>

<reference anchor="I-D.ietf-tls-esni">
   <front>
      <title>TLS Encrypted Client Hello</title>
      <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
         <organization>Independent</organization>
      </author>
      <author fullname="Kazuho Oku" initials="K." surname="Oku">
         <organization>Fastly</organization>
      </author>
      <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
         <organization>Cryptography Consulting LLC</organization>
      </author>
      <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
         <organization>Cloudflare</organization>
      </author>
      <date day="14" month="June" year="2025"/>
      <abstract>
	 <t>   This document describes a mechanism in Transport Layer Security (TLS)
   for encrypting a ClientHello message under a server public key.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/tlswg/draft-ietf-tls-esni
   (https://github.com/tlswg/draft-ietf-tls-esni).

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-tls-esni-25"/>
   
</reference>
<reference anchor="RFC6020">
  <front>
    <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
    <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
    <date month="October" year="2010"/>
    <abstract>
      <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6020"/>
  <seriesInfo name="DOI" value="10.17487/RFC6020"/>
</reference>
<reference anchor="RFC8340">
  <front>
    <title>YANG Tree Diagrams</title>
    <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
    <author fullname="L. Berger" initials="L." role="editor" surname="Berger"/>
    <date month="March" year="2018"/>
    <abstract>
      <t>This document captures the current syntax used in YANG module tree diagrams. The purpose of this document is to provide a single location for this definition. This syntax may be updated from time to time based on the evolution of the YANG language.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="215"/>
  <seriesInfo name="RFC" value="8340"/>
  <seriesInfo name="DOI" value="10.17487/RFC8340"/>
</reference>
<reference anchor="RFC9146">
  <front>
    <title>Connection Identifier for DTLS 1.2</title>
    <author fullname="E. Rescorla" initials="E." role="editor" surname="Rescorla"/>
    <author fullname="H. Tschofenig" initials="H." role="editor" surname="Tschofenig"/>
    <author fullname="T. Fossati" initials="T." surname="Fossati"/>
    <author fullname="A. Kraus" initials="A." surname="Kraus"/>
    <date month="March" year="2022"/>
    <abstract>
      <t>This document specifies the Connection ID (CID) construct for the Datagram Transport Layer Security (DTLS) protocol version 1.2.</t>
      <t>A CID is an identifier carried in the record layer header that gives the recipient additional information for selecting the appropriate security association. In "classical" DTLS, selecting a security association of an incoming DTLS record is accomplished with the help of the 5-tuple. If the source IP address and/or source port changes during the lifetime of an ongoing DTLS session, then the receiver will be unable to locate the correct security context.</t>
      <t>The new ciphertext record format with the CID also provides content type encryption and record layer padding.</t>
      <t>This document updates RFC 6347.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9146"/>
  <seriesInfo name="DOI" value="10.17487/RFC9146"/>
</reference>
<reference anchor="RFC4347">
  <front>
    <title>Datagram Transport Layer Security</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
    <date month="April" year="2006"/>
    <abstract>
      <t>This document specifies Version 1.0 of the Datagram Transport Layer Security (DTLS) protocol. The DTLS protocol provides communications privacy for datagram protocols. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. The DTLS protocol is based on the Transport Layer Security (TLS) protocol and provides equivalent security guarantees. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4347"/>
  <seriesInfo name="DOI" value="10.17487/RFC4347"/>
</reference>
<reference anchor="RFC6347">
  <front>
    <title>Datagram Transport Layer Security Version 1.2</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
    <date month="January" year="2012"/>
    <abstract>
      <t>This document specifies version 1.2 of the Datagram Transport Layer Security (DTLS) protocol. The DTLS protocol provides communications privacy for datagram protocols. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. The DTLS protocol is based on the Transport Layer Security (TLS) protocol and provides equivalent security guarantees. Datagram semantics of the underlying transport are preserved by the DTLS protocol. This document updates DTLS 1.0 to work with TLS version 1.2. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6347"/>
  <seriesInfo name="DOI" value="10.17487/RFC6347"/>
</reference>
<reference anchor="RFC7983">
  <front>
    <title>Multiplexing Scheme Updates for Secure Real-time Transport Protocol (SRTP) Extension for Datagram Transport Layer Security (DTLS)</title>
    <author fullname="M. Petit-Huguenin" initials="M." surname="Petit-Huguenin"/>
    <author fullname="G. Salgueiro" initials="G." surname="Salgueiro"/>
    <date month="September" year="2016"/>
    <abstract>
      <t>This document defines how Datagram Transport Layer Security (DTLS), Real-time Transport Protocol (RTP), RTP Control Protocol (RTCP), Session Traversal Utilities for NAT (STUN), Traversal Using Relays around NAT (TURN), and ZRTP packets are multiplexed on a single receiving socket. It overrides the guidance from RFC 5764 ("SRTP Extension for DTLS"), which suffered from four issues described and fixed in this document.</t>
      <t>This document updates RFC 5764.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7983"/>
  <seriesInfo name="DOI" value="10.17487/RFC7983"/>
</reference>
<reference anchor="RFC9147">
  <front>
    <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
    <date month="April" year="2022"/>
    <abstract>
      <t>This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
      <t>This document obsoletes RFC 6347.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9147"/>
  <seriesInfo name="DOI" value="10.17487/RFC9147"/>
</reference>



    </references>

</references>


<?line 1208?>

<section anchor="yang-model"><name>QUIC-LB YANG Model</name>

<t>These YANG models conform to <xref target="RFC6020"/> and express a complete QUIC-LB
configuration. There is one model for the server and one for the middlebox
(i.e the load balancer and/or Retry Service).</t>

<figure><artwork><![CDATA[
module ietf-quic-lb-server {
  yang-version "1.1";
  namespace "urn:ietf:params:xml:ns:yang:ietf-quic-lb";
  prefix "quic-lb";

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  organization
    "IETF QUIC Working Group";

  contact
    "WG Web:   <http://datatracker.ietf.org/wg/quic>
     WG List:  <quic@ietf.org>

     Authors: Martin Duke (martin.h.duke at gmail dot com)
              Nick Banks (nibanks at microsoft dot com)
              Christian Huitema (huitema at huitema.net)";

  description
    "This module enables the explicit cooperation of QUIC servers
     with trusted intermediaries without breaking important
     protocol features.

     Copyright (c) 2022 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     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 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.";

  revision "2023-07-14" {
    description
      "Updated to design in version 17 of the draft";
    reference
      "RFC XXXX, QUIC-LB: Generating Routable QUIC Connection IDs";
  }

  container quic-lb {
    presence "The container for QUIC-LB configuration.";

    description
      "QUIC-LB container.";

    typedef quic-lb-key {
      type yang:hex-string {
        length 47;
      }
      description
        "This is a 16-byte key, represented with 47 bytes";
    }

    leaf config-id {
      type uint8 {
        range "0..6";
      }
      mandatory true;
      description
        "Identifier for this CID configuration.";
    }

    leaf first-octet-encodes-cid-length {
      type boolean;
      default false;
      description
        "If true, the six least significant bits of the first
         CID octet encode the CID length minus one.";
    }

    leaf server-id-length {
      type uint8 {
        range "1..15";
      }
      must '. <= (19 - ../nonce-length)' {
        error-message
          "Server ID and nonce lengths must sum
           to no more than 19.";
      }
      mandatory true;
      description
        "Length (in octets) of a server ID. Further range-limited
         by nonce-length.";
    }

    leaf nonce-length {
      type uint8 {
        range "4..18";
      }
      mandatory true;
      description
        "Length, in octets, of the nonce. Short nonces mean there
         will be frequent configuration updates.";
    }

    leaf cid-key {
      type quic-lb-key;
      description
        "Key for encrypting the connection ID.";
    }

    leaf server-id {
      type yang:hex-string;
      must "string-length(.) = 3 * ../../server-id-length - 1";
      mandatory true;
      description
        "An allocated server ID";
    }
  }
}
]]></artwork></figure>

<figure><artwork><![CDATA[
module ietf-quic-lb-middlebox {
  yang-version "1.1";
  namespace "urn:ietf:params:xml:ns:yang:ietf-quic-lb";
  prefix "quic-lb";

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types.";
  }

  organization
    "IETF QUIC Working Group";

  contact
    "WG Web:   <http://datatracker.ietf.org/wg/quic>
     WG List:  <quic@ietf.org>

     Authors: Martin Duke (martin.h.duke at gmail dot com)
              Nick Banks (nibanks at microsoft dot com)
              Christian Huitema (huitema at huitema.net)";

  description
    "This module enables the explicit cooperation of QUIC servers
     with trusted intermediaries without breaking important
     protocol features.

     Copyright (c) 2021 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     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 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.";

  revision "2021-02-11" {
    description
      "Updated to design in version 13 of the draft";
    reference
      "RFC XXXX, QUIC-LB: Generating Routable QUIC Connection IDs";
  }

  container quic-lb {
    presence "The container for QUIC-LB configuration.";

    description
      "QUIC-LB container.";

    typedef quic-lb-key {
      type yang:hex-string {
        length 47;
      }
      description
        "This is a 16-byte key, represented with 47 bytes";
    }

    list cid-configs {
      key "config-rotation-bits";
      description
        "List up to three load balancer configurations";

      leaf config-rotation-bits {
        type uint8 {
          range "0..2";
        }
        mandatory true;
        description
          "Identifier for this CID configuration.";
      }

      leaf server-id-length {
        type uint8 {
          range "1..15";
        }
        must '. <= (19 - ../nonce-length)' {
          error-message
            "Server ID and nonce lengths must sum to
             no more than 19.";
        }
        mandatory true;
        description
          "Length (in octets) of a server ID. Further range-limited
           by nonce-length.";
      }

      leaf cid-key {
        type quic-lb-key;
        description
          "Key for encrypting the connection ID.";
      }

      leaf nonce-length {
        type uint8 {
          range "4..18";
        }
        mandatory true;
        description
          "Length, in octets, of the nonce. Short nonces mean there
           will be frequent configuration updates.";
      }

      list server-id-mappings {
        key "server-id";
        description "Statically allocated Server IDs";

        leaf server-id {
          type yang:hex-string;
          must "string-length(.) = 3 * ../../server-id-length - 1";
          mandatory true;
          description
            "An allocated server ID";

        }

        leaf server-address {
          type inet:ip-address;
          mandatory true;
          description
            "Destination address corresponding to the server ID";
        }
      }
    }
  }
}
]]></artwork></figure>

<section anchor="tree-diagram"><name>Tree Diagram</name>

<t>This summary of the YANG models uses the notation in <xref target="RFC8340"/>.</t>

<figure><artwork><![CDATA[
module: ietf-quic-lb-server
  +--rw quic-lb!
     +--rw config-id                         uint8
     +--rw first-octet-encodes-cid-length?   boolean
     +--rw server-id-length                  uint8
     +--rw nonce-length                      uint8
     +--rw cid-key?                          quic-lb-key
     +--rw server-id                         yang:hex-string
]]></artwork></figure>

<figure><artwork><![CDATA[
module: ietf-quic-lb-middlebox
  +--rw quic-lb!
     +--rw cid-configs* [config-rotation-bits]
     |  +--rw config-rotation-bits    uint8
     |  +--rw server-id-length        uint8
     |  +--rw cid-key?                quic-lb-key
     |  +--rw nonce-length            uint8
     |  +--rw server-id-mappings* [server-id]
     |     +--rw server-id         yang:hex-string
     |     +--rw server-address    inet:ip-address
]]></artwork></figure>

</section>
</section>
<section anchor="test-vectors"><name>Load Balancer Test Vectors</name>

<t>This section uses the following abbreviations:</t>

<figure><artwork><![CDATA[
cid      Connection ID
cr_bits  Config Rotation Bits
LB       Load Balancer
sid      Server ID
]]></artwork></figure>

<t>In all cases, the server is configured to encode the CID length.</t>

<section anchor="unencrypted-cids"><name>Unencrypted CIDs</name>

<figure><sourcecode type="pseudocode"><![CDATA[
cr_bits sid nonce cid
0 c4605e 4504cc4f 07c4605e4504cc4f
1 350d28b420 3487d970b 20a350d28b4203487d970b
]]></sourcecode></figure>

</section>
<section anchor="encrypted-cids"><name>Encrypted CIDs</name>

<t>The key for all of these examples is 8f95f09245765f80256934e50c66207f. The
test vectors include an example that uses the 16-octet single-pass special
case, as well as an instance where the server ID length exceeds the nonce
length, requiring a fourth decryption pass.</t>

<figure><sourcecode type="pseudocode"><![CDATA[
cr_bits sid nonce cid
0 ed793a ee080dbf 0720b1d07b359d3c
1 ed793a51d49b8f5fab65 ee080dbf48
                         2fcc381bc74cb4fbad2823a3d1f8fed2
2 ed793a51d49b8f5f ee080dbf48c0d1e5
                         504dd2d05a7b0de9b2b9907afb5ecf8cc3
3 ed793a51d49b8f5fab ee080dbf48c0d1e55d
                         125779c9cc86beb3a3a4a3ca96fce4bfe0cdbc
]]></sourcecode></figure>

</section>
</section>
<section anchor="interoperability-with-dtls-over-udp"><name>Interoperability with DTLS over UDP</name>

<t>Some environments may contain DTLS traffic as well as QUIC operating over UDP,
which may be hard to distinguish.</t>

<t>In most cases, the packet parsing rules above will cause a QUIC-LB load
balancer to route DTLS traffic in an appropriate way. DTLS 1.3 implementations
that use the connection_id extension <xref target="RFC9146"/> might use the techniques in
this document to generate connection IDs and achieve robust routability for DTLS
associations if they meet a few additional requirements. This non-normative
appendix describes this interaction.</t>

<section anchor="dtls-10-and-12"><name>DTLS 1.0 and 1.2</name>

<t>DTLS 1.0 <xref target="RFC4347"/> and 1.2 <xref target="RFC6347"/> use packet formats that a QUIC-LB
router will interpret as short header packets with CIDs that request 4-tuple
routing.  As such, they will route such packets consistently as long as the
4-tuple does not change. Note that DTLS 1.0 has been deprecated by the IETF.</t>

<t>The first octet of every DTLS 1.0 or 1.2 datagram contains the content type.
A QUIC-LB load balancer will interpret any content type less than 128 as a short
header packet, meaning that the subsequent octets should contain a connection
ID.</t>

<t>Existing TLS content types comfortably fit in the range below 128. Assignment of
codepoints greater than 64 would require coordination in accordance with
<xref target="RFC7983"/>, and anyway would likely create problems demultiplexing DTLS and
version 1 of QUIC. Therefore, this document believes it is extremely unlikely
that TLS content types of 128 or greater will be assigned. Nevertheless, such
an assignment would cause a QUIC-LB load balancer to interpret the packet as a
QUIC long header with an essentially random connection ID, which is likely to be
routed irregularly.</t>

<t>The second octet of every DTLS 1.0 or 1.2 datagram is the bitwise complement
of the DTLS Major version (i.e. version 1.x = 0xfe). A QUIC-LB load balancer
will interpret this as a connection ID that requires 4-tuple based load
balancing, meaning that the routing will be consistent as long as the 4-tuple
remains the same.</t>

<t><xref target="RFC9146"/> defines an extension to add connection IDs to DTLS 1.2.
Unfortunately, a QUIC-LB load balancer will not correctly parse the connection
ID and will continue 4-tuple routing. An modified QUIC-LB load balancer that
correctly identifies DTLS and parses a DTLS 1.2 datagram for the connection ID
is outside the scope of this document.</t>

</section>
<section anchor="dtls-13"><name>DTLS 1.3</name>

<t>DTLS 1.3 <xref target="RFC9147"/> changes the structure of datagram headers in relevant
ways.</t>

<t>Handshake packets continue to have a TLS content type in the first octet and
0xfe in the second octet, so they will be 4-tuple routed, which should not
present problems for likely NAT rebinding or address change events.</t>

<t>Non-handshake packets always have zero in their most significant bit and will
therefore always be treated as QUIC short headers. If the connection ID is
present, it follows in the succeeding octets. Therefore, a DTLS 1.3 association
where the server utilizes Connection IDs and the encodings in this document
will be routed correctly in the presence of client address and port changes.</t>

<t>However, if the client does not include the connection_id extension in its
ClientHello, the server is unable to use connection IDs. In this case, non-
handshake packets will appear to contain random connection IDs and be routed
randomly. Thus, unmodified QUIC-LB load balancers will not work with DTLS 1.3
if the client does not advertise support for connection IDs, or the server does
not request the use of a compliant connection ID.</t>

<t>A QUIC-LB load balancer might be modified to identify DTLS 1.3 packets and
correctly parse the fields to identify when there is no connection ID and
revert to 4-tuple routing, removing the server requirement above. However, such
a modification is outside the scope of this document, and classifying some
packets as DTLS might be incompatible with future versions of QUIC.</t>

</section>
<section anchor="future-versions-of-dtls"><name>Future Versions of DTLS</name>

<t>As DTLS does not have an IETF consensus document that defines what parts of
DTLS will be invariant in future versions, it is difficult to speculate about
the applicability of this section to future versions of DTLS.</t>

</section>
</section>
<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>Manasi Deval, Erik Fuller, Toma Gavrichenkov, Greg Greenway, Jana Iyengar,
Subodh Iyengar, Stefan Kolbl, Ladislav Lhotka, Jan Lindblad, Ling Tao Nju,
Ilari Liusvaara, Kazuho Oku, Udip Pant, Zaheduzzaman Sarker, Ian Swett, Andy
Sykes, Martin Thomson, Dmitri Tikhonov, Victor Vasiliev, Xingcan Lan, Yu Zhu,
and William Zeng Ke all provided useful input to this document.</t>

</section>
<section anchor="change-log"><name>Change Log</name>

<ul empty="true"><li>
  <t><strong>RFC Editor's Note:</strong>  Please remove this section prior to
publication of a final version of this document.</t>
</li></ul>

<section anchor="since-draft-ietf-quic-load-balancers-21"><name>since draft-ietf-quic-load-balancers-21</name>

<t><list style="symbols">
  <t>Added considerations for multiple tenants on the same IP address</t>
  <t>Added considerations for retiring all connection IDs at once</t>
  <t>Added considerations when routing on SNI but the CID accidentally
decrypts successfully</t>
  <t>Cleaned up typos and outdated statements.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-20"><name>since draft-ietf-quic-load-balancers-20</name>

<t><list style="symbols">
  <t>Changed definition of Unroutable DCIDs, and rewrote sections on config
failover and fallback routing to avoid misrouted connections.</t>
  <t>Deleted text on dropping packets</t>
  <t>Rewrote version invariance section</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-19"><name>since draft-ietf-quic-load-balancers-19</name>

<t><list style="symbols">
  <t>Further guidance on multiple server processes/threads</t>
  <t>Fixed error in encryption example.</t>
  <t>Clarified fallback algorithms and known QUIC versions.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-18"><name>since draft-ietf-quic-load-balancers-18</name>

<t><list style="symbols">
  <t>Rearranged the output of the expand function to reduce CPU load of decrypt</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-17"><name>since draft-ietf-quic-load-balancers-17</name>

<t><list style="symbols">
  <t>fixed regressions in draft-17 publication</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-16"><name>since draft-ietf-quic-load-balancers-16</name>

<t><list style="symbols">
  <t>added a config ID bit (now there are 3).</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-15"><name>since draft-ietf-quic-load-balancers-15</name>

<t><list style="symbols">
  <t>aasvg fixes.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-14"><name>since draft-ietf-quic-load-balancers-14</name>

<t><list style="symbols">
  <t>Revised process demultiplexing text</t>
  <t>Restored lost text in Security Considerations</t>
  <t>Editorial comments from Martin Thomson.</t>
  <t>Tweaked 4-pass algorithm to avoid accidental plaintext similarities</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-13"><name>since draft-ietf-quic-load-balancers-13</name>

<t><list style="symbols">
  <t>Incorporated Connection ID length in argument of truncate function</t>
  <t>Added requirements for codepoint 0b11.</t>
  <t>Describe Distinguishing Attack in Security Considerations.</t>
  <t>Added non-normative language about server process demultiplexers</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-12"><name>since draft-ietf-quic-load-balancers-12</name>

<t><list style="symbols">
  <t>Separated Retry Service design into a separate draft</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-11"><name>since draft-ietf-quic-load-balancers-11</name>

<t><list style="symbols">
  <t>Fixed mistakes in test vectors</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-10"><name>since draft-ietf-quic-load-balancers-10</name>

<t><list style="symbols">
  <t>Refactored algorithm descriptions; made the 4-pass algorithm easier to
implement</t>
  <t>Revised test vectors</t>
  <t>Split YANG model into a server and middlebox version</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-09"><name>since draft-ietf-quic-load-balancers-09</name>
<t><list style="symbols">
  <t>Renamed "Stream Cipher" and "Block Cipher" to "Encrypted Short" and
"Encrypted Long"</t>
  <t>Added section on per-connection state</t>
  <t>Changed "Encrypted Short" to a 4-pass algorithm.</t>
  <t>Recommended a random initial nonce when incrementing.</t>
  <t>Clarified what SNI LBs should do with unknown QUIC versions.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-08"><name>since draft-ietf-quic-load-balancers-08</name>
<t><list style="symbols">
  <t>Eliminate Dynamic SID allocation</t>
  <t>Eliminated server use bytes</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-07"><name>since draft-ietf-quic-load-balancers-07</name>
<t><list style="symbols">
  <t>Shortened SSCID nonce minimum length to 4 bytes</t>
  <t>Removed RSCID from Retry token body</t>
  <t>Simplified CID formats</t>
  <t>Shrunk size of SID table</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-06"><name>since draft-ietf-quic-load-balancers-06</name>
<t><list style="symbols">
  <t>Added interoperability with DTLS</t>
  <t>Changed "non-compliant" to "unroutable"</t>
  <t>Changed "arbitrary" algorithm to "fallback"</t>
  <t>Revised security considerations for mistrustful tenants</t>
  <t>Added retry service considerations for non-Initial packets</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-05"><name>since draft-ietf-quic-load-balancers-05</name>
<t><list style="symbols">
  <t>Added low-config CID for further discussion</t>
  <t>Complete revision of shared-state Retry Token</t>
  <t>Added YANG model</t>
  <t>Updated configuration limits to ensure CID entropy</t>
  <t>Switched to notation from quic-transport</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-04"><name>since draft-ietf-quic-load-balancers-04</name>
<t><list style="symbols">
  <t>Rearranged the shared-state retry token to simplify token processing</t>
  <t>More compact timestamp in shared-state retry token</t>
  <t>Revised server requirements for shared-state retries</t>
  <t>Eliminated zero padding from the test vectors</t>
  <t>Added server use bytes to the test vectors</t>
  <t>Additional compliant DCID criteria</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-03"><name>since-draft-ietf-quic-load-balancers-03</name>
<t><list style="symbols">
  <t>Improved Config Rotation text</t>
  <t>Added stream cipher test vectors</t>
  <t>Deleted the Obfuscated CID algorithm</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-02"><name>since-draft-ietf-quic-load-balancers-02</name>
<t><list style="symbols">
  <t>Replaced stream cipher algorithm with three-pass version</t>
  <t>Updated Retry format to encode info for required TPs</t>
  <t>Added discussion of version invariance</t>
  <t>Cleaned up text about config rotation</t>
  <t>Added Reset Oracle and limited configuration considerations</t>
  <t>Allow dropped long-header packets for known QUIC versions</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-01"><name>since-draft-ietf-quic-load-balancers-01</name>
<t><list style="symbols">
  <t>Test vectors for load balancer decoding</t>
  <t>Deleted remnants of in-band protocol</t>
  <t>Light edit of Retry Services section</t>
  <t>Discussed load balancer chains</t>
</list></t>

</section>
<section anchor="since-draft-ietf-quic-load-balancers-00"><name>since-draft-ietf-quic-load-balancers-00</name>
<t><list style="symbols">
  <t>Removed in-band protocol from the document</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-06"><name>Since draft-duke-quic-load-balancers-06</name>
<t><list style="symbols">
  <t>Switch to IETF WG draft.</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-05"><name>Since draft-duke-quic-load-balancers-05</name>
<t><list style="symbols">
  <t>Editorial changes</t>
  <t>Made load balancer behavior independent of QUIC version</t>
  <t>Got rid of token in stream cipher encoding, because server might not have it</t>
  <t>Defined "non-compliant DCID" and specified rules for handling them.</t>
  <t>Added psuedocode for config schema</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-04"><name>Since draft-duke-quic-load-balancers-04</name>
<t><list style="symbols">
  <t>Added standard for retry services</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-03"><name>Since draft-duke-quic-load-balancers-03</name>
<t><list style="symbols">
  <t>Renamed Plaintext CID algorithm as Obfuscated CID</t>
  <t>Added new Plaintext CID algorithm</t>
  <t>Updated to allow 20B CIDs</t>
  <t>Added self-encoding of CID length</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-02"><name>Since draft-duke-quic-load-balancers-02</name>
<t><list style="symbols">
  <t>Added Config Rotation</t>
  <t>Added failover mode</t>
  <t>Tweaks to existing CID algorithms</t>
  <t>Added Block Cipher CID algorithm</t>
  <t>Reformatted QUIC-LB packets</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-01"><name>Since draft-duke-quic-load-balancers-01</name>
<t><list style="symbols">
  <t>Complete rewrite</t>
  <t>Supports multiple security levels</t>
  <t>Lightweight messages</t>
</list></t>

</section>
<section anchor="since-draft-duke-quic-load-balancers-00"><name>Since draft-duke-quic-load-balancers-00</name>
<t><list style="symbols">
  <t>Converted to markdown</t>
  <t>Added variable length connection IDs</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
WsXVxxTopt0+EXe0ydm27b4d0vw/1ms9mX8iAQA=

-->

</rfc>

