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


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

]>

<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-quic-retry-offload-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="QUIC Retry Offload">QUIC Retry Offload</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>Microsoft</organization>
      <address>
        <email>nibanks@microsoft.com</email>
      </address>
    </author>

    <date />

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

    <abstract>


<t>QUIC uses Retry packets to reduce load on stressed servers, by forcing the
client to prove ownership of its address before the server commits state.
QUIC also has an anti-tampering mechanism to prevent the unauthorized injection
of Retry packets into a connection. However, a server operator may want to
offload production of Retry packets to an anti-Denial-of-Service agent or
hardware accelerator. "Retry Offload" is a mechanism for coordination between
a server and an external generator of Retry packets that can succeed despite
the anti-tampering mechanism.</t>



    </abstract>



  </front>

  <middle>


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

<t>QUIC <xref target="RFC9000"/> servers send Retry packets to avoid prematurely allocating
resources when under stress, such as during a Denial of Service (DoS) attack.
Because both Initial packets and Retry packets have weak authentication
properties, the Retry packet contains an encrypted token that helps the client
and server to validate, via transport parameters, that an attacker did not
inject or modify a packet of either type for this connection attempt.</t>

<t>However, a server under stress is less inclined to process incoming Initial
packets and compute the Retry token in the first place. An analogous mechanism
for TCP is syncookies <xref target="RFC4987"/>. As TCP has weaker authentication properties
to QUIC, syncookie generation can often be offloaded to a hardware device, or
to a anti-Denial-of-Service provider that is topologically far from the
protected server. As such an offload would behave exactly like an attacker,
QUIC's authentication methods make such a capability impossible.</t>

<t>This document seeks to enable offloading of Retry generation to QUIC via
explicit coordination between servers and the hardware or provider offload,
which this document refers to as a "Retry Offload." It has two different
modes, to conform to two different use cases.</t>

<t>The no-shared-state mode has minimal coordination and does not require key
sharing. While operationally easier to configure and manage, it places severe
constraints on the operational profile of the offload. In particular, the
offload must control all ingress to the server and fail closed.</t>

<t>The shared-state mode removes the operational constraints, but also requires
more sophisticated key management.</t>

<t>Both modes specify a common format for encoding information in the Retry token,
so that the server can correctly populate the relevant transport parameter
fields.</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>For brevity, "Connection ID" will often be abbreviated as "CID".</t>

<t>A "Retry Offload" is a hardware or software device that is conceptually separate
from a QUIC server that terminates QUIC connections. This document assumes that
the Retry Offload and the server have an administrative relationship that allows
them to accept common configuation.</t>

<t>A "configuration agent" is some entity that determines the common configuration
to be distributed to the servers and the Retry Offload.</t>

<t>This document uses "QUIC" to refer to the protocol in QUIC version 1
<xref target="RFC9000"/>. Retry offloads can be applied to other versions of QUIC that use
Retry packets and have identical information requirements for Retry validation.
However, note that source and destination connection IDs are the only relevant
data fields that are invariant across QUIC versions <xref target="RFC8999"/>.</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>

<t>The example below illustrates the basic framework:</t>

<figure title="Example Format" anchor="fig-ex-format"><artwork><![CDATA[
Example Structure {
  One-bit Field (1),
  7-bit Field with Fixed Value (7) = 61,
  Field with Variable-Length Integer (i),
  Arbitrary-Length Field (..),
  Variable-Length Field (8..24),
  Field With Minimum Length (16..),
  Field With Maximum Length (..128),
  [Optional Field (64)],
  Repeated Field (8) ...,
}
]]></artwork></figure>

</section>
</section>
<section anchor="common-requirements"><name>Common Requirements</name>

<t>Regardless of mechanism, a Retry Offload has an active mode, where it is
generating Retry packets, and an inactive mode, where it is not, based on its
assessment of server load and the likelihood an attack is underway. The choice
of mode MAY be made on a per-packet or per-connection basis, through a
stochastic process or based on client address.</t>

<t>A configuration agent MUST distribute a list of QUIC versions the Retry Offload
supports. It MAY also distribute either an "Allow-List" or a "Deny-List" of
other QUIC versions. It MUST NOT distribute both an Allow-List and a Deny-List.</t>

<t>The Allow-List or Deny-List MUST NOT include any versions included for Retry
Offload support.</t>

<t>The Configuration Agent MUST provide a means for the entity that controls the
Retry Offload to report its supported version(s) to the configuration Agent. If
the entity has not reported this information, it MUST NOT activate the Retry
Offload and the configuration agent MUST NOT distribute configuration that
activates it.</t>

<t>The configuration agent MAY delete versions from the final supported version
list if policy does not require the Retry Offload to operate on those versions.</t>

<t>The configuration Agent MUST provide a means for the entities that control
servers behind the Retry Offload to report either an Allow-List or a Deny-List.</t>

<t>If all entities supply Allow-Lists, the consolidated list MUST be the union of
these sets. If all entities supply Deny-Lists, the consolidated list MUST be
the intersection of these sets.</t>

<t>If entities provide a mixture of Allow-Lists and Deny-Lists, the consolidated
list MUST be a Deny-List that is the intersection of all provided Deny-Lists and
the inverses of all Allow-Lists.</t>

<t>If no entities that control servers have reported Allow-Lists or Deny-Lists,
the default is a Deny-List with the null set (i.e., all unsupported versions
will be admitted). This preserves the future extensibilty of QUIC.</t>

<t>A Retry Offload MUST forward all packets for a QUIC version it does not
support that are not on a Deny-List or absent from an Allow-List. Note that if
servers support versions the Retry Offload does not, this may increase load on
the servers.</t>

<t>Note that future versions of QUIC might not have Retry packets, require
different information in Retry, or use different packet type indicators.</t>

