diff --git a/draft-ietf-quic-qpack.md b/draft-ietf-quic-qpack.md index 53210d4081..191405c7b1 100644 --- a/draft-ietf-quic-qpack.md +++ b/draft-ietf-quic-qpack.md @@ -489,9 +489,18 @@ After processing a set of instructions on the encoder stream, the decoder will emit a Table State Synchronize instruction on the decoder stream. The instruction begins with the '1' one-bit pattern. The instruction specifies the total number of dynamic table inserts and duplications since the last Table -State Synchronize, encoded as a 7-bit prefix integer. The encoder uses this -value to determine which table entries are vulnerable to head-of-line blocking. -A decoder MAY coalesce multiple synchronization updates into a single update. +State Synchronize or Header Acknowledgement that increased the largest +acknolwedged dynamic table entry. This is encoded as a 7-bit prefix integer. +The encoder uses this value to determine which table entries are vulnerable to +head-of-line blocking. + +A decoder MAY coalesce multiple synchronization updates into a single update. A +decoder MAY rely on Header Acknowledgement instructions to indirectly +acknowledge changes to the dynamic table. Relying on Header Acknowledgment +instructions exclusively leads to poor compression efficiency if the encoder +waits for an entry to be acknowledged before using it. This happens if the +encoder wants to avoid the risk of blocking at the decoder, or the encoder has +already reached the decoder's limit for blocked streams. ~~~~~~~~~~ drawing 0 1 2 3 4 5 6 7 @@ -499,7 +508,7 @@ A decoder MAY coalesce multiple synchronization updates into a single update. | 1 | Insert Count (7+) | +---+---------------------------+ ~~~~~~~~~~ -{:#fig-size-sync title="Table Size Synchronize"} +{:#fig-size-sync title="Table State Synchronize"} ### Header Acknowledgement @@ -523,6 +532,16 @@ blocks within a stream have been fully processed. ~~~~~~~~~~ {:#fig-header-ack title="Header Acknowledgement"} +An encoder MUST treat receipt of a Header Acknowledgment as also acknowledging +any dynamic table entries that the header block referenced. That is, this +instruction is also processed as a Table State Synchronize instruction with a +value matching the Largest Reference of the corresponding header block. + +A decoder MUST track increases to the largest acknowledged dynamic table entry +caused by acknowledging a header block so that it can correctly generate the +Table State Synchronize instruction. + + ## Request and Push Streams HEADERS and PUSH_PROMISE frames on request and push streams reference the