1. Overview (概要)
QUICは安全な汎用トランスポートプロトコルです。本文書はQUICバージョン1を定義しており、[QUIC-INVARIANTS]で定義されているQUICのバージョン非依存プロパティ (Version-Independent Properties) に準拠しています。
QUICは接続指向プロトコル (Connection-Oriented Protocol) であり、クライアントとサーバー間でステートフルな対話を作成します。
QUICハンドシェイクは、暗号化パラメータとトランスポートパラメータのネゴシエーションを組み合わせています。QUICはTLSハンドシェイク[TLS13]を統合していますが、パケットを保護するためにカスタマイズされたフレーミングを使用しています。TLSとQUICの統合については、[QUIC-TLS]でより詳細に説明されています。ハンドシェイクの構造は、できるだけ早くアプリケーションデータを交換できるように設計されています。これには、クライアントが即座にデータを送信する(0-RTT)オプションが含まれており、これを有効にするには何らかの形の事前通信または設定が必要です。
エンドポイントはQUICにおいて、QUICパケット (QUIC Packets) を交換することで通信します。ほとんどのパケットにはフレーム (Frames) が含まれており、フレームはエンドポイント間で制御情報とアプリケーションデータを伝送します。QUICは各パケットの全内容を認証し、各パケットの可能な限り多くの部分を暗号化します。QUICパケットはUDPデータグラム[UDP]で運ばれ、既存のシステムとネットワークへの展開を容易にします。
アプリケーションプロトコルは、ストリーム (Streams) を介してQUIC接続上で情報を交換します。ストリームは順序付けられたバイトシーケンス (Ordered Sequences of Bytes) です。2種類のストリームを作成できます:双方向ストリーム (Bidirectional Streams) は両方のエンドポイントがデータを送信でき、単方向ストリーム (Unidirectional Streams) は単一のエンドポイントのみがデータを送信できます。クレジットベーススキーム (Credit-Based Scheme) を使用して、ストリームの作成と送信可能なデータ量を制限します。
QUICは信頼性のある配信 (Reliable Delivery) と輻輳制御 (Congestion Control) を実装するために必要なフィードバックを提供します。[QUIC-RECOVERY]の第6節では、データ損失を検出して回復するアルゴリズムが説明されています。QUICはネットワーク輻輳を回避するために輻輳制御に依存しています。[QUIC-RECOVERY]の第7節では、例示的な輻輳制御アルゴリズムが説明されています。
QUIC接続は単一のネットワークパスに厳密にバインドされていません。接続マイグレーション (Connection Migration) は接続識別子 (Connection Identifiers) を使用して、接続を新しいネットワークパスに転送できるようにします。このバージョンのQUICでは、クライアントのみがマイグレーションできます。この設計により、NAT再バインド (NAT Rebinding) によって引き起こされる可能性のあるネットワークトポロジやアドレスマッピングの変更後も接続を継続できます。
一度確立されると、接続終了には複数のオプションが提供されます。アプリケーションは正常なシャットダウン (Graceful Shutdown) を管理でき、エンドポイントはタイムアウト期間をネゴシエートでき、エラーは即座の接続切断を引き起こし、ステートレスメカニズムは一方のエンドポイントが状態を失った後に接続を終了する方法を提供します。
1.1. Document Structure (文書構造)
本文書はコアQUICプロトコルを説明しており、以下のように構成されています:
ストリーム (Streams) - QUICが提供する基本サービス抽象
- 第2節: ストリームに関連するコア概念を説明
- 第3節: ストリーム状態の参照モデルを提供
- 第4節: フロー制御の動作を概説
接続 (Connections) - QUICエンドポイントが通信するコンテキスト
- 第5節: 接続に関連するコア概念を説明
- 第6節: バージョンネゴシエーション (Version Negotiation) を説明
- 第7節: 接続確立のプロセスを詳述
- 第8節: アドレス検証と重要なDoS攻撃緩和策を説明
- 第9節: エンドポイントが接続を新しいネットワークパスに移行する方法を説明
- 第10節: オープン接続を終了するオプションをリスト
- 第11節: ストリームおよび接続エラー処理のガイダンスを提供
パケットとフレーム (Packets and Frames) - QUICが通信に使用する基本単位
- 第12節: パケットとフレームに関連する概念を説明
- 第13節: データの送信、再送信、確認応答のモデルを定義
- 第14節: QUICパケットを運ぶデータグラムのサイズを管理するルールを指定
エンコーディング詳細 (Encoding Details) - QUICプロトコル要素のエンコーディング詳細
- 第15節: バージョン (Versions)
- 第16節: 整数エンコーディング (Integer Encoding)
- 第17節: パケットヘッダー (Packet Headers)
- 第18節: トランスポートパラメータ (Transport Parameters)
- 第19節: フレーム (Frames)
- 第20節: エラー (Errors)
付属文書
付属文書では、QUICのロス検出と輻輳制御[QUIC-RECOVERY]、およびTLSとその他の暗号化メカニズムの使用[QUIC-TLS]について説明しています。
本文書はQUICバージョン1を定義しており、[QUIC-INVARIANTS]のプロトコル不変条件に準拠しています。
引用に関する注意:
- QUICバージョン1を引用する場合は、本文書を引用してください
- QUICの限定されたバージョン非依存プロパティセットを引用する場合は、[QUIC-INVARIANTS]を引用できます
1.2. Terms and Definitions (用語と定義)
本文書のキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「NOT RECOMMENDED」、「MAY」、および「OPTIONAL」は、BCP 14 [RFC2119] [RFC8174]に記載されているとおりに解釈されるものとします。ただし、ここに示すようにすべて大文字で表示される場合に限ります。
本文書で一般的に使用される用語は以下のとおりです:
コア用語
QUIC
本文書で説明されているトランスポートプロトコル。QUICは名前であり、頭字語ではありません。
Endpoint (エンドポイント)
QUICパケットを生成、受信、処理することでQUIC接続に参加できるエンティティ。QUICには2種類のエンドポイントのみがあります:クライアント (Client) とサーバー (Server)。
Client (クライアント)
QUIC接続を開始するエンドポイント。
Server (サーバー)
QUIC接続を受け入れるエンドポイント。
QUIC Packet (QUICパケット)
UDPデータグラムにカプセル化できる完全な処理可能なQUIC単位。1つ以上のQUICパケットを単一のUDPデータグラムにカプセル化できます。
Ack-eliciting Packet (確認応答を引き出すパケット)
ACK、PADDING、CONNECTION_CLOSE以外のフレームを含むQUICパケット。これらのパケットは受信者に確認応答の送信を引き起こします。第13.2.1節を参照してください。
Frame (フレーム)
構造化されたプロトコル情報の単位。複数のフレームタイプがあり、それぞれ異なる情報を運びます。フレームはQUICパケットに含まれます。
Address (アドレス)
修飾なしで使用される場合、ネットワークパスの一端を表すIPバージョン、IPアドレス、およびUDPポート番号のタプル。
Connection ID (接続識別子)
エンドポイントでQUIC接続を識別するために使用される識別子。各エンドポイントは、ピアがエンドポイントに送信するパケットに含める1つ以上の接続IDを選択します。この値はピアに対して不透明です。
Stream (ストリーム)
QUIC接続内の単方向または双方向の順序付けられたバイトチャネル。QUIC接続は複数の同時ストリームを運ぶことができます。
Application (アプリケーション)
QUICを使用してデータを送受信するエンティティ。
プロトコル階層用語
本文書では、「QUICパケット」、「UDPデータグラム」、および「IPパケット」という用語を使用して、それぞれのプロトコルの単位を指します。つまり、1つ以上のQUICパケットをUDPデータグラムにカプセル化でき、UDPデータグラムはIPパケットにカプセル化されます。
+------------------+
| IP Packet |
| +--------------+|
| | UDP Datagram ||
| | +----------+ ||
| | |QUIC Pkt 1| ||
| | +----------+ ||
| | +----------+ ||
| | |QUIC Pkt 2| ||
| | +----------+ ||
| +--------------+|
+------------------+
1.3. Notational Conventions (表記規則)
本文書のパケットおよびフレーム図はカスタム形式を使用しています。この形式の目的は、プロトコル要素を定義するのではなく要約することです。散文がstructuresの完全なセマンティクスと詳細を定義します。
フィールド表現ルール
複雑なフィールドは最初に名前が付けられ、その後に一対の一致する中括弧で囲まれたフィールドのリストが続きます。このリスト内の各フィールドはカンマで区切られます。
個々のフィールドには長度情報と、固定値、オプション性、または繰り返しに関する指示が含まれます。個々のフィールドは以下の表記規則を使用し、すべての長さはビット (Bits) 単位です:
x (A)
xがAビット長であることを示します
x (i)
xが第16節で説明されている可変長エンコーディングを使用した整数値を保持することを示します
x (A..B)
xがAからBまでの任意の長さであることを示します。Aを省略すると最小ゼロビットを示し、Bを省略すると上限が設定されていないことを示します。この形式の値は常にバイト境界で終了します
x (L) = C
xが固定値Cを持つことを示します。xの長さはLで記述され、Lは上記の任意の長さ形式を使用できます
x (L) = C..D
xがCからDの範囲(CとDを含む)の値を持つことを示し、長さは上記のようにLで記述されます
[x (L)]
xがオプションであり、長さがLであることを示します
x (L) ...
xがゼロ回以上繰り返され、各インスタンスの長さがLであることを示します
バイトオーダーとビット順序
本文書はネットワークバイトオーダー (Network Byte Order、つまりビッグエンディアン Big Endian) の値を使用します。フィールドは各バイトの上位ビットから配置されます。
慣例により、個々のフィールドは複雑なフィールドの名前を使用して複雑なフィールドを参照します。
例示構造
図1に例を示します:
Example Structure {
One-bit Field (1),
7-bit Field with Fixed Value (7) = 61,
Field with Variable-Length Integer (i),
Arbitrary-Length Field (..),
Variable-Length Field (8..24),
Field With Minimum Length (16..),
Field With Maximum Length (..128),
[Optional Field (64)],
Repeated Field (8) ...,
}
図1: 例示形式
散文で単一ビットフィールドを参照する場合、フィールドを運ぶバイトの値(フィールド値が設定された状態)を使用してそのフィールドの位置を明確にできます。たとえば、値0x80は、図1のOne-bit Fieldなど、バイトの最上位ビットの単一ビットフィールドを参照するために使用できます。
次の章: 2. Streams (ストリーム) - QUICのストリーム抽象を詳しく学ぶ