<section anchor="consistent-treatment-of-initials"><name>Consistent Treatment of Initials</name>

<t>Retry Offloads SHOULD treat Initial packets from the same connection with a
uniform policy. Initial packets of the first and second client flight can be
difficult to distinguish without expensive decryption of the contents, which is
unsuitable under the conditions of a DDoS attack. If the first packet of a
connection is admitted without Retry, but the second triggers a Retry, that
Retry packet will be ignored and the loss of an Initial coalesced with other
packets can impair performance. In some situations, the client does not yet have
handshake keys, and dropping further client Initial packets creates a deadlock
where the connection cannot progress.</t>

<t>The simplest means to ensure this is to require, when active, a Retry Token
for all incoming Initial packets, and send a Retry packet otherwise. If the
Retry Offload is to be more selective, one technique keeps state on which
address/port 4-tuples have been admitted. Another would be to apply a secure
hash to the source IP address, port, and connection ID to deterministically
compute whether the Initial requires a Retry Token or not. These source
values remain consistent over the handshake.</t>

<t>However, even with these techniques there is a potential problem when a Retry
Offload switches from inactive to active mode. The Retry Offload could admit
the first packet while in inactive mode, and then drop subsequent Initials in
active mode.</t>

<t>If the Retry Offload is always on-path, it MAY keep state on incoming
connections while in inactive mode to avoid this problem. If it cannot or will
not keep such state, it SHOULD implement "transition mode" for an interval
chosen to include the likely Initial packet exchange of most clients (200ms is a
sensible default).</t>

<t>In transition mode, Retry Offloads process Initial packets with Retry tokens
as in active mode. When the Retry Offload receives an Initial packet with no
token, it issues a Retry AND forwards the packet to the server. If the client
has already received a packet from the server, it will ignore the Retry and the
connection will progress normally. If not, the client will reconnect based on
the Retry, the server's response to the first initial will be discarded, and
the connection will progress normally based on the client's second Initial.
<xref target="mid-handshake"/> explores the various possible packet sequences in
transition mode.</t>

<t>Note that transition mode provides no actual DDoS relief to the server, so its
duration should be as short as possible. The Retry Offload can choose not to
implement transition mode and cause some client connections to fail.</t>

<t>Servers operating behind a Retry Offload SHOULD implement a mechanism that
operates whenever a client Initial arrives with a valid Retry token. If there
is another connection with identical client Connection ID, IP, and Port, but
with an unvalidated address, that connection is immediately and silently
terminated. This mechanism eliminates incorrect connection state that is an
artifact of transition mode, as explained in <xref target="mid-handshake"/>.</t>

</section>
<section anchor="considerations-for-non-initial-packets"><name>Considerations for Non-Initial Packets</name>

<t>Initial Packets are especially effective at consuming server resources
because they cause the server to create connection state. Even when mitigating
this load with Retry Packets, the act of validating an Initial Token and sending
a Retry Packet is more expensive than the response to a non-Initial packet with
an unknown Connection ID: simply dropping it and/or sending a Stateless Reset.</t>

<t>Nevertheless, a Retry Offload in Active Mode might desire to shield servers
from non-Initial packets that do not correspond to a previously admitted
Initial Packet. This has a number of considerations.</t>

<t><list style="symbols">
  <t>If a Retry Offload maintains no per-flow state, it cannot distinguish between
valid and invalid non-Initial packets and MUST forward all non-Initial Packets
to the server.</t>
  <t>For QUIC versions the Retry Offload does not support and are present on the
Allow-List (or absent from the Deny-List), the Retry Offload cannot distinguish
Initial Packets from other long headers and therefore MUST admit all long
headers.</t>
  <t>If a Retry Offload keeps per-flow state, it can identify 4-tuples that have
been previously approved, admit non-Initial packets from those flows, and
drop all others. However, dropping short headers will effectively break Address
Migration and NAT Rebinding when in Active Mode, as post-migration packets will
arrive with a previously unknown 4-tuple. This policy will also break connection
attempts using any new QUIC versions that begin connections with a short header.</t>
  <t>If a Retry Offload is integrated with a QUIC-LB routable load balancer
<xref target="I-D.ietf-quic-load-balancers"/>, it can verify that the Destination Connection
ID is routable, and only admit non-Initial packets with routable DCIDs. As the
Connection ID encoding is invariant across QUIC versions, the Retry Offload can
do this for all short headers.</t>
</list></t>

<t>Nothing in this section prevents Retry Offloads from making basic syntax
correctness checks on packets with QUIC versions that it understands (e.g.,
enforcing the Initial Packet datagram size minimum in version 1).</t>

</section>
</section>
<section anchor="no-shared-state-retry-offload"><name>No-Shared-State Retry Offload</name>

<t>The no-shared-state Retry Offload requires no coordination, except that the
server must be configured to accept this offload and know which QUIC versions
the Retry Offload supports. The scheme uses the first bit of the token to
distinguish between tokens from Retry packets (codepoint '0') and tokens from
NEW_TOKEN frames (codepoint '1').</t>

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

<t>See <xref target="common-requirements"/>.</t>

</section>
<section anchor="nss-offload-requirements"><name>Offload Requirements</name>

<t>A no-shared-state Retry Offload MUST be present on all paths from potential
clients to the server. These paths MUST fail to pass QUIC traffic should the
offload fail for any reason. That is, if the offload is not operational, the
server MUST NOT be exposed to client traffic. Otherwise, servers that have
already disabled their Retry capability would be vulnerable to attack.</t>

<t>The path between offload and server MUST be free of any potential attackers.
Note that this and other requirements above severely restrict the operational
conditions in which a no-shared-state Retry Offload can safely operate.</t>

