QUIC version 2 is not intended to deprecate version 1. Endpoints that support version 2 might continue support for version 1 to maximize compatibility with other endpoints. In particular, HTTP clients often use Alt-Svc [
RFC 7838] to discover QUIC support. As this mechanism does not currently distinguish between QUIC versions, HTTP servers
SHOULD support multiple versions to reduce the probability of incompatibility and the cost associated with QUIC version negotiation or TCP fallback. For example, an origin advertising support for "h3" in Alt-Svc should support QUIC version 1, as it was the original QUIC version used by HTTP/3; therefore, some clients will only support that version.
Any QUIC endpoint that supports QUIC version 2
MUST send, process, and validate the version_information transport parameter specified in [
QUIC-VN] to prevent version downgrade attacks.
Note that version 2 meets the definition in [
QUIC-VN] of a compatible version with version 1, and version 1 is compatible with version 2. Therefore, servers can use compatible negotiation to switch a connection between the two versions. Endpoints that support both versions
SHOULD support compatible version negotiation to avoid a round trip.
Compatible version negotiation between versions 1 and 2 follows the same requirements in either direction. This section uses the terms "original version" and "negotiated version" from [
QUIC-VN].
If the server sends a Retry packet, it
MUST use the original version. The client ignores Retry packets using other versions. The client
MUST NOT use a different version in the subsequent Initial packet that contains the Retry token. The server
MAY encode the QUIC version in its Retry token to validate that the client did not switch versions, and drop the packet if it switched, to enforce client compliance.
QUIC version 2 uses the same transport parameters to authenticate the Retry as QUIC version 1. After switching to a negotiated version after a Retry, the server
MUST include the relevant transport parameters to validate that the server sent the Retry and the connection IDs used in the exchange, as described in
Section 7.3 of [
QUIC].
The server cannot send CRYPTO frames until it has processed the client's transport parameters. The server
MUST send all CRYPTO frames using the negotiated version.
The client learns the negotiated version by observing the first long header Version field that differs from the original version. If the client receives a CRYPTO frame from the server in the original version, it indicates that the negotiated version is equal to the original version.
Before the server is able to process transport parameters from the client, it might need to respond to Initial packets from the client. For these packets, the server uses the original version.
Once the client has learned the negotiated version, it
SHOULD send subsequent Initial packets using that version. The server
MUST NOT discard its original version Initial receive keys until it successfully processes a Handshake packet with the negotiated version.
Both endpoints
MUST send Handshake and 1-RTT packets using the negotiated version. An endpoint
MUST drop packets using any other version. Endpoints have no need to generate the keying material that would allow them to decrypt or authenticate such packets.
The client
MUST NOT send 0-RTT packets using the negotiated version, even after processing a packet of that version from the server. Servers can accept 0-RTT and then process 0-RTT packets from the original version.