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