<t>Retry tokens generated by the offload MUST have the format below.</t>

<figure title="Format of non-shared-state Retry Offload tokens" anchor="nss-retry-offload-token-format"><artwork><![CDATA[
No-Shared-State Retry Offload Token {
  Token Type (1) = 0,
  ODCIL (7) = 8..20,
  Original Destination Connection ID (64..160),
  Opaque Data (..),
}
]]></artwork></figure>

<t>The first bit of retry tokens generated by the offload MUST be zero. The token
has the following additional fields:</t>

<t>ODCIL: The length of the original destination connection ID from the triggering
Initial packet. This is in cleartext to be readable for the server, but
authenticated later in the token. The Retry Offload SHOULD reject any token
in which the value is less than 8.</t>

<t>Original Destination Connection ID: This also in cleartext and authenticated
later.</t>

<t>Opaque Data: This data contains the information necessary to authenticate the
Retry token in accordance with the QUIC specification. A straightforward
implementation would encode the Retry Source Connection ID, client IP address,
and a timestamp in the Opaque Data. A more space-efficient implementation would
use the Retry Source Connection ID and Client IP as associated data in an
encryption operation, and encode only the timestamp and the authentication tag
in the Opaque Data. If the Initial packet alters the Connection ID or source IP
address, authentication of the token will fail.</t>

<t>Upon receipt of an Initial packet with a token that begins with '0', the Retry
Offload MUST validate the token in accordance with the QUIC specification.</t>

<t>In active mode, the offload MUST issue Retry packets for all client Initial
packets that contain no token, or a token that has the first bit set to '1'. It
MUST NOT forward the packet to the server. The offload MUST validate all tokens
with the first bit set to '0'. If successful, the offload MUST forward the
packet with the token intact. If unsuccessful, it MUST drop the packet. The
Retry Offload MAY send an Initial Packet containing a CONNECTION_CLOSE frame
with the INVALID_TOKEN error code when dropping the packet.</t>

<t>Note that this scheme has a performance drawback. When the Retry Offload is in
active mode, clients with a token from a NEW_TOKEN frame will suffer a 1-RTT
penalty even though its token provides proof of address.</t>

<t>In inactive mode, the offload MUST forward all packets that have no token or a
token with the first bit set to '1'. It MUST validate all tokens with the first
bit set to '0'. If successful, the offload MUST forward the packet with the
token intact. If unsuccessful, it MUST drop the packet.</t>

</section>
<section anchor="server-requirements"><name>Server Requirements</name>

<t>A server behind a non-shared-state Retry Offload MUST NOT send Retry packets
for a QUIC version the Retry Offload understands. It MAY send Retry for QUIC
versions the Retry Offload does not understand.</t>

<t>Tokens sent in NEW_TOKEN frames MUST have the first bit set to '1'.</t>

<t>If a server receives an Initial Packet with the first bit in the token set to
'1', it could be from a server-generated NEW_TOKEN frame and should be processed
in accordance with the QUIC specification. If a server receives an Initial
Packet with the first bit to '0', it is a Retry token and the server MUST NOT
attempt to validate it. Instead, it MUST assume the address is validated, MUST
include the packet's Destination Connection ID in a Retry Source Connection ID
transport parameter, and MUST extract the Original Destination Connection ID
from the token cleartext for use in the transport parameter of the same name.</t>

</section>
</section>
<section anchor="shared-state-retry"><name>Shared-State Retry Offload</name>

<t>A shared-state Retry Offload uses a shared key, so that the server can decode
the offload's retry tokens. It does not require that all traffic pass through
the Retry Offload, so servers MAY send Retry packets in response to Initial
packets without a valid token.</t>

<t>Both server and offload MUST have time synchronized within two seconds of each
other to prevent tokens being incorrectly marked as expired.</t>

<t>The tokens are protected using AES128-GCM AEAD, as explained in
<xref target="token-protection-with-aead"/>. All tokens, generated by either the server or
Retry Offload, MUST use the following format, which includes:</t>

<t><list style="symbols">
  <t>A 1 bit token type identifier.</t>
  <t>A 7 bit token key identifier.</t>
  <t>A 96 bit unique token number transmitted in clear text, but protected as part
of the AEAD associated data.</t>
  <t>A token body, encoding the Original Destination Connection ID and the
Timestamp, optionally followed by server specific Opaque Data.</t>
</list></t>

<t>The token protection uses an 128 bit representation of the source IP address
from the triggering Initial packet.  The client IP address is 16 octets. If an
IPv4 address, the last 12 octets are zeroes. It also uses the Source Connection
ID of the Retry packet, which will cause an authentication failure if it
differs from the Destination Connection ID of the packet bearing the token.</t>

<t>If there is a Network Address Translator (NAT) in the server infrastructure that
changes the client IP, the Retry Offload MUST either be positioned behind the
NAT, or the NAT must have the token key to rewrite the Retry token accordingly.
Note also that a host that obtains a token through a NAT and then attempts to
connect over a path that does not have an identically configured NAT will fail
address validation.</t>

<t>The 96 bit unique token number is set to a random value using a
cryptography-grade random number generator.</t>

<t>The token key identifier and the corresponding AEAD key and AEAD IV are
provisioned by the configuration agent.</t>

<t>The token body is encoded as follows:</t>

<figure title="Body of shared-state Retry Offload tokens" anchor="ss-retry-offload-token-body"><artwork><![CDATA[
Shared-State Retry Offload Token Body {
   Timestamp (64),
   [ODCIL (8) = 8..20],
   [Original Destination Connection ID (64..160)],
   [Port (16)],
   Opaque Data (..),
}
]]></artwork></figure>
<t>The token body has the following fields:</t>

