draft-ietf-quic-qpack-21.txt | draft-ietf-quic-qpack-latest.txt | |||
---|---|---|---|---|
QUIC Working Group C. Krasic | QUIC Working Group C. Krasic | |||
Internet-Draft Netflix | Internet-Draft Netflix | |||
Intended status: Standards Track M. Bishop | Intended status: Standards Track M. Bishop | |||
Expires: August 6, 2021 Akamai Technologies | Expires: January 7, 2025 Akamai Technologies | |||
A. Frindell, Ed. | A. Frindell, Ed. | |||
February 2, 2021 | July 6, 2024 | |||
QPACK: Header Compression for HTTP/3 | QPACK: Header Compression for HTTP/3 | |||
draft-ietf-quic-qpack-21 | draft-ietf-quic-qpack-latest | |||
Abstract | Abstract | |||
This specification defines QPACK, a compression format for | This specification defines QPACK, a compression format for | |||
efficiently representing HTTP fields, to be used in HTTP/3. This is | efficiently representing HTTP fields, to be used in HTTP/3. This is | |||
a variation of HPACK compression that seeks to reduce head-of-line | a variation of HPACK compression that seeks to reduce head-of-line | |||
blocking. | blocking. | |||
Note to Readers | ||||
Discussion of this draft takes place on the QUIC working group | ||||
mailing list (quic@ietf.org [1]), which is archived at | ||||
<https://mailarchive.ietf.org/arch/search/?email_list=quic>. | ||||
Working Group information can be found at <https://github.com/ | ||||
quicwg>; source code and issues list for this draft can be found at | ||||
<https://github.com/quicwg/base-drafts/labels/-qpack>. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
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 August 6, 2021. | This Internet-Draft will expire on January 7, 2025. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2024 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 | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Conventions and Definitions . . . . . . . . . . . . . . . 4 | 1.1. Conventions and Definitions . . . . . . . . . . . . . . . 4 | |||
1.2. Notational Conventions . . . . . . . . . . . . . . . . . 5 | 1.2. Notational Conventions . . . . . . . . . . . . . . . . . 5 | |||
2. Compression Process Overview . . . . . . . . . . . . . . . . 6 | 2. Compression Process Overview . . . . . . . . . . . . . . . . 5 | |||
2.1. Encoder . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 2.1. Encoder . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.1.1. Limits on Dynamic Table Insertions . . . . . . . . . 6 | 2.1.1. Limits on Dynamic Table Insertions . . . . . . . . . 6 | |||
2.1.2. Blocked Streams . . . . . . . . . . . . . . . . . . . 7 | 2.1.2. Blocked Streams . . . . . . . . . . . . . . . . . . . 7 | |||
2.1.3. Avoiding Flow Control Deadlocks . . . . . . . . . . . 8 | 2.1.3. Avoiding Flow Control Deadlocks . . . . . . . . . . . 8 | |||
2.1.4. Known Received Count . . . . . . . . . . . . . . . . 9 | 2.1.4. Known Received Count . . . . . . . . . . . . . . . . 8 | |||
2.2. Decoder . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 2.2. Decoder . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
2.2.1. Blocked Decoding . . . . . . . . . . . . . . . . . . 9 | 2.2.1. Blocked Decoding . . . . . . . . . . . . . . . . . . 9 | |||
2.2.2. State Synchronization . . . . . . . . . . . . . . . . 10 | 2.2.2. State Synchronization . . . . . . . . . . . . . . . . 9 | |||
2.2.3. Invalid References . . . . . . . . . . . . . . . . . 11 | 2.2.3. Invalid References . . . . . . . . . . . . . . . . . 11 | |||
3. Reference Tables . . . . . . . . . . . . . . . . . . . . . . 11 | 3. Reference Tables . . . . . . . . . . . . . . . . . . . . . . 11 | |||
3.1. Static Table . . . . . . . . . . . . . . . . . . . . . . 11 | 3.1. Static Table . . . . . . . . . . . . . . . . . . . . . . 11 | |||
3.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 12 | 3.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 11 | |||
3.2.1. Dynamic Table Size . . . . . . . . . . . . . . . . . 12 | 3.2.1. Dynamic Table Size . . . . . . . . . . . . . . . . . 12 | |||
3.2.2. Dynamic Table Capacity and Eviction . . . . . . . . . 12 | 3.2.2. Dynamic Table Capacity and Eviction . . . . . . . . . 12 | |||
3.2.3. Maximum Dynamic Table Capacity . . . . . . . . . . . 13 | 3.2.3. Maximum Dynamic Table Capacity . . . . . . . . . . . 12 | |||
3.2.4. Absolute Indexing . . . . . . . . . . . . . . . . . . 14 | 3.2.4. Absolute Indexing . . . . . . . . . . . . . . . . . . 13 | |||
3.2.5. Relative Indexing . . . . . . . . . . . . . . . . . . 14 | 3.2.5. Relative Indexing . . . . . . . . . . . . . . . . . . 13 | |||
3.2.6. Post-Base Indexing . . . . . . . . . . . . . . . . . 15 | 3.2.6. Post-Base Indexing . . . . . . . . . . . . . . . . . 14 | |||
4. Wire Format . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 4. Wire Format . . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
4.1. Primitives . . . . . . . . . . . . . . . . . . . . . . . 15 | 4.1. Primitives . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
4.1.1. Prefixed Integers . . . . . . . . . . . . . . . . . . 16 | 4.1.1. Prefixed Integers . . . . . . . . . . . . . . . . . . 15 | |||
4.1.2. String Literals . . . . . . . . . . . . . . . . . . . 16 | 4.1.2. String Literals . . . . . . . . . . . . . . . . . . . 15 | |||
4.2. Encoder and Decoder Streams . . . . . . . . . . . . . . . 16 | 4.2. Encoder and Decoder Streams . . . . . . . . . . . . . . . 16 | |||
4.3. Encoder Instructions . . . . . . . . . . . . . . . . . . 17 | 4.3. Encoder Instructions . . . . . . . . . . . . . . . . . . 16 | |||
4.3.1. Set Dynamic Table Capacity . . . . . . . . . . . . . 17 | 4.3.1. Set Dynamic Table Capacity . . . . . . . . . . . . . 17 | |||
4.3.2. Insert With Name Reference . . . . . . . . . . . . . 18 | 4.3.2. Insert With Name Reference . . . . . . . . . . . . . 17 | |||
4.3.3. Insert With Literal Name . . . . . . . . . . . . . . 18 | 4.3.3. Insert With Literal Name . . . . . . . . . . . . . . 18 | |||
4.3.4. Duplicate . . . . . . . . . . . . . . . . . . . . . . 19 | 4.3.4. Duplicate . . . . . . . . . . . . . . . . . . . . . . 18 | |||
4.4. Decoder Instructions . . . . . . . . . . . . . . . . . . 19 | 4.4. Decoder Instructions . . . . . . . . . . . . . . . . . . 19 | |||
4.4.1. Section Acknowledgment . . . . . . . . . . . . . . . 19 | 4.4.1. Section Acknowledgment . . . . . . . . . . . . . . . 19 | |||
4.4.2. Stream Cancellation . . . . . . . . . . . . . . . . . 20 | 4.4.2. Stream Cancellation . . . . . . . . . . . . . . . . . 19 | |||
4.4.3. Insert Count Increment . . . . . . . . . . . . . . . 20 | 4.4.3. Insert Count Increment . . . . . . . . . . . . . . . 20 | |||
4.5. Field Line Representations . . . . . . . . . . . . . . . 21 | 4.5. Field Line Representations . . . . . . . . . . . . . . . 20 | |||
4.5.1. Encoded Field Section Prefix . . . . . . . . . . . . 21 | 4.5.1. Encoded Field Section Prefix . . . . . . . . . . . . 20 | |||
4.5.2. Indexed Field Line . . . . . . . . . . . . . . . . . 24 | 4.5.2. Indexed Field Line . . . . . . . . . . . . . . . . . 23 | |||
4.5.3. Indexed Field Line With Post-Base Index . . . . . . . 25 | 4.5.3. Indexed Field Line With Post-Base Index . . . . . . . 24 | |||
4.5.4. Literal Field Line With Name Reference . . . . . . . 25 | 4.5.4. Literal Field Line With Name Reference . . . . . . . 24 | |||
4.5.5. Literal Field Line With Post-Base Name Reference . . 26 | 4.5.5. Literal Field Line With Post-Base Name Reference . . 25 | |||
4.5.6. Literal Field Line With Literal Name . . . . . . . . 26 | 4.5.6. Literal Field Line With Literal Name . . . . . . . . 25 | |||
5. Configuration . . . . . . . . . . . . . . . . . . . . . . . . 27 | ||||
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 27 | 5. Configuration . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 28 | 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
7.1. Probing Dynamic Table State . . . . . . . . . . . . . . . 28 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 27 | |||
7.1.1. Applicability to QPACK and HTTP . . . . . . . . . . . 29 | 7.1. Probing Dynamic Table State . . . . . . . . . . . . . . . 27 | |||
7.1.2. Mitigation . . . . . . . . . . . . . . . . . . . . . 29 | 7.1.1. Applicability to QPACK and HTTP . . . . . . . . . . . 28 | |||
7.1.3. Never-Indexed Literals . . . . . . . . . . . . . . . 30 | 7.1.2. Mitigation . . . . . . . . . . . . . . . . . . . . . 28 | |||
7.2. Static Huffman Encoding . . . . . . . . . . . . . . . . . 31 | 7.1.3. Never-Indexed Literals . . . . . . . . . . . . . . . 29 | |||
7.3. Memory Consumption . . . . . . . . . . . . . . . . . . . 31 | 7.2. Static Huffman Encoding . . . . . . . . . . . . . . . . . 30 | |||
7.4. Implementation Limits . . . . . . . . . . . . . . . . . . 33 | 7.3. Memory Consumption . . . . . . . . . . . . . . . . . . . 30 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 33 | 7.4. Implementation Limits . . . . . . . . . . . . . . . . . . 32 | |||
8.1. Settings Registration . . . . . . . . . . . . . . . . . . 33 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 32 | |||
8.2. Stream Type Registration . . . . . . . . . . . . . . . . 33 | 8.1. Settings Registration . . . . . . . . . . . . . . . . . . 32 | |||
8.3. Error Code Registration . . . . . . . . . . . . . . . . . 34 | 8.2. Stream Type Registration . . . . . . . . . . . . . . . . 32 | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 34 | 8.3. Error Code Registration . . . . . . . . . . . . . . . . . 33 | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . 34 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
9.2. Informative References . . . . . . . . . . . . . . . . . 35 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 33 | |||
9.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 9.2. Informative References . . . . . . . . . . . . . . . . . 34 | |||
Appendix A. Static Table . . . . . . . . . . . . . . . . . . . . 36 | Appendix A. Static Table . . . . . . . . . . . . . . . . . . . . 35 | |||
Appendix B. Encoding and Decoding Examples . . . . . . . . . . . 41 | Appendix B. Encoding and Decoding Examples . . . . . . . . . . . 39 | |||
B.1. Literal Field Line With Name Reference . . . . . . . . . 41 | B.1. Literal Field Line With Name Reference . . . . . . . . . 40 | |||
B.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 41 | B.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 40 | |||
B.3. Speculative Insert . . . . . . . . . . . . . . . . . . . 42 | B.3. Speculative Insert . . . . . . . . . . . . . . . . . . . 41 | |||
B.4. Duplicate Instruction, Stream Cancellation . . . . . . . 43 | B.4. Duplicate Instruction, Stream Cancellation . . . . . . . 42 | |||
B.5. Dynamic Table Insert, Eviction . . . . . . . . . . . . . 44 | B.5. Dynamic Table Insert, Eviction . . . . . . . . . . . . . 43 | |||
Appendix C. Sample One Pass Encoding Algorithm . . . . . . . . . 45 | Appendix C. Sample One Pass Encoding Algorithm . . . . . . . . . 44 | |||
Appendix D. Change Log . . . . . . . . . . . . . . . . . . . . . 47 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
D.1. Since draft-ietf-quic-qpack-19 . . . . . . . . . . . . . 47 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
D.2. Since draft-ietf-quic-qpack-18 . . . . . . . . . . . . . 47 | ||||
D.3. Since draft-ietf-quic-qpack-17 . . . . . . . . . . . . . 47 | ||||
D.4. Since draft-ietf-quic-qpack-16 . . . . . . . . . . . . . 47 | ||||
D.5. Since draft-ietf-quic-qpack-15 . . . . . . . . . . . . . 47 | ||||
D.6. Since draft-ietf-quic-qpack-14 . . . . . . . . . . . . . 47 | ||||
D.7. Since draft-ietf-quic-qpack-13 . . . . . . . . . . . . . 47 | ||||
D.8. Since draft-ietf-quic-qpack-12 . . . . . . . . . . . . . 47 | ||||
D.9. Since draft-ietf-quic-qpack-11 . . . . . . . . . . . . . 47 | ||||
D.10. Since draft-ietf-quic-qpack-10 . . . . . . . . . . . . . 48 | ||||
D.11. Since draft-ietf-quic-qpack-09 . . . . . . . . . . . . . 48 | ||||
D.12. Since draft-ietf-quic-qpack-08 . . . . . . . . . . . . . 48 | ||||
D.13. Since draft-ietf-quic-qpack-06 . . . . . . . . . . . . . 48 | ||||
D.14. Since draft-ietf-quic-qpack-05 . . . . . . . . . . . . . 48 | ||||
D.15. Since draft-ietf-quic-qpack-04 . . . . . . . . . . . . . 48 | ||||
D.16. Since draft-ietf-quic-qpack-03 . . . . . . . . . . . . . 48 | ||||
D.17. Since draft-ietf-quic-qpack-02 . . . . . . . . . . . . . 48 | ||||
D.18. Since draft-ietf-quic-qpack-01 . . . . . . . . . . . . . 49 | ||||
D.19. Since draft-ietf-quic-qpack-00 . . . . . . . . . . . . . 49 | ||||
D.20. Since draft-ietf-quic-qcram-00 . . . . . . . . . . . . . 49 | ||||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 50 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
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 compression of | HTTP/2 ([RFC7540]). HTTP/2 uses HPACK ([RFC7541]) for compression of | |||
the header and trailer sections. If HPACK were used for HTTP/3 | the header and trailer sections. If HPACK were used for HTTP/3 | |||
([HTTP3]), it would induce head-of-line blocking for field sections | ([HTTP3]), it would induce head-of-line blocking for field sections | |||
due to built-in assumptions of a total ordering across frames on all | due to built-in assumptions of a total ordering across frames on all | |||
streams. | streams. | |||
skipping to change at page 4, line 40 ¶ | skipping to change at page 4, line 9 ¶ | |||
flexibility for implementations to balance between resilience against | flexibility for implementations to balance between resilience against | |||
head-of-line blocking and optimal compression ratio. The design | head-of-line blocking and optimal compression ratio. The design | |||
goals are to closely approach the compression ratio of HPACK with | goals are to closely approach the compression ratio of HPACK with | |||
substantially less head-of-line blocking under the same loss | substantially less head-of-line blocking under the same loss | |||
conditions. | conditions. | |||
1.1. Conventions and Definitions | 1.1. Conventions and Definitions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
Definitions of terms that are used in this document: | Definitions of terms that are used in this document: | |||
HTTP fields: Metadata sent as part of an HTTP message. The term | HTTP fields: Metadata sent as part of an HTTP message. The term | |||
encompasses both header and trailer fields. Colloquially, the | encompasses both header and trailer fields. Colloquially, the | |||
term "headers" has often been used to refer to HTTP header fields | term "headers" has often been used to refer to HTTP header fields | |||
and trailer fields; this document uses "fields" for generality. | and trailer fields; this document uses "fields" for generality. | |||
HTTP field line: A name-value pair sent as part of an HTTP field | HTTP field line: A name-value pair sent as part of an HTTP field | |||
skipping to change at page 10, line 10 ¶ | skipping to change at page 9, line 32 ¶ | |||
Required Insert Count. When the Required Insert Count is less than | Required Insert Count. When the Required Insert Count is less than | |||
or equal to the decoder's Insert Count, the field section can be | or equal to the decoder's Insert Count, the field section can be | |||
processed immediately. Otherwise, the stream on which the field | processed immediately. Otherwise, the stream on which the field | |||
section was received becomes blocked. | section was received becomes blocked. | |||
While blocked, encoded field section data SHOULD remain in the | While blocked, encoded field section data SHOULD remain in the | |||
blocked stream's flow control window. This data is unusable until | blocked stream's flow control window. This data is unusable until | |||
the stream becomes unblocked, and releasing the flow control | the stream becomes unblocked, and releasing the flow control | |||
prematurely makes the decoder vulnerable to memory exhaustion | prematurely makes the decoder vulnerable to memory exhaustion | |||
attacks. A stream becomes unblocked when the Insert Count becomes | attacks. A stream becomes unblocked when the Insert Count becomes | |||
unblocked when the Insert Count becomes greater than or equal to the | greater than or equal to the Required Insert Count for all encoded | |||
Required Insert Count for all encoded field sections the decoder has | field sections the decoder has started reading from the stream. | |||
started reading from the stream. | ||||
When processing encoded field sections, the decoder expects the | When processing encoded field sections, the decoder expects the | |||
Required Insert Count to equal the lowest possible value for the | Required Insert Count to equal the lowest possible value for the | |||
Insert Count with which the field section can be decoded, as | Insert Count with which the field section can be decoded, as | |||
prescribed in Section 2.1.2. If it encounters a Required Insert | prescribed in Section 2.1.2. If it encounters a Required Insert | |||
Count smaller than expected, it MUST treat this as a connection error | Count smaller than expected, it MUST treat this as a connection error | |||
of type QPACK_DECOMPRESSION_FAILED; see Section 2.2.3. If it | of type QPACK_DECOMPRESSION_FAILED; see Section 2.2.3. If it | |||
encounters a Required Insert Count larger than expected, it MAY treat | encounters a Required Insert Count larger than expected, it MAY treat | |||
this as a connection error of type QPACK_DECOMPRESSION_FAILED. | this as a connection error of type QPACK_DECOMPRESSION_FAILED. | |||
skipping to change at page 27, line 27 ¶ | skipping to change at page 26, line 27 ¶ | |||
This representation starts with the '001' 3-bit pattern. The fourth | This representation starts with the '001' 3-bit pattern. The fourth | |||
bit is the 'N' bit as described in Section 4.5.4. The name follows, | bit is the 'N' bit as described in Section 4.5.4. The name follows, | |||
represented as a 4-bit prefix string literal, then the value, | represented as a 4-bit prefix string literal, then the value, | |||
represented as an 8-bit prefix string literal; see Section 4.1.2. | represented as an 8-bit prefix string literal; see Section 4.1.2. | |||
5. Configuration | 5. Configuration | |||
QPACK defines two settings for the HTTP/3 SETTINGS frame: | QPACK defines two settings for the HTTP/3 SETTINGS frame: | |||
SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x1): The default value is zero. | SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x01): The default value is zero. | |||
See Section 3.2 for usage. This is the equivalent of the | See Section 3.2 for usage. This is the equivalent of the | |||
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 (0x07): The default value is zero. | |||
See Section 2.1.2. | See Section 2.1.2. | |||
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 that prevent the stream or connection from continuing: | of QPACK that prevent the stream or connection from continuing: | |||
QPACK_DECOMPRESSION_FAILED (0x200): The decoder failed to interpret | QPACK_DECOMPRESSION_FAILED (0x0200): The decoder failed to interpret | |||
an encoded field section and is not able to continue decoding that | an encoded field section and is not able to continue decoding that | |||
field section. | field section. | |||
QPACK_ENCODER_STREAM_ERROR (0x201): The decoder failed to interpret | QPACK_ENCODER_STREAM_ERROR (0x0201): The decoder failed to interpret | |||
an encoder instruction received on the encoder stream. | an encoder instruction received on the encoder stream. | |||
QPACK_DECODER_STREAM_ERROR (0x202): The encoder failed to interpret | QPACK_DECODER_STREAM_ERROR (0x0202): The encoder failed to interpret | |||
a decoder instruction received on the decoder stream. | a decoder instruction received on the decoder stream. | |||
7. Security Considerations | 7. Security Considerations | |||
This section describes potential areas of security concern with | This section describes potential areas of security concern with | |||
QPACK: | QPACK: | |||
o Use of compression as a length-based oracle for verifying guesses | o Use of compression as a length-based oracle for verifying guesses | |||
about secrets that are compressed into a shared compression | about secrets that are compressed into a shared compression | |||
context. | context. | |||
skipping to change at page 33, line 25 ¶ | skipping to change at page 32, line 25 ¶ | |||
enough to process the largest individual field the HTTP | enough to process the largest individual field the HTTP | |||
implementation can be configured to accept. | implementation can be configured to accept. | |||
If an implementation encounters a value larger than it is able to | If an implementation encounters a value larger than it is able to | |||
decode, this MUST be treated as a stream error of type | decode, this MUST be treated as a stream error of type | |||
QPACK_DECOMPRESSION_FAILED if on a request stream, or a connection | QPACK_DECOMPRESSION_FAILED if on a request stream, or a connection | |||
error of the appropriate type if on the encoder or decoder stream. | error of the appropriate type if on the encoder or decoder stream. | |||
8. IANA Considerations | 8. IANA Considerations | |||
This document makes multiple registrations in the registries defined | ||||
by [HTTP3]. The allocations created by this document are all | ||||
assigned permanent status and list a change controller of the IETF | ||||
and a contact of the HTTP working group (ietf-http-wg@w3.org). | ||||
8.1. Settings Registration | 8.1. Settings Registration | |||
This document specifies two settings. The entries in the following | This document specifies two settings. The entries in the following | |||
table are registered in the "HTTP/3 Settings" registry established in | table are registered in the "HTTP/3 Settings" registry established in | |||
[HTTP3]. | [HTTP3]. | |||
+--------------------------+------+---------------+---------+ | +--------------------------+------+---------------+---------+ | |||
| Setting Name | Code | Specification | Default | | | Setting Name | Code | Specification | Default | | |||
+--------------------------+------+---------------+---------+ | +--------------------------+------+---------------+---------+ | |||
| QPACK_MAX_TABLE_CAPACITY | 0x1 | Section 5 | 0 | | | QPACK_MAX_TABLE_CAPACITY | 0x01 | Section 5 | 0 | | |||
| | | | | | | | | | | | |||
| QPACK_BLOCKED_STREAMS | 0x7 | Section 5 | 0 | | | QPACK_BLOCKED_STREAMS | 0x07 | Section 5 | 0 | | |||
+--------------------------+------+---------------+---------+ | +--------------------------+------+---------------+---------+ | |||
For fomatting reasons, the setting names here are abbreviated by | For fomatting reasons, the setting names here are abbreviated by | |||
removing the 'SETTING_' prefix. | removing the 'SETTING_' prefix. | |||
8.2. Stream Type Registration | 8.2. Stream Type Registration | |||
This document specifies two stream types. The entries in the | This document specifies two stream types. The entries in the | |||
following table are registered in the "HTTP/3 Stream Type" registry | following table are registered in the "HTTP/3 Stream Type" registry | |||
established in [HTTP3]. | established in [HTTP3]. | |||
skipping to change at page 34, line 19 ¶ | skipping to change at page 33, line 19 ¶ | |||
| | | | | | | | | | | | |||
| QPACK Decoder Stream | 0x03 | Section 4.2 | Both | | | QPACK Decoder Stream | 0x03 | Section 4.2 | Both | | |||
+----------------------+------+---------------+--------+ | +----------------------+------+---------------+--------+ | |||
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 | | |||
+----------------------------+-------+--------------+---------------+ | +----------------------------+--------+-------------+---------------+ | |||
| QPACK_DECOMPRESSION_FAILED | 0x200 | Decoding of | Section 6 | | | QPACK_DECOMPRESSION_FAILED | 0x0200 | Decoding of | Section 6 | | |||
| | | a field | | | | | | a field | | | |||
| | | section | | | | | | section | | | |||
| | | failed | | | | | | failed | | | |||
| | | | | | | | | | | | |||
| QPACK_ENCODER_STREAM_ERROR | 0x201 | Error on the | Section 6 | | | QPACK_ENCODER_STREAM_ERROR | 0x0201 | Error on | Section 6 | | |||
| | | encoder | | | | | | the encoder | | | |||
| | | stream | | | | | | stream | | | |||
| | | | | | | | | | | | |||
| QPACK_DECODER_STREAM_ERROR | 0x202 | Error on the | Section 6 | | | QPACK_DECODER_STREAM_ERROR | 0x0202 | Error on | Section 6 | | |||
| | | decoder | | | | | | the decoder | | | |||
| | | stream | | | | | | stream | | | |||
+----------------------------+-------+--------------+---------------+ | +----------------------------+--------+-------------+---------------+ | |||
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)", draft-ietf-quic-http-34 (work in progress). | (HTTP/3)", draft-ietf-quic-http-latest (work in progress). | |||
[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", draft-ietf-quic- | Multiplexed and Secure Transport", RFC 9000, | |||
transport-34 (work in progress). | DOI 10.17487/RFC9000, | |||
<https://www.rfc-editor.org/info/rfc9000>. | ||||
[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>. | |||
[RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | |||
RFC 2360, DOI 10.17487/RFC2360, June 1998, | RFC 2360, DOI 10.17487/RFC2360, June 1998, | |||
<https://www.rfc-editor.org/info/rfc2360>. | <https://www.rfc-editor.org/info/rfc2360>. | |||
[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>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[SEMANTICS] | [SEMANTICS] | |||
Fielding, R., Nottingham, M., and J. Reschke, "HTTP | Fielding, R., Nottingham, M., and J. Reschke, "HTTP | |||
Semantics", draft-ietf-httpbis-semantics-14 (work in | Semantics", draft-ietf-httpbis-semantics-19 (work in | |||
progress), January 2021. | progress), September 2021. | |||
9.2. Informative References | 9.2. Informative References | |||
[CRIME] Wikipedia, "CRIME", May 2015, <http://en.wikipedia.org/w/ | [CRIME] Wikipedia, "CRIME", May 2015, <http://en.wikipedia.org/w/ | |||
index.php?title=CRIME&oldid=660948120>. | index.php?title=CRIME&oldid=660948120>. | |||
[PETAL] Tan, J. and J. Nahata, "PETAL: Preset Encoding | [PETAL] Tan, J. and J. Nahata, "PETAL: Preset Encoding | |||
Table Information Leakage", April 2013, | Table Information Leakage", April 2013, | |||
<http://www.pdl.cmu.edu/PDL-FTP/associated/CMU-PDL- | <http://www.pdl.cmu.edu/PDL-FTP/associated/CMU-PDL- | |||
13-106.pdf>. | 13-106.pdf>. | |||
skipping to change at page 36, line 5 ¶ | skipping to change at page 35, line 5 ¶ | |||
[RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
<https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
[TLS] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
9.3. URIs | ||||
[1] mailto:quic@ietf.org | ||||
Appendix A. Static Table | Appendix A. Static Table | |||
This table was generated by analyzing actual Internet traffic in 2018 | This table was generated by analyzing actual Internet traffic in 2018 | |||
and including the most common header fields, after filtering out some | and including the most common header fields, after filtering out some | |||
unsupported and non-standard values. Due to this methodology, some | unsupported and non-standard values. Due to this methodology, some | |||
of the entries may be inconsistent or appear multiple times with | of the entries may be inconsistent or appear multiple times with | |||
similar but not identical values. The order of the entries is | similar but not identical values. The order of the entries is | |||
optimized to encode the most common header fields with the smallest | optimized to encode the most common header fields with the smallest | |||
number of bytes. | number of bytes. | |||
skipping to change at page 44, line 8 ¶ | skipping to change at page 43, line 8 ¶ | |||
The encoder duplicates an existing entry in the dynamic table, then | The encoder duplicates an existing entry in the dynamic table, then | |||
sends an encoded field section referencing the dynamic table entries | sends an encoded field section referencing the dynamic table entries | |||
including the duplicated entry. The packet containing the encoder | including the duplicated entry. The packet containing the encoder | |||
stream data is delayed. Before the packet arrives, the decoder | stream data is delayed. Before the packet arrives, the decoder | |||
cancels the stream and notifies the encoder that the encoded field | cancels the stream and notifies the encoder that the encoded field | |||
section was not processed. | section was not processed. | |||
Stream: Encoder | Stream: Encoder | |||
02 | Duplicate (Relative Index = 2) | 02 | Duplicate (Relative Index = 2) | |||
| Absolute Index = | | Absolute Index = | |||
| Insert Count(4) - Index(2) - 1 = 1 | | Insert Count(3) - Index(2) - 1 = 0 | |||
Abs Ref Name Value | Abs Ref Name Value | |||
0 0 :authority www.example.com | 0 0 :authority www.example.com | |||
1 0 :path /sample/path | 1 0 :path /sample/path | |||
2 0 custom-key custom-value | 2 0 custom-key custom-value | |||
^-- acknowledged --^ | ^-- acknowledged --^ | |||
3 0 :authority www.example.com | 3 0 :authority www.example.com | |||
Size=217 | Size=217 | |||
Stream: 8 | Stream: 8 | |||
skipping to change at page 44, line 45 ¶ | skipping to change at page 43, line 45 ¶ | |||
Size=217 | Size=217 | |||
Stream: Decoder | Stream: Decoder | |||
48 | Stream Cancellation (Stream=8) | 48 | Stream Cancellation (Stream=8) | |||
Abs Ref Name Value | Abs Ref Name Value | |||
0 0 :authority www.example.com | 0 0 :authority www.example.com | |||
1 0 :path /sample/path | 1 0 :path /sample/path | |||
2 0 custom-key custom-value | 2 0 custom-key custom-value | |||
^-- acknowledged --^ | ^-- acknowledged --^ | |||
4 0 :authority www.example.com | 3 0 :authority www.example.com | |||
Size=217 | Size=217 | |||
B.5. Dynamic Table Insert, Eviction | B.5. Dynamic Table Insert, Eviction | |||
The encoder inserts another header into the dynamic table, which | The encoder inserts another header into the dynamic table, which | |||
evicts the oldest entry. The encoder does not send any encoded field | evicts the oldest entry. The encoder does not send any encoded field | |||
sections. | sections. | |||
Stream: Encoder | Stream: Encoder | |||
810d 6375 7374 6f6d | Insert With Name Reference | 810d 6375 7374 6f6d | Insert With Name Reference | |||
skipping to change at page 47, line 10 ¶ | skipping to change at page 46, line 10 ¶ | |||
if base >= requiredInsertCount: | if base >= requiredInsertCount: | |||
encodeInteger(prefixBuffer, 0x00, | encodeInteger(prefixBuffer, 0x00, | |||
base - requiredInsertCount, 7) | base - requiredInsertCount, 7) | |||
else: | else: | |||
encodeInteger(prefixBuffer, 0x80, | encodeInteger(prefixBuffer, 0x80, | |||
requiredInsertCount - base - 1, 7) | requiredInsertCount - base - 1, 7) | |||
return encoderBuffer, prefixBuffer + streamBuffer | return encoderBuffer, prefixBuffer + streamBuffer | |||
Appendix D. Change Log | ||||
*RFC Editor's Note:* Please remove this section prior to | ||||
publication of a final version of this document. | ||||
D.1. Since draft-ietf-quic-qpack-19 | ||||
Editorial changes only | ||||
D.2. Since draft-ietf-quic-qpack-18 | ||||
Editorial changes only | ||||
D.3. Since draft-ietf-quic-qpack-17 | ||||
Editorial changes only | ||||
D.4. Since draft-ietf-quic-qpack-16 | ||||
Editorial changes only | ||||
D.5. Since draft-ietf-quic-qpack-15 | ||||
No changes | ||||
D.6. Since draft-ietf-quic-qpack-14 | ||||
Added security considerations | ||||
D.7. Since draft-ietf-quic-qpack-13 | ||||
No changes | ||||
D.8. Since draft-ietf-quic-qpack-12 | ||||
Editorial changes only | ||||
D.9. Since draft-ietf-quic-qpack-11 | ||||
Editorial changes only | ||||
D.10. Since draft-ietf-quic-qpack-10 | ||||
Editorial changes only | ||||
D.11. Since draft-ietf-quic-qpack-09 | ||||
o Decoders MUST emit Header Acknowledgments (#2939) | ||||
o Updated error code for multiple encoder or decoder streams (#2970) | ||||
o Added explicit defaults for new SETTINGS (#2974) | ||||
D.12. Since draft-ietf-quic-qpack-08 | ||||
o Endpoints are permitted to create encoder and decoder streams even | ||||
if they can't use them (#2100, #2529) | ||||
o Maximum values for settings removed (#2766, #2767) | ||||
D.13. Since draft-ietf-quic-qpack-06 | ||||
o Clarify initial dynamic table capacity maximums (#2276, #2330, | ||||
#2330) | ||||
D.14. Since draft-ietf-quic-qpack-05 | ||||
o Introduced the terms dynamic table capacity and maximum dynamic | ||||
table capacity. | ||||
o Renamed SETTINGS_HEADER_TABLE_SIZE to | ||||
SETTINGS_QPACK_MAX_TABLE_CAPACITY. | ||||
D.15. Since draft-ietf-quic-qpack-04 | ||||
o Changed calculation of Delta Base Index to avoid an illegal value | ||||
(#2002, #2005) | ||||
D.16. Since draft-ietf-quic-qpack-03 | ||||
o Change HTTP settings defaults (#2038) | ||||
o Substantial editorial reorganization | ||||
D.17. Since draft-ietf-quic-qpack-02 | ||||
o Largest Reference encoded modulo MaxEntries (#1763) | ||||
o New Static Table (#1355) | ||||
o Table Size Update with Insert Count=0 is a connection error | ||||
(#1762) | ||||
o Stream Cancellations are optional when | ||||
SETTINGS_HEADER_TABLE_SIZE=0 (#1761) | ||||
o Implementations must handle 62 bit integers (#1760) | ||||
o Different error types for each QPACK stream, other changes to | ||||
error handling (#1726) | ||||
o Preserve header field order (#1725) | ||||
o Initial table size is the maximum permitted when table is first | ||||
usable (#1642) | ||||
D.18. Since draft-ietf-quic-qpack-01 | ||||
o Only header blocks that reference the dynamic table are | ||||
acknowledged (#1603, #1605) | ||||
D.19. Since draft-ietf-quic-qpack-00 | ||||
o Renumbered instructions for consistency (#1471, #1472) | ||||
o Decoder is allowed to validate largest reference (#1404, #1469) | ||||
o Header block acknowledgments also acknowledge the associated | ||||
largest reference (#1370, #1400) | ||||
o Added an acknowledgment for unread streams (#1371, #1400) | ||||
o Removed framing from encoder stream (#1361,#1467) | ||||
o Control streams use typed unidirectional streams rather than fixed | ||||
stream IDs (#910,#1359) | ||||
D.20. Since draft-ietf-quic-qcram-00 | ||||
o Separate instruction sets for table updates and header blocks | ||||
(#1235, #1142, #1141) | ||||
o Reworked indexing scheme (#1176, #1145, #1136, #1130, #1125, | ||||
#1314) | ||||
o Added mechanisms that support one-pass encoding (#1138, #1320) | ||||
o Added a setting to control the number of blocked decoders (#238, | ||||
#1140, #1143) | ||||
o Moved table updates and acknowledgments to dedicated streams | ||||
(#1121, #1122, #1238) | ||||
Acknowledgments | Acknowledgments | |||
The IETF QUIC Working Group received an enormous amount of support | The IETF QUIC Working Group received an enormous amount of support | |||
from many people. | from many people. | |||
The compression design team did substantial work exploring the | The compression design team did substantial work exploring the | |||
problem space and influencing the initial draft. The contributions | problem space and influencing the initial draft. The contributions | |||
of design team members Roberto Peon, Martin Thomson, and Dmitri | of design team members Roberto Peon, Martin Thomson, and Dmitri | |||
Tikhonov are gratefully acknowledged. | Tikhonov are gratefully acknowledged. | |||
End of changes. 36 change blocks. | ||||
267 lines changed or deleted | 96 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |