6. バージョンネゴシエーション (Version Negotiation)
ロングヘッダーを持つパケットを受信し、そのバージョンが理解できない、またはサポートしていないQUICエンドポイントは、レスポンスとしてバージョンネゴシエーションパケット (Version Negotiation Packet) を送信する場合があります。ショートヘッダーを持つパケットはバージョンネゴシエーションをトリガーしません。
バージョンネゴシエーションパケットは最初のバイトの高位ビットを設定するため、セクション5.1で定義されたロングヘッダーを持つパケットのフォーマットに準拠します。バージョンネゴシエーションパケットは、0x00000000に設定されたバージョンフィールドによって識別できます。
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) ...,
}
図4: バージョンネゴシエーションパケット
バージョンネゴシエーションパケットの最初のバイトでは、最上位ビットのみが定義された値を持ちます。"Unused" (未使用) とラベル付けされた残りの7ビットは、送信時に任意の値に設定でき、受信時には無視しなければなりません (MUST)。
送信元接続IDフィールドの後、バージョンネゴシエーションパケットにはサポートされるバージョンフィールド (Supported Version Fields) のリストが含まれ、各フィールドはパケットを送信するエンドポイントがサポートするバージョンを識別します。バージョンネゴシエーションパケットには他のフィールドは含まれません。エンドポイントは、サポートされるバージョンフィールドを含まない、または切り捨てられたサポートされるバージョン値を含むパケットを無視しなければなりません (MUST)。
バージョンネゴシエーションパケットは完全性保護や機密性保護を使用しません。特定のQUICバージョンには、エンドポイントがサポートされるバージョンセットの変更や破損を検出できるプロトコル要素が含まれる場合があります。
エンドポイントは、受信したパケットの送信元接続IDフィールドの値を宛先接続IDフィールドに含めなければなりません (MUST)。送信元接続IDフィールドの値は、受信したパケットの宛先接続IDフィールドからコピーしなければなりません (MUST)。これは最初にクライアントによってランダムに選択されます。両方の接続IDをエコーバックすることで、クライアントにサーバーがパケットを受信したこと、およびバージョンネゴシエーションパケットがパケットを観測できない攻撃者によって生成されたものではないことについて、ある程度の保証を提供します。
バージョンネゴシエーションパケットを受信したエンドポイントは、後続のパケットに使用することを決定したバージョンを変更する場合があります。エンドポイントがQUICバージョンを変更する条件は、選択するQUICバージョンに依存します。
QUICバージョン1をサポートするエンドポイントがバージョンネゴシエーションパケットをどのように生成および使用するかについての詳細な説明は、[QUIC-TRANSPORT] を参照してください。