<t>Timestamp: The Timestamp is a 64-bit integer, in network order, that expresses
the expiration time of the token as a number of seconds in POSIX time (see Sec.
4.16 of <xref target="TIME_T"/>).</t>

<t>ODCIL: The original destination connection ID length. Tokens in NEW_TOKEN frames
do not have this field.</t>

<t>Original Destination Connection ID: The server or Retry Offload copies this
from the field in the client Initial packet. Tokens in NEW_TOKEN frames do not
have this field.</t>

<t>Port: The Source Port of the UDP datagram that triggered the Retry packet.
This field MUST be present if and only if the ODCIL is greater than zero. This
field is therefore always absent in tokens in NEW_TOKEN frames.</t>

<t>Opaque Data: The server may use this field to encode additional information,
such as congestion window, RTT, or MTU. The Retry Offload MUST have zero-length
opaque data.</t>

<t>Some implementations of QUIC encode in the token the Initial Packet Number used
by the client, in order to verify that the client sends the retried Initial
with a PN larger that the triggering Initial. Such implementations will encode
the Initial Packet Number as part of the opaque data. As tokens may be
generated by the Service, servers MUST NOT reject tokens because they lack
opaque data and therefore the packet number.</t>

<t>Shared-state Retry Offloads use the AES-128-ECB cipher. Future standards could
add new algorithms that use other ciphers to provide cryptographic agility in
accordance with <xref target="RFC7696"/>. Retry Offload and server implementations SHOULD be
extensible to support new algorithms.</t>

<section anchor="token-protection-with-aead"><name>Token Protection with AEAD</name>

<t>On the wire, the token is presented as:</t>

<figure title="Wire image of shared-state Retry Offload tokens" anchor="ss-retry-offload-token-wire-image"><artwork><![CDATA[
Shared-State Retry Offload Token {
  Token Type (1),
  Key Sequence (7),
  Unique Token Number (96),
  Encrypted Shared-State Retry Offload Token Body (64..),
  AEAD Integrity Check Value (128),
}
]]></artwork></figure>

<t>The tokens are protected using AES128-GCM as follows:</t>

<t><list style="symbols">
  <t>The Key Sequence is the 7 bit identifier to retrieve the token key and IV.</t>
  <t>The AEAD IV, is 96 bits generated by the configuration agent.</t>
  <t>The AEAD nonce, N, is formed by XORing the AEAD IV with the 96 bit unique
token number.</t>
  <t>The associated data is a formatted as a pseudo header by combining the
cleartext part of the token with the IP address of the client. The format of
the pseudoheader depends on whether the Token Type bit is '1' (a NEW_TOKEN
token) or '0' (a Retry token).</t>
</list></t>

<figure title="Psuedoheader for shared-state Retry Offload tokens" anchor="ss-retry-offload-token-pseudoheader"><artwork><![CDATA[
Shared-State Retry Offload Token Pseudoheader {
  IP Address (128),
  Token Type (1),
  Key Sequence (7),
  Unique Token Number (96),
  [RSCIL (8)],
  [Retry Source Connection ID (0..20)],
}
]]></artwork></figure>

<t>RSCIL: The Retry Source Connection ID Length in octets. This field is only
present when the Token Type is '0'.</t>

<t>Retry Source Connection ID: To create a Retry Token, populate this field with
the Source Connection ID the Retry packet will use. To validate a Retry token,
populate it with the Destination Connection ID of the Initial packet that
carries the token. This field is only present when the Token Type is '0'.</t>

<t><list style="symbols">
  <t>The input plaintext for the AEAD is the token body. The output ciphertext of
the AEAD is transmitted in place of the token body.</t>
  <t>The AEAD Integrity Check Value(ICV), defined in Section 6 of <xref target="RFC4106"/>, is
computed as part of the AEAD encryption process, and is verified during
decryption.</t>
</list></t>

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

<t>The configuration agent generates and distributes a "token key", a "token IV",
a key sequence, and the information described in <xref target="common-requirements"/>.</t>

</section>
<section anchor="ss-offload"><name>Offload Requirements</name>

<t>In inactive mode, the Retry Offload forwards all packets without further
inspection or processing. The rest of this section only applies to a offload in
active mode.</t>

<t>Retry Offloads MUST NOT issue Retry packets except where explicitly allowed
below, to avoid sending a Retry packet in response to a Retry token.</t>

<t>The offload MUST generate Retry tokens with the format described above when it
receives a client Initial packet with no token.</t>

<t>If there is a token of either type, the offload MUST attempt to decrypt it.</t>

<t>To decrypt a packet, the offload checks the Token Type and constructs a
pseudoheader with the appropriate format for that type, using the bearing
packet's Destination Connection ID to populate the Retry Source Connection ID
field, if any.</t>

<t>A token is invalid if:</t>

<t><list style="symbols">
  <t>it uses an unknown key sequence,</t>
  <t>the AEAD ICV does not match the expected value (By construction, it will only
match if the client IP Address, and any Retry Source Connection ID, also
matches),</t>
  <t>the ODCIL, if present, is invalid for a client-generated CID (less than 8 or
more than 20 in QUIC version 1),</t>
  <t>the Timestamp of a token points to time in the past (however, in order to
allow for clock skew, it SHOULD NOT consider tokens to be expired if the
Timestamp encodes less than two seconds in the past), or</t>
  <t>the port number, if present, does not match the source port in the
encapsulating UDP header.</t>
</list></t>

<t>Packets with valid tokens MUST be forwarded to the server.</t>

<t>The offload MUST drop packets with invalid tokens. If the token is of type '1'
(NEW_TOKEN), it MUST respond with a Retry packet. If of type '0', it MUST NOT
respond with a Retry packet.</t>

</section>
<section anchor="server-requirements-1"><name>Server Requirements</name>

