12. パケットとフレーム
12. パケットとフレーム
QUICエンドポイントは、パケットを交換することで通信します。パケットは機密性と完全性の保護を持ち (セクション 12.1 を参照)、UDPデータグラムで運ばれます (セクション 14 を参照)。
このバージョンのQUICは、接続確立中にロングパケットヘッダー (セクション 17.2) を使用します。ロングヘッダーを持つパケットは、Initial (セクション 17.2.2)、0-RTT (セクション 17.2.3)、Handshake (セクション 17.2.4)、Retry (セクション 17.2.5) です。バージョンネゴシエーションは、ロングヘッダーを持つバージョン非依存のパケットを使用します (セクション 17.2.1)。
ショートヘッダーを持つパケット (セクション 17.3) は、最小限のオーバーヘッドを目的として設計されており、接続が確立され1-RTTキーが利用可能になった後に使用されます。
12.1 保護されたパケット
QUICパケットは、パケットのタイプに基づいて異なるレベルの暗号化保護を持ちます。セクション 17 は、パケットタイプとその保護レベルの概要を提供します。
12.2 パケットの結合
Initial (セクション 17.2.2)、0-RTT (セクション 17.2.3)、Handshake (セクション 17.2.4) パケットには、パケットの終わりを決定するLengthフィールドが含まれています。長さには、Packet NumberフィールドとPayloadフィールドの両方が含まれ、どちらも機密で最初は不明です。Payloadフィールドの長さは、パケット保護が削除されると判明します。
Lengthフィールドを使用して、送信者は複数のQUICパケットを1つのUDPデータグラムに結合できます。これにより、暗号化ハンドシェイクを完了してデータの送信を開始するために必要なUDPデータグラムの数を減らすことができます。受信者は結合されたパケットを処理できなければなりません (MUST)。
12.3 パケット番号
パケット番号は、0から2^62-1の範囲の整数です。パケット番号は、QUICで3つの空間に分割されます:
- Initialスペース: すべてのInitialパケット (セクション 17.2.2) がこのスペースにあります。
- Handshakeスペース: すべてのHandshakeパケット (セクション 17.2.4) がこのスペースにあります。
- アプリケーションデータスペース: すべての0-RTT (セクション 17.2.3) および1-RTT (セクション 17.3.1) パケットがこのスペースにあります。
各スペースのパケット番号は、パケット番号0から始まります。同じパケット番号スペースで送信される後続のパケットは、パケット番号を少なくとも1つ増やさなければなりません (MUST)。
12.4 フレームとフレームタイプ
QUICパケットのペイロードは、パケット保護を削除した後、図13に示すように、完全なフレームのシーケンスで構成されます。バージョンネゴシエーション、ステートレスリセット、Retryパケットにはフレームが含まれません。
Packet Payload {
Frame (8..),
...
}
図13: QUICペイロード
フレームを含むパケットのペイロードは、少なくとも1つのフレームを含まなければならず (MUST)、複数のフレームと複数のフレームタイプを含むことができます (MAY)。エンドポイントは、フレームを含まないパケットの受信を、PROTOCOL_VIOLATIONタイプの接続エラーとして扱わなければなりません (MUST)。フレームは常に単一のQUICパケット内に収まり、複数のパケットにまたがることはできません。
各フレームは、そのタイプを示すフレームタイプで始まり、その後に追加のタイプ依存フィールドが続きます:
Frame {
Frame Type (i),
Type-Dependent Fields (..),
}
図14: 汎用フレームレイアウト
12.5 フレームと番号スペース
一部のフレームは、異なるパケット番号スペースで禁止されています。どのフレームがどのパケットタイプに現れる可能性があるかの規則は、セクション 17 で説明され、表3にまとめられています。
| フレームタイプ | Initial | 0-RTT | Handshake | 1-RTT |
|---|---|---|---|---|
| PADDING | Y | Y | Y | Y |
| PING | Y | Y | Y | Y |
| ACK | Y | - | Y | Y |
| RESET_STREAM | - | Y | - | Y |
| STOP_SENDING | - | Y | - | Y |
| CRYPTO | Y | - | Y | Y |
| NEW_TOKEN | - | - | - | Y |
| STREAM | - | Y | - | Y |
| MAX_DATA | - | Y | - | Y |
| MAX_STREAM_DATA | - | Y | - | Y |
| MAX_STREAMS | - | Y | - | Y |
| DATA_BLOCKED | - | Y | - | Y |
| STREAM_DATA_BLOCKED | - | Y | - | Y |
| STREAMS_BLOCKED | - | Y | - | Y |
| NEW_CONNECTION_ID | - | Y | - | Y |
| RETIRE_CONNECTION_ID | - | - | - | Y |
| PATH_CHALLENGE | - | Y | - | Y |
| PATH_RESPONSE | - | - | - | Y |
| CONNECTION_CLOSE | Y | Y | Y | Y |
| HANDSHAKE_DONE | - | - | - | Y |
表3: フレームとパケット番号スペース