Greasing the QUIC Bit
Extracted elements (15)
Extensions that define semantics for the QUIC Bit can be negotiated without using the grease_quic_bit transport parameter, but including both extensions allows the QUIC Bit to be greased even when the alternative use is not supported by the peer.
The 7-day limit on using a prior server NEW_TOKEN to pre-clear the QUIC Bit accommodates server configuration changes. If the server's configuration changes and removes grease_quic_bit support, a client that still clears the bit could cause the server to drop packets and trigger connection failures.
The QUIC Bit (second-most significant bit of the first byte, value 0x40) has a fixed value in QUIC version 1 to allow endpoints to efficiently distinguish QUIC from other protocols. If systems come to depend on this fixed value, it could become infeasible to define a future QUIC version that attributes semantics to the bit, motivating the greasing mechanism.
Endpoints can set the QUIC Bit to 0 on all packets sent after receiving and processing transport parameters, including Initial, Handshake, and Retry packets. This applies once negotiation is confirmed through transport parameter exchange.
When an extension uses the QUIC Bit alongside grease_quic_bit, recipients must distinguish a randomized value from one carrying extension-defined semantics. The extension should require endpoints to set the bit per its rules but defer acting on the information until the extension's own transport parameter is received.
A client MAY set the QUIC Bit to 0 in Initial, Handshake, or 0-RTT packets sent prior to receiving server transport parameters, but MUST NOT do so unless the Initial packets include a NEW_TOKEN frame token received from the server less than 604800 seconds (7 days) prior on a connection where the server also included grease_quic_bit.
A server MUST set the QUIC Bit to 0 only after processing transport parameters from a client, and MUST NOT remember that a client negotiated the extension in a previous connection and set the QUIC Bit to 0 based on that cached information.
An endpoint MUST NOT set the QUIC Bit to 0 without knowing whether the peer supports the extension. Stateless Reset packets are unlikely to be able to use the cleared QUIC Bit since they are only used after loss of connection state.
An endpoint that advertises the grease_quic_bit transport parameter MUST accept packets with the QUIC Bit set to a value of 0.
Endpoints that receive the grease_quic_bit transport parameter from a peer SHOULD set the QUIC Bit to an unpredictable value unless another extension assigns specific meaning to the value of the bit.
Extensions to QUIC that define semantics for the QUIC Bit MUST negotiate their use prior to acting on any semantic, to avoid acting on a randomized (greased) value.
Receipt of a non-empty value of the grease_quic_bit transport parameter MUST be treated as a connection error of type TRANSPORT_PARAMETER_ERROR.
The grease_quic_bit transport parameter (codepoint 0x2ab2) is defined for QUIC version 1 and can be sent by both client and server. It is sent with an empty value; receipt of a non-empty value MUST be treated as a TRANSPORT_PARAMETER_ERROR connection error.
The grease_quic_bit transport parameter is registered in the IANA 'QUIC Transport Parameters' registry with value 0x2ab2, status Permanent, per RFC 9287.
Greasing the QUIC Bit introduces no new security considerations for endpoints or cooperating entities, but makes identifying QUIC traffic more difficult without endpoint cooperation. This works counter to the security goals of network operators who rely on traffic classification to identify threats.