<t>The server MAY issue Retry or NEW_TOKEN tokens in accordance with <xref target="RFC9000"/>.
When doing so, it MUST follow the format above.</t>

<t>The server MUST validate all tokens that arrive in Initial packets, as they may
have bypassed the Retry Offload. It determines validity using the procedure
in <xref target="ss-offload"/>.</t>

<t>If a valid Retry token, the server populates the
original_destination_connection_id transport parameter using the
corresponding token field. It populates the retry_source_connection_id transport
parameter with the Destination Connection ID of the packet bearing the token.</t>

<t>In all other respects, the server processes both valid and invalid tokens in
accordance with <xref target="RFC9000"/>.</t>

<t>For QUIC versions the offload does not support, the server MAY use any token
format.</t>

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

<section anchor="shared-state-retry-keys"><name>Shared-State Retry Keys</name>

<t>The Shared-State Retry Offload defined in <xref target="shared-state-retry"/> describes the
format of retry tokens or new tokens protected and encrypted using AES128-GCM.
Each token includes a 96 bit randomly generated unique token number, and an 8
bit identifier used to get the AES-GCM encryption context. The AES-GCM
encryption context contains a 128 bit key and an AEAD IV. There are three
important security considerations for these tokens:</t>

<t><list style="symbols">
  <t>An attacker that obtains a copy of the encryption key will be able to decrypt
and forge tokens.</t>
  <t>Attackers may be able to retrieve the key if they capture a sufficently large
number of retry tokens encrypted with a given key.</t>
  <t>Confidentiality of the token data will fail if separate tokens reuse the
same 96 bit unique token number and the same key.</t>
</list></t>

<t>To protect against disclosure of keys to attackers, offload and servers MUST
ensure that the keys are stored securely. To limit the consequences of potential
exposures, the lifetime of any given key should be limited.</t>

<t>Section 6.6 of <xref target="RFC9001"/> states that "Endpoints MUST count the number of
encrypted packets for each set of keys. If the total number of encrypted packets
with the same key exceeds the confidentiality limit for the selected AEAD, the
endpoint MUST stop using those keys." It goes on with the specific limit: "For
AEAD_AES_128_GCM and AEAD_AES_256_GCM, the confidentiality limit is 2^23
encrypted packets; see Appendix B.1." It is prudent to adopt the same limit
here, and configure the offload in such a way that no more than 2^23 tokens are
generated with the same key.</t>

<t>In order to protect against collisions, the 96 bit unique token numbers should
be generated using a cryptographically secure pseudorandom number generator
(CSPRNG), as specified in Appendix C.1 of the TLS 1.3 specification
<xref target="RFC8446"/>. With proper random numbers, if fewer than 2^40 tokens are
generated with a single key, the risk of collisions is lower than 0.001%.</t>

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

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

</section>


  </middle>

  <back>

    <references title='Normative References'>

<reference anchor="TIME_T" target="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_16">
  <front>
    <title>Open Group Standard: Vol. 1: Base Definitions, Issue 7</title>
    <author >
      <organization></organization>
    </author>
    <date year="2018"/>
  </front>
  <seriesInfo name="IEEE Std 1003.1" value=""/>
</reference>




<reference anchor='RFC9000' target='https://www.rfc-editor.org/info/rfc9000'>
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
<author fullname='J. Iyengar' initials='J.' role='editor' surname='Iyengar'><organization/></author>
<author fullname='M. Thomson' initials='M.' role='editor' surname='Thomson'><organization/></author>
<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='RFC8446' target='https://www.rfc-editor.org/info/rfc8446'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
<author fullname='E. Rescorla' initials='E.' surname='Rescorla'><organization/></author>
<date month='August' year='2018'/>
<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t><t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='8446'/>
<seriesInfo name='DOI' value='10.17487/RFC8446'/>
</reference>




    </references>

    <references title='Informative References'>





<reference anchor='RFC4987' target='https://www.rfc-editor.org/info/rfc4987'>
<front>
<title>TCP SYN Flooding Attacks and Common Mitigations</title>
<author fullname='W. Eddy' initials='W.' surname='Eddy'><organization/></author>
<date month='August' year='2007'/>
<abstract><t>This document describes TCP SYN flooding attacks, which have been well-known to the community for several years.  Various countermeasures against these attacks, and the trade-offs of each, are described.  This document archives explanations of the attack and common defense techniques for the benefit of TCP implementers and administrators of TCP servers or networks, but does not make any standards-level recommendations.  This memo provides information for the Internet community.</t></abstract>
</front>
<seriesInfo name='RFC' value='4987'/>
<seriesInfo name='DOI' value='10.17487/RFC4987'/>
</reference>



<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></author>
<date month='March' year='1997'/>
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference anchor='RFC8999' target='https://www.rfc-editor.org/info/rfc8999'>
<front>
<title>Version-Independent Properties of QUIC</title>
<author fullname='M. Thomson' initials='M.' surname='Thomson'><organization/></author>
<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>


<reference anchor='I-D.ietf-quic-load-balancers'>
   <front>
      <title>QUIC-LB: Generating Routable QUIC Connection IDs</title>
      <author fullname='Martin Duke'>
	 <organization>Google</organization>
      </author>
      <author fullname='Nick Banks'>
	 <organization>Microsoft</organization>
      </author>
      <author fullname='Christian Huitema'>
	 <organization>Private Octopus Inc.</organization>
      </author>
      <date day='28' month='March' year='2022'/>
      <abstract>
	 <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 &quot;layer-4&quot; 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&#39;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>
   <seriesInfo name='Internet-Draft' value='draft-ietf-quic-load-balancers-13'/>
   <format target='https://www.ietf.org/archive/id/draft-ietf-quic-load-balancers-13.txt' type='TXT'/>
</reference>



<reference anchor='RFC7696' target='https://www.rfc-editor.org/info/rfc7696'>
<front>
<title>Guidelines for Cryptographic Algorithm Agility and Selecting Mandatory-to-Implement Algorithms</title>
<author fullname='R. Housley' initials='R.' surname='Housley'><organization/></author>
<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='RFC4106' target='https://www.rfc-editor.org/info/rfc4106'>
<front>
<title>The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP)</title>
<author fullname='J. Viega' initials='J.' surname='Viega'><organization/></author>
<author fullname='D. McGrew' initials='D.' surname='McGrew'><organization/></author>
<date month='June' year='2005'/>
<abstract><t>This memo describes the use of the Advanced Encryption Standard (AES) in Galois/Counter Mode (GCM) as an IPsec Encapsulating Security Payload (ESP) mechanism to provide confidentiality and data origin authentication.  This method can be efficiently implemented in hardware for speeds of 10 gigabits per second and above, and is also well-suited to software implementations.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4106'/>
<seriesInfo name='DOI' value='10.17487/RFC4106'/>
</reference>



<reference anchor='RFC9001' target='https://www.rfc-editor.org/info/rfc9001'>
<front>
<title>Using TLS to Secure QUIC</title>
<author fullname='M. Thomson' initials='M.' role='editor' surname='Thomson'><organization/></author>
<author fullname='S. Turner' initials='S.' role='editor' surname='Turner'><organization/></author>
<date month='May' year='2021'/>
<abstract><t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t></abstract>
</front>
<seriesInfo name='RFC' value='9001'/>
<seriesInfo name='DOI' value='10.17487/RFC9001'/>
</reference>



<reference anchor='RFC6020' target='https://www.rfc-editor.org/info/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'><organization/></author>
<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' target='https://www.rfc-editor.org/info/rfc8340'>
<front>
<title>YANG Tree Diagrams</title>
<author fullname='M. Bjorklund' initials='M.' surname='Bjorklund'><organization/></author>
<author fullname='L. Berger' initials='L.' role='editor' surname='Berger'><organization/></author>
<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>




    </references>


<section anchor="yang-model"><name>Retry Offload YANG Model</name>

<t>These YANG models conform to <xref target="RFC6020"/> and express a complete Retry Offload
configuration.</t>

<figure><artwork><![CDATA[
module ietf-retry-offload {
  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 offloads that generate Retry packets on their behalf.

     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 "2022-02-11" {
    description
      "Initial version";
    reference
      "RFC XXXX, QUIC Retry Offloads";
  }

  container retry-offload-config {
    description
      "Configuration of Retry Offload. If supported-versions is empty,
       there is no Retry Offload. If token-keys is empty, it uses the
       non-shared-state offload. If present, it uses shared-state
       tokens.";

    leaf-list supported-versions {
      type uint32;
      description
        "QUIC versions that the Retry Offload supports. If empty,
         there is no Retry Offload.";
    }

    leaf unsupported-version-default {
      type enumeration {
        enum allow {
          description "Unsupported versions admitted by default";
        }
        enum deny {
          description "Unsupported versions denied by default";
        }
      }
      default allow;
      description
        "Are unsupported versions not in version-exceptions allowed
         or denied?";
    }

    leaf-list version-exceptions {
      type uint32;
      description
        "Exceptions to the default-deny or default-allow rule.";
    }

    list token-keys {
      key "key-sequence-number";
      description
        "list of active keys, for key rotation purposes. Existence
         implies shared-state format";

      leaf key-sequence-number {
        type uint8 {
          range "0..127";
        }
        mandatory true;
        description
          "Identifies the key used to encrypt the token";
        }

      leaf token-key {
        type retry-offload-key;
        mandatory true;
        description
          "16-byte key to encrypt the token";
      }

      leaf token-iv {
        type yang:hex-string {
          length 23;
        }
        mandatory true;
        description
          "8-byte IV to encrypt the token, encoded in 23 bytes";
      }
    }
  }
}
]]></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: retry-offload-config
  +--rw retry-offload-config
     +--rw supported-versions*            uint32
     +--rw unsupported-version-default?   enumeration
     +--rw version-exceptions*            uint32
     +--rw token-keys* [key-sequence-number]
        +--rw key-sequence-number    uint8
        +--rw token-key              quic-lb-key
        +--rw token-iv               yang:hex-string

## Shared State Retry Token Test Vectors

In this case, the shared-state retry token is issued by Retry Offload, so the
opaque data of shared-state retry token body would be null
({{shared-state-retry}}).

]]></artwork></figure>
<t>Configuration:
key_seq 0x00
encrypt_key 0x30313233343536373839303132333435
AEAD_IV 0x313233343536373839303132</t>

<t>Shared-State Retry Offload Token Body:
ODCIL 0x12
RSCIL 0x10
port 0x1a0a
original_destination_connection_id 0x0c3817b544ca1c94313bba41757547eec937
retry_source_connection_id 0x0301e770d24b3b13070dd5c2a9264307
timestamp 0x0000000060c7bf4d</t>

<t>Shared-State Retry Offload Token:
unique_token_number 0x59ef316b70575e793e1a8782
key_sequence 0x00
encrypted_shared_state_retry_offload_token_body
0x7d38b274aa4427c7a1557c3fa666945931defc65da387a83855196a7cb73caac1e28e5346fd76868de94f8b62294
AEAD_ICV 0xf91174fdd711543a32d5e959867f9c22</t>

<t>AEAD related parameters:
client_ip_addr 127.0.0.1
client_port 6666
AEAD_nonce 0x68dd025f45616941072ab6b0
AEAD_associated_data 0x7f00000100000000000000000000000059ef316b70575e793e1a878200
~~~</t>

