draft-ietf-quic-qpack-12.txt   draft-ietf-quic-qpack-13.txt 
QUIC C. Krasic QUIC C. Krasic
Internet-Draft Netflix Internet-Draft Netflix
Intended status: Standards Track M. Bishop Intended status: Standards Track M. Bishop
Expires: 25 July 2020 Akamai Technologies Expires: 24 August 2020 Akamai Technologies
A. Frindell, Ed. A. Frindell, Ed.
Facebook Facebook
22 January 2020 21 February 2020
QPACK: Header Compression for HTTP/3 QPACK: Header Compression for HTTP/3
draft-ietf-quic-qpack-12 draft-ietf-quic-qpack-13
Abstract Abstract
This specification defines QPACK, a compression format for This specification defines QPACK, a compression format for
efficiently representing HTTP header fields, to be used in HTTP/3. efficiently representing HTTP header fields, to be used in HTTP/3.
This is a variation of HPACK header compression that seeks to reduce This is a variation of HPACK header compression that seeks to reduce
head-of-line blocking. head-of-line blocking.
Note to Readers Note to Readers
skipping to change at page 1, line 48 skipping to change at page 1, line 48
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 25 July 2020. This Internet-Draft will expire on 24 August 2020.
Copyright Notice Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the Copyright (c) 2020 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components and restrictions with respect to this document. Code Components
extracted from this document must include Simplified BSD License text extracted from this document must include Simplified BSD License text
as described in Section 4.e of the Trust Legal Provisions and are as described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Simplified BSD License. provided without warranty as described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1. Conventions and Definitions . . . . . . . . . . . . . . . 4 1.1. Conventions and Definitions . . . . . . . . . . . . . . . 4
1.2. Notational Conventions . . . . . . . . . . . . . . . . . 4 1.2. Notational Conventions . . . . . . . . . . . . . . . . . 5
2. Compression Process Overview . . . . . . . . . . . . . . . . 5 2. Compression Process Overview . . . . . . . . . . . . . . . . 5
2.1. Encoder . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1. Encoder . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1. Reference Tracking . . . . . . . . . . . . . . . . . 6 2.1.1. Reference Tracking . . . . . . . . . . . . . . . . . 6
2.1.2. Limits on Dynamic Table Insertions . . . . . . . . . 6 2.1.2. Limits on Dynamic Table Insertions . . . . . . . . . 6
2.1.3. Blocked Streams . . . . . . . . . . . . . . . . . . . 7 2.1.3. Blocked Streams . . . . . . . . . . . . . . . . . . . 7
2.1.4. Known Received Count . . . . . . . . . . . . . . . . 8 2.1.4. Avoiding Flow Control Deadlocks . . . . . . . . . . . 8
2.2. Decoder . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.5. Known Received Count . . . . . . . . . . . . . . . . 8
2.2.1. Blocked Decoding . . . . . . . . . . . . . . . . . . 8 2.2. Decoder . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1. Blocked Decoding . . . . . . . . . . . . . . . . . . 9
2.2.2. State Synchronization . . . . . . . . . . . . . . . . 9 2.2.2. State Synchronization . . . . . . . . . . . . . . . . 9
2.2.3. Invalid References . . . . . . . . . . . . . . . . . 10 2.2.3. Invalid References . . . . . . . . . . . . . . . . . 10
3. Header Tables . . . . . . . . . . . . . . . . . . . . . . . . 10 3. Header Tables . . . . . . . . . . . . . . . . . . . . . . . . 11
3.1. Static Table . . . . . . . . . . . . . . . . . . . . . . 10 3.1. Static Table . . . . . . . . . . . . . . . . . . . . . . 11
3.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 11 3.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 11
3.2.1. Dynamic Table Size . . . . . . . . . . . . . . . . . 11 3.2.1. Dynamic Table Size . . . . . . . . . . . . . . . . . 11
3.2.2. Dynamic Table Capacity and Eviction . . . . . . . . . 11 3.2.2. Dynamic Table Capacity and Eviction . . . . . . . . . 12
3.2.3. Maximum Dynamic Table Capacity . . . . . . . . . . . 12 3.2.3. Maximum Dynamic Table Capacity . . . . . . . . . . . 12
3.2.4. Absolute Indexing . . . . . . . . . . . . . . . . . . 12 3.2.4. Absolute Indexing . . . . . . . . . . . . . . . . . . 13
3.2.5. Relative Indexing . . . . . . . . . . . . . . . . . . 12 3.2.5. Relative Indexing . . . . . . . . . . . . . . . . . . 13
3.2.6. Post-Base Indexing . . . . . . . . . . . . . . . . . 14 3.2.6. Post-Base Indexing . . . . . . . . . . . . . . . . . 14
4. Wire Format . . . . . . . . . . . . . . . . . . . . . . . . . 14 4. Wire Format . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.1. Primitives . . . . . . . . . . . . . . . . . . . . . . . 14 4.1. Primitives . . . . . . . . . . . . . . . . . . . . . . . 15
4.1.1. Prefixed Integers . . . . . . . . . . . . . . . . . . 14 4.1.1. Prefixed Integers . . . . . . . . . . . . . . . . . . 15
4.1.2. String Literals . . . . . . . . . . . . . . . . . . . 14 4.1.2. String Literals . . . . . . . . . . . . . . . . . . . 15
4.2. Encoder and Decoder Streams . . . . . . . . . . . . . . . 15 4.2. Encoder and Decoder Streams . . . . . . . . . . . . . . . 15
4.3. Encoder Instructions . . . . . . . . . . . . . . . . . . 16 4.3. Encoder Instructions . . . . . . . . . . . . . . . . . . 16
4.3.1. Set Dynamic Table Capacity . . . . . . . . . . . . . 16 4.3.1. Set Dynamic Table Capacity . . . . . . . . . . . . . 16
4.3.2. Insert With Name Reference . . . . . . . . . . . . . 16 4.3.2. Insert With Name Reference . . . . . . . . . . . . . 17
4.3.3. Insert Without Name Reference . . . . . . . . . . . . 17 4.3.3. Insert Without Name Reference . . . . . . . . . . . . 17
4.3.4. Duplicate . . . . . . . . . . . . . . . . . . . . . . 17 4.3.4. Duplicate . . . . . . . . . . . . . . . . . . . . . . 18
4.4. Decoder Instructions . . . . . . . . . . . . . . . . . . 18 4.4. Decoder Instructions . . . . . . . . . . . . . . . . . . 18
4.4.1. Header Acknowledgement . . . . . . . . . . . . . . . 18 4.4.1. Header Acknowledgement . . . . . . . . . . . . . . . 18
4.4.2. Stream Cancellation . . . . . . . . . . . . . . . . . 19 4.4.2. Stream Cancellation . . . . . . . . . . . . . . . . . 19
4.4.3. Insert Count Increment . . . . . . . . . . . . . . . 19 4.4.3. Insert Count Increment . . . . . . . . . . . . . . . 19
4.5. Header Block Representations . . . . . . . . . . . . . . 19 4.5. Header Block Representations . . . . . . . . . . . . . . 20
4.5.1. Header Block Prefix . . . . . . . . . . . . . . . . . 20 4.5.1. Header Block Prefix . . . . . . . . . . . . . . . . . 20
4.5.2. Indexed Header Field . . . . . . . . . . . . . . . . 22 4.5.2. Indexed Header Field . . . . . . . . . . . . . . . . 23
4.5.3. Indexed Header Field With Post-Base Index . . . . . . 23 4.5.3. Indexed Header Field With Post-Base Index . . . . . . 23
4.5.4. Literal Header Field With Name Reference . . . . . . 23 4.5.4. Literal Header Field With Name Reference . . . . . . 24
4.5.5. Literal Header Field With Post-Base Name Reference . 24 4.5.5. Literal Header Field With Post-Base Name Reference . 25
4.5.6. Literal Header Field Without Name Reference . . . . . 24 4.5.6. Literal Header Field Without Name Reference . . . . . 25
5. Configuration . . . . . . . . . . . . . . . . . . . . . . . . 25 5. Configuration . . . . . . . . . . . . . . . . . . . . . . . . 26
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 25 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 26
7. Security Considerations . . . . . . . . . . . . . . . . . . . 26 7. Security Considerations . . . . . . . . . . . . . . . . . . . 26
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27
8.1. Settings Registration . . . . . . . . . . . . . . . . . . 26 8.1. Settings Registration . . . . . . . . . . . . . . . . . . 27
8.2. Stream Type Registration . . . . . . . . . . . . . . . . 26 8.2. Stream Type Registration . . . . . . . . . . . . . . . . 27
8.3. Error Code Registration . . . . . . . . . . . . . . . . . 27 8.3. Error Code Registration . . . . . . . . . . . . . . . . . 27
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 27 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 28
9.1. Normative References . . . . . . . . . . . . . . . . . . 27 9.1. Normative References . . . . . . . . . . . . . . . . . . 28
9.2. Informative References . . . . . . . . . . . . . . . . . 28 9.2. Informative References . . . . . . . . . . . . . . . . . 28
Appendix A. Static Table . . . . . . . . . . . . . . . . . . . . 28 Appendix A. Static Table . . . . . . . . . . . . . . . . . . . . 29
Appendix B. Sample One Pass Encoding Algorithm . . . . . . . . . 32 Appendix B. Sample One Pass Encoding Algorithm . . . . . . . . . 33
Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 33 Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 34
C.1. Since draft-ietf-quic-qpack-11 . . . . . . . . . . . . . 34 C.1. Since draft-ietf-quic-qpack-12 . . . . . . . . . . . . . 35
C.2. Since draft-ietf-quic-qpack-10 . . . . . . . . . . . . . 34 C.2. Since draft-ietf-quic-qpack-11 . . . . . . . . . . . . . 35
C.3. Since draft-ietf-quic-qpack-09 . . . . . . . . . . . . . 34 C.3. Since draft-ietf-quic-qpack-10 . . . . . . . . . . . . . 35
C.4. Since draft-ietf-quic-qpack-08 . . . . . . . . . . . . . 34 C.4. Since draft-ietf-quic-qpack-09 . . . . . . . . . . . . . 35
C.5. Since draft-ietf-quic-qpack-06 . . . . . . . . . . . . . 34 C.5. Since draft-ietf-quic-qpack-08 . . . . . . . . . . . . . 35
C.6. Since draft-ietf-quic-qpack-05 . . . . . . . . . . . . . 34 C.6. Since draft-ietf-quic-qpack-06 . . . . . . . . . . . . . 35
C.7. Since draft-ietf-quic-qpack-04 . . . . . . . . . . . . . 34 C.7. Since draft-ietf-quic-qpack-05 . . . . . . . . . . . . . 35
C.8. Since draft-ietf-quic-qpack-03 . . . . . . . . . . . . . 34 C.8. Since draft-ietf-quic-qpack-04 . . . . . . . . . . . . . 35
C.9. Since draft-ietf-quic-qpack-02 . . . . . . . . . . . . . 35 C.9. Since draft-ietf-quic-qpack-03 . . . . . . . . . . . . . 36
C.10. Since draft-ietf-quic-qpack-01 . . . . . . . . . . . . . 35 C.10. Since draft-ietf-quic-qpack-02 . . . . . . . . . . . . . 36
C.11. Since draft-ietf-quic-qpack-00 . . . . . . . . . . . . . 35 C.11. Since draft-ietf-quic-qpack-01 . . . . . . . . . . . . . 36
C.12. Since draft-ietf-quic-qcram-00 . . . . . . . . . . . . . 35 C.12. Since draft-ietf-quic-qpack-00 . . . . . . . . . . . . . 36
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 36 C.13. Since draft-ietf-quic-qcram-00 . . . . . . . . . . . . . 37
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 36 Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 37
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 37
1. Introduction 1. Introduction
The QUIC transport protocol [QUIC-TRANSPORT] is designed to support The QUIC transport protocol [QUIC-TRANSPORT] is designed to support
HTTP semantics, and its design subsumes many of the features of HTTP semantics, and its design subsumes many of the features of
HTTP/2 [RFC7540]. HTTP/2 uses HPACK [RFC7541] for header HTTP/2 [RFC7540]. HTTP/2 uses HPACK [RFC7541] for header
compression. If HPACK were used for HTTP/3 [HTTP3], it would induce compression. If HPACK were used for HTTP/3 [HTTP3], it would induce
head-of-line blocking due to built-in assumptions of a total ordering head-of-line blocking due to built-in assumptions of a total ordering
across frames on all streams. across frames on all streams.
skipping to change at page 7, line 40 skipping to change at page 7, line 44
When the decoder receives a header block with a Required Insert Count When the decoder receives a header block with a Required Insert Count
greater than its own Insert Count, the stream cannot be processed greater than its own Insert Count, the stream cannot be processed
immediately, and is considered "blocked"; see Section 2.2.1. immediately, and is considered "blocked"; see Section 2.2.1.
The decoder specifies an upper bound on the number of streams which The decoder specifies an upper bound on the number of streams which
can be blocked using the SETTINGS_QPACK_BLOCKED_STREAMS setting; see can be blocked using the SETTINGS_QPACK_BLOCKED_STREAMS setting; see
Section 5. An encoder MUST limit the number of streams which could Section 5. An encoder MUST limit the number of streams which could
become blocked to the value of SETTINGS_QPACK_BLOCKED_STREAMS at all become blocked to the value of SETTINGS_QPACK_BLOCKED_STREAMS at all
times. If a decoder encounters more blocked streams than it promised times. If a decoder encounters more blocked streams than it promised
to support, it MUST treat this as a connection error of type to support, it MUST treat this as a connection error of type
HTTP_QPACK_DECOMPRESSION_FAILED. QPACK_DECOMPRESSION_FAILED.
Note that the decoder might not become blocked on every stream which Note that the decoder might not become blocked on every stream which
risks becoming blocked. risks becoming blocked.
An encoder can decide whether to risk having a stream become blocked. An encoder can decide whether to risk having a stream become blocked.
If permitted by the value of SETTINGS_QPACK_BLOCKED_STREAMS, If permitted by the value of SETTINGS_QPACK_BLOCKED_STREAMS,
compression efficiency can often be improved by referencing dynamic compression efficiency can often be improved by referencing dynamic
table entries that are still in transit, but if there is loss or table entries that are still in transit, but if there is loss or
reordering the stream can become blocked at the decoder. An encoder reordering the stream can become blocked at the decoder. An encoder
can avoid the risk of blocking by only referencing dynamic table can avoid the risk of blocking by only referencing dynamic table
entries which have been acknowledged, but this could mean using entries which have been acknowledged, but this could mean using
literals. Since literals make the header block larger, this can literals. Since literals make the header block larger, this can
result in the encoder becoming blocked on congestion or flow control result in the encoder becoming blocked on congestion or flow control
limits. limits.
2.1.4. Known Received Count 2.1.4. Avoiding Flow Control Deadlocks
Writing instructions on streams that are limited by flow control can
produce deadlocks.
A decoder might stop issuing flow control credit on the stream that
carries a header block until the necessary updates are received on
the encoder stream. If the granting of flow control credit on the
encoder stream (or the connection as a whole) depends on the
consumption and release of data on the stream carrying the header
block, a deadlock might result.
More generally, a stream containing a large instruction can become
deadlocked if the decoder withholds flow control credit until the
instruction is completely received.
To avoid these deadlocks, an encoder SHOULD avoid writing an
instruction unless sufficient stream and connection flow control
credit is available for the entire instruction.
2.1.5. Known Received Count
The Known Received Count is the total number of dynamic table The Known Received Count is the total number of dynamic table
insertions and duplications acknowledged by the decoder. The encoder insertions and duplications acknowledged by the decoder. The encoder
tracks the Known Received Count in order to identify which dynamic tracks the Known Received Count in order to identify which dynamic
table entries can be referenced without potentially blocking a table entries can be referenced without potentially blocking a
stream. The decoder tracks the Known Received Count in order to be stream. The decoder tracks the Known Received Count in order to be
able to send Insert Count Increment instructions. able to send Insert Count Increment instructions.
A Header Acknowledgement instruction (Section 4.4.1) implies that the A Header Acknowledgement instruction (Section 4.4.1) implies that the
decoder has received all dynamic table state necessary to process decoder has received all dynamic table state necessary to process
skipping to change at page 9, line 10 skipping to change at page 9, line 35
While blocked, header block data SHOULD remain in the blocked While blocked, header block data SHOULD remain in the blocked
stream's flow control window. A stream becomes unblocked when the stream's flow control window. A stream becomes unblocked when the
Insert Count becomes greater than or equal to the Required Insert Insert Count becomes greater than or equal to the Required Insert
Count for all header blocks the decoder has started reading from the Count for all header blocks the decoder has started reading from the
stream. stream.
When processing header blocks, the decoder expects the Required When processing header blocks, the decoder expects the Required
Insert Count to exactly match the value defined in Section 2.1.3. If Insert Count to exactly match the value defined in Section 2.1.3. If
it encounters a smaller value than expected, it MUST treat this as a it encounters a smaller value than expected, it MUST treat this as a
connection error of type HTTP_QPACK_DECOMPRESSION_FAILED; see connection error of type QPACK_DECOMPRESSION_FAILED; see
Section 2.2.3. If it encounters a larger value than expected, it MAY Section 2.2.3. If it encounters a larger value than expected, it MAY
treat this as a connection error of type treat this as a connection error of type QPACK_DECOMPRESSION_FAILED.
HTTP_QPACK_DECOMPRESSION_FAILED.
2.2.2. State Synchronization 2.2.2. State Synchronization
The decoder signals the following events by emitting decoder The decoder signals the following events by emitting decoder
instructions (Section 4.4) on the decoder stream. instructions (Section 4.4) on the decoder stream.
2.2.2.1. Completed Processing of a Header Block 2.2.2.1. Completed Processing of a Header Block
After the decoder finishes decoding a header block containing dynamic After the decoder finishes decoding a header block containing dynamic
table references, it MUST emit a Header Acknowledgement instruction table references, it MUST emit a Header Acknowledgement instruction
skipping to change at page 10, line 25 skipping to change at page 10, line 44
Section 4.4.1. However, delaying too long may lead to compression Section 4.4.1. However, delaying too long may lead to compression
inefficiencies if the encoder waits for an entry to be acknowledged inefficiencies if the encoder waits for an entry to be acknowledged
before using it. before using it.
2.2.3. Invalid References 2.2.3. Invalid References
If the decoder encounters a reference in a header block If the decoder encounters a reference in a header block
representation to a dynamic table entry which has already been representation to a dynamic table entry which has already been
evicted or which has an absolute index greater than or equal to the evicted or which has an absolute index greater than or equal to the
declared Required Insert Count (Section 4.5.1), it MUST treat this as declared Required Insert Count (Section 4.5.1), it MUST treat this as
a connection error of type "HTTP_QPACK_DECOMPRESSION_FAILED". a connection error of type QPACK_DECOMPRESSION_FAILED.
If the decoder encounters a reference in an encoder instruction to a If the decoder encounters a reference in an encoder instruction to a
dynamic table entry which has already been evicted, it MUST treat dynamic table entry which has already been evicted, it MUST treat
this as a connection error of type "HTTP_QPACK_ENCODER_STREAM_ERROR". this as a connection error of type QPACK_ENCODER_STREAM_ERROR.
3. Header Tables 3. Header Tables
Unlike in HPACK, entries in the QPACK static and dynamic tables are Unlike in HPACK, entries in the QPACK static and dynamic tables are
addressed separately. The following sections describe how entries in addressed separately. The following sections describe how entries in
each table are addressed. each table are addressed.
3.1. Static Table 3.1. Static Table
The static table consists of a predefined static list of header The static table consists of a predefined static list of header
skipping to change at page 10, line 52 skipping to change at page 11, line 26
All entries in the static table have a name and a value. However, All entries in the static table have a name and a value. However,
values can be empty (that is, have a length of 0). Each entry is values can be empty (that is, have a length of 0). Each entry is
identified by a unique index. identified by a unique index.
Note that the QPACK static table is indexed from 0, whereas the HPACK Note that the QPACK static table is indexed from 0, whereas the HPACK
static table is indexed from 1. static table is indexed from 1.
When the decoder encounters an invalid static table index in a header When the decoder encounters an invalid static table index in a header
block representation it MUST treat this as a connection error of type block representation it MUST treat this as a connection error of type
"HTTP_QPACK_DECOMPRESSION_FAILED". If this index is received on the QPACK_DECOMPRESSION_FAILED. If this index is received on the encoder
encoder stream, this MUST be treated as a connection error of type stream, this MUST be treated as a connection error of type
"HTTP_QPACK_ENCODER_STREAM_ERROR". QPACK_ENCODER_STREAM_ERROR.
3.2. Dynamic Table 3.2. Dynamic Table
The dynamic table consists of a list of header fields maintained in The dynamic table consists of a list of header fields maintained in
first-in, first-out order. Each HTTP/3 endpoint holds a dynamic first-in, first-out order. Each HTTP/3 endpoint holds a dynamic
table that is initially empty. Entries are added by encoder table that is initially empty. Entries are added by encoder
instructions received on the encoder stream; see Section 4.3. instructions received on the encoder stream; see Section 4.3.
The dynamic table can contain duplicate entries (i.e., entries with The dynamic table can contain duplicate entries (i.e., entries with
the same name and same value). Therefore, duplicate entries MUST NOT the same name and same value). Therefore, duplicate entries MUST NOT
skipping to change at page 11, line 45 skipping to change at page 12, line 21
the dynamic table. the dynamic table.
Before a new entry is added to the dynamic table, entries are evicted Before a new entry is added to the dynamic table, entries are evicted
from the end of the dynamic table until the size of the dynamic table from the end of the dynamic table until the size of the dynamic table
is less than or equal to (table capacity - size of new entry). The is less than or equal to (table capacity - size of new entry). The
encoder MUST NOT cause a dynamic table entry to be evicted unless encoder MUST NOT cause a dynamic table entry to be evicted unless
that entry is evictable; see Section 2.1.2. The new entry is then that entry is evictable; see Section 2.1.2. The new entry is then
added to the table. It is an error if the encoder attempts to add an added to the table. It is an error if the encoder attempts to add an
entry that is larger than the dynamic table capacity; the decoder entry that is larger than the dynamic table capacity; the decoder
MUST treat this as a connection error of type MUST treat this as a connection error of type
"HTTP_QPACK_ENCODER_STREAM_ERROR". QPACK_ENCODER_STREAM_ERROR.
A new entry can reference an entry in the dynamic table that will be A new entry can reference an entry in the dynamic table that will be
evicted when adding this new entry into the dynamic table. evicted when adding this new entry into the dynamic table.
Implementations are cautioned to avoid deleting the referenced name Implementations are cautioned to avoid deleting the referenced name
or value if the referenced entry is evicted from the dynamic table or value if the referenced entry is evicted from the dynamic table
prior to inserting the new entry. prior to inserting the new entry.
Whenever the dynamic table capacity is reduced by the encoder Whenever the dynamic table capacity is reduced by the encoder
(Section 4.3.1), entries are evicted from the end of the dynamic (Section 4.3.1), entries are evicted from the end of the dynamic
table until the size of the dynamic table is less than or equal to table until the size of the dynamic table is less than or equal to
skipping to change at page 12, line 30 skipping to change at page 13, line 5
Section 4.3.1. Section 4.3.1.
For clients using 0-RTT data in HTTP/3, the server's maximum table For clients using 0-RTT data in HTTP/3, the server's maximum table
capacity is the remembered value of the setting, or zero if the value capacity is the remembered value of the setting, or zero if the value
was not previously sent. When the client's 0-RTT value of the was not previously sent. When the client's 0-RTT value of the
SETTING is zero, the server MAY set it to a non-zero value in its SETTING is zero, the server MAY set it to a non-zero value in its
SETTINGS frame. If the remembered value is non-zero, the server MUST SETTINGS frame. If the remembered value is non-zero, the server MUST
send the same non-zero value in its SETTINGS frame. If it specifies send the same non-zero value in its SETTINGS frame. If it specifies
any other value, or omits SETTINGS_QPACK_MAX_TABLE_CAPACITY from any other value, or omits SETTINGS_QPACK_MAX_TABLE_CAPACITY from
SETTINGS, the encoder must treat this as a connection error of type SETTINGS, the encoder must treat this as a connection error of type
"HTTP_QPACK_DECODER_STREAM_ERROR". QPACK_DECODER_STREAM_ERROR.
For HTTP/3 servers and HTTP/3 clients when 0-RTT is not attempted or For HTTP/3 servers and HTTP/3 clients when 0-RTT is not attempted or
is rejected, the maximum table capacity is 0 until the encoder is rejected, the maximum table capacity is 0 until the encoder
processes a SETTINGS frame with a non-zero value of processes a SETTINGS frame with a non-zero value of
SETTINGS_QPACK_MAX_TABLE_CAPACITY. SETTINGS_QPACK_MAX_TABLE_CAPACITY.
When the maximum table capacity is zero, the encoder MUST NOT insert When the maximum table capacity is zero, the encoder MUST NOT insert
entries into the dynamic table, and MUST NOT send any encoder entries into the dynamic table, and MUST NOT send any encoder
instructions on the encoder stream. instructions on the encoder stream.
skipping to change at page 16, line 37 skipping to change at page 17, line 7
| 0 | 0 | 1 | Capacity (5+) | | 0 | 0 | 1 | Capacity (5+) |
+---+---+---+-------------------+ +---+---+---+-------------------+
Figure 5: Set Dynamic Table Capacity Figure 5: Set Dynamic Table Capacity
The new capacity MUST be lower than or equal to the limit described The new capacity MUST be lower than or equal to the limit described
in Section 3.2.3. In HTTP/3, this limit is the value of the in Section 3.2.3. In HTTP/3, this limit is the value of the
SETTINGS_QPACK_MAX_TABLE_CAPACITY parameter (Section 5) received from SETTINGS_QPACK_MAX_TABLE_CAPACITY parameter (Section 5) received from
the decoder. The decoder MUST treat a new dynamic table capacity the decoder. The decoder MUST treat a new dynamic table capacity
value that exceeds this limit as a connection error of type value that exceeds this limit as a connection error of type
"HTTP_QPACK_ENCODER_STREAM_ERROR". QPACK_ENCODER_STREAM_ERROR.
Reducing the dynamic table capacity can cause entries to be evicted; Reducing the dynamic table capacity can cause entries to be evicted;
see Section 3.2.2. This MUST NOT cause the eviction of entries which see Section 3.2.2. This MUST NOT cause the eviction of entries which
are not evictable; see Section 2.1.2. Changing the capacity of the are not evictable; see Section 2.1.2. Changing the capacity of the
dynamic table is not acknowledged as this instruction does not insert dynamic table is not acknowledged as this instruction does not insert
an entry. an entry.
4.3.2. Insert With Name Reference 4.3.2. Insert With Name Reference
An encoder adds an entry to the dynamic table where the header field An encoder adds an entry to the dynamic table where the header field
skipping to change at page 18, line 33 skipping to change at page 19, line 5
This section specifies the following decoder instructions. This section specifies the following decoder instructions.
4.4.1. Header Acknowledgement 4.4.1. Header Acknowledgement
After processing a header block whose declared Required Insert Count After processing a header block whose declared Required Insert Count
is not zero, the decoder emits a Header Acknowledgement instruction. is not zero, the decoder emits a Header Acknowledgement instruction.
The instruction begins with the '1' one-bit pattern which is followed The instruction begins with the '1' one-bit pattern which is followed
by the header block's associated stream ID encoded as a 7-bit prefix by the header block's associated stream ID encoded as a 7-bit prefix
integer; see Section 4.1.1. integer; see Section 4.1.1.
This instruction is used as described in Section 2.1.4 and in This instruction is used as described in Section 2.1.5 and in
Section 2.2.2. Section 2.2.2.
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| 1 | Stream ID (7+) | | 1 | Stream ID (7+) |
+---+---------------------------+ +---+---------------------------+
Figure 9: Header Acknowledgement Figure 9: Header Acknowledgement
If an encoder receives a Header Acknowledgement instruction referring If an encoder receives a Header Acknowledgement instruction referring
to a stream on which every header block with a non-zero Required to a stream on which every header block with a non-zero Required
Insert Count has already been acknowledged, that MUST be treated as a Insert Count has already been acknowledged, that MUST be treated as a
connection error of type "HTTP_QPACK_DECODER_STREAM_ERROR". connection error of type QPACK_DECODER_STREAM_ERROR.
The Header Acknowledgement instruction might increase the Known The Header Acknowledgement instruction might increase the Known
Received Count; see Section 2.1.4. Received Count; see Section 2.1.5.
4.4.2. Stream Cancellation 4.4.2. Stream Cancellation
When a stream is reset or reading is abandoned, the decoder emits a When a stream is reset or reading is abandoned, the decoder emits a
Stream Cancellation instruction. The instruction begins with the Stream Cancellation instruction. The instruction begins with the
'01' two-bit pattern, which is followed by the stream ID of the '01' two-bit pattern, which is followed by the stream ID of the
affected stream encoded as a 6-bit prefix integer. affected stream encoded as a 6-bit prefix integer.
This instruction is used as described in Section 2.2.2. This instruction is used as described in Section 2.2.2.
skipping to change at page 19, line 25 skipping to change at page 19, line 43
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| 0 | 1 | Stream ID (6+) | | 0 | 1 | Stream ID (6+) |
+---+---+-----------------------+ +---+---+-----------------------+
Figure 10: Stream Cancellation Figure 10: Stream Cancellation
4.4.3. Insert Count Increment 4.4.3. Insert Count Increment
The Insert Count Increment instruction begins with the '00' two-bit The Insert Count Increment instruction begins with the '00' two-bit
pattern, followed by the Increment encoded as a 6-bit prefix integer. pattern, followed by the Increment encoded as a 6-bit prefix integer.
This instruction increases the Known Received Count (Section 2.1.4) This instruction increases the Known Received Count (Section 2.1.5)
by the value of the Increment parameter. The decoder should send an by the value of the Increment parameter. The decoder should send an
Increment value that increases the Known Received Count to the total Increment value that increases the Known Received Count to the total
number of dynamic table insertions and duplications processed so far. number of dynamic table insertions and duplications processed so far.
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| 0 | 0 | Increment (6+) | | 0 | 0 | Increment (6+) |
+---+---+-----------------------+ +---+---+-----------------------+
Figure 11: Insert Count Increment Figure 11: Insert Count Increment
An encoder that receives an Increment field equal to zero, or one An encoder that receives an Increment field equal to zero, or one
that increases the Known Received Count beyond what the encoder has that increases the Known Received Count beyond what the encoder has
sent MUST treat this as a connection error of type sent MUST treat this as a connection error of type
"HTTP_QPACK_DECODER_STREAM_ERROR". QPACK_DECODER_STREAM_ERROR.
4.5. Header Block Representations 4.5. Header Block Representations
A header block consists of a prefix and a possibly empty sequence of A header block consists of a prefix and a possibly empty sequence of
representations defined in this section. Each representation representations defined in this section. Each representation
corresponds to a single header field. These representations corresponds to a single header field. These representations
reference the static table or the dynamic table in a particular reference the static table or the dynamic table in a particular
state, but do not modify that state. state, but do not modify that state.
Header blocks are carried in frames on streams defined by the Header blocks are carried in frames on streams defined by the
skipping to change at page 21, line 6 skipping to change at page 21, line 26
"MaxTableCapacity" is the maximum capacity of the dynamic table as "MaxTableCapacity" is the maximum capacity of the dynamic table as
specified by the decoder; see Section 3.2.3. specified by the decoder; see Section 3.2.3.
This encoding limits the length of the prefix on long-lived This encoding limits the length of the prefix on long-lived
connections. connections.
The decoder can reconstruct the Required Insert Count using an The decoder can reconstruct the Required Insert Count using an
algorithm such as the following. If the decoder encounters a value algorithm such as the following. If the decoder encounters a value
of EncodedInsertCount that could not have been produced by a of EncodedInsertCount that could not have been produced by a
conformant encoder, it MUST treat this as a connection error of type conformant encoder, it MUST treat this as a connection error of type
"HTTP_QPACK_DECOMPRESSION_FAILED". QPACK_DECOMPRESSION_FAILED.
TotalNumberOfInserts is the total number of inserts into the TotalNumberOfInserts is the total number of inserts into the
decoder's dynamic table. decoder's dynamic table.
FullRange = 2 * MaxEntries FullRange = 2 * MaxEntries
if EncodedInsertCount == 0: if EncodedInsertCount == 0:
ReqInsertCount = 0 ReqInsertCount = 0
else: else:
if EncodedInsertCount > FullRange: if EncodedInsertCount > FullRange:
Error Error
skipping to change at page 25, line 41 skipping to change at page 26, line 29
SETTINGS_HEADER_TABLE_SIZE from HTTP/2. SETTINGS_HEADER_TABLE_SIZE from HTTP/2.
SETTINGS_QPACK_BLOCKED_STREAMS (0x7): The default value is zero. SETTINGS_QPACK_BLOCKED_STREAMS (0x7): The default value is zero.
See Section 2.1.3. See Section 2.1.3.
6. Error Handling 6. Error Handling
The following error codes are defined for HTTP/3 to indicate failures The following error codes are defined for HTTP/3 to indicate failures
of QPACK which prevent the connection from continuing: of QPACK which prevent the connection from continuing:
HTTP_QPACK_DECOMPRESSION_FAILED (0x200): The decoder failed to QPACK_DECOMPRESSION_FAILED (0x200): The decoder failed to interpret
interpret a header block and is not able to continue decoding that a header block and is not able to continue decoding that header
header block. block.
HTTP_QPACK_ENCODER_STREAM_ERROR (0x201): The decoder failed to QPACK_ENCODER_STREAM_ERROR (0x201): The decoder failed to interpret
interpret an encoder instruction received on the encoder stream. an encoder instruction received on the encoder stream.
HTTP_QPACK_DECODER_STREAM_ERROR (0x202): The encoder failed to QPACK_DECODER_STREAM_ERROR (0x202): The encoder failed to interpret
interpret a decoder instruction received on the decoder stream. a decoder instruction received on the decoder stream.
7. Security Considerations 7. Security Considerations
TBD. Also see Section 7.1 of [RFC7541]. TBD. Also see Section 7.1 of [RFC7541].
While the negotiated limit on the dynamic table size accounts for While the negotiated limit on the dynamic table size accounts for
much of the memory that can be consumed by a QPACK implementation, much of the memory that can be consumed by a QPACK implementation,
data which cannot be immediately sent due to flow control is not data which cannot be immediately sent due to flow control is not
affected by this limit. Implementations should limit the size of affected by this limit. Implementations should limit the size of
unsent data, especially on the decoder stream where flexibility to unsent data, especially on the decoder stream where flexibility to
skipping to change at page 27, line 11 skipping to change at page 28, line 5
+----------------------+------+---------------+--------+ +----------------------+------+---------------+--------+
Table 2 Table 2
8.3. Error Code Registration 8.3. Error Code Registration
This document specifies three error codes. The entries in the This document specifies three error codes. The entries in the
following table are registered in the "HTTP/3 Error Code" registry following table are registered in the "HTTP/3 Error Code" registry
established in [HTTP3]. established in [HTTP3].
+---------------------------------+-----+-------------+-------------+ +----------------------------+------+---------------+---------------+
| Name |Code | Description |Specification| | Name | Code | Description | Specification |
+=================================+=====+=============+=============+ +============================+======+===============+===============+
| HTTP_QPACK_DECOMPRESSION_FAILED |0x200|Decompression| Section 6 | | QPACK_DECOMPRESSION_FAILED |0x200 | Decompression | Section 6 |
| | | of a header | | | | | of a header | |
| | |block failed | | | | | block failed | |
+---------------------------------+-----+-------------+-------------+ +----------------------------+------+---------------+---------------+
| HTTP_QPACK_ENCODER_STREAM_ERROR |0x201|Error on the | Section 6 | | QPACK_ENCODER_STREAM_ERROR |0x201 | Error on the | Section 6 |
| | | encoder | | | | |encoder stream | |
| | | stream | | +----------------------------+------+---------------+---------------+
+---------------------------------+-----+-------------+-------------+ | QPACK_DECODER_STREAM_ERROR |0x202 | Error on the | Section 6 |
| HTTP_QPACK_DECODER_STREAM_ERROR |0x202|Error on the | Section 6 | | | |decoder stream | |
| | | decoder | | +----------------------------+------+---------------+---------------+
| | | stream | |
+---------------------------------+-----+-------------+-------------+
Table 3 Table 3
9. References 9. References
9.1. Normative References 9.1. Normative References
[HTTP3] Bishop, M., Ed., "Hypertext Transfer Protocol Version 3 [HTTP3] Bishop, M., Ed., "Hypertext Transfer Protocol Version 3
(HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- (HTTP/3)", Work in Progress, Internet-Draft, draft-ietf-
quic-http-25, 22 January 2020, quic-http-26, 21 February 2020,
<https://tools.ietf.org/html/draft-ietf-quic-http-25>. <https://tools.ietf.org/html/draft-ietf-quic-http-26>.
[QUIC-TRANSPORT] [QUIC-TRANSPORT]
Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
Multiplexed and Secure Transport", Work in Progress, Multiplexed and Secure Transport", Work in Progress,
Internet-Draft, draft-ietf-quic-transport-25, 22 January Internet-Draft, draft-ietf-quic-transport-26, 21 February
2020, <https://tools.ietf.org/html/draft-ietf-quic- 2020, <https://tools.ietf.org/html/draft-ietf-quic-
transport-25>. transport-26>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
[RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for [RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for
HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015,
<https://www.rfc-editor.org/info/rfc7541>. <https://www.rfc-editor.org/info/rfc7541>.
skipping to change at page 34, line 7 skipping to change at page 35, line 7
else: else:
encodeInteger(prefixBuffer, 0x80, encodeInteger(prefixBuffer, 0x80,
largestReference - baseIndex, 7) largestReference - baseIndex, 7)
return controlBuffer, prefixBuffer + streamBuffer return controlBuffer, prefixBuffer + streamBuffer
Appendix C. Change Log Appendix C. Change Log
*RFC Editor's Note:* Please remove this section prior to *RFC Editor's Note:* Please remove this section prior to
publication of a final version of this document. publication of a final version of this document.
C.1. Since draft-ietf-quic-qpack-11 C.1. Since draft-ietf-quic-qpack-12
Editorial changes only Editorial changes only
C.2. Since draft-ietf-quic-qpack-10 C.2. Since draft-ietf-quic-qpack-11
Editorial changes only Editorial changes only
C.3. Since draft-ietf-quic-qpack-09 C.3. Since draft-ietf-quic-qpack-10
Editorial changes only
C.4. Since draft-ietf-quic-qpack-09
* Decoders MUST emit Header Acknowledgements (#2939) * Decoders MUST emit Header Acknowledgements (#2939)
* Updated error code for multiple encoder or decoder streams (#2970) * Updated error code for multiple encoder or decoder streams (#2970)
* Added explicit defaults for new SETTINGS (#2974) * Added explicit defaults for new SETTINGS (#2974)
C.4. Since draft-ietf-quic-qpack-08 C.5. Since draft-ietf-quic-qpack-08
* Endpoints are permitted to create encoder and decoder streams even * Endpoints are permitted to create encoder and decoder streams even
if they can't use them (#2100, #2529) if they can't use them (#2100, #2529)
* Maximum values for settings removed (#2766, #2767) * Maximum values for settings removed (#2766, #2767)
C.5. Since draft-ietf-quic-qpack-06 C.6. Since draft-ietf-quic-qpack-06
* Clarify initial dynamic table capacity maximums (#2276, #2330, * Clarify initial dynamic table capacity maximums (#2276, #2330,
#2330) #2330)
C.6. Since draft-ietf-quic-qpack-05 C.7. Since draft-ietf-quic-qpack-05
* Introduced the terms dynamic table capacity and maximum dynamic * Introduced the terms dynamic table capacity and maximum dynamic
table capacity. table capacity.
* Renamed SETTINGS_HEADER_TABLE_SIZE to * Renamed SETTINGS_HEADER_TABLE_SIZE to
SETTINGS_QPACK_MAX_TABLE_CAPACITY. SETTINGS_QPACK_MAX_TABLE_CAPACITY.
C.7. Since draft-ietf-quic-qpack-04 C.8. Since draft-ietf-quic-qpack-04
* Changed calculation of Delta Base Index to avoid an illegal value * Changed calculation of Delta Base Index to avoid an illegal value
(#2002, #2005) (#2002, #2005)
C.8. Since draft-ietf-quic-qpack-03 C.9. Since draft-ietf-quic-qpack-03
* Change HTTP settings defaults (#2038) * Change HTTP settings defaults (#2038)
* Substantial editorial reorganization * Substantial editorial reorganization
C.9. Since draft-ietf-quic-qpack-02 C.10. Since draft-ietf-quic-qpack-02
* Largest Reference encoded modulo MaxEntries (#1763) * Largest Reference encoded modulo MaxEntries (#1763)
* New Static Table (#1355) * New Static Table (#1355)
* Table Size Update with Insert Count=0 is a connection error * Table Size Update with Insert Count=0 is a connection error
(#1762) (#1762)
* Stream Cancellations are optional when * Stream Cancellations are optional when
SETTINGS_HEADER_TABLE_SIZE=0 (#1761) SETTINGS_HEADER_TABLE_SIZE=0 (#1761)
skipping to change at page 35, line 28 skipping to change at page 36, line 33
* Implementations must handle 62 bit integers (#1760) * Implementations must handle 62 bit integers (#1760)
* Different error types for each QPACK stream, other changes to * Different error types for each QPACK stream, other changes to
error handling (#1726) error handling (#1726)
* Preserve header field order (#1725) * Preserve header field order (#1725)
* Initial table size is the maximum permitted when table is first * Initial table size is the maximum permitted when table is first
usable (#1642) usable (#1642)
C.10. Since draft-ietf-quic-qpack-01 C.11. Since draft-ietf-quic-qpack-01
* Only header blocks that reference the dynamic table are * Only header blocks that reference the dynamic table are
acknowledged (#1603, #1605) acknowledged (#1603, #1605)
C.11. Since draft-ietf-quic-qpack-00 C.12. Since draft-ietf-quic-qpack-00
* Renumbered instructions for consistency (#1471, #1472) * Renumbered instructions for consistency (#1471, #1472)
* Decoder is allowed to validate largest reference (#1404, #1469) * Decoder is allowed to validate largest reference (#1404, #1469)
* Header block acknowledgments also acknowledge the associated * Header block acknowledgments also acknowledge the associated
largest reference (#1370, #1400) largest reference (#1370, #1400)
* Added an acknowledgment for unread streams (#1371, #1400) * Added an acknowledgment for unread streams (#1371, #1400)
* Removed framing from encoder stream (#1361,#1467) * Removed framing from encoder stream (#1361,#1467)
* Control streams use typed unidirectional streams rather than fixed * Control streams use typed unidirectional streams rather than fixed
stream IDs (#910,#1359) stream IDs (#910,#1359)
C.12. Since draft-ietf-quic-qcram-00 C.13. Since draft-ietf-quic-qcram-00
* Separate instruction sets for table updates and header blocks * Separate instruction sets for table updates and header blocks
(#1235, #1142, #1141) (#1235, #1142, #1141)
* Reworked indexing scheme (#1176, #1145, #1136, #1130, #1125, * Reworked indexing scheme (#1176, #1145, #1136, #1130, #1125,
#1314) #1314)
* Added mechanisms that support one-pass encoding (#1138, #1320) * Added mechanisms that support one-pass encoding (#1138, #1320)
* Added a setting to control the number of blocked decoders (#238, * Added a setting to control the number of blocked decoders (#238,
#1140, #1143) #1140, #1143)
 End of changes. 56 change blocks. 
107 lines changed or deleted 130 lines changed or added

This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/