target = "https://www.rfc-editor.org/rfc/rfc9000#section-17.2.1" # 17.2.1. Version Negotiation Packet # # A Version Negotiation packet is inherently not version specific. # Upon receipt by a client, it will be identified as a Version # Negotiation packet based on the Version field having a value of 0. # # The Version Negotiation packet is a response to a client packet that # contains a version that is not supported by the server. It is only # sent by servers. # # The layout of a Version Negotiation packet is: # # Version Negotiation Packet { # Header Form (1) = 1, # Unused (7), # Version (32) = 0, # Destination Connection ID Length (8), # Destination Connection ID (0..2040), # Source Connection ID Length (8), # Source Connection ID (0..2040), # Supported Version (32) ..., # } # # Figure 14: Version Negotiation Packet # # The value in the Unused field is set to an arbitrary value by the # server. Clients MUST ignore the value of this field. Where QUIC # might be multiplexed with other protocols (see [RFC7983]), servers # SHOULD set the most significant bit of this field (0x40) to 1 so that # Version Negotiation packets appear to have the Fixed Bit field. Note # that other versions of QUIC might not make a similar recommendation. # # The Version field of a Version Negotiation packet MUST be set to # 0x00000000. # # The server MUST include the value from the Source Connection ID field # of the packet it receives in the Destination Connection ID field. # The value for Source Connection ID MUST be copied from the # Destination Connection ID of the received packet, which is initially # randomly selected by a client. Echoing both connection IDs gives # clients some assurance that the server received the packet and that # the Version Negotiation packet was not generated by an entity that # did not observe the Initial packet. # # Future versions of QUIC could have different requirements for the # lengths of connection IDs. In particular, connection IDs might have # a smaller minimum length or a greater maximum length. Version- # specific rules for the connection ID therefore MUST NOT influence a # decision about whether to send a Version Negotiation packet. # # The remainder of the Version Negotiation packet is a list of 32-bit # versions that the server supports. # # A Version Negotiation packet is not acknowledged. It is only sent in # response to a packet that indicates an unsupported version; see # Section 5.2.2. # # The Version Negotiation packet does not include the Packet Number and # Length fields present in other packets that use the long header form. # Consequently, a Version Negotiation packet consumes an entire UDP # datagram. # # A server MUST NOT send more than one Version Negotiation packet in # response to a single UDP datagram. # # See Section 6 for a description of the version negotiation process. [[spec]] level = "MUST" quote = ''' Clients MUST ignore the value of this field. ''' [[spec]] level = "SHOULD" quote = ''' Where QUIC might be multiplexed with other protocols (see [RFC7983]), servers SHOULD set the most significant bit of this field (0x40) to 1 so that Version Negotiation packets appear to have the Fixed Bit field. ''' [[spec]] level = "MUST" quote = ''' The Version field of a Version Negotiation packet MUST be set to 0x00000000. ''' [[spec]] level = "MUST" quote = ''' The server MUST include the value from the Source Connection ID field of the packet it receives in the Destination Connection ID field. ''' [[spec]] level = "MUST" quote = ''' The value for Source Connection ID MUST be copied from the Destination Connection ID of the received packet, which is initially randomly selected by a client. ''' [[spec]] level = "MUST" quote = ''' Version- specific rules for the connection ID therefore MUST NOT influence a decision about whether to send a Version Negotiation packet. ''' [[spec]] level = "MUST" quote = ''' A server MUST NOT send more than one Version Negotiation packet in response to a single UDP datagram. '''