</section>
</section>
<section anchor="mid-handshake"><name>Transition Mode Scenarios</name>

<t>The logic motivating transition mode behavior involves detailed reasoning about
endpoint behavior during the handshake. This non-normative appendix walks
through the scenarios.</t>

<t>Dropping Initial packets in the client's second flight can cause performance
problems or deadlocks. In the case where the client and server first flight end
with both sides having handshake keys, there will generally be no impact on
performance. However, if an Initial ACK is critical to progress, as it can be in
the case of multiple-packet TLS messages, Hello Retry Requests, and similar
cases, dropping subsequent Initial ACKs results in deadlock.</t>

<t>In transition mode, the Retry Offload forwards Initials with no token while also
generating a Retry. This allows handshakes to progress without further incident.</t>

<section anchor="handshakes-in-progress"><name>Handshakes in Progress</name>

<t>If the client hello was admitted in inactive mode, then the client has already
received a packet from the server. Although subsequent client Initial packets
will trigger a Retry, the client will ignore these packets. Those Initials will
also be processed by the server to continue the handshake.</t>

</section>
<section anchor="new-connections"><name>New Connections</name>

<t>After sending a Client Hello in Initial Packet A, a client will rapidly receive
a Retry Packet from the Offload and attempt to reconnect accordingly with
Initial Packet B.</t>

<t>The client will discard any server response to Initial A. If a Retry, it is a
second Retry on the connection. If an Initial, its is encrypted with keys
derived from Initial A, which have already been discarded, and will be a
decryption failure.</t>

<t>Initial B's destination connection ID will be new, so the server will process
it as a new connection and proceed normally.</t>

<t>Unfortunately, the server connection state initiated by Initial A will remain.
For this reason, this document suggests that servers silently terminate the
older connection. Requiring the address to be validated avoids cases where an
attacker simply replays a client Initial with a new Destination Connection ID
to terminate a valid connection.</t>

<t>Note that there are corner cases involving further packet loss that result in
connection timeout. For instance, if the Retry Offload's response to Initial A
is lost, then the connection will proceed based on Initial A. If the Retry
Offload then switches from transition mode to active mode before the client's
second flight arrives, the Retry Offload will drop the Initial packet in that
flight, and the connection might deadlock.</t>

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

<t>Christian Huitema, Ling Tao Nju, 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-duke-quic-retry-offload-00"><name>since draft-duke-quic-retry-offload-00</name>
<t><list style="symbols">
  <t>Converted to adopted IETF draft</t>
  <t>Cleaner transition from inactive to active mode</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 from the QUIC-LB draft</t>
  <t>Renamed "Retry Service" to "Retry Offload"</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 Offload 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 Offloads 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 Offloads</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:
