| draft-ietf-quic-qpack-05.txt | draft-ietf-quic-qpack-06.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: June 21, 2019 Akamai Technologies | Expires: July 27, 2019 Akamai Technologies | |||
| A. Frindell, Ed. | A. Frindell, Ed. | |||
| December 18, 2018 | January 23, 2019 | |||
| QPACK: Header Compression for HTTP over QUIC | QPACK: Header Compression for HTTP over QUIC | |||
| draft-ietf-quic-qpack-05 | draft-ietf-quic-qpack-06 | |||
| 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 46 ¶ | skipping to change at page 1, line 46 ¶ | |||
| 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 June 21, 2019. | This Internet-Draft will expire on July 27, 2019. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2019 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 | |||
| skipping to change at page 2, line 30 ¶ | skipping to change at page 2, line 30 ¶ | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 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 . . . . . . . . . . . . . . . . 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. Blocked Dynamic Table Insertions . . . . . . . . . . 6 | 2.1.2. Blocked Dynamic Table Insertions . . . . . . . . . . 6 | |||
| 2.1.3. Avoiding Head-of-Line Blocking . . . . . . . . . . . 7 | 2.1.3. Avoiding Head-of-Line Blocking . . . . . . . . . . . 7 | |||
| 2.1.4. Largest Known Received . . . . . . . . . . . . . . . 8 | 2.1.4. Known Received Count . . . . . . . . . . . . . . . . 8 | |||
| 2.2. Decoder . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 2.2. Decoder . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 2.2.1. State Synchronization . . . . . . . . . . . . . . . . 8 | 2.2.1. State Synchronization . . . . . . . . . . . . . . . . 8 | |||
| 2.2.2. Blocked Decoding . . . . . . . . . . . . . . . . . . 9 | 2.2.2. Blocked Decoding . . . . . . . . . . . . . . . . . . 9 | |||
| 3. Header Tables . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3. Header Tables . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.1. Static Table . . . . . . . . . . . . . . . . . . . . . . 9 | 3.1. Static Table . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 9 | 3.2. Dynamic Table . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.2.1. Calculating Table Size . . . . . . . . . . . . . . . 10 | 3.2.1. Dynamic Table Size . . . . . . . . . . . . . . . . . 10 | |||
| 3.2.2. Eviction . . . . . . . . . . . . . . . . . . . . . . 10 | 3.2.2. Dynamic Table Capacity and Eviction . . . . . . . . . 10 | |||
| 3.2.3. Maximum Table Size . . . . . . . . . . . . . . . . . 10 | 3.2.3. Maximum Dynamic Table Capacity . . . . . . . . . . . 11 | |||
| 3.2.4. Absolute Indexing . . . . . . . . . . . . . . . . . . 11 | 3.2.4. Initial Dynamic Table Capacity . . . . . . . . . . . 11 | |||
| 3.2.5. Relative Indexing . . . . . . . . . . . . . . . . . . 11 | 3.2.5. Absolute Indexing . . . . . . . . . . . . . . . . . . 11 | |||
| 3.2.6. Post-Base Indexing . . . . . . . . . . . . . . . . . 12 | 3.2.6. Relative Indexing . . . . . . . . . . . . . . . . . . 11 | |||
| 3.2.7. Invalid References . . . . . . . . . . . . . . . . . 12 | 3.2.7. Post-Base Indexing . . . . . . . . . . . . . . . . . 12 | |||
| 3.2.8. Invalid References . . . . . . . . . . . . . . . . . 13 | ||||
| 4. Wire Format . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 4. Wire Format . . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.1. Primitives . . . . . . . . . . . . . . . . . . . . . . . 13 | 4.1. Primitives . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.1.1. Prefixed Integers . . . . . . . . . . . . . . . . . . 13 | 4.1.1. Prefixed Integers . . . . . . . . . . . . . . . . . . 13 | |||
| 4.1.2. String Literals . . . . . . . . . . . . . . . . . . . 13 | 4.1.2. String Literals . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.2. Stream Types . . . . . . . . . . . . . . . . . . . . . . 13 | 4.2. Stream Types . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.3. Encoder Stream . . . . . . . . . . . . . . . . . . . . . 14 | 4.3. Encoder Stream . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.3.1. Insert With Name Reference . . . . . . . . . . . . . 14 | 4.3.1. Insert With Name Reference . . . . . . . . . . . . . 15 | |||
| 4.3.2. Insert Without Name Reference . . . . . . . . . . . . 15 | 4.3.2. Insert Without Name Reference . . . . . . . . . . . . 15 | |||
| 4.3.3. Duplicate . . . . . . . . . . . . . . . . . . . . . . 15 | 4.3.3. Duplicate . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.3.4. Dynamic Table Size Update . . . . . . . . . . . . . . 15 | 4.3.4. Set Dynamic Table Capacity . . . . . . . . . . . . . 16 | |||
| 4.4. Decoder Stream . . . . . . . . . . . . . . . . . . . . . 16 | 4.4. Decoder Stream . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.4.1. Table State Synchronize . . . . . . . . . . . . . . . 16 | 4.4.1. Insert Count Increment . . . . . . . . . . . . . . . 17 | |||
| 4.4.2. Header Acknowledgement . . . . . . . . . . . . . . . 17 | 4.4.2. Header Acknowledgement . . . . . . . . . . . . . . . 18 | |||
| 4.4.3. Stream Cancellation . . . . . . . . . . . . . . . . . 18 | 4.4.3. Stream Cancellation . . . . . . . . . . . . . . . . . 18 | |||
| 4.5. Request and Push Streams . . . . . . . . . . . . . . . . 18 | 4.5. Request and Push Streams . . . . . . . . . . . . . . . . 19 | |||
| 4.5.1. Header Data Prefix . . . . . . . . . . . . . . . . . 18 | 4.5.1. Header Block Prefix . . . . . . . . . . . . . . . . . 19 | |||
| 4.5.2. Indexed Header Field . . . . . . . . . . . . . . . . 20 | 4.5.2. Indexed Header Field . . . . . . . . . . . . . . . . 21 | |||
| 4.5.3. Indexed Header Field With Post-Base Index . . . . . . 21 | 4.5.3. Indexed Header Field With Post-Base Index . . . . . . 22 | |||
| 4.5.4. Literal Header Field With Name Reference . . . . . . 21 | 4.5.4. Literal Header Field With Name Reference . . . . . . 22 | |||
| 4.5.5. Literal Header Field With Post-Base Name Reference . 22 | 4.5.5. Literal Header Field With Post-Base Name Reference . 23 | |||
| 4.5.6. Literal Header Field Without Name Reference . . . . . 22 | 4.5.6. Literal Header Field Without Name Reference . . . . . 23 | |||
| 5. Configuration . . . . . . . . . . . . . . . . . . . . . . . . 23 | 5. Configuration . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 23 | 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 24 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 25 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 24 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 8.1. Settings Registration . . . . . . . . . . . . . . . . . . 24 | 8.1. Settings Registration . . . . . . . . . . . . . . . . . . 25 | |||
| 8.2. Stream Type Registration . . . . . . . . . . . . . . . . 24 | 8.2. Stream Type Registration . . . . . . . . . . . . . . . . 25 | |||
| 8.3. Error Code Registration . . . . . . . . . . . . . . . . . 24 | 8.3. Error Code Registration . . . . . . . . . . . . . . . . . 25 | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . 25 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 26 | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . 26 | 9.2. Informative References . . . . . . . . . . . . . . . . . 27 | |||
| 9.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 9.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| Appendix A. Static Table . . . . . . . . . . . . . . . . . . . . 26 | Appendix A. Static Table . . . . . . . . . . . . . . . . . . . . 27 | |||
| Appendix B. Sample One Pass Encoding Algorithm . . . . . . . . . 31 | Appendix B. Sample One Pass Encoding Algorithm . . . . . . . . . 32 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 33 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 34 | |||
| C.1. Since draft-ietf-quic-qpack-04 . . . . . . . . . . . . . 33 | C.1. Since draft-ietf-quic-qpack-05 . . . . . . . . . . . . . 34 | |||
| C.2. Since draft-ietf-quic-qpack-03 . . . . . . . . . . . . . 33 | C.2. Since draft-ietf-quic-qpack-04 . . . . . . . . . . . . . 34 | |||
| C.3. Since draft-ietf-quic-qpack-02 . . . . . . . . . . . . . 33 | C.3. Since draft-ietf-quic-qpack-03 . . . . . . . . . . . . . 34 | |||
| C.4. Since draft-ietf-quic-qpack-01 . . . . . . . . . . . . . 33 | C.4. Since draft-ietf-quic-qpack-02 . . . . . . . . . . . . . 34 | |||
| C.5. Since draft-ietf-quic-qpack-00 . . . . . . . . . . . . . 33 | C.5. Since draft-ietf-quic-qpack-01 . . . . . . . . . . . . . 35 | |||
| C.6. Since draft-ietf-quic-qcram-00 . . . . . . . . . . . . . 34 | C.6. Since draft-ietf-quic-qpack-00 . . . . . . . . . . . . . 35 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 34 | C.7. Since draft-ietf-quic-qcram-00 . . . . . . . . . . . . . 35 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 35 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 36 | ||||
| 1. Introduction | 1. Introduction | |||
| The QUIC transport protocol was designed from the outset to support | The QUIC transport protocol was designed from the outset 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. HTTP/2 uses HPACK ([RFC7541]) for header compression, but | HTTP/2. HTTP/2 uses HPACK ([RFC7541]) for header compression, but | |||
| QUIC's stream multiplexing comes into some conflict with HPACK. A | QUIC's stream multiplexing comes into some conflict with HPACK. A | |||
| key goal of the design of QUIC is to improve stream multiplexing | key goal of the design of QUIC is to improve stream multiplexing | |||
| relative to HTTP/2 by reducing head-of-line blocking. If HPACK were | relative to HTTP/2 by reducing head-of-line blocking. If HPACK were | |||
| used for HTTP/3, it would induce head-of-line blocking due to built- | used for HTTP/3, it would induce head-of-line blocking due to built- | |||
| skipping to change at page 4, line 43 ¶ | skipping to change at page 4, line 43 ¶ | |||
| Header block: The compressed representation of a header list. | Header block: The compressed representation of a header list. | |||
| Encoder: An implementation which transforms a header list into a | Encoder: An implementation which transforms a header list into a | |||
| header block. | header block. | |||
| Decoder: An implementation which transforms a header block into a | Decoder: An implementation which transforms a header block into a | |||
| header list. | header list. | |||
| Absolute Index: A unique index for each entry in the dynamic table. | Absolute Index: A unique index for each entry in the dynamic table. | |||
| Base Index: An absolute index in a header block from which relative | Base: A reference point for relative indicies. Dynamic references | |||
| indices are made. | are made relative to a Base in header blocks. | |||
| Largest Reference: The largest absolute index of an entry referenced | Insert Count: The total number of entries inserted in the dynamic | |||
| in a header block. | table. | |||
| QPACK is a name, not an acronym. | QPACK is a name, not an acronym. | |||
| 1.2. Notational Conventions | 1.2. Notational Conventions | |||
| Diagrams use the format described in Section 3.1 of [RFC2360], with | Diagrams use the format described in Section 3.1 of [RFC2360], with | |||
| the following additional conventions: | the following additional conventions: | |||
| x (A) Indicates that x is A bits long | x (A) Indicates that x is A bits long | |||
| skipping to change at page 6, line 25 ¶ | skipping to change at page 6, line 25 ¶ | |||
| table entry is not received by the decoder after the referenced entry | table entry is not received by the decoder after the referenced entry | |||
| has been evicted. Hence the encoder needs to track information about | has been evicted. Hence the encoder needs to track information about | |||
| each compressed header block that references the dynamic table until | each compressed header block that references the dynamic table until | |||
| that header block is acknowledged by the decoder. | that header block is acknowledged by the decoder. | |||
| 2.1.2. Blocked Dynamic Table Insertions | 2.1.2. Blocked Dynamic Table Insertions | |||
| An encoder MUST NOT insert an entry into the dynamic table (or | An encoder MUST NOT insert an entry into the dynamic table (or | |||
| duplicate an existing entry) if doing so would evict an entry with | duplicate an existing entry) if doing so would evict an entry with | |||
| unacknowledged references. For header blocks that might rely on the | unacknowledged references. For header blocks that might rely on the | |||
| newly added entry, the encoder can use a literal representation and | newly added entry, the encoder can use a literal representation. | |||
| maybe insert the entry later. | ||||
| To ensure that the encoder is not prevented from adding new entries, | To ensure that the encoder is not prevented from adding new entries, | |||
| the encoder can avoid referencing entries that are close to eviction. | the encoder can avoid referencing entries that are close to eviction. | |||
| Rather than reference such an entry, the encoder can emit a Duplicate | Rather than reference such an entry, the encoder can emit a Duplicate | |||
| instruction (see Section 4.3.3), and reference the duplicate instead. | instruction (see Section 4.3.3), and reference the duplicate instead. | |||
| Determining which entries are too close to eviction to reference is | Determining which entries are too close to eviction to reference is | |||
| an encoder preference. One heuristic is to target a fixed amount of | an encoder preference. One heuristic is to target a fixed amount of | |||
| available space in the dynamic table: either unused space or space | available space in the dynamic table: either unused space or space | |||
| that can be reclaimed by evicting unreferenced entries. To achieve | that can be reclaimed by evicting unreferenced entries. To achieve | |||
| skipping to change at page 7, line 11 ¶ | skipping to change at page 7, line 11 ¶ | |||
| entries with an absolute index lower than the draining index, the | entries with an absolute index lower than the draining index, the | |||
| number of unacknowledged references to those entries will eventually | number of unacknowledged references to those entries will eventually | |||
| become zero, allowing them to be evicted. | become zero, allowing them to be evicted. | |||
| +----------+---------------------------------+--------+ | +----------+---------------------------------+--------+ | |||
| | Draining | Referenceable | Unused | | | Draining | Referenceable | Unused | | |||
| | Entries | Entries | Space | | | Entries | Entries | Space | | |||
| +----------+---------------------------------+--------+ | +----------+---------------------------------+--------+ | |||
| ^ ^ ^ | ^ ^ ^ | |||
| | | | | | | | | |||
| Dropping Draining Index Base Index / | Dropping Draining Index Insertion Point | |||
| Point Insertion Point | Point | |||
| Figure 1: Draining Dynamic Table Entries | Figure 1: Draining Dynamic Table Entries | |||
| 2.1.3. Avoiding Head-of-Line Blocking | 2.1.3. Avoiding Head-of-Line Blocking | |||
| Because QUIC does not guarantee order between data on different | Because QUIC does not guarantee order between data on different | |||
| streams, a header block might reference an entry in the dynamic table | streams, a header block might reference an entry in the dynamic table | |||
| that has not yet been received. | that has not yet been received. | |||
| Each header block contains a Largest Reference (Section 4.5.1) which | Each header block contains a Required Insert Count, the lowest | |||
| identifies the table state necessary for decoding. If the greatest | possible value for the Insert Count with which the header block can | |||
| absolute index in the dynamic table is less than the value of the | be decoded. For a header block with no references to the dynamic | |||
| Largest Reference, the stream is considered "blocked." While | table, the Required Insert Count is zero. | |||
| When the Required Insert Count is zero, the frame contains no | ||||
| references to the dynamic table and can always be processed | ||||
| immediately. | ||||
| If the Required Insert Count is greater than the number of dynamic | ||||
| table entries received, the stream is considered "blocked." While | ||||
| blocked, header field data SHOULD remain in the blocked stream's flow | blocked, header field data SHOULD remain in the blocked stream's flow | |||
| control window. When the Largest Reference is zero, the frame | control window. A stream becomes unblocked when the Insert Count | |||
| contains no references to the dynamic table and can always be | becomes greater than or equal to the Required Insert Count for all | |||
| processed immediately. A stream becomes unblocked when the greatest | header blocks the decoder has started reading from the stream. | |||
| absolute index in the dynamic table becomes greater than or equal to | ||||
| the Largest Reference for all header blocks the decoder has started | If the decoder encounters a header block where the largest Absolute | |||
| reading from the stream. If the decoder encounters a header block | Index used is not equal to the largest value permitted by the | |||
| where the actual largest reference is not equal to the Largest | Required Insert Count, it MAY treat this as a stream error of type | |||
| Reference declared in the prefix, it MAY treat this as a stream error | HTTP_QPACK_DECOMPRESSION_FAILED. | |||
| of type HTTP_QPACK_DECOMPRESSION_FAILED. | ||||
| The SETTINGS_QPACK_BLOCKED_STREAMS setting (see Section 5) specifies | The SETTINGS_QPACK_BLOCKED_STREAMS setting (see Section 5) specifies | |||
| an upper bound on the number of streams which can be blocked. An | an upper bound on the number of streams which can be blocked. An | |||
| encoder MUST limit the number of streams which could become blocked | encoder MUST limit the number of streams which could become blocked | |||
| to the value of SETTINGS_QPACK_BLOCKED_STREAMS at all times. Note | to the value of SETTINGS_QPACK_BLOCKED_STREAMS at all times. Note | |||
| that the decoder might not actually become blocked on every stream | that the decoder might not actually become blocked on every stream | |||
| which risks becoming blocked. If the decoder encounters more blocked | which risks becoming blocked. If the decoder encounters more blocked | |||
| streams than it promised to support, it MUST treat this as a stream | streams than it promised to support, it MUST treat this as a stream | |||
| error of type HTTP_QPACK_DECOMPRESSION_FAILED. | error of type HTTP_QPACK_DECOMPRESSION_FAILED. | |||
| skipping to change at page 8, line 4 ¶ | skipping to change at page 8, line 12 ¶ | |||
| streams than it promised to support, it MUST treat this as a stream | streams than it promised to support, it MUST treat this as a stream | |||
| error of type HTTP_QPACK_DECOMPRESSION_FAILED. | error of type HTTP_QPACK_DECOMPRESSION_FAILED. | |||
| 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 | |||
| avoids the risk of blocking by only referencing dynamic table entries | avoids the risk of blocking by only referencing dynamic table entries | |||
| which have been acknowledged, but this could mean using literals. | which have been acknowledged, but this could mean using literals. | |||
| Since literals make the header block larger, this can result in the | Since literals make the header block larger, this can result in the | |||
| encoder becoming blocked on congestion or flow control limits. | encoder becoming blocked on congestion or flow control limits. | |||
| 2.1.4. Largest Known Received | 2.1.4. Known Received Count | |||
| In order to identify which dynamic table entries can be safely used | In order to identify which dynamic table entries can be safely used | |||
| without a stream becoming blocked, the encoder tracks the absolute | without a stream becoming blocked, the encoder tracks the number of | |||
| index of the decoder's Largest Known Received entry. | entries received by the decoder. The Known Received Count tracks the | |||
| total number of acknowledged insertions. | ||||
| When blocking references are permitted, the encoder uses header block | When blocking references are permitted, the encoder uses header block | |||
| acknowledgement to identify the Largest Known Received index, as | acknowledgement to maintain the Known Received Count, as described in | |||
| described in Section 4.4.2. | Section 4.4.2. | |||
| To acknowledge dynamic table entries which are not referenced by | To acknowledge dynamic table entries which are not referenced by | |||
| header blocks, for example because the encoder or the decoder have | header blocks, for example because the encoder or the decoder have | |||
| chosen not to risk blocked streams, the decoder sends a Table State | chosen not to risk blocked streams, the decoder sends an Insert Count | |||
| Synchronize instruction (see Section 4.4.1). | Increment instruction (see Section 4.4.1). | |||
| 2.2. Decoder | 2.2. Decoder | |||
| As in HPACK, the decoder processes header blocks and emits the | As in HPACK, the decoder processes header blocks and emits the | |||
| corresponding header lists. It also processes dynamic table | corresponding header lists. It also processes dynamic table | |||
| modifications from instructions on the encoder stream. | modifications from instructions on the encoder stream. | |||
| The decoder MUST emit header fields in the order their | The decoder MUST emit header fields in the order their | |||
| representations appear in the input header block. | representations appear in the input header block. | |||
| skipping to change at page 8, line 43 ¶ | skipping to change at page 9, line 4 ¶ | |||
| The decoder stream (Section 4.4) signals key events at the decoder | The decoder stream (Section 4.4) signals key events at the decoder | |||
| that permit the encoder to track the decoder's state. These events | that permit the encoder to track the decoder's state. These events | |||
| are: | are: | |||
| o Complete processing of a header block | o Complete processing of a header block | |||
| o Abandonment of a stream which might have remaining header blocks | o Abandonment of a stream which might have remaining header blocks | |||
| o Receipt of new dynamic table entries | o Receipt of new dynamic table entries | |||
| Knowledge that a header block with references to the dynamic table | Knowledge that a header block with references to the dynamic table | |||
| has been processed permits the encoder to evict entries to which no | has been processed permits the encoder to evict entries to which no | |||
| unacknowledged references remain, regardless of whether those | unacknowledged references remain, regardless of whether those | |||
| references were potentially blocking (see Section 2.1.2). When a | references were potentially blocking (see Section 2.1.2). When a | |||
| stream is reset or abandoned, the indication that these header blocks | stream is reset or abandoned, the indication that these header blocks | |||
| will never be processed serves a similar function; see Section 4.4.3. | will never be processed serves a similar function; see Section 4.4.3. | |||
| The decoder chooses when to emit Table State Synchronize instructions | The decoder chooses when to emit Insert Count Increment instructions | |||
| (see Section 4.4.1). Emitting an instruction after adding each new | (see Section 4.4.1). Emitting an instruction after adding each new | |||
| dynamic table entry will provide the most timely feedback to the | dynamic table entry will provide the most timely feedback to the | |||
| encoder, but could be redundant with other decoder feedback. By | encoder, but could be redundant with other decoder feedback. By | |||
| delaying a Table State Synchronize instruction, the decoder might be | delaying an Insert Count Increment instruction, the decoder might be | |||
| able to coalesce multiple Table State Synchronize instructions, or | able to coalesce multiple Insert Count Increment instructions, or | |||
| replace them entirely with Header Acknowledgements (see | replace them entirely with Header Acknowledgements (see | |||
| Section 4.4.2). However, delaying too long may lead to compression | Section 4.4.2). 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.2. Blocked Decoding | 2.2.2. Blocked Decoding | |||
| To track blocked streams, the necessary Largest Reference value for | To track blocked streams, the Required Insert Count value for each | |||
| each stream can be used. Whenever the decoder processes a table | stream can be used. Whenever the decoder processes a table update, | |||
| update, it can begin decoding any blocked streams that now have their | it can begin decoding any blocked streams that now have their | |||
| dependencies satisfied. | dependencies satisfied. | |||
| 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 | |||
| skipping to change at page 10, line 5 ¶ | skipping to change at page 10, line 16 ¶ | |||
| 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. The dynamic table is initially empty. | first-in, first-out order. The dynamic table is initially empty. | |||
| Entries are added by instructions on the encoder stream (see | Entries are added by instructions on the encoder stream (see | |||
| Section 4.3). | 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 | |||
| be treated as an error by the decoder. | be treated as an error by the decoder. | |||
| 3.2.1. Calculating Table Size | 3.2.1. Dynamic Table Size | |||
| The size of the dynamic table is the sum of the size of its entries. | The size of the dynamic table is the sum of the size of its entries. | |||
| The size of an entry is the sum of its name's length in bytes (as | The size of an entry is the sum of its name's length in bytes (as | |||
| defined in Section 4.1.2), its value's length in bytes, and 32. | defined in Section 4.1.2), its value's length in bytes, and 32. | |||
| The size of an entry is calculated using the length of its name and | The size of an entry is calculated using the length of its name and | |||
| value without any Huffman encoding applied. | value without Huffman encoding applied. | |||
| 3.2.2. Eviction | 3.2.2. Dynamic Table Capacity and Eviction | |||
| The encoder sets the capacity of the dynamic table, which serves as | ||||
| the upper limit on its size. | ||||
| 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 (maximum size - new entry size) or until the | is less than or equal to (table capacity - size of new entry) or | |||
| table is empty. The encoder MUST NOT evict a dynamic table entry | until the table is empty. The encoder MUST NOT evict a dynamic table | |||
| unless it has first been acknowledged by the decoder. | entry unless it has first been acknowledged by the decoder. | |||
| If the size of the new entry is less than or equal to the maximum | If the size of the new entry is less than or equal to the dynamic | |||
| size, that entry is added to the table. It is an error to attempt to | table capacity, then that entry is added to the table. It is an | |||
| add an entry that is larger than the maximum size; this MUST be | error if the encoder attempts to add an entry that is larger than the | |||
| treated as a connection error of type | dynamic table capacity; the decoder MUST treat this as a connection | |||
| "HTTP_QPACK_ENCODER_STREAM_ERROR". | error of type "HTTP_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 | |||
| if the referenced entry is evicted from the dynamic table prior to | or value if the referenced entry is evicted from the dynamic table | |||
| inserting the new entry. | prior to inserting the new entry. | |||
| Whenever the maximum size for the dynamic table is reduced by the | Whenever the dynamic table capacity is reduced by the encoder, | |||
| encoder, entries are evicted from the end of the dynamic table until | entries are evicted from the end of the dynamic table until the size | |||
| the size of the dynamic table is less than or equal to the new | of the dynamic table is less than or equal to the new table capacity. | |||
| maximum size. This mechanism can be used to completely clear entries | This mechanism can be used to completely clear entries from the | |||
| from the dynamic table by setting a maxiumum size of 0, which can | dynamic table by setting a capacity of 0, which can subsequently be | |||
| subsequently be restored. | restored. | |||
| 3.2.3. Maximum Table Size | 3.2.3. Maximum Dynamic Table Capacity | |||
| The encoder decides how to update the dynamic table size and as such | To bound the memory requirements of the decoder, the decoder limits | |||
| can control how much memory is used by the dynamic table. To limit | the maximum value the encoder is permitted to set for the dynamic | |||
| the memory requirements of the decoder, the dynamic table size is | table capacity. In HTTP/3, this limit is determined by the value of | |||
| strictly bounded. The decoder determines the maximum size that the | SETTINGS_QPACK_MAX_TABLE_CAPACITY sent by the decoder (see | |||
| encoder is permitted to set for the dynamic table. In HTTP/3, this | Section 5). The encoder MUST not set a dynamic table capacity that | |||
| value is determined by the SETTINGS_HEADER_TABLE_SIZE setting (see | ||||
| Section 5). The encoder MUST not set a dynamic table size that | ||||
| exceeds this maximum, but it can choose to use a lower dynamic table | exceeds this maximum, but it can choose to use a lower dynamic table | |||
| size (see Section 4.3.4). | capacity (see Section 4.3.4). | |||
| The initial maximum size is determined by the corresponding setting | 3.2.4. Initial Dynamic Table Capacity | |||
| when HTTP requests or responses are first permitted to be sent. For | ||||
| clients using 0-RTT data in HTTP/3, the table size is the remembered | ||||
| value of the setting, even if the server later specifies a larger | ||||
| maximum in its SETTINGS frame. For HTTP/3 servers and HTTP/3 clients | ||||
| when 0-RTT is not attempted or is rejected, the initial maximum table | ||||
| size is the value of the setting in the peer's SETTINGS frame. | ||||
| 3.2.4. Absolute Indexing | The initial dynamic table capacity is determined by the corresponding | |||
| setting when HTTP requests or responses are first permitted to be | ||||
| sent. For clients using 0-RTT data in HTTP/3, the initial table | ||||
| capacity is the remembered value of the setting, even if the server | ||||
| later specifies a larger maximum dynamic table capacity in its | ||||
| SETTINGS frame. For HTTP/3 servers and HTTP/3 clients when 0-RTT is | ||||
| not attempted or is rejected, the initial table capacity is the value | ||||
| of the setting in the peer's SETTINGS frame. | ||||
| 3.2.5. Absolute Indexing | ||||
| Each entry possesses both an absolute index which is fixed for the | Each entry possesses both an absolute index which is fixed for the | |||
| lifetime of that entry and a relative index which changes based on | lifetime of that entry and a relative index which changes based on | |||
| the context of the reference. The first entry inserted has an | the context of the reference. The first entry inserted has an | |||
| absolute index of "1"; indices increase sequentially with each | absolute index of "0"; indices increase by one with each insertion. | |||
| insertion. | ||||
| 3.2.5. Relative Indexing | 3.2.6. Relative Indexing | |||
| The relative index begins at zero and increases in the opposite | The relative index begins at zero and increases in the opposite | |||
| direction from the absolute index. Determining which entry has a | direction from the absolute index. Determining which entry has a | |||
| relative index of "0" depends on the context of the reference. | relative index of "0" depends on the context of the reference. | |||
| On the encoder stream, a relative index of "0" always refers to the | On the encoder stream, a relative index of "0" always refers to the | |||
| most recently inserted value in the dynamic table. Note that this | most recently inserted value in the dynamic table. Note that this | |||
| means the entry referenced by a given relative index will change | means the entry referenced by a given relative index will change | |||
| while interpreting instructions on the encoder stream. | while interpreting instructions on the encoder stream. | |||
| +---+---------------+-----------+ | +-----+---------------+-------+ | |||
| | n | ... | d + 1 | Absolute Index | | n-1 | ... | d | Absolute Index | |||
| + - +---------------+ - - - - - + | + - - +---------------+ - - - + | |||
| | 0 | ... | n - d - 1 | Relative Index | | 0 | ... | n-d-1 | Relative Index | |||
| +---+---------------+-----------+ | +-----+---------------+-------+ | |||
| ^ | | ^ | | |||
| | V | | V | |||
| Insertion Point Dropping Point | Insertion Point Dropping Point | |||
| n = count of entries inserted | n = count of entries inserted | |||
| d = count of entries dropped | d = count of entries dropped | |||
| Example Dynamic Table Indexing - Control Stream | Example Dynamic Table Indexing - Control Stream | |||
| Because frames from request streams can be delivered out of order | Unlike on the encoder stream, relative indices on push and request | |||
| with instructions on the encoder stream, relative indices are | streams are relative to the Base at the beginning of the header block | |||
| relative to the Base Index at the beginning of the header block (see | (see Section 4.5.1). This ensures that references are stable even if | |||
| Section 4.5.1). The Base Index is an absolute index. When | the dynamic table is updated while decoding a header block. | |||
| interpreting the rest of the frame, the entry identified by Base | ||||
| Index has a relative index of zero. The relative indices of entries | ||||
| do not change while interpreting headers on a request or push stream. | ||||
| Base Index | The Base is encoded as a value relative to the Required Insert Count. | |||
| | | The Base identifies which dynamic table entries can be referenced | |||
| V | using relative indexing, starting with 0 at the last entry added. | |||
| +---+-----+-----+-----+-------+ | ||||
| | n | n-1 | n-2 | ... | d+1 | Absolute Index | Post-Base references are used for entries inserted after base, | |||
| +---+-----+ - +-----+ - + | starting at 0 for the first entry added after the Base, see | |||
| | 0 | ... | n-d-3 | Relative Index | Section 3.2.7. | |||
| +-----+-----+-------+ | ||||
| Required | ||||
| Insert | ||||
| Count Base | ||||
| | | | ||||
| V V | ||||
| +-----+-----+-----+-----+-------+ | ||||
| | n-1 | n-2 | n-3 | ... | d | Absolute Index | ||||
| +-----+-----+ - +-----+ - + | ||||
| | 0 | ... | n-d-3 | Relative Index | ||||
| +-----+-----+-------+ | ||||
| n = count of entries inserted | n = count of entries inserted | |||
| d = count of entries dropped | d = count of entries dropped | |||
| Example Dynamic Table Indexing - Relative Index on Request Stream | Example Dynamic Table Indexing - Relative Index on Request Stream | |||
| 3.2.6. Post-Base Indexing | 3.2.7. Post-Base Indexing | |||
| A header block on the request stream can reference entries added | A header block on the request stream can reference entries added | |||
| after the entry identified by the Base Index. This allows an encoder | after the entry identified by the Base. This allows an encoder to | |||
| to process a header block in a single pass and include references to | process a header block in a single pass and include references to | |||
| entries added while processing this (or other) header blocks. Newly | entries added while processing this (or other) header blocks. Newly | |||
| added entries are referenced using Post-Base instructions. Indices | added entries are referenced using Post-Base instructions. Indices | |||
| for Post-Base instructions increase in the same direction as absolute | for Post-Base instructions increase in the same direction as absolute | |||
| indices, but the zero value is one higher than the Base Index. | indices, with the zero value being the first entry inserted after the | |||
| Base. | ||||
| Base Index | Base | |||
| | | | | |||
| V | V | |||
| +---+-----+-----+-----+-----+ | +-----+-----+-----+-----+-----+ | |||
| | n | n-1 | n-2 | ... | d+1 | Absolute Index | | n-1 | n-2 | n-3 | ... | d | Absolute Index | |||
| +---+-----+-----+-----+-----+ | +-----+-----+-----+-----+-----+ | |||
| | 1 | 0 | Post-Base Index | | 1 | 0 | Post-Base Index | |||
| +---+-----+ | +-----+-----+ | |||
| n = count of entries inserted | n = count of entries inserted | |||
| d = count of entries dropped | d = count of entries dropped | |||
| Example Dynamic Table Indexing - Post-Base Index on Request Stream | Example Dynamic Table Indexing - Post-Base Index on Request Stream | |||
| 3.2.7. Invalid References | 3.2.8. Invalid References | |||
| If the decoder encounters a reference on a request or push stream to | If the decoder encounters a reference on a request or push stream to | |||
| a dynamic table entry which has already been evicted or which has an | a dynamic table entry which has already been evicted or which has an | |||
| absolute index greater than the declared Largest Reference (see | absolute index greater than or equal to the declared Required Insert | |||
| Section 4.5.1), it MUST treat this as a stream error of type | Count (see Section 4.5.1), it MUST treat this as a stream error of | |||
| "HTTP_QPACK_DECOMPRESSION_FAILED". | type "HTTP_QPACK_DECOMPRESSION_FAILED". | |||
| If the decoder encounters a reference on the encoder stream to a | If the decoder encounters a reference on the encoder stream to a | |||
| dynamic table entry which has already been dropped, it MUST treat | dynamic table entry which has already been dropped, it MUST treat | |||
| this as a connection error of type "HTTP_QPACK_ENCODER_STREAM_ERROR". | this as a connection error of type "HTTP_QPACK_ENCODER_STREAM_ERROR". | |||
| 4. Wire Format | 4. Wire Format | |||
| 4.1. Primitives | 4.1. Primitives | |||
| 4.1.1. Prefixed Integers | 4.1.1. Prefixed Integers | |||
| skipping to change at page 14, line 10 ¶ | skipping to change at page 14, line 39 ¶ | |||
| o The decoder stream is a unidirectional stream of type "0x68" | o The decoder stream is a unidirectional stream of type "0x68" | |||
| (ASCII 'h') which carries acknowledgements of table modifications | (ASCII 'h') which carries acknowledgements of table modifications | |||
| and header processing from decoder to encoder. | and header processing from decoder to encoder. | |||
| o Finally, the contents of HEADERS and PUSH_PROMISE frames on | o Finally, the contents of HEADERS and PUSH_PROMISE frames on | |||
| request streams and push streams reference the QPACK table state. | request streams and push streams reference the QPACK table state. | |||
| There MUST be exactly one of each unidirectional stream type in each | There MUST be exactly one of each unidirectional stream type in each | |||
| direction. Receipt of a second instance of either stream type MUST | direction. Receipt of a second instance of either stream type MUST | |||
| be treated as a connection error of HTTP_WRONG_STREAM_COUNT. Closure | be treated as a connection error of HTTP_WRONG_STREAM_COUNT. These | |||
| of either unidirectional stream MUST be treated as a connection error | streams MUST NOT be closed. Closure of either unidirectional stream | |||
| of type HTTP_CLOSED_CRITICAL_STREAM. | MUST be treated as a connection error of type | |||
| HTTP_CLOSED_CRITICAL_STREAM. | ||||
| This section describes the instructions which are possible on each | This section describes the instructions which are possible on each | |||
| stream type. | stream type. | |||
| 4.3. Encoder Stream | 4.3. Encoder Stream | |||
| Table updates can add a table entry, possibly using existing entries | Table updates can add a table entry, possibly using existing entries | |||
| to avoid transmitting redundant information. The name can be | to avoid transmitting redundant information. The name can be | |||
| transmitted as a reference to an existing entry in the static or the | transmitted as a reference to an existing entry in the static or the | |||
| dynamic table or as a string literal. For entries which already | dynamic table or as a string literal. For entries which already | |||
| skipping to change at page 15, line 46 ¶ | skipping to change at page 16, line 37 ¶ | |||
| +---+---+---+-------------------+ | +---+---+---+-------------------+ | |||
| Figure 2: Duplicate | Figure 2: Duplicate | |||
| The existing entry is re-inserted into the dynamic table without | The existing entry is re-inserted into the dynamic table without | |||
| resending either the name or the value. This is useful to mitigate | resending either the name or the value. This is useful to mitigate | |||
| the eviction of older entries which are frequently referenced, both | the eviction of older entries which are frequently referenced, both | |||
| to avoid the need to resend the header and to avoid the entry in the | to avoid the need to resend the header and to avoid the entry in the | |||
| table blocking the ability to insert new headers. | table blocking the ability to insert new headers. | |||
| 4.3.4. Dynamic Table Size Update | 4.3.4. Set Dynamic Table Capacity | |||
| An encoder informs the decoder of a change to the size of the dynamic | An encoder informs the decoder of a change to the dynamic table | |||
| table using an instruction which begins with the '001' three-bit | capacity using an instruction which begins with the '001' three-bit | |||
| pattern. The new maximum table size is represented as an integer | pattern. The new dynamic table capacity is represented as an integer | |||
| with a 5-bit prefix (see Section 5.1 of [RFC7541]). | with a 5-bit prefix (see Section 5.1 of [RFC7541]). | |||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | 0 | 0 | 1 | Max size (5+) | | | 0 | 0 | 1 | Capacity (5+) | | |||
| +---+---+---+-------------------+ | +---+---+---+-------------------+ | |||
| Figure 3: Maximum Dynamic Table Size Change | Figure 3: Set Dynamic Table Capacity | |||
| The new maximum size MUST be lower than or equal to the limit | The new capacity MUST be lower than or equal to the limit described | |||
| described in Section 3.2.3. In HTTP/3, this limit is the value of | in Section 3.2.3. In HTTP/3, this limit is the value of the | |||
| the SETTINGS_HEADER_TABLE_SIZE parameter (see Section 5) received | SETTINGS_QPACK_MAX_TABLE_CAPACITY parameter (see Section 5) received | |||
| from the decoder. The decoder MUST treat a value that exceeds this | from the decoder. The decoder MUST treat a new dynamic table | |||
| limit as a connection error of type | capacity value that exceeds this limit as a connection error of type | |||
| "HTTP_QPACK_ENCODER_STREAM_ERROR". | "HTTP_QPACK_ENCODER_STREAM_ERROR". | |||
| Reducing the maximum size of the dynamic table can cause entries to | Reducing the dynamic table capacity can cause entries to be evicted | |||
| be evicted (see Section 4.3 of [RFC7541]). This MUST NOT cause the | (see Section 3.2.2). This MUST NOT cause the eviction of entries | |||
| eviction of entries with outstanding references (see Section 2.1.1). | with outstanding references (see Section 2.1.1). Changing the | |||
| Changing the size of the dynamic table is not acknowledged as this | capacity of the dynamic table is not acknowledged as this instruction | |||
| instruction does not insert an entry. | does not insert an entry. | |||
| 4.4. Decoder Stream | 4.4. Decoder Stream | |||
| The decoder stream carries information used to ensure consistency of | The decoder stream carries information used to ensure consistency of | |||
| the dynamic table. Information is sent from the decoder to the | the dynamic table. Information is sent from the decoder to the | |||
| encoder; that is, the server informs the client about the processing | encoder; that is, the server informs the client about the processing | |||
| of the client's header blocks and table updates, and the client | of the client's header blocks and table updates, and the client | |||
| informs the server about the processing of the server's header blocks | informs the server about the processing of the server's header blocks | |||
| and table updates. | and table updates. | |||
| The contents of the decoder stream are an unframed sequence of the | The contents of the decoder stream are an unframed sequence of the | |||
| following instructions. | following instructions. | |||
| 4.4.1. Table State Synchronize | 4.4.1. Insert Count Increment | |||
| The Table State Synchronize instruction begins with the '00' two-bit | The Insert Count Increment instruction begins with the '00' two-bit | |||
| pattern. The instruction specifies the total number of dynamic table | pattern. The instruction specifies the total number of dynamic table | |||
| inserts and duplications since the last Table State Synchronize or | inserts and duplications since the last Insert Count Increment or | |||
| Header Acknowledgement that increased the Largest Known Received | Header Acknowledgement that increased the Known Received Count for | |||
| dynamic table entry (see Section 2.1.4). This is encoded as a 6-bit | the dynamic table (see Section 2.1.4). The Increment field is | |||
| prefix integer. The encoder uses this value to determine which table | encoded as a 6-bit prefix integer. The encoder uses this value to | |||
| entries might cause a stream to become blocked, as described in | determine which table entries might cause a stream to become blocked, | |||
| Section 2.2.1. | as described in Section 2.2.1. | |||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | 0 | 0 | Insert Count (6+) | | | 0 | 0 | Increment (6+) | | |||
| +---+---+-----------------------+ | +---+---+-----------------------+ | |||
| Figure 4: Table State Synchronize | Figure 4: Insert Count Increment | |||
| An encoder that receives an Insert Count equal to zero or one that | An encoder that receives an Increment field equal to zero or one that | |||
| increases Largest Known Received beyond what the encoder has sent | increases the Known Received Count beyond what the encoder has sent | |||
| MUST treat this as a connection error of type | MUST treat this as a connection error of type | |||
| "HTTP_QPACK_DECODER_STREAM_ERROR". | "HTTP_QPACK_DECODER_STREAM_ERROR". | |||
| 4.4.2. Header Acknowledgement | 4.4.2. Header Acknowledgement | |||
| After processing a header block whose declared Largest Reference is | After processing a header block whose declared Required Insert Count | |||
| not zero, the decoder emits a Header Acknowledgement instruction on | is not zero, the decoder emits a Header Acknowledgement instruction | |||
| the decoder stream. The instruction begins with the '1' one-bit | on the decoder stream. The instruction begins with the '1' one-bit | |||
| pattern and includes the request stream's stream ID, encoded as a | pattern and includes the request stream's stream ID, encoded as a | |||
| 7-bit prefix integer. It is used by the peer's encoder to know when | 7-bit prefix integer. It is used by the peer's encoder to know when | |||
| it is safe to evict an entry, and possibly update Largest Known | it is safe to evict an entry, and possibly update the Known Received | |||
| Received. | Count. | |||
| 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 5: Header Acknowledgement | Figure 5: Header Acknowledgement | |||
| The same Stream ID can be identified multiple times, as multiple | The same Stream ID can be identified multiple times, as multiple | |||
| header blocks can be sent on a single stream in the case of | header blocks can be sent on a single stream in the case of | |||
| intermediate responses, trailers, and pushed requests. Since header | intermediate responses, trailers, and pushed requests. Since header | |||
| frames on each stream are received and processed in order, this gives | frames on each stream are received and processed in order, this gives | |||
| the encoder precise feedback on which header blocks within a stream | the encoder precise feedback on which header blocks within a stream | |||
| have been fully processed. | have been fully processed. | |||
| 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 Largest | to a stream on which every header block with a non-zero Required | |||
| Reference 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 "HTTP_QPACK_DECODER_STREAM_ERROR". | |||
| When blocking references are permitted, the encoder uses | When blocking references are permitted, the encoder uses | |||
| acknowledgement of header blocks to update the Largest Known Received | acknowledgement of header blocks to update the Known Received Count. | |||
| index. If a header block was potentially blocking, the | If a header block was potentially blocking, the acknowledgement | |||
| acknowledgement implies that the decoder has received all dynamic | implies that the decoder has received all dynamic table state | |||
| table state necessary to process the header block. If the Largest | necessary to process the header block. If the Required Insert Count | |||
| Reference of an acknowledged header block was greater than the | of an acknowledged header block was greater than the encoder's | |||
| encoder's current Largest Known Received index, the block's Largest | current Known Received Count, the block's Required Insert Count | |||
| Reference becomes the new Largest Known Received. | becomes the new Known Received Count. | |||
| 4.4.3. Stream Cancellation | 4.4.3. Stream Cancellation | |||
| The instruction begins with the '01' two-bit pattern. The | The instruction begins with the '01' two-bit pattern. The | |||
| instruction includes the stream ID of the affected stream - a request | instruction includes the stream ID of the affected stream - a request | |||
| or push stream - encoded as a 6-bit prefix integer. | or push stream - encoded as a 6-bit prefix integer. | |||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | 0 | 1 | Stream ID (6+) | | | 0 | 1 | Stream ID (6+) | | |||
| skipping to change at page 18, line 27 ¶ | skipping to change at page 19, line 19 ¶ | |||
| Figure 6: Stream Cancellation | Figure 6: Stream Cancellation | |||
| A stream that is reset might have multiple outstanding header blocks | A stream that is reset might have multiple outstanding header blocks | |||
| with dynamic table references. When an endpoint receives a stream | with dynamic table references. When an endpoint receives a stream | |||
| reset before the end of a stream, it generates a Stream Cancellation | reset before the end of a stream, it generates a Stream Cancellation | |||
| instruction on the decoder stream. Similarly, when an endpoint | instruction on the decoder stream. Similarly, when an endpoint | |||
| abandons reading of a stream it needs to signal this using the Stream | abandons reading of a stream it needs to signal this using the Stream | |||
| Cancellation instruction. This signals to the encoder that all | Cancellation instruction. This signals to the encoder that all | |||
| references to the dynamic table on that stream are no longer | references to the dynamic table on that stream are no longer | |||
| outstanding. A decoder with a maximum dynamic table size equal to | outstanding. A decoder with a maximum dynamic table capacity equal | |||
| zero (see Section 3.2.3) MAY omit sending Stream Cancellations, | to zero (see Section 3.2.3) MAY omit sending Stream Cancellations, | |||
| because the encoder cannot have any dynamic table references. | because the encoder cannot have any dynamic table references. | |||
| An encoder cannot infer from this instruction that any updates to the | An encoder cannot infer from this instruction that any updates to the | |||
| dynamic table have been received. | dynamic table have been received. | |||
| 4.5. Request and Push Streams | 4.5. Request and Push Streams | |||
| HEADERS and PUSH_PROMISE frames on request and push streams reference | HEADERS and PUSH_PROMISE frames on request and push streams reference | |||
| the dynamic table in a particular state without modifying it. Frames | the dynamic table in a particular state without modifying it. Frames | |||
| on these streams emit the headers for an HTTP request or response. | on these streams emit the headers for an HTTP request or response. | |||
| 4.5.1. Header Data Prefix | 4.5.1. Header Block Prefix | |||
| Header data is prefixed with two integers, "Largest Reference" and | Each header block is prefixed with two integers. The Required Insert | |||
| "Base Index". | Count is encoded as an integer with an 8-bit prefix after the | |||
| encoding described in Section 4.5.1.1). The Base is encoded as sign- | ||||
| and-modulus integer, using a single sign bit and a value with a 7-bit | ||||
| prefix (see Section 4.5.1.2). | ||||
| These two values are followed by instructions for compressed headers. | ||||
| The entire block is expected to be framed by the using protocol. | ||||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | Largest Reference (8+) | | | Required Insert Count (8+) | | |||
| +---+---------------------------+ | +---+---------------------------+ | |||
| | S | Delta Base Index (7+) | | | S | Delta Base (7+) | | |||
| +---+---------------------------+ | +---+---------------------------+ | |||
| | Compressed Headers ... | | Compressed Headers ... | |||
| +-------------------------------+ | +-------------------------------+ | |||
| Figure 7: Frame Payload | Figure 7: Frame Payload | |||
| 4.5.1.1. Largest Reference | 4.5.1.1. Required Insert Count | |||
| "Largest Reference" identifies the largest absolute dynamic index | Required Insert Count identifies the state of the dynamic table | |||
| referenced in the block. Blocking decoders use the Largest Reference | needed to process the header block. Blocking decoders use the | |||
| to determine when it is safe to process the rest of the block. If | Required Insert Count to determine when it is safe to process the | |||
| Largest Reference is greater than zero, the encoder transforms it as | rest of the block. | |||
| follows before encoding: | ||||
| LargestReference = (LargestReference mod (2 * MaxEntries)) + 1 | If no references are made to the dynamic table, a value of 0 is | |||
| encoded. Alternatively, where the Required Insert Count is greater | ||||
| than zero, the encoder transforms it as follows before encoding: | ||||
| EncodedInsertCount = (ReqInsertCount mod (2 * MaxEntries)) + 1 | ||||
| Here "MaxEntries" is the maximum number of entries that the dynamic | Here "MaxEntries" is the maximum number of entries that the dynamic | |||
| table can have. The smallest entry has empty name and value strings | table can have. The smallest entry has empty name and value strings | |||
| and has the size of 32. Hence "MaxEntries" is calculated as | and has the size of 32. Hence "MaxEntries" is calculated as | |||
| MaxEntries = floor( MaxTableSize / 32 ) | MaxEntries = floor( MaxTableCapacity / 32 ) | |||
| "MaxTableSize" is the maximum size of the dynamic table as specified | "MaxTableCapacity" is the maximum capacity of the dynamic table as | |||
| by the decoder (see Section 3.2.3). | specified by the decoder (see Section 3.2.3). | |||
| The decoder reconstructs the Largest Reference using the following | The decoder reconstructs the Required Insert Count using the | |||
| algorithm: | following algorithm, where TotalNumberOfInserts is the total number | |||
| of inserts into the decoder's dynamic table: | ||||
| if LargestReference > 0: | if EncodedInsertCount == 0: | |||
| LargestReference -= 1 | ReqInsertCount = 0 | |||
| else: | ||||
| InsertCount = EncodedInsertCount - 1 | ||||
| CurrentWrapped = TotalNumberOfInserts mod (2 * MaxEntries) | CurrentWrapped = TotalNumberOfInserts mod (2 * MaxEntries) | |||
| if CurrentWrapped >= LargestReference + MaxEntries: | if CurrentWrapped >= InsertCount + MaxEntries: | |||
| # Largest Reference wrapped around 1 extra time | # Insert Count wrapped around 1 extra time | |||
| LargestReference += 2 * MaxEntries | ReqInsertCount += 2 * MaxEntries | |||
| else if CurrentWrapped + MaxEntries < LargestReference | else if CurrentWrapped + MaxEntries < InsertCount: | |||
| # Decoder wrapped around 1 extra time | # Decoder wrapped around 1 extra time | |||
| CurrentWrapped += 2 * MaxEntries | CurrentWrapped += 2 * MaxEntries | |||
| LargestReference += TotalNumberOfInserts - CurrentWrapped | ReqInsertCount += TotalNumberOfInserts - CurrentWrapped | |||
| TotalNumberOfInserts is the total number of inserts into the | This encoding limits the length of the prefix on long-lived | |||
| decoder's dynamic table. This encoding limits the length of the | connections. | |||
| prefix on long-lived connections. | ||||
| 4.5.1.2. Base Index | For example, if the dynamic table is 100 bytes, then the Required | |||
| Insert Count will be encoded modulo 6. If a decoder has received 10 | ||||
| inserts, then an encoded value of 3 indicates that the Required | ||||
| Insert Count is 9 for the header block. | ||||
| "Base Index" is used to resolve references in the dynamic table as | 4.5.1.2. Base | |||
| described in Section 3.2.5. | ||||
| To save space, Base Index is encoded relative to Largest Reference | The "Base" is used to resolve references in the dynamic table as | |||
| using a one-bit sign and the "Delta Base Index" value. A sign bit of | described in Section 3.2.6. | |||
| 0 indicates that the Base Index has an absolute index that is greater | ||||
| than or equal to the Largest Reference; the value of Delta Base Index | ||||
| is added to the Largest Reference to determine the absolute value of | ||||
| the Base Index. A sign bit of 1 indicates that the Base Index is | ||||
| less than the Largest Reference. That is: | ||||
| if sign == 0: | To save space, the Base is encoded relative to the Insert Count using | |||
| baseIndex = largestReference + deltaBaseIndex | a one-bit sign and the "Delta Base" value. A sign bit of 0 indicates | |||
| that the Base is greater than or equal to the value of the Insert | ||||
| Count; the value of Delta Base is added to the Insert Count to | ||||
| determine the value of the Base. A sign bit of 1 indicates that the | ||||
| Base is less than the Insert Count. That is: | ||||
| if S == 0: | ||||
| Base = ReqInsertCount + DeltaBase | ||||
| else: | else: | |||
| baseIndex = largestReference - deltaBaseIndex - 1 | Base = ReqInsertCount - DeltaBase - 1 | |||
| A single-pass encoder determines the absolute value of Base Index | A single-pass encoder determines the Base before encoding a header | |||
| before encoding a header block. If the encoder inserted entries in | block. If the encoder inserted entries in the dynamic table while | |||
| the dynamic table while encoding the header block, Largest Reference | encoding the header block, Required Insert Count will be greater than | |||
| will be greater than Base Index, so the encoded difference is | the Base, so the encoded difference is negative and the sign bit is | |||
| negative and the sign bit is set to 1. If the header block did not | set to 1. If the header block did not reference the most recent | |||
| reference the most recent entry in the table and did not insert any | entry in the table and did not insert any new entries, the Base will | |||
| new entries, Base Index will be greater than the Largest Reference, | be greater than the Required Insert Count, so the delta will be | |||
| so the delta will be positive and the sign bit is set to 0. | positive and the sign bit is set to 0. | |||
| An encoder that produces table updates before encoding a header block | An encoder that produces table updates before encoding a header block | |||
| might set Largest Reference and Base Index to the same value. In | might set Required Insert Count and the Base to the same value. In | |||
| such case, both the sign bit and the Delta Base Index will be set to | such case, both the sign bit and the Delta Base will be set to zero. | |||
| zero. | ||||
| A header block that does not reference the dynamic table can use any | A header block that does not reference the dynamic table can use any | |||
| value for Base Index; setting both Largest Reference and Base Index | value for the Base; setting Delta Base to zero is the most efficient | |||
| to zero is the most efficient encoding. | encoding. | |||
| For example, with an Required Insert Count of 9, a decoder receives a | ||||
| S bit of 1 and a Delta Base of 2. This sets the Base to 6 and | ||||
| enables post-base indexing for three entries. In this example, a | ||||
| regular index of 1 refers to the 5th entry that was added to the | ||||
| table; a post-base index of 1 refers to the 8th entry. | ||||
| 4.5.2. Indexed Header Field | 4.5.2. Indexed Header Field | |||
| An indexed header field representation identifies an entry in either | An indexed header field representation identifies an entry in either | |||
| the static table or the dynamic table and causes that header field to | the static table or the dynamic table and causes that header field to | |||
| be added to the decoded header list, as described in Section 3.2 of | be added to the decoded header list, as described in Section 3.2 of | |||
| [RFC7541]. | [RFC7541]. | |||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | 1 | S | Index (6+) | | | 1 | S | Index (6+) | | |||
| +---+---+-----------------------+ | +---+---+-----------------------+ | |||
| Indexed Header Field | Indexed Header Field | |||
| If the entry is in the static table, or in the dynamic table with an | If the entry is in the static table, or in the dynamic table with an | |||
| absolute index less than or equal to Base Index, this representation | absolute index less than the Base, this representation starts with | |||
| starts with the '1' 1-bit pattern, followed by the "S" bit indicating | the '1' 1-bit pattern, followed by the "S" bit indicating whether the | |||
| whether the reference is into the static (S=1) or dynamic (S=0) | reference is into the static (S=1) or dynamic (S=0) table. Finally, | |||
| table. Finally, the relative index of the matching header field is | the relative index of the matching header field is represented as an | |||
| represented as an integer with a 6-bit prefix (see Section 5.1 of | integer with a 6-bit prefix (see Section 5.1 of [RFC7541]). | |||
| [RFC7541]). | ||||
| 4.5.3. Indexed Header Field With Post-Base Index | 4.5.3. Indexed Header Field With Post-Base Index | |||
| If the entry is in the dynamic table with an absolute index greater | If the entry is in the dynamic table with an absolute index greater | |||
| than Base Index, the representation starts with the '0001' 4-bit | than or equal to the Base, the representation starts with the '0001' | |||
| pattern, followed by the post-base index (see Section 3.2.6) of the | 4-bit pattern, followed by the post-base index (see Section 3.2.7) of | |||
| matching header field, represented as an integer with a 4-bit prefix | the matching header field, represented as an integer with a 4-bit | |||
| (see Section 5.1 of [RFC7541]). | prefix (see Section 5.1 of [RFC7541]). | |||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | 0 | 0 | 0 | 1 | Index (4+) | | | 0 | 0 | 0 | 1 | Index (4+) | | |||
| +---+---+---+---+---------------+ | +---+---+---+---+---------------+ | |||
| Indexed Header Field with Post-Base Index | Indexed Header Field with Post-Base Index | |||
| 4.5.4. Literal Header Field With Name Reference | 4.5.4. Literal Header Field With Name Reference | |||
| A literal header field with a name reference represents a header | A literal header field with a name reference represents a header | |||
| where the header field name matches the header field name of an entry | where the header field name matches the header field name of an entry | |||
| stored in the static table or the dynamic table. | stored in the static table or the dynamic table. | |||
| If the entry is in the static table, or in the dynamic table with an | If the entry is in the static table, or in the dynamic table with an | |||
| absolute index less than or equal to Base Index, this representation | absolute index less than the Base, this representation starts with | |||
| starts with the '01' two-bit pattern. If the entry is in the dynamic | the '01' two-bit pattern. If the entry is in the dynamic table with | |||
| table with an absolute index greater than Base Index, the | an absolute index greater than or equal to the Base, the | |||
| representation starts with the '0000' four-bit pattern. | representation starts with the '0000' four-bit pattern. | |||
| The following bit, 'N', indicates whether an intermediary is | The following bit, 'N', indicates whether an intermediary is | |||
| permitted to add this header to the dynamic header table on | permitted to add this header to the dynamic header table on | |||
| subsequent hops. When the 'N' bit is set, the encoded header MUST | subsequent hops. When the 'N' bit is set, the encoded header MUST | |||
| always be encoded with a literal representation. In particular, when | always be encoded with a literal representation. In particular, when | |||
| a peer sends a header field that it received represented as a literal | a peer sends a header field that it received represented as a literal | |||
| header field with the 'N' bit set, it MUST use a literal | header field with the 'N' bit set, it MUST use a literal | |||
| representation to forward this header field. This bit is intended | representation to forward this header field. This bit is intended | |||
| for protecting header field values that are not to be put at risk by | for protecting header field values that are not to be put at risk by | |||
| skipping to change at page 22, line 20 ¶ | skipping to change at page 23, line 19 ¶ | |||
| | 0 | 1 | N | S |Name Index (4+)| | | 0 | 1 | N | S |Name Index (4+)| | |||
| +---+---+---+---+---------------+ | +---+---+---+---+---------------+ | |||
| | H | Value Length (7+) | | | H | Value Length (7+) | | |||
| +---+---------------------------+ | +---+---------------------------+ | |||
| | Value String (Length bytes) | | | Value String (Length bytes) | | |||
| +-------------------------------+ | +-------------------------------+ | |||
| Literal Header Field With Name Reference | Literal Header Field With Name Reference | |||
| For entries in the static table or in the dynamic table with an | For entries in the static table or in the dynamic table with an | |||
| absolute index less than or equal to Base Index, the header field | absolute index less than the Base, the header field name is | |||
| name is represented using the relative index of that entry, which is | represented using the relative index of that entry, which is | |||
| represented as an integer with a 4-bit prefix (see Section 5.1 of | represented as an integer with a 4-bit prefix (see Section 5.1 of | |||
| [RFC7541]). The "S" bit indicates whether the reference is to the | [RFC7541]). The "S" bit indicates whether the reference is to the | |||
| static (S=1) or dynamic (S=0) table. | static (S=1) or dynamic (S=0) table. | |||
| 4.5.5. Literal Header Field With Post-Base Name Reference | 4.5.5. Literal Header Field With Post-Base Name Reference | |||
| For entries in the dynamic table with an absolute index greater than | For entries in the dynamic table with an absolute index greater than | |||
| Base Index, the header field name is represented using the post-base | or equal to the Base, the header field name is represented using the | |||
| index of that entry (see Section 3.2.6) encoded as an integer with a | post-base index of that entry (see Section 3.2.7) encoded as an | |||
| 3-bit prefix. | integer with a 3-bit prefix. | |||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | 0 | 0 | 0 | 0 | N |NameIdx(3+)| | | 0 | 0 | 0 | 0 | N |NameIdx(3+)| | |||
| +---+---+---+---+---+-----------+ | +---+---+---+---+---+-----------+ | |||
| | H | Value Length (7+) | | | H | Value Length (7+) | | |||
| +---+---------------------------+ | +---+---------------------------+ | |||
| | Value String (Length bytes) | | | Value String (Length bytes) | | |||
| +-------------------------------+ | +-------------------------------+ | |||
| skipping to change at page 23, line 34 ¶ | skipping to change at page 24, line 32 ¶ | |||
| | Value String (Length bytes) | | | Value String (Length bytes) | | |||
| +-------------------------------+ | +-------------------------------+ | |||
| Literal Header Field Without Name Reference | Literal Header Field Without Name Reference | |||
| 5. Configuration | 5. Configuration | |||
| QPACK defines two settings which are included in the HTTP/3 SETTINGS | QPACK defines two settings which are included in the HTTP/3 SETTINGS | |||
| frame. | frame. | |||
| SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of | SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x1): An integer with a maximum | |||
| 2^30 - 1. The default value is zero bytes. See Section 3.2 for | value of 2^30 - 1. The default value is zero bytes. See | |||
| usage. | Section 3.2 for usage. This is the equivalent of the | |||
| SETTINGS_HEADER_TABLE_SIZE from HTTP/2. | ||||
| SETTINGS_QPACK_BLOCKED_STREAMS (0x7): An integer with a maximum | SETTINGS_QPACK_BLOCKED_STREAMS (0x7): An integer with a maximum | |||
| value of 2^16 - 1. The default value is zero. See Section 2.1.3. | value of 2^16 - 1. The default value is zero. 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 stream or connection from continuing: | of QPACK which prevent the stream or connection from continuing: | |||
| HTTP_QPACK_DECOMPRESSION_FAILED (TBD): The decoder failed to | HTTP_QPACK_DECOMPRESSION_FAILED (TBD): The decoder failed to | |||
| skipping to change at page 24, line 25 ¶ | skipping to change at page 25, line 25 ¶ | |||
| 8. IANA Considerations | 8. IANA Considerations | |||
| 8.1. Settings Registration | 8.1. Settings Registration | |||
| This document creates two new settings in the "HTTP/3 Settings" | This document creates two new settings in the "HTTP/3 Settings" | |||
| registry established in [HTTP3]. | registry established in [HTTP3]. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +-----------------------+------+---------------+ | +--------------------------+------+---------------+ | |||
| | Setting Name | Code | Specification | | | Setting Name | Code | Specification | | |||
| +-----------------------+------+---------------+ | +--------------------------+------+---------------+ | |||
| | HEADER_TABLE_SIZE | 0x1 | Section 5 | | | QPACK_MAX_TABLE_CAPACITY | 0x1 | Section 5 | | |||
| | | | | | | | | | | |||
| | QPACK_BLOCKED_STREAMS | 0x7 | Section 5 | | | QPACK_BLOCKED_STREAMS | 0x7 | Section 5 | | |||
| +-----------------------+------+---------------+ | +--------------------------+------+---------------+ | |||
| 8.2. Stream Type Registration | 8.2. Stream Type Registration | |||
| This document creates two new settings in the "HTTP/3 Stream Type" | This document creates two new settings in the "HTTP/3 Stream Type" | |||
| registry established in [HTTP3]. | registry established in [HTTP3]. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +----------------------+------+---------------+--------+ | +----------------------+------+---------------+--------+ | |||
| | Stream Type | Code | Specification | Sender | | | Stream Type | Code | Specification | Sender | | |||
| skipping to change at page 25, line 28 ¶ | skipping to change at page 26, line 28 ¶ | |||
| | HTTP_QPACK_DECODER_STREAM_ER | TBD | Error on the | Section 6 | | | HTTP_QPACK_DECODER_STREAM_ER | TBD | Error on the | Section 6 | | |||
| | ROR | | decoder | | | | ROR | | 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-17 (work in progress), | (HTTP/3)", draft-ietf-quic-http-18 (work in progress), | |||
| December 2018. | January 2019. | |||
| [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", draft-ietf-quic- | |||
| transport-16 (work in progress), December 2018. | transport-17 (work in progress), January 2019. | |||
| [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 33, line 10 ¶ | skipping to change at page 34, line 10 ¶ | |||
| 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-04 | C.1. 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. | ||||
| C.2. Since draft-ietf-quic-qpack-04 | ||||
| o Changed calculation of Delta Base Index to avoid an illegal value | o Changed calculation of Delta Base Index to avoid an illegal value | |||
| (#2002, #2005) | (#2002, #2005) | |||
| C.2. Since draft-ietf-quic-qpack-03 | C.3. Since draft-ietf-quic-qpack-03 | |||
| o Change HTTP settings defaults (#2038) | o Change HTTP settings defaults (#2038) | |||
| o Substantial editorial reorganization | o Substantial editorial reorganization | |||
| C.3. Since draft-ietf-quic-qpack-02 | C.4. Since draft-ietf-quic-qpack-02 | |||
| o Largest Reference encoded modulo MaxEntries (#1763) | o Largest Reference encoded modulo MaxEntries (#1763) | |||
| o New Static Table (#1355) | o New Static Table (#1355) | |||
| o Table Size Update with Insert Count=0 is a connection error | o Table Size Update with Insert Count=0 is a connection error | |||
| (#1762) | (#1762) | |||
| o Stream Cancellations are optional when | o Stream Cancellations are optional when | |||
| SETTINGS_HEADER_TABLE_SIZE=0 (#1761) | SETTINGS_HEADER_TABLE_SIZE=0 (#1761) | |||
| skipping to change at page 33, line 43 ¶ | skipping to change at page 35, line 5 ¶ | |||
| o Implementations must handle 62 bit integers (#1760) | o Implementations must handle 62 bit integers (#1760) | |||
| o Different error types for each QPACK stream, other changes to | o Different error types for each QPACK stream, other changes to | |||
| error handling (#1726) | error handling (#1726) | |||
| o Preserve header field order (#1725) | o Preserve header field order (#1725) | |||
| o Initial table size is the maximum permitted when table is first | o Initial table size is the maximum permitted when table is first | |||
| usable (#1642) | usable (#1642) | |||
| C.4. Since draft-ietf-quic-qpack-01 | C.5. Since draft-ietf-quic-qpack-01 | |||
| o Only header blocks that reference the dynamic table are | o Only header blocks that reference the dynamic table are | |||
| acknowledged (#1603, #1605) | acknowledged (#1603, #1605) | |||
| C.5. Since draft-ietf-quic-qpack-00 | C.6. Since draft-ietf-quic-qpack-00 | |||
| o Renumbered instructions for consistency (#1471, #1472) | o Renumbered instructions for consistency (#1471, #1472) | |||
| o Decoder is allowed to validate largest reference (#1404, #1469) | o Decoder is allowed to validate largest reference (#1404, #1469) | |||
| o Header block acknowledgments also acknowledge the associated | o Header block acknowledgments also acknowledge the associated | |||
| largest reference (#1370, #1400) | largest reference (#1370, #1400) | |||
| o Added an acknowledgment for unread streams (#1371, #1400) | o Added an acknowledgment for unread streams (#1371, #1400) | |||
| o Removed framing from encoder stream (#1361,#1467) | o Removed framing from encoder stream (#1361,#1467) | |||
| o Control streams use typed unidirectional streams rather than fixed | o Control streams use typed unidirectional streams rather than fixed | |||
| stream IDs (#910,#1359) | stream IDs (#910,#1359) | |||
| C.6. Since draft-ietf-quic-qcram-00 | C.7. Since draft-ietf-quic-qcram-00 | |||
| o Separate instruction sets for table updates and header blocks | o Separate instruction sets for table updates and header blocks | |||
| (#1235, #1142, #1141) | (#1235, #1142, #1141) | |||
| o Reworked indexing scheme (#1176, #1145, #1136, #1130, #1125, | o Reworked indexing scheme (#1176, #1145, #1136, #1130, #1125, | |||
| #1314) | #1314) | |||
| o Added mechanisms that support one-pass encoding (#1138, #1320) | o Added mechanisms that support one-pass encoding (#1138, #1320) | |||
| o Added a setting to control the number of blocked decoders (#238, | o Added a setting to control the number of blocked decoders (#238, | |||
| End of changes. 105 change blocks. | ||||
| 301 lines changed or deleted | 348 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||