draft-ietf-quic-load-balancers-04.txt   draft-ietf-quic-load-balancers-05.txt 
QUIC M. Duke QUIC M. Duke
Internet-Draft F5 Networks, Inc. Internet-Draft F5 Networks, Inc.
Intended status: Standards Track N. Banks Intended status: Standards Track N. Banks
Expires: 15 February 2021 Microsoft Expires: 3 May 2021 Microsoft
14 August 2020 30 October 2020
QUIC-LB: Generating Routable QUIC Connection IDs QUIC-LB: Generating Routable QUIC Connection IDs
draft-ietf-quic-load-balancers-04 draft-ietf-quic-load-balancers-05
Abstract Abstract
QUIC connection IDs allow continuation of connections across address/ QUIC connection IDs allow continuation of connections across address/
port 4-tuple changes, and can store routing information for stateless port 4-tuple changes, and can store routing information for stateless
or low-state load balancers. They also can prevent linkability of or low-state load balancers. They also can prevent linkability of
connections across deliberate address migration through the use of connections across deliberate address migration through the use of
protected communications between client and server. This creates protected communications between client and server. This creates
issues for load-balancing intermediaries. This specification issues for load-balancing intermediaries. This specification
standardizes methods for encoding routing information given a small standardizes methods for encoding routing information given a small
skipping to change at page 1, line 40 skipping to change at page 1, line 40
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 15 February 2021. This Internet-Draft will expire on 3 May 2021.
Copyright Notice Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the Copyright (c) 2020 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
skipping to change at page 2, line 26 skipping to change at page 2, line 26
2.1. Simplicity . . . . . . . . . . . . . . . . . . . . . . . 5 2.1. Simplicity . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. Security . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2. Security . . . . . . . . . . . . . . . . . . . . . . . . 5
3. First CID octet . . . . . . . . . . . . . . . . . . . . . . . 6 3. First CID octet . . . . . . . . . . . . . . . . . . . . . . . 6
3.1. Config Rotation . . . . . . . . . . . . . . . . . . . . . 6 3.1. Config Rotation . . . . . . . . . . . . . . . . . . . . . 6
3.2. Configuration Failover . . . . . . . . . . . . . . . . . 7 3.2. Configuration Failover . . . . . . . . . . . . . . . . . 7
3.3. Length Self-Description . . . . . . . . . . . . . . . . . 7 3.3. Length Self-Description . . . . . . . . . . . . . . . . . 7
3.4. Format . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.4. Format . . . . . . . . . . . . . . . . . . . . . . . . . 7
4. Routing Algorithms . . . . . . . . . . . . . . . . . . . . . 8 4. Routing Algorithms . . . . . . . . . . . . . . . . . . . . . 8
4.1. Plaintext CID Algorithm . . . . . . . . . . . . . . . . . 9 4.1. Plaintext CID Algorithm . . . . . . . . . . . . . . . . . 9
4.1.1. Configuration Agent Actions . . . . . . . . . . . . . 9 4.1.1. Configuration Agent Actions . . . . . . . . . . . . . 9
4.1.2. Load Balancer Actions . . . . . . . . . . . . . . . . 9 4.1.2. Load Balancer Actions . . . . . . . . . . . . . . . . 10
4.1.3. Server Actions . . . . . . . . . . . . . . . . . . . 10 4.1.3. Server Actions . . . . . . . . . . . . . . . . . . . 10
4.2. Stream Cipher CID Algorithm . . . . . . . . . . . . . . . 10 4.2. Stream Cipher CID Algorithm . . . . . . . . . . . . . . . 10
4.2.1. Configuration Agent Actions . . . . . . . . . . . . . 10 4.2.1. Configuration Agent Actions . . . . . . . . . . . . . 10
4.2.2. Load Balancer Actions . . . . . . . . . . . . . . . . 10 4.2.2. Load Balancer Actions . . . . . . . . . . . . . . . . 11
4.2.3. Server Actions . . . . . . . . . . . . . . . . . . . 12 4.2.3. Server Actions . . . . . . . . . . . . . . . . . . . 12
4.3. Block Cipher CID Algorithm . . . . . . . . . . . . . . . 12 4.3. Block Cipher CID Algorithm . . . . . . . . . . . . . . . 12
4.3.1. Configuration Agent Actions . . . . . . . . . . . . . 12 4.3.1. Configuration Agent Actions . . . . . . . . . . . . . 13
4.3.2. Load Balancer Actions . . . . . . . . . . . . . . . . 13 4.3.2. Load Balancer Actions . . . . . . . . . . . . . . . . 13
4.3.3. Server Actions . . . . . . . . . . . . . . . . . . . 13 4.3.3. Server Actions . . . . . . . . . . . . . . . . . . . 13
5. ICMP Processing . . . . . . . . . . . . . . . . . . . . . . . 13 5. ICMP Processing . . . . . . . . . . . . . . . . . . . . . . . 13
6. Retry Service . . . . . . . . . . . . . . . . . . . . . . . . 14 6. Retry Service . . . . . . . . . . . . . . . . . . . . . . . . 14
6.1. Common Requirements . . . . . . . . . . . . . . . . . . . 14 6.1. Common Requirements . . . . . . . . . . . . . . . . . . . 14
6.2. No-Shared-State Retry Service . . . . . . . . . . . . . . 15 6.2. No-Shared-State Retry Service . . . . . . . . . . . . . . 15
6.2.1. Configuration Agent Actions . . . . . . . . . . . . . 15 6.2.1. Configuration Agent Actions . . . . . . . . . . . . . 15
6.2.2. Service Requirements . . . . . . . . . . . . . . . . 15 6.2.2. Service Requirements . . . . . . . . . . . . . . . . 15
6.2.3. Server Requirements . . . . . . . . . . . . . . . . . 17 6.2.3. Server Requirements . . . . . . . . . . . . . . . . . 17
6.3. Shared-State Retry Service . . . . . . . . . . . . . . . 17 6.3. Shared-State Retry Service . . . . . . . . . . . . . . . 17
6.3.1. Configuration Agent Actions . . . . . . . . . . . . . 19 6.3.1. Configuration Agent Actions . . . . . . . . . . . . . 19
6.3.2. Service Requirements . . . . . . . . . . . . . . . . 19 6.3.2. Service Requirements . . . . . . . . . . . . . . . . 19
6.3.3. Server Requirements . . . . . . . . . . . . . . . . . 19 6.3.3. Server Requirements . . . . . . . . . . . . . . . . . 20
7. Configuration Requirements . . . . . . . . . . . . . . . . . 20 7. Configuration Requirements . . . . . . . . . . . . . . . . . 20
8. Additional Use Cases . . . . . . . . . . . . . . . . . . . . 21 8. Additional Use Cases . . . . . . . . . . . . . . . . . . . . 22
8.1. Load balancer chains . . . . . . . . . . . . . . . . . . 21 8.1. Load balancer chains . . . . . . . . . . . . . . . . . . 22
8.2. Moving connections between servers . . . . . . . . . . . 22 8.2. Moving connections between servers . . . . . . . . . . . 23
9. Version Invariance of QUIC-LB . . . . . . . . . . . . . . . . 22 9. Version Invariance of QUIC-LB . . . . . . . . . . . . . . . . 23
10. Security Considerations . . . . . . . . . . . . . . . . . . . 23 10. Security Considerations . . . . . . . . . . . . . . . . . . . 24
10.1. Attackers not between the load balancer and server . . . 23 10.1. Attackers not between the load balancer and server . . . 24
10.2. Attackers between the load balancer and server . . . . . 24 10.2. Attackers between the load balancer and server . . . . . 25
10.3. Multiple Configuration IDs . . . . . . . . . . . . . . . 24 10.3. Multiple Configuration IDs . . . . . . . . . . . . . . . 25
10.4. Limited configuration scope . . . . . . . . . . . . . . 24 10.4. Limited configuration scope . . . . . . . . . . . . . . 25
10.5. Stateless Reset Oracle . . . . . . . . . . . . . . . . . 25 10.5. Stateless Reset Oracle . . . . . . . . . . . . . . . . . 25
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 25 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26
12. References . . . . . . . . . . . . . . . . . . . . . . . . . 25 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 26
12.1. Normative References . . . . . . . . . . . . . . . . . . 25 12.1. Normative References . . . . . . . . . . . . . . . . . . 26
12.2. Informative References . . . . . . . . . . . . . . . . . 25 12.2. Informative References . . . . . . . . . . . . . . . . . 26
Appendix A. Load Balancer Test Vectors . . . . . . . . . . . . . 26 Appendix A. Load Balancer Test Vectors . . . . . . . . . . . . . 26
A.1. Plaintext Connection ID Algorithm . . . . . . . . . . . . 26 A.1. Plaintext Connection ID Algorithm . . . . . . . . . . . . 27
A.2. Stream Cipher Connection ID Algorithm . . . . . . . . . . 26 A.2. Stream Cipher Connection ID Algorithm . . . . . . . . . . 27
A.3. Block Cipher Connection ID Algorithm . . . . . . . . . . 27 A.3. Block Cipher Connection ID Algorithm . . . . . . . . . . 28
Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 28 Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 30
Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 28 Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 30
C.1. since-draft-ietf-quic-load-balancers-03 . . . . . . . . . 28 C.1. since draft-ietf-quic-load-balancers-04 . . . . . . . . . 30
C.2. since-draft-ietf-quic-load-balancers-02 . . . . . . . . . 28 C.2. since-draft-ietf-quic-load-balancers-03 . . . . . . . . . 30
C.3. since-draft-ietf-quic-load-balancers-01 . . . . . . . . . 28 C.3. since-draft-ietf-quic-load-balancers-02 . . . . . . . . . 30
C.4. since-draft-ietf-quic-load-balancers-00 . . . . . . . . . 29 C.4. since-draft-ietf-quic-load-balancers-01 . . . . . . . . . 31
C.5. Since draft-duke-quic-load-balancers-06 . . . . . . . . . 29 C.5. since-draft-ietf-quic-load-balancers-00 . . . . . . . . . 31
C.6. Since draft-duke-quic-load-balancers-05 . . . . . . . . . 29 C.6. Since draft-duke-quic-load-balancers-06 . . . . . . . . . 31
C.7. Since draft-duke-quic-load-balancers-04 . . . . . . . . . 29 C.7. Since draft-duke-quic-load-balancers-05 . . . . . . . . . 31
C.8. Since draft-duke-quic-load-balancers-03 . . . . . . . . . 29 C.8. Since draft-duke-quic-load-balancers-04 . . . . . . . . . 31
C.9. Since draft-duke-quic-load-balancers-02 . . . . . . . . . 29 C.9. Since draft-duke-quic-load-balancers-03 . . . . . . . . . 31
C.10. Since draft-duke-quic-load-balancers-01 . . . . . . . . . 30 C.10. Since draft-duke-quic-load-balancers-02 . . . . . . . . . 32
C.11. Since draft-duke-quic-load-balancers-00 . . . . . . . . . 30 C.11. Since draft-duke-quic-load-balancers-01 . . . . . . . . . 32
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 30 C.12. Since draft-duke-quic-load-balancers-00 . . . . . . . . . 32
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 32
1. Introduction 1. Introduction
QUIC packets [QUIC-TRANSPORT] usually contain a connection ID to QUIC packets [QUIC-TRANSPORT] usually contain a connection ID to
allow endpoints to associate packets with different address/port allow endpoints to associate packets with different address/port
4-tuples to the same connection context. This feature makes 4-tuples to the same connection context. This feature makes
connections robust in the event of NAT rebinding. QUIC endpoints connections robust in the event of NAT rebinding. QUIC endpoints
usually designate the connection ID which peers use to address usually designate the connection ID which peers use to address
packets. Server-generated connection IDs create a potential need for packets. Server-generated connection IDs create a potential need for
out-of-band communication to support QUIC. out-of-band communication to support QUIC.
skipping to change at page 8, line 22 skipping to change at page 8, line 22
balancer and server. Increasing complexity improves obfuscation of balancer and server. Increasing complexity improves obfuscation of
the server mapping. the server mapping.
As clients sometimes generate the DCIDs in long headers, these might As clients sometimes generate the DCIDs in long headers, these might
not conform to the expectations of the routing algorithm. These are not conform to the expectations of the routing algorithm. These are
called "non-compliant DCIDs": called "non-compliant DCIDs":
* The DCID might not be long enough for the routing algorithm to * The DCID might not be long enough for the routing algorithm to
process. process.
* The config rotation bits (Section 3.1) may not correspond to an
active configuration.
* The extracted server mapping might not correspond to an active * The extracted server mapping might not correspond to an active
server. server.
Load balancers MUST forward packets with long headers with non- Load balancers MUST forward packets with long headers and non-
compliant DCIDs to an active server using an algorithm of its own compliant DCIDs to an active server using an algorithm of its own
choosing. It need not coordinate this algorithm with the servers. choosing. It need not coordinate this algorithm with the servers.
The algorithm SHOULD be deterministic over short time scales so that The algorithm SHOULD be deterministic over short time scales so that
related packets go to the same server. The design of this algorithm related packets go to the same server. The design of this algorithm
SHOULD consider the version-invariant properties of QUIC described in SHOULD consider the version-invariant properties of QUIC described in
[QUIC-INVARIANTS] to maximize its robustness to future versions of [QUIC-INVARIANTS] to maximize its robustness to future versions of
QUIC. For example, a non-compliant DCID might be converted to an QUIC. For example, a non-compliant DCID might be converted to an
integer and divided by the number of servers, with the modulus used integer and divided by the number of servers, with the modulus used
to forward the packet. The number of servers is usually consistent to forward the packet. The number of servers is usually consistent
on the time scale of a QUIC connection handshake. See also on the time scale of a QUIC connection handshake. See also
Section 9. Section 9.
As a partial exception to the above, load balancers MAY drop packets As a partial exception to the above, load balancers MAY drop packets
with long headers and non-compliant DCIDs if and only if it knows with long headers and non-compliant DCIDs if and only if it knows
that the encoded QUIC version does not allow a non-compliant DCID in that the encoded QUIC version does not allow a non-compliant DCID in
a packet with that signature. For example, a load balancer can a packet with that signature. For example, a load balancer can
safely drop a QUIC version 1 Handshake packet with a non-compliant safely drop a QUIC version 1 Handshake packet with a non-compliant
DCIDs. The prohibition against dropping packets with long headers DCID. The prohibition against dropping packets with long headers
remains for unknown QUIC versions. remains for unknown QUIC versions.
Load balancers SHOULD drop packets with non-compliant DCIDs in a Load balancers SHOULD drop packets with non-compliant DCIDs in a
short header. short header.
Servers that receive packets with noncompliant CIDs MUST use the
available mechanisms to induce the client to use a compliant CID in
future packets. In QUIC version 1, this requires using a compliant
CID in the Source CID field of server-generated long headers.
A QUIC-LB configuration MAY significantly over-provision the server A QUIC-LB configuration MAY significantly over-provision the server
ID space (i.e., provide far more codepoints than there are servers) ID space (i.e., provide far more codepoints than there are servers)
to increase the probability that a randomly generated Destination to increase the probability that a randomly generated Destination
Connection ID is non- compliant. Connection ID is non- compliant.
Load balancers MUST forward packets with compliant DCIDs to a server Load balancers MUST forward packets with compliant DCIDs to a server
in accordance with the chosen routing algorithm. in accordance with the chosen routing algorithm.
The load balancer MUST NOT make the routing behavior dependent on any The load balancer MUST NOT make the routing behavior dependent on any
bits in the first octet of the QUIC packet header, except the first bits in the first octet of the QUIC packet header, except the first
bit, which indicates a long header. All other bits are QUIC version- bit, which indicates a long header. All other bits are QUIC version-
dependent and intermediaries would cannot build their design on dependent and intermediaries cannot base their design on version-
version-specific templates. specific templates.
There are situations where a server pool might be operating two or There are situations where a server pool might be operating two or
more routing algorithms or parameter sets simultaneously. The load more routing algorithms or parameter sets simultaneously. The load
balancer uses the first two bits of the connection ID to multiplex balancer uses the first two bits of the connection ID to multiplex
incoming DCIDs over these schemes. incoming DCIDs over these schemes.
This section describes three participants: the configuration agent, This section describes three participants: the configuration agent,
the load balancer, and the server. the load balancer, and the server.
4.1. Plaintext CID Algorithm 4.1. Plaintext CID Algorithm
skipping to change at page 9, line 40 skipping to change at page 9, line 50
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| First octet | Server ID (X=8..152) | | First octet | Server ID (X=8..152) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Any (0..152-X) | | Any (0..152-X) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 2: Plaintext CID Format Figure 2: Plaintext CID Format
4.1.1. Configuration Agent Actions 4.1.1. Configuration Agent Actions
The configuration agent selects a number of bytes of the server The configuration agent selects a length for the server ID encoding.
connection ID to encode individual server IDs, called the "routing This length MUST have enough entropy to have a different code point
bytes". The number of bytes MUST have enough entropy to have a for each server.
different code point for each server.
It also assigns a server ID to each server. It also assigns a server ID to each server.
4.1.2. Load Balancer Actions 4.1.2. Load Balancer Actions
On each incoming packet, the load balancer extracts consecutive On each incoming packet, the load balancer extracts consecutive
octets, beginning with the second octet. These bytes represent the octets, beginning with the second octet. These bytes represent the
server ID. server ID.
4.1.3. Server Actions 4.1.3. Server Actions
skipping to change at page 12, line 50 skipping to change at page 13, line 13
Figure 4: Block Cipher CID Format Figure 4: Block Cipher CID Format
4.3.1. Configuration Agent Actions 4.3.1. Configuration Agent Actions
The configuration agent assigns a server ID to every server in its The configuration agent assigns a server ID to every server in its
pool, and determines a server ID length (in octets) sufficiently pool, and determines a server ID length (in octets) sufficiently
large to encode all server IDs, including potential future servers. large to encode all server IDs, including potential future servers.
The server ID will start in the second octet of the decrypted The server ID will start in the second octet of the decrypted
connection ID and occupy continuous octets beyond that. connection ID and occupy continuous octets beyond that.
They server ID length MUST be no more than 16 octets and SHOULD sum They server ID length MUST be no more than 16 octets and SHOULD be no
to no more than 12 octets, to provide servers adequate space to more than 12 octets, to provide servers adequate space to encode
encode their own opaque data. their own opaque data.
The configuration agent also selects an 16-octet AES-ECB key to use The configuration agent also selects an 16-octet AES-ECB key to use
for connection ID decryption. for connection ID decryption.
4.3.2. Load Balancer Actions 4.3.2. Load Balancer Actions
Upon receipt of a QUIC packet, the load balancer reads the first Upon receipt of a QUIC packet, the load balancer reads the first
octet to obtain the config rotation bits. It then decrypts the octet to obtain the config rotation bits. It then decrypts the
subsequent 16 octets using AES-ECB decryption and the chosen key. subsequent 16 octets using AES-ECB decryption and the chosen key.
skipping to change at page 13, line 35 skipping to change at page 13, line 47
octets SHOULD appear essentially random to observers. The first octets SHOULD appear essentially random to observers. The first
octet is reserved as described in Section 3. octet is reserved as described in Section 3.
The server then encrypts the second through seventeenth octets using The server then encrypts the second through seventeenth octets using
the 128-bit AES-ECB cipher. the 128-bit AES-ECB cipher.
5. ICMP Processing 5. ICMP Processing
For protocols where 4-tuple load balancing is sufficient, it is For protocols where 4-tuple load balancing is sufficient, it is
straightforward to deliver ICMP packets from the network to the straightforward to deliver ICMP packets from the network to the
correct server, by reading the IP and transport-layer headers to correct server, by reading the echoed `IP and transport-layer headers
obtain the 4-tuple. When routing is based on connection ID, further to obtain the 4-tuple. When routing is based on connection ID,
measures are required, as most QUIC packets that trigger ICMP further measures are required, as most QUIC packets that trigger ICMP
responses will only contain a client-generated connection ID that responses will only contain a client-generated connection ID that
contains no routing information. contains no routing information.
To solve this problem, load balancers MAY maintain a mapping of To solve this problem, load balancers MAY maintain a mapping of
Client IP and port to server ID based on recently observed packets. Client IP and port to server ID based on recently observed packets.
Alternatively, servers MAY implement the technique described in Alternatively, servers MAY implement the technique described in
Section 14.4.1 of [QUIC-TRANSPORT] to increase the likelihood a Section 14.4.1 of [QUIC-TRANSPORT] to increase the likelihood a
Source Connection ID is included in ICMP responses to Path Maximum Source Connection ID is included in ICMP responses to Path Maximum
Transmission Unit (PMTU) probes. Load balancers MAY parse the echoed Transmission Unit (PMTU) probes. Load balancers MAY parse the echoed
packet to extract the Source Connection ID, if it contains a QUIC 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 long header, and extract the Server ID as if it were in a Destination
CID. CID.
6. Retry Service 6. Retry Service
When a server is under load, QUICv1 allows it to defer storage of When a server is under load, QUICv1 allows it to defer storage of
connection state until the client proves it can receive packets at connection state until the client proves it can receive packets at
its advertised IP address. Through the use of a Retry packet, a its advertised IP address. Through the use of a Retry packet, a
token in subsequent client Initial packets, and the token in subsequent client Initial packets, and transport parameters,
original_destination_connection_id transport parameter, servers servers verify address ownership and clients verify that there is no
verify address ownership and clients verify that there is no "man in on-path attacker generating Retry packets.
the middle" generating Retry packets.
As a trusted Retry Service is literally a "man in the middle," the
service must communicate the original_destination_connection_id back
to the server so that it can pass client verification. It also must
either verify the address itself (with the server trusting this
verification) or make sure there is common context for the server to
verify the address using a service-generated token.
The service must also communicate the source connection ID of the A "Retry Service" detects potential Denial of Service attacks and
Retry packet to the server so that it can include it in a transport handles sending of Retry packets on behalf of the server. As it is,
parameter for client verification. by definition, literally an on-path entity, the service must
communicate some of the original connection IDs back to the server so
that it can pass client verification. It also must either verify the
address itself (with the server trusting this verification) or make
sure there is common context for the server to verify the address
using a service-generated token.
There are two different mechanisms to allow offload of DoS mitigation There are two different mechanisms to allow offload of DoS mitigation
to a trusted network service. One requires no shared state; the to a trusted network service. One requires no shared state; the
server need only be configured to trust a retry service, though this server need only be configured to trust a retry service, though this
imposes other operational constraints. The other requires shared imposes other operational constraints. The other requires a shared
key, but has no such constraints. key, but has no such constraints.
Retry services MUST forward all QUIC packets that are not of type Retry services MUST forward all QUIC packets that are not of type
Initial or 0-RTT. Other packets types might involve changed IP Initial or 0-RTT. Other packet types might involve changed IP
addresses or connection IDs, so it is not practical for Retry addresses or connection IDs, so it is not practical for Retry
Services to identify such packets as valid or invalid. Services to identify such packets as valid or invalid.
6.1. Common Requirements 6.1. Common Requirements
Regardless of mechanism, a retry service has an active mode, where it Regardless of mechanism, a retry service has an active mode, where it
is generating Retry packets, and an inactive mode, where it is not, is generating Retry packets, and an inactive mode, where it is not,
based on its assessment of server load and the likelihood an attack 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- 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 connection basis, through a stochastic process or based on client
skipping to change at page 16, line 41 skipping to change at page 17, line 10
initial packets that contain no token, or a token that has the first 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 bit set to '1'. It MUST NOT forward the packet to the server. The
service MUST validate all tokens with the first bit set to '0'. If service MUST validate all tokens with the first bit set to '0'. If
successful, the service MUST forward the packet with the token successful, the service MUST forward the packet with the token
intact. If unsuccessful, it MUST drop the packet. The Retry Service intact. If unsuccessful, it MUST drop the packet. The Retry Service
MAY send an Initial Packet containing a CONNECTION_CLOSE frame with MAY send an Initial Packet containing a CONNECTION_CLOSE frame with
the INVALID_TOKEN error code when dropping the packet. the INVALID_TOKEN error code when dropping the packet.
Note that this scheme has a performance drawback. When the retry Note that this scheme has a performance drawback. When the retry
service is in active mode, clients with a token from a NEW_TOKEN service is in active mode, clients with a token from a NEW_TOKEN
frame will suffer a 1-RTT penalty even though it has proof of address frame will suffer a 1-RTT penalty even though its token provides
with its token. proof of address.
In inactive mode, the service MUST forward all packets that have no In inactive mode, the service MUST forward all packets that have no
token or a token with the first bit set to '1'. It MUST validate all 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 service tokens with the first bit set to '0'. If successful, the service
MUST forward the packet with the token intact. If unsuccessful, it MUST forward the packet with the token intact. If unsuccessful, it
MUST either drop the packet or forward it with the token removed. MUST either drop the packet or forward it with the token removed.
The latter requires decryption and re-encryption of the entire The latter requires decryption and re-encryption of the entire
Initial packet to avoid authentication failure. Forwarding the Initial packet to avoid authentication failure. Forwarding the
packet causes the server to respond without the packet causes the server to respond without the
original_destination_connection_id transport parameter, which original_destination_connection_id transport parameter, which
preserves the normal QUIC signal to the client that there is an preserves the normal QUIC signal to the client that there is an on-
unauthorized man in the middle. path attacker.
6.2.3. Server Requirements 6.2.3. Server Requirements
A server behind a non-shared-state retry service MUST NOT send Retry A server behind a non-shared-state retry service MUST NOT send Retry
packets for a QUIC version the retry service understands. It MAY packets for a QUIC version the retry service understands. It MAY
send Retry for QUIC versions the Retry Service does not understand. send Retry for QUIC versions the Retry Service does not understand.
Tokens sent in NEW_TOKEN frames MUST have the first bit be set to Tokens sent in NEW_TOKEN frames MUST have the first bit set to '1'.
'1'.
If a server receives an Initial Packet with the first bit set to '1', If a server receives an Initial Packet with the first bit set to '1',
it could be from a server-generated NEW_TOKEN frame and should be it could be from a server-generated NEW_TOKEN frame and should be
processed in accordance with the QUIC specification. If a server processed in accordance with the QUIC specification. If a server
receives an Initial Packet with the first bit to '0', it is a Retry 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 token and the server MUST NOT attempt to validate it. Instead, it
MUST assume the address is validated and MUST extract the Original MUST assume the address is validated and MUST extract the Original
Destination Connection ID and Retry Source Connection ID, assuming Destination Connection ID and Retry Source Connection ID, assuming
the format described in Section 6.2.2. the format described in Section 6.2.2.
6.3. Shared-State Retry Service 6.3. Shared-State Retry Service
A shared-state retry service uses a shared key, so that the server A shared-state retry service uses a shared key, so that the server
can decode the service's retry tokens. It does not require that all can decode the service's retry tokens. It does not require that all
traffic pass through the Retry service, so servers MAY send Retry traffic pass through the Retry service, so servers MAY send Retry
packets in response to Initial packets that don't include a valid packets in response to Initial packets that don't include a valid
token. token.
Both server and service must have access to Universal time, though Both server and service must have access to Universal time, though
tight synchronization is not necessary. tight synchronization is unnecessary.
All tokens, generated by either the server or retry service, MUST use All tokens, generated by either the server or retry service, MUST use
the following format. This format is the cleartext version. On the the following format. This format is the cleartext version. On the
wire, these fields are encrypted using an AES-ECB cipher and the wire, these fields are encrypted using an AES-ECB cipher and the
token key. If the token is not a multiple of 16 octets, the last token key. If the token is not a multiple of 16 octets, the last
block is padded with zeroes. block is padded with zeroes.
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Client IP Address (128) +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ODCIL | RSCIL | | ODCIL | RSCIL |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Original Destination Connection ID (0..160) | | Original Destination Connection ID (0..160) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... | | ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Retry Source Connection ID (0..160) | | Retry Source Connection ID (0..160) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... | | ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |
+ + + Timestamp (64) +
| |
+ Client IP Address (128) +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ +
| date-time (160) |
+ +
| |
+ +
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opaque Data (optional) | | Opaque Data (optional) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 6: Cleartext format of shared-state retry tokens Figure 6: Cleartext format of shared-state retry tokens
The tokens have the following fields: The tokens have the following fields:
ODCIL: The original destination connection ID length. Tokens in ODCIL: The original destination connection ID length. Tokens in
skipping to change at page 19, line 10 skipping to change at page 19, line 10
frames MUST set this field to zero. frames MUST set this field to zero.
Original Destination Connection ID: The server or Retry Service Original Destination Connection ID: The server or Retry Service
copies this from the field in the client Initial packet. copies this from the field in the client Initial packet.
Retry Source Connection ID: The server or Retry service copies this Retry Source Connection ID: The server or Retry service copies this
from the Source Connection ID of the Retry packet. from the Source Connection ID of the Retry packet.
Client IP Address: The source IP address from the triggering Initial Client IP Address: The source IP address from the triggering Initial
packet. The client IP address is 16 octets. If an IPv4 address, the packet. The client IP address is 16 octets. If an IPv4 address, the
last 12 octets are zeroes. last 12 octets are zeroes. If there is a Network Address Translator
(NAT) in the server infrastructure that changes the client IP, the
Retry Service MUST either be positioned behind the NAT, or the NAT
must have the token key to rewrite the Retry token accordingly.
date-time: The date-time string is a total of 20 octets and encodes Timestamp: The timestamp is a 64-bit integer, in network order, that
the time the token was generated. The format of date-time is expresses the number of seconds in POSIX time (see Sec. 4.16 of
described in Section 5.6 of [RFC3339]. This ASCII field MUST use the [TIME_T]).
"Z" character for time-offset.
Opaque Data: The server may use this field to encode additional Opaque Data: The server may use this field to encode additional
information, such as congestion window, RTT, or MTU. Opaque data information, such as congestion window, RTT, or MTU. Opaque data MAY
SHOULD also allow servers to distinguish between retry tokens (which also allow servers to distinguish between retry tokens (which trigger
trigger use of the original_destination_connection_id transport use of certain transport parameters) and NEW_TOKEN frame tokens.
parameter) and NEW_TOKEN frame tokens.
6.3.1. Configuration Agent Actions 6.3.1. Configuration Agent Actions
The configuration agent generates and distributes a "token key." The configuration agent generates and distributes a "token key" and a
list of QUIC versions the service supports. It must also inform the
service if a NAT lies between the service and the servers.
6.3.2. Service Requirements 6.3.2. Service Requirements
When in active mode, the service MUST generate Retry tokens with the When in active mode, the service MUST generate Retry tokens with the
format described above when it receives a client Initial packet with format described above when it receives a client Initial packet with
no token. no token.
In active mode, the service SHOULD decrypt incoming tokens. The In active mode, the service SHOULD decrypt the first 16 octets of
service SHOULD drop packets with an IP address that does not match, incoming tokens. The service SHOULD drop packets with an IP address
and SHOULD forward packets that do, regardless of the other fields. that does not match, and SHOULD forward packets that do, regardless
of the other fields.
However, the service MUST NOT decrypt or validate tokens if there is
a NAT between it and the servers.
In inactive mode, the service SHOULD forward all packets to the In inactive mode, the service SHOULD forward all packets to the
server so that the server can issue an up-to-date token to the server so that the server can issue an up-to-date token to the
client. client.
6.3.3. Server Requirements 6.3.3. Server Requirements
When issuing Retry or NEW_TOKEN tokens, the server MUST encode the
client IP address in the first 16 octets and encrypt that block with
the token key. It MAY use any format or encryption for the remainder
of the token. However, it MUST include a means of distinguishing
service-generated Retry tokens, server-generated Retry tokens (if
different), and NEW_TOKEN tokens.
The server MUST validate all tokens that arrive in Initial packets, The server MUST validate all tokens that arrive in Initial packets,
as they may have bypassed the Retry service. It SHOULD use the date- as they may have bypassed the Retry service.
time field to apply its expiration limits for tokens. This need not
be synchronized with the retry service. However, servers MAY allow For Retry tokens that follow the format above, servers SHOULD use the
retry tokens marked as being a few seconds in the future, due to timestamp field to apply its expiration limits for tokens. This need
possible clock synchronization issues. not be precisely synchronized with the retry service. However,
servers MAY allow retry tokens marked as being a few seconds in the
future, due to possible clock synchronization issues.
After decrypting the token, the server uses the corresponding fields After decrypting the token, the server uses the corresponding fields
to populate the original_destination_connection_id transport to populate the original_destination_connection_id transport
parameter, with a length equal to ODCIL, and the parameter, with a length equal to ODCIL, and the
retry_source_connection_id transport parameter, with length equal to retry_source_connection_id transport parameter, with length equal to
RSCIL. RSCIL.
For QUIC versions the service does not support, the server MAY use
any token format.
As discussed in [QUIC-TRANSPORT], a server MUST NOT send a Retry As discussed in [QUIC-TRANSPORT], a server MUST NOT send a Retry
packet in response to an Initial packet that contains a retry token. packet in response to an Initial packet that contains a retry token.
7. Configuration Requirements 7. Configuration Requirements
QUIC-LB requires common configuration to synchronize understanding of QUIC-LB requires common configuration to synchronize understanding of
encodings and guarantee explicit consent of the server. encodings and guarantee explicit consent of the server.
The load balancer and server MUST agree on a routing algorithm and The load balancer and server MUST agree on a routing algorithm and
the relevant parameters for that algorithm. the relevant parameters for that algorithm. Each server MUST know
its server ID for each configuration, and the load balancer MUST have
forwarding instructions for each server ID.
For Plaintext CID Routing, this consists of the Server ID and the For all algorithms, the load balancer and servers MUST have a common
routing bytes. The Server ID is unique to each server, and the understanding of the server ID length.
routing bytes are global.
For Stream Cipher CID Routing, this consists of the Server ID, Server For Stream Cipher CID Routing, the servers and load balancer also
ID Length, Key, and Nonce Length. The Server ID is unique to each MUST have a common understanding of the key and nonce length.
server, but the others MUST be global. The authentication token MUST
be distributed out of band for this algorithm to operate.
For Block Cipher CID Routing, this consists of the Server ID, Server For Block Cipher CID Routing, the servers and load balancer also MUST
ID Length, Key, and Zero-Padding Length. The Server ID is unique to have a common understanding of the key.
each server, but the others MUST be global.
A full QUIC-LB configuration MUST also specify the information Note that server IDs are opaque bytes, not integers, so there is no
content of the first CID octet and the presence and mode of any Retry notion of network order or host order.
Service.
A server configuration MUST specify if the first octet encodes the
CID length. Note that a load balancer does not need the CID length,
as the required bytes are present in the QUIC packet.
A full QUIC-LB server configuration MUST also specify the supported
QUIC versions of any Retry Service. If a shared-state service, the
server also must have the token key.
A non-shared-state Retry Service need only be configured with the
QUIC versions it supports. A shared-state Retry Service also needs
the token key, and to be aware if a NAT sits between it and the
servers.
The following pseudocode describes the data items necessary to store The following pseudocode describes the data items necessary to store
a full QUIC-LB configuration at the server. It is meant to describe a full QUIC-LB configuration at the server. It is meant to describe
the conceptual range and not specify the presentation of such the conceptual range and not specify the presentation of such
configuration in an internet packet. The comments signify the range configuration in an internet packet. The comments signify the range
of acceptable values where applicable. of acceptable values where applicable.
uint2 config_rotation_bits; uint2 config_rotation_bits;
boolean first_octet_encodes_cid_length; boolean first_octet_encodes_cid_length;
enum { none, non_shared_state, shared_state } retry_service; enum { none, non_shared_state, shared_state } retry_service;
select (retry_service) { select (retry_service) {
case none: null; case none: null;
case non_shared_state: uint32 list_of_quic_versions[]; case non_shared_state: uint32 list_of_quic_versions[];
case shared_state: uint8 key[16]; case shared_state: {
uint32 list_of_quic_versions[];
uint8 token_key[16];
} shared_state_config;
} retry_service_config; } retry_service_config;
enum { none, plaintext, stream_cipher, block_cipher } enum { none, plaintext, stream_cipher, block_cipher }
routing_algorithm; routing_algorithm;
select (routing_algorithm) { select (routing_algorithm) {
case none: null; case none: null;
case plaintext: struct { case plaintext: struct {
uint8 server_id_length; /* 1..19 */ uint8 server_id_length; /* 1..19 */
uint8 server_id[server_id_length]; uint8 server_id[server_id_length];
} plaintext_config; } plaintext_config;
case stream_cipher: struct { case stream_cipher: struct {
skipping to change at page 21, line 43 skipping to change at page 22, line 46
8. Additional Use Cases 8. Additional Use Cases
This section discusses considerations for some deployment scenarios This section discusses considerations for some deployment scenarios
not implied by the specification above. not implied by the specification above.
8.1. Load balancer chains 8.1. Load balancer chains
Some network architectures may have multiple tiers of low-state load Some network architectures may have multiple tiers of low-state load
balancers, where a first tier of devices makes a routing decision to balancers, where a first tier of devices makes a routing decision to
the next tier, and so on until packets reach the server. Although the next tier, and so on, until packets reach the server. Although
QUIC-LB is not explicitly designed for this use case, it is possible QUIC-LB is not explicitly designed for this use case, it is possible
to support it. to support it.
If each load balancer is assigned a range of server IDs that is a 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 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 client, then the first devices to process an incoming packet can
extract the server ID and then map it to the correct forwrading extract the server ID and then map it to the correct forwarding
address. Note that this solution is extensible to arbitrarily large address. Note that this solution is extensible to arbitrarily large
numbers of load-balancing tiers, as the maximum server ID space is numbers of load-balancing tiers, as the maximum server ID space is
quite large. quite large.
8.2. Moving connections between servers 8.2. Moving connections between servers
Some deployments may transparently move a connection from one server Some deployments may transparently move a connection from one server
to another. The means of transferring connection state between to another. The means of transferring connection state between
servers is out of scope of this document. servers is out of scope of this document.
To support a handover, a server involved in the transition could 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, issue CIDs that map to the new server via a NEW_CONNECTION_ID frame,
and retire CIDs associated with the new server using the "Retire and retire CIDs associated with the new server using the "Retire
Prior To" field in that frame. Prior To" field in that frame.
Alternately, if the old server is going offline, the load balancer Alternately, if the old server is going offline, the load balancer
could simply map its server ID to the new server's address. could simply map its server ID to the new server's address.
9. Version Invariance of QUIC-LB 9. Version Invariance of QUIC-LB
Retry Services are inherently dependent on the format (and existence) Non-shared-state Retry Services are inherently dependent on the
of Retry Packets in each version of QUIC, and so Retry Service format (and existence) of Retry Packets in each version of QUIC, and
configuration explicitly includes the supported QUIC versions. so Retry Service configuration explicitly includes the supported QUIC
versions.
The server ID encodings, and requirements for their handling, are The server ID encodings, and requirements for their handling, are
designed to be QUIC version independent (see [QUIC-INVARIANTS]). A designed to be QUIC version independent (see [QUIC-INVARIANTS]). A
QUIC-LB load balancer will generally not require changes as servers QUIC-LB load balancer will generally not require changes as servers
deploy new versions of QUIC. However, there are several unlikely deploy new versions of QUIC. However, there are several unlikely
future design decisions that could impact the operation of QUIC-LB. future design decisions that could impact the operation of QUIC-LB.
The maximum Connection ID length could be below the minimum necessary The maximum Connection ID length could be below the minimum necessary
for one or more encoding algorithms. for one or more encoding algorithms.
skipping to change at page 25, line 36 skipping to change at page 26, line 25
QUIC", Work in Progress, Internet-Draft, draft-ietf-quic- QUIC", Work in Progress, Internet-Draft, draft-ietf-quic-
invariants, invariants,
<https://tools.ietf.org/html/draft-ietf-quic-invariants>. <https://tools.ietf.org/html/draft-ietf-quic-invariants>.
[QUIC-TRANSPORT] [QUIC-TRANSPORT]
Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
Multiplexed and Secure Transport", Work in Progress, Multiplexed and Secure Transport", Work in Progress,
Internet-Draft, draft-ietf-quic-transport, Internet-Draft, draft-ietf-quic-transport,
<https://tools.ietf.org/html/draft-ietf-quic-transport>. <https://tools.ietf.org/html/draft-ietf-quic-transport>.
[RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet: [TIME_T] "Open Group Standard: Vol. 1: Base Definitions, Issue 7",
Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002, IEEE Std 1003.1 , 2018,
<https://www.rfc-editor.org/info/rfc3339>. <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/
V1_chap04.html#tag_04_16>.
12.2. Informative References 12.2. Informative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
Appendix A. Load Balancer Test Vectors Appendix A. Load Balancer Test Vectors
Because any connection ID encoding in this specification includes Each section of this draft includes multiple sets of load balancer
many bits for server use without affecting extraction of the server configuration, each of which has five examples of server ID and
ID, there are many possible connection IDs for any given set of server use bytes and how they are encoded in a CID.
parameters. However, every connection ID should result in a unique
server ID. The following connection IDs can be used to verify that a In some cases, there are no server use bytes. Note that, for
load balancer implementation extracts the correct server ID. simplicity, the first octet bits used for neither config rotation nor
length self-encoding are random, rather than listed in the server use
field. Therefore, a server implementation using these parameters may
generate CIDs with a slightly different first octet.
This section uses the following abbreviations:
cid Connection ID cr_bits Config Rotation Bits LB Load Balancer sid
Server ID sid_len Server ID length su Server Use Bytes
All values except length_self_encoding and sid_len are expressed in
hexidecimal format.
A.1. Plaintext Connection ID Algorithm A.1. Plaintext Connection ID Algorithm
TBD LB configuration: cr_bits 0x0 length_self_encoding: y sid_len 1
A.2. Stream Cipher Connection ID Algorithm cid 01be sid be su cid 0221b7 sid 21 su b7 cid 03cadfd8 sid ca su
dfd8 cid 041e0c9328 sid 1e su 0c9328 cid 050c8f6d9129 sid 0c su
8f6d9129
cr_bits 0x0 length_self_encoding: y nonce_len 10 sid_len 1 key LB configuration: cr_bits 0x0 length_self_encoding: n sid_len 2
9c46142f1597511357cf437841721d4b
cid 0b05be7bf896ed26cb4cc59a sid ab cid 0b43909398577dd7df1597d4 sid cid 02aab0 sid aab0 su cid 3ac4b106 sid c4b1 su 06 cid 08bd3cf4a0 sid
37 cid 0bf85fa27034785803747464 sid 0e cid 0bc630c588fdecbfbdb62e61 bd3c su f4a0 cid 3771d59502d6 sid 71d5 su 9502d6 cid 1d57dee8b888f3
sid 44 cid 0b8788901684f5d4e4dc6aeb sid 83 sid 57de su e8b888f3
cr_bits 0x0 length_self_encoding: n nonce_len 9 sid_len 2 key LB configuration: cr_bits 0x0 length_self_encoding: y sid_len 3
434ae6fbf36aca0773a6a75f10e3f747
cid 08644a29067622f363d4c83e sid 846a cid 234b2899f9b213a70abfe193 cid 0336c976 sid 36c976 su cid 04aa291806 sid aa2918 su 06 cid
sid 4417 cid 3ff4ef53bbaad327c1e18fa5 sid 7554 cid 0586897bd8b6 sid 86897b su d8b6 cid 063625bcae4de0 sid 3625bc su
08a0eaf4cc08f184e6cf7743 sid b78a cid 3fb2f5cf1b3e08bf97709c42 sid ae4de0 cid 07966fb1f3cb535f sid 966fb1 su f3cb535f
ed7e
cr_bits 0x0 length_self_encoding: y nonce_len 12 sid_len 3 key LB configuration: cr_bits 0x0 length_self_encoding: n sid_len 4
02e895bf84f6a80c3c7156da88a96755
cid 0f7405813570b8f9a6a10564d7b92834 sid 49023c cid cid 185172fab8 sid 5172fab8 su cid 2eb7ff2c9297 sid b7ff2c92 su 97
0f3bb656319c6af210239dcaef77d3b9 sid b0a8ce cid cid 14f3eb3dd3edbe sid f3eb3dd3 su edbe cid 3feb31cece744b74 sid
0f3ae6d54ee97fc6907b5e2d60436caf sid 21f035 cid eb31cece su 744b74 cid 06b9f34c353ce23bb5 sid b9f34c35 su 3ce23bb5
0f4774918a6576c88f85829306f6450f sid 9e46ea cid
0f7467db6ca1eb4c185e642b0c9f8f44 sid c33db0
cr_bits 0x0 length_self_encoding: n nonce_len 11 sid_len 4 key LB configuration: cr_bits 0x0 length_self_encoding: y sid_len 5
ccb612da03f5dc205faf9b0b1d5429cb
cid 0c4b23e27639aef72f861ad2dce39d96 sid 125fdba1 cid cid 05bdcd8d0b1d sid bdcd8d0b1d su cid 06aee673725a63 sid aee673725a
063ed9a173d22be11818b77a3bd5ec37 sid 0f3f82bc cid su 63 cid 07bbf338ddbf37f4 sid bbf338ddbf su 37f4 cid
1a14e39b0f6ca6a3a48f6fdd2083fa09 sid 05950af2 cid 08fbbca64c26756840 sid fbbca64c26 su 756840 cid 09e7737c495b93894e34
36cb4df5a7776edb21ec87c35c24e988 sid 3cb80d59 cid sid e7737c495b su 93894e34
05749809112a91327fef4b3152335298 sid 4746cb79
cr_bits 0x0 length_self_encoding: y nonce_len 8 sid_len 5 key
625696d413ea1a352401afce6eec2432
cid 0d2a7b43eeaac8b36fce2c14ac96 sid 4b00da143a cid A.2. Stream Cipher Connection ID Algorithm
0ddd6cdb6685e75b91f4a1bb0dde sid f9aa795663 cid
0d870ea4d173d29484e41ea4a189 sid e430dcfb3f cid
0df12abe175241b5ab035d23910f sid 8bc66a2596 cid
0d390df5de76903ca94b2e9daa49 sid 7637d0c172
A.3. Block Cipher Connection ID Algorithm In each case below, the server is using a plain text nonce value of
zero.
Like the previous section, the text below lists a set of load LB configuration: cr_bits 0x0 length_self_encoding: y nonce_len 12
balancer configuration and 5 CIDs generated with that configuration. sid_len 1 key 4d9d0fd25a25e7f321ef464e13f9fa3d
cid 0d69fe8ab8293680395ae256e89c sid c5 su cid
0e420d74ed99b985e10f5073f43027 sid d5 su 27 cid
0f380f440c6eefd3142ee776f6c16027 sid 10 su 6027 cid
1020607efbe82049ddbf3a7c3d9d32604d sid 3c su 32604d cid
11e132d12606a1bb0fa17e1caef00ec54c10 sid e3 su 0ec54c10
cr_bits 0x0 length_self_encoding: y sid_len 1 zp_len 11 key LB configuration: cr_bits 0x0 length_self_encoding: n nonce_len 12
8c24cb9b9c3289b4ee63c3f3d7f93a9a sid_len 2 key 49e1cec7fd264b1f4af37413baf8ada9
cid: 1378e44f874642624fa69e7b4aec15a2a678b8b5 sid: 48 cid 3d3a5e1126414271cc8dc2ec7c8c15 sid f7fe su cid
cid: 13772c82fe8ce6a00813f76a211b730eb4b20363 sid: 66 007042539e7c5f139ac2adfbf54ba748 sid eaf4 su 48 cid
cid: 135ccf507b1c209457f80df0217b9a1df439c4b2 sid: 30 2bc125dd2aed2aafacf59855d99e029217 sid e880 su 9217 cid
cid: 13898459900426c073c66b1001c867f9098a7aab sid: fe 3be6728dc082802d9862c6c8e4dda3d984d8 sid 62c6 su d984d8 cid
cid: 1397a18da00bf912f20049d9f0a007444f8b6699 sid: 30 1afe9c6259ad350fc7bad28e0aeb2e8d4d4742 sid 8502 su 8d4d4742
cr_bits 0x0 length_self_encoding: n sid_len 2 zp_len 10 key LB configuration: cr_bits 0x0 length_self_encoding: y nonce_len 14
cc7ec42794664a8428250c12a7fb16fa sid_len 3 key 2c70df0b399bd33a7335523dcdb884ad
cid: 0cb28bfc1f65c3de14752bc0fc734ef824ce8f78 sid: 33fa cid 11d62e8670565cd30b552edff6782ff5a740 sid d794bb su cid
cid: 2345e9fc7a7be55b4ba1ff6ffa04f3f5f8c67009 sid: ee47 12c70e481f49363cabd9370d1fd5012c12bca5 sid 2cbd5d su a5 cid
cid: 0d32102be441600f608c95841fd40ce978aa7a02 sid: 0c8b 133b95dfd8ad93566782f8424df82458069fc9e9 sid d126cd su c9e9 cid
cid: 2e6bfc53c91c275019cd809200fa8e23836565ab sid: feca 13ac6ffcd635532ab60370306c7ee572d6b6e795 sid 539e42 su e795 cid
cid: 29b87a902ed129c26f7e4e918a68703dc71a6e0a sid: 8941 1383ed07a9700777ff450bb39bb9c1981266805c sid 9094dd su 805c
cr_bits 0x1 length_self_encoding: y sid_len 3 zp_len 9 key LB configuration: cr_bits 0x0 length_self_encoding: n nonce_len 12
42e657946b96b7052ab8e6eeb863ee24 sid_len 4 key 2297b8a95c776cf9c048b76d9dc27019
cid: 53c48f7884d73fd9016f63e50453bfd9bcfc637d sid: b46b68 cid 32873890c3059ca62628089439c44c1f84 sid 7398d8ca su cid
cid: 53f45532f6a4f0e1757fa15c35f9a2ab0fcce621 sid: 2147b4 1ff7c7d7b9823954b178636c99a7dc93ac83 sid 9655f091 su 83 cid
cid: 5361fd4bbcee881a637210f4fffc02134772cc76 sid: e4bf4b 31044000a5ebb3bf2fa7629a17f2c78b077c17 sid 8b035fc6 su 7c17 cid
cid: 53881ffde14e613ef151e50ba875769d6392809b sid: c2afee 1791bd28c66721e8fea0c6f34fd2d8e663a6ef70 sid 6672e0e2 su a6ef70 cid
cid: 53ad0d60204d88343492334e6c4c4be88d4a3add sid: ae0331 3df1d90ad5ccd5f8f475f040e90aeca09ec9839d sid b98b1fff su c9839d
cr_bits 0x0 length_self_encoding: n sid_len 4 zp_len 8 key LB configuration: cr_bits 0x0 length_self_encoding: y nonce_len 8
ee2dc6a3359a94b0043ca0c82715ce71 sid_len 5 key 484b2ed942d9f4765e45035da3340423
cid: 058b9da37f436868cca3cef40c7f98001797c611 sid: eaf846c7
cid: 1259fc97439adaf87f61250afea059e5ddf66e44 sid: 4cc5e84a
cid: 202f424376f234d5f014f41cebc38de2619c6c71 sid: f94ff800
cid: 146ac3e4bbb750d3bfb617ef4b0cb51a1cae5868 sid: c2071b1b
cid: 36dfe886538af7eb16a196935b3705c9d741479f sid: 26359dbb
cr_bits 0x2 length_self_encoding: y sid_len 5 zp_len 7 key cid 0da995b7537db605bfd3a38881ae sid 391a7840dc su cid
700837da8834840afe7720186ec610c9 0ed8d02d55b91d06443540d1bf6e98 sid 10f7f7b284 su 98 cid
0f3f74be6d46a84ccb1fd1ee92cdeaf2 sid 0606918fc0 su eaf2 cid
1045626dbf20e03050837633cc5650f97c sid e505eea637 su 50f97c cid
11bb9a17f691ab446a938427febbeb593eaa sid 99343a2a96 su eb593eaa
cid: 931ef3cc07e2eaf08d4c1902cd564d907cc3377c sid: 759b1d419a A.3. Block Cipher Connection ID Algorithm
cid: 9398c3d0203ab15f1dfeb5aa8f81e52888c32008 sid: 77cc0d3310
cid: 93f4ba09ab08a9ef997db4fa37a97dbf2b4c5481 sid: f7db9dce32 LB configuration: cr_bits 0x0 length_self_encoding: y sid_len 1 key
cid: 93744f4bedf95e04dd6607592ecf775825403093 sid: e264d714d2 411592e4160268398386af84ea7505d4
cid: 93256308e3d349f8839dec840b0a90c7e7a1fc20 sid: 618b07791f cid 10564f7c0df399f6d93bdddb1a03886f25 sid 23 su
05231748a80884ed58007847eb9fd0 cid 10d5c03f9dd765d73b3d8610b244f74d02
sid 15 su 76cd6b6f0d3f0b20fc8e633e3a05f3 cid
108ca55228ab23b92845341344a2f956f2 sid 64 su
65c0ce170a9548717498b537cb8790 cid 10e73f3d034aef2f6f501e3a7693d6270a
sid 07 su f9ad10c84cc1e89a2492221d74e707 cid
101a6ce13d48b14a77ecfd365595ad2582 sid 6c su
76ce4689b0745b956ef71c2608045d
LB configuration: cr_bits 0x0 length_self_encoding: n sid_len 2 key
92ce44aecd636aeeff78da691ef48f77
cid 20aa09bc65ed52b1ccd29feb7ef995d318 sid a52f su
99278b92a86694ff0ecd64bc2f73 cid 30b8dbef657bd78a2f870e93f9485d5211
sid 6c49 su 7381c8657a388b4e9594297afe96 cid
043a8137331eacd2e78383279b202b9a6d sid 4188 su
5ac4b0e0b95f4e7473b49ee2d0dd cid 3ba71ea2bcf0ab95719ab59d3d7fde770d
sid 8ccc su 08728807605db25f2ca88be08e0f cid
37ef1956b4ec354f40dc68336a23d42b31 sid c89d su
5a3ccd1471caa0de221ad6c185c0
LB configuration: cr_bits 0x0 length_self_encoding: y sid_len 3 key
5c49cb9265efe8ae7b1d3886948b0a34
cid 10efcffc161d232d113998a49b1dbc4aa0 sid 0690b3 su
958fc9f38fe61b83881b2c5780 cid 10fc13bdbcb414ba90e391833400c19505 sid
031ac3 su 9a55e1e1904e780346fcc32c3c cid
10d3cc1efaf5dc52c7a0f6da2746a8c714 sid 572d3a su
ff2ec9712664e7174dc03ca3f8 cid 107edf37f6788e33c0ec7758a485215f2b sid
562c25 su 02c5a5dcbea629c3840da5f567 cid
10bc28da122582b7312e65aa096e9724fc sid 2fa4f0 su
8ae8c666bfc0fc364ebfd06b9a
LB configuration: cr_bits 0x0 length_self_encoding: n sid_len 4 key
e787a3a491551fb2b4901a3fa15974f3
cid 26125351da12435615e3be6b16fad35560 sid 0cb227d3 su
65b40b1ab54e05bff55db046 cid 14de05fc84e41b611dfbe99ed5b1c9d563 sid
6a0f23ad su d73bee2f3a7e72b3ffea52d9 cid
1306052c3f973db87de6d7904914840ff1 sid ca21402d su
5829465f7418b56ee6ada431 cid 1d202b5811af3e1dba9ea2950d27879a92 sid
b14e1307 su 4902aba8b23a5f24616df3cf cid
26538b78efc2d418539ad1de13ab73e477 sid a75e0148 su
0040323f1854e75aeb449b9f
LB configuration: cr_bits 0x0 length_self_encoding: y sid_len 5 key
d5a6d7824336fbe0f25d28487cdda57c
cid 10a2794871aadb20ddf274a95249e57fde sid 82d3b0b1a1 su
0935471478c2edb8120e60 cid 108122fe80a6e546a285c475a3b8613ec9 sid
fbcc902c9d su 59c47946882a9a93981c15 cid
104d227ad9dd0fef4c8cb6eb75887b6ccc sid 2808e22642 su
2a7ef40e2c7e17ae40b3fb cid 10b3f367d8627b36990a28d67f50b97846 sid
5e018f0197 su 2289cae06a566e5cb6cfa4 cid
1024412bfe25f4547510204bdda6143814 sid 8a8dd3d036 su
4b12933a135e5eaaebc6fd
Appendix B. Acknowledgments Appendix B. Acknowledgments
Appendix C. Change Log Appendix C. Change Log
*RFC Editor's Note:* Please remove this section prior to *RFC Editor's Note:* Please remove this section prior to
publication of a final version of this document. publication of a final version of this document.
C.1. since-draft-ietf-quic-load-balancers-03 C.1. since draft-ietf-quic-load-balancers-04
* Rearranged the shared-state retry token to simplify token
processing
* More compact timestamp in shared-state retry token
* Revised server requirements for shared-state retries
* Eliminated zero padding from the test vectors
* Added server use bytes to the test vectors
* Additional compliant DCID criteria
C.2. since-draft-ietf-quic-load-balancers-03
* Improved Config Rotation text * Improved Config Rotation text
* Added stream cipher test vectors * Added stream cipher test vectors
* Deleted the Obfuscated CID algorithm * Deleted the Obfuscated CID algorithm
C.2. since-draft-ietf-quic-load-balancers-02 C.3. since-draft-ietf-quic-load-balancers-02
* Replaced stream cipher algorithm with three-pass version * Replaced stream cipher algorithm with three-pass version
* Updated Retry format to encode info for required TPs * Updated Retry format to encode info for required TPs
* Added discussion of version invariance * Added discussion of version invariance
* Cleaned up text about config rotation * Cleaned up text about config rotation
* Added Reset Oracle and limited configuration considerations * Added Reset Oracle and limited configuration considerations
* Allow dropped long-header packets for known QUIC versions * Allow dropped long-header packets for known QUIC versions
C.3. since-draft-ietf-quic-load-balancers-01 C.4. since-draft-ietf-quic-load-balancers-01
* Test vectors for load balancer decoding * Test vectors for load balancer decoding
* Deleted remnants of in-band protocol * Deleted remnants of in-band protocol
* Light edit of Retry Services section * Light edit of Retry Services section
* Discussed load balancer chains * Discussed load balancer chains
C.4. since-draft-ietf-quic-load-balancers-00 C.5. since-draft-ietf-quic-load-balancers-00
* Removed in-band protocol from the document * Removed in-band protocol from the document
C.5. Since draft-duke-quic-load-balancers-06 C.6. Since draft-duke-quic-load-balancers-06
* Switch to IETF WG draft. * Switch to IETF WG draft.
C.6. Since draft-duke-quic-load-balancers-05 C.7. Since draft-duke-quic-load-balancers-05
* Editorial changes * Editorial changes
* Made load balancer behavior independent of QUIC version * Made load balancer behavior independent of QUIC version
* Got rid of token in stream cipher encoding, because server might * Got rid of token in stream cipher encoding, because server might
not have it not have it
* Defined "non-compliant DCID" and specified rules for handling * Defined "non-compliant DCID" and specified rules for handling
them. them.
* Added psuedocode for config schema * Added psuedocode for config schema
C.7. Since draft-duke-quic-load-balancers-04 C.8. Since draft-duke-quic-load-balancers-04
* Added standard for retry services * Added standard for retry services
C.8. Since draft-duke-quic-load-balancers-03 C.9. Since draft-duke-quic-load-balancers-03
* Renamed Plaintext CID algorithm as Obfuscated CID * Renamed Plaintext CID algorithm as Obfuscated CID
* Added new Plaintext CID algorithm * Added new Plaintext CID algorithm
* Updated to allow 20B CIDs * Updated to allow 20B CIDs
* Added self-encoding of CID length * Added self-encoding of CID length
C.9. Since draft-duke-quic-load-balancers-02 C.10. Since draft-duke-quic-load-balancers-02
* Added Config Rotation * Added Config Rotation
* Added failover mode * Added failover mode
* Tweaks to existing CID algorithms * Tweaks to existing CID algorithms
* Added Block Cipher CID algorithm * Added Block Cipher CID algorithm
* Reformatted QUIC-LB packets * Reformatted QUIC-LB packets
C.10. Since draft-duke-quic-load-balancers-01 C.11. Since draft-duke-quic-load-balancers-01
* Complete rewrite * Complete rewrite
* Supports multiple security levels * Supports multiple security levels
* Lightweight messages * Lightweight messages
C.11. Since draft-duke-quic-load-balancers-00 C.12. Since draft-duke-quic-load-balancers-00
* Converted to markdown * Converted to markdown
* Added variable length connection IDs * Added variable length connection IDs
Authors' Addresses Authors' Addresses
Martin Duke Martin Duke
F5 Networks, Inc. F5 Networks, Inc.
 End of changes. 84 change blocks. 
222 lines changed or deleted 325 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/