H4sIAJqLjmIAA619a3PbSJLg9/oVODkuLPWRbFKS9erdmZEldbdibFlnqd2z
NzGrAIkiWSsS4AKgKI5D89s3X/UCKFmeOd/tNEUCVVlZ+c6srG63q2pTz/RJ
svV/f7s8Sz7rulwnn8bjWZFmWyodDkv9cJK0f1NZMcrTObyYlem47hpdj7v/
vTSjbomPdQt+rDtLa13VKoP/nCRfz09vL57UCP6YFOX6JKnqTJlFeZLU5bKq
d/v94/6uSkudniS3ZZpXi6Ks1aoo7ydlsVwwHEpVdZpnd+msyGHMta7Uwpwk
f62LUSep4IVSjyv4tJ7zBwB0ni4WJp/8Tal0WU+L8kQlSRf+L0lMXp0kH3vJ
+fJe0xe8po9pWZvcf1uUk5Pkl6KYzPhvPU/N7CSZ02O9aS+DB/80wS97o2Ku
4uGvesn7NL+vgvGvzOg++JKG/2hGZVEV4zqcITdDfOpPc/sjj58X5TytzYM+
wbluLz9e3N2e0Ht2Nz8tdJ78glhLbhBdaZmdJF+KWS8ZnMDMlU7O9djkpjZF
Dki6rKqlTg63aAzerN3+4Ij+rHRpdGXycXGSXF5cXMCAWTLo9/d6A54yLSe6
Pkmmdb04+fHHxXJY9QqYnvasB2v7schnJtf4w4/HB8fHx4Pjw+PjH4cARQZb
9OOXwd1omi76+71pPZ+9qdPJXX//bnCgVLfbTdJhVZfpqFaKqHBZ6UpIcZGO
7nVdJXWRlDpbjnSCJJcUOdBVqSsYHWF/0CUscLhOxkU5AipI6qlWo5nReY1v
LsriQSfFKofHpmaRFOPEwJhpluEQyVDDaxrfkbES2IA5PgFUWOseA5XOqiKZ
pvBaDv+/Nt06nS8AbTDbXMPaclPNeTL9QPPCcMucidH8HeA0+X/pEe6Fgvnj
1ZkcXkxh2jznR3rJr8UKxik78LUABfgu07oogSTXySqlpSnhQVwiYAdfTVqj
49gC87nOTToDzu3ewKAG0JlOENiiVFMgnxXwZZKORnrGU/WSrVhaJAbWH6wX
EAdQF2Vm8pQmH+p6pXWuHNRAlzi7fqx1maezBKaTZbThnKZ1MoKHqyWAABjL
dLUwtVaIyudQ3mMKmpssA8ZVb5LLvHa4EHr6+vV/ff757Ljf7z89WXKB/wJk
bUQ9FAaxCbxZL0s9W8O+zwqQZjCpAmopluUIiHM1BdZb5hkskOmwg0BPEyCP
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
q6OkgX3Qqqhd8DEXE+gdGtyKyI1F5C8BK5Usqg0s0huDI1qFCFDQ/9v5tc+N
SgUfqT+dtZRNj49+M5zNDJkZ+yS2pKeYZ+CNCVU7lRxltvF5XDqvWIqZqVZD
an2lUsS4zOOGFbcDyw7heD6FrS8HL1XMU8AmCP+Hh/aU7YYEZDLBbaUyOhB1
q07y+Zb1yMfb3zYF3L39i4vrMmWpgoFjk0ndYIlhHOf1R2EEssinDcOp4jxe
MYMs0TW1cpHohFiQWI88wkYNgtAS+gHM8ChT8GS9tfslhnR9BTZKOXHtETba
Qr3kBvHUXAkXn+TOwdkMuViXLrcSYIhKGXivcfeGWrUyPdIHyKcnXXBEUh3O
fwiq72YAQLgVjdqgwL5h8YNb9aworZxND+5FF/2Li7P3ycgsphg0/ZkPOlXS
2K7iOATqZSpkSWcTEEv1dC6xMBxKCjdpgMr2fcPTe4HeBbM3nUhTIQwCxvEI
7hNweHB84DspfGrnVJv7JTkiQLM9s8aJWlvQFQNMEa03oiivva1NEJDm/vrm
BW8KGJXpeUXHU4IAb2XlB6ns16rqdtYTNemfYbdvpE4ZE5/43W9s8/DDQoTb
xwf024XrLfY624D0ODcbIFuFiohwV86wcMV2L+A+AN9U4YiJrpmDIWMV+e/o
6/M3r1Tn3+ECR+bQDyTCInTJoU72MAPDjQxjFBYtkxlp6/JLz44m5lsHR2J7
c0OqdrMRFwyQY/+WTnJFw6Bo5nf/8umzdTysmejiaJFxq0Lj1g3dSoqhscGC
X1xeML4rvQQNyiVOOOeomA85N1BTY0YbdQrlVyN0HXiERXhWgVXG2GbCST7y
fDJdphckm+k8lD9oFJD4kIODbwdvk+0gvs/r3UHV9LZPPwWuy07vlex0HcKC
vAULsS7ctu1r8a/z218/34gN/Tf+8/m85nYfTWx87puMFCFSWOm6Wmr3HYYJ
X8VNBN5JoN43giYdP1Dfir8fGEVYrAUGkLJG0cqmcwLs4Tb237oykU2TABCu
RDw6XNYJ22a5WakEe2PUgM61Naw4VtVLPMd3G0SPI9LpKDePCWLW34wUNLKw
7NFjoah49K5koYmx5FUYY3Y2+WJJrdvQ/5A4sBMNJpiIvBzJZS5rfIkVLb0l
fOheigNk1BguZnMaLJJ2mxTA9uXZl53OpmY74rBQm8VB/4BqRit7wDBrmkY0
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
8zTZnsoHPBfBH3uA9x3GBtuxC487bqPDdMoXx1Q2buOuhLGHu1xhgW2CQiBw
Z0QbjSSZ2wj/uc6UFAswdEwhnY17gr8zsOZK6rayPdpJdvu7uwnt6C1ek+cM
FgCiIslhTVsMbvMAfLWYT49RRzGqtKVhqT8WQpzZGT9rF4W2nSuk5Dvoxz8E
/4uPMsyxwyWtsvRLxngvXeYk4pTiSQt0Yynav1iW1ZKvJpPmh8uhVBPwGGzM
gPlIDfhgDmtekxhnwXmD+XVe6/ubc6BCfhzMDR4DYOOkkbVz9nsjlzRxKHxb
JR/0BKsmbAFcZdEg8Rgs1sbHz+X6Bfl9G3mkAiahCwu19gwigHcxFr9jsUqk
ZOWZjW9b+Upy0CcjkN//Av8aE61Wq145HnVhf7D2D6fCKX6E7/DpHTYdKIgA
A5gazKCxQ0Uyxu67M1oqeJ0AYuVBC+90eYsW0tsO/xdDNfjZ3umCn+kqF/eB
h5DHOO7mP/nX3cUu+CfG5aKveJC34PW+ZXp4ay98efvChS+NS1N4kCjp8f7s
OhnsJ9v2rpQd/ng0ONzfoYB60AWE/nTUt7bXvhiOF4BjY8Bk5fANmCyrPEG1
22PBgY1YWFEhg3b7u93BYEvEe1OooEiWkJCQw9YLYh83trPh0s3Ki3zLGWUS
52pZ5z4PRZyucrdg+dDT2Pcn77oQBtZ7zhf1umNlrcstgPXRHoETxuTnuDdd
6JydMvrXOpJVBIP4oLS8GD7p4GC/lTckAUpPx13qqr1hEV/lJQpNLoGM9nZ/
kq/aiErkQtS4H0o7+RVcJDBu4OglLMnuP3mww6bYFuauba4dga7BCLXq56ub
DL/lHFbwZbSyZOu3DX23fRvh4dq2t9z6yY3wFE8Ammb9nePDK+Zboz+5feD1
0jpe3JzTUm9sI07BNd9tpsvZPl6oJPgc7EUpwP2xvR1MRRtG+V4quvCvSqhe
FtklXBIM/DdvXglqoUke1BLe85QFAcX3FvxP18YJuuyebL0IkL0iQzKo3F8Z
dQUOV9pLbEBZY/8SoOuLR+qg6yRUQpYtJWUj3uUIoOVEIeoN0AXk43B4FNFU
Sf1Yt/p418vhRlqcY+EfqMM1Xhys/RObFoyi1xpIlYtd2RiguOI+uBTNFy7F
bUBzAbEAhgd++mfhHBx0h+ta25MSz8O2CTLz0ASMvKKpfuyiYZdPIhxL743d
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

-->

</rfc>

