<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.8 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-quic-qpack-00" category="std">

  <front>
    <title abbrev="QPACK">QPACK: Header Compression for HTTP over QUIC</title>

    <author initials="C." surname="Krasic" fullname="Charles 'Buck' Krasic">
      <organization>Google, Inc</organization>
      <address>
        <email>ckrasic@google.com</email>
      </address>
    </author>
    <author initials="M." surname="Bishop" fullname="Mike Bishop">
      <organization>Akamai Technologies</organization>
      <address>
        <email>mbishop@evequefou.be</email>
      </address>
    </author>
    <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
      <organization>Facebook</organization>
      <address>
        <email>afrind@fb.com</email>
      </address>
    </author>

    <date year="2018" month="May" day="23"/>

    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    

    <abstract>


<t>This specification defines QPACK, a compression format for efficiently
representing HTTP header fields, to be used in HTTP over QUIC. This is a
variation of HPACK header compression that seeks to reduce head-of-line
blocking.</t>



    </abstract>


    <note title="Note to Readers">


<t>Discussion of this draft takes place on the QUIC working group mailing list
(quic@ietf.org), which is archived at
<eref target="https://mailarchive.ietf.org/arch/search/?email_list=quic">https://mailarchive.ietf.org/arch/search/?email_list=quic</eref>.</t>

<t>Working Group information can be found at <eref target="https://github.com/quicwg">https://github.com/quicwg</eref>; source
code and issues list for this draft can be found at
<eref target="https://github.com/quicwg/base-drafts/labels/-qpack">https://github.com/quicwg/base-drafts/labels/-qpack</eref>.</t>


    </note>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>The QUIC transport protocol was designed from the outset to support HTTP
semantics, and its design subsumes many of the features of HTTP/2.  QUIC’s
stream multiplexing comes into some conflict with header compression.  A key
goal of the design of QUIC is to improve stream multiplexing relative to HTTP/2
by eliminating HoL (head of line) blocking, which can occur in HTTP/2.  HoL
blocking can happen because all HTTP/2 streams are multiplexed onto a single TCP
connection with its in-order semantics.  QUIC can maintain independence between
streams because it implements core transport functionality in a fully
stream-aware manner.  However, the HTTP/QUIC mapping is still subject to HoL
blocking if HPACK is used directly.  HPACK exploits multiplexing for greater
compression, shrinking the representation of headers that have appeared earlier
on the same connection.  In the context of QUIC, this imposes a vulnerability to
HoL blocking (see <xref target="hol-example"/>).</t>

<t>QUIC is described in <xref target="QUIC-TRANSPORT"/>.  The HTTP/QUIC
mapping is described in <xref target="QUIC-HTTP"/>. For a full
description of HTTP/2, see <xref target="RFC7540"/>. The description of HPACK is
<xref target="RFC7541"/>, with important terminology in Section 1.3.</t>

<t>QPACK modifies HPACK to allow correctness in the presence of out-of-order
delivery, with flexibility for implementations to balance between resilience
against HoL blocking and optimal compression ratio.  The design goals are to
closely approach the compression ratio of HPACK with substantially less
head-of-line blocking under the same loss conditions.</t>

<t>QPACK is intended to be a relatively non-intrusive extension to HPACK; an
implementation should be easily shared within stacks supporting both HTTP/2 over
(TLS+)TCP and HTTP/QUIC.</t>

<section anchor="hol-example" title="Head-of-Line Blocking in HPACK">

<t>HPACK enables several types of header representations, one of which also adds
the header to a dynamic table of header values.  These values are then available
for reuse in subsequent header blocks simply by referencing the entry number in
the table.</t>

<t>If the packet containing a header is lost, that stream cannot complete header
processing until the packet is retransmitted.  This is unavoidable. However,
other streams which rely on the state created by that packet <spanx style="emph">also</spanx> cannot make
progress. This is the problem which QUIC solves in general, but which is
reintroduced by HPACK when the loss includes a HEADERS frame.</t>

</section>
<section anchor="overview-hol-avoidance" title="Avoiding Head-of-Line Blocking in HTTP/QUIC">

<t>Because QUIC does not guarantee order between data on different streams, a
header block might reference an entry in the dynamic table that has not yet been
received.</t>

<t>Each header block contains a Largest Reference (see <xref target="absolute-index"/>) which
identifies the table state necessary for decoding. If the greatest absolute
index in the dynamic table is less than the value of the Largest Reference, the
stream is considered “blocked.”  While blocked, header field data should remain
in the blocked stream’s flow control window.  When the Largest Reference is
zero, the frame contains no references to the dynamic table and can always be
processed immediately. A stream becomes unblocked when the greatest absolute
index in the dynamic table becomes greater than or equal to the Largest
Reference for all header blocks the decoder has started reading from the stream.</t>

<t>A decoder can permit the possibility of blocked streams by setting
SETTINGS_QPACK_BLOCKED_STREAMS to a non-zero value.  This setting specifies an
upper bound on the number of streams which can be blocked.</t>

<t>An encoder can decide whether to risk having a stream become blocked. If
permitted by the value of SETTINGS_QPACK_BLOCKED_STREAMS, compression efficiency
can be improved by referencing dynamic table entries that are still in transit,
but if there is loss or reordering the stream can become blocked at the decoder.
An encoder avoids the risk of blocking by only referencing dynamic table entries
which have been acknowledged, but this means using literals. Since literals make
the header block larger, this can result in the encoder becoming blocked on
congestion or flow control limits.</t>

<t>An encoder MUST limit the number of streams which could become blocked to the
value of SETTINGS_QPACK_BLOCKED_STREAMS at all times. Note that the decoder
might not actually become blocked on every stream which risks becoming blocked.
If the decoder encounters more blocked streams than it promised to support, it
SHOULD treat this as a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.</t>

</section>
</section>
<section anchor="conventions-and-definitions" title="Conventions and Definitions">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
“SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>

<t>Definitions of terms that are used in this document:</t>

<t><list style="hanging">
  <t hangText='Header:'>
  A name-value pair sent as part of an HTTP message.</t>
  <t hangText='Header set:'>
  The full collection of headers associated with an HTTP message.</t>
  <t hangText='Header block:'>
  The compressed representation of a header set.</t>
  <t hangText='Encoder:'>
  An implementation which transforms a header set into a header block.</t>
  <t hangText='Decoder:'>
  An implementation which transforms a header block into a header set.</t>
</list></t>

<t>QPACK is a name, not an acronym.</t>

<section anchor="notational-conventions" title="Notational Conventions">

<t>Diagrams use the format described in Section 3.1 of <xref target="RFC2360"/>, with the
following additional conventions:</t>

<t><list style="hanging">
  <t hangText='x (A)'>
  Indicates that x is A bits long</t>
  <t hangText='x (A+)'>
  Indicates that x uses the prefixed integer encoding defined in Section 5.1 of
<xref target="RFC7541"></xref>, beginning with an A-bit prefix.</t>
  <t hangText='x …'>
  Indicates that x is variable-length and extends to the end of the region.</t>
</list></t>

</section>
</section>
<section anchor="wire-format" title="Wire Format">

<t>QPACK instructions occur in three locations, each of which uses a separate
instruction space:</t>

<t><list style="symbols">
  <t>Table updates are carried by a unidirectional stream from encoder to decoder.
Instructions on this stream modify the dynamic table state without generating
output to any particular request.</t>
  <t>Acknowledgements of table modifications and header processing are carried by
a unidirectional stream from decoder to encoder.</t>
  <t>Finally, the contents of HEADERS and PUSH_PROMISE frames on request streams
reference the QPACK table state.</t>
</list></t>

<t>This section describes the instructions which are possible on each stream type.</t>

<t>All table updates occur on the control stream.  Request streams only carry
header blocks that do not modify the state of the table.</t>

<section anchor="primitives" title="Primitives">

<t>The prefixed integer from Section 5.1 of <xref target="RFC7541"></xref> is used heavily throughout
this document.  The string literal, defined by Section 5.2 of <xref target="RFC7541"></xref>, is used
with the following modification.</t>

<t>HPACK defines string literals to begin on a byte boundary.  They begin with a
single flag (indicating whether the string is Huffman-coded), followed by the
Length encoded as a 7-bit prefix integer, and finally Length octets of data.</t>

<t>QPACK permits strings to begin other than on a byte boundary.  An “N-bit prefix
string literal” begins with the same Huffman flag, followed by the length
encoded as an (N-1)-bit prefix integer.  The remainder of the string literal is
unmodified.</t>

<t>A string literal without a prefix length noted is an 8-bit prefix string literal
and follows the definitions in <xref target="RFC7541"></xref> without modification.</t>

</section>
<section anchor="indexing" title="Indexing">

<t>Entries in the QPACK static and dynamic tables are addressed separately.</t>

<t>Entries in the static table have the same indices at all times.  The static
table is defined in Appendix A of <xref target="RFC7541"/>. Note that because HPACK did not
use zero-based references, there is no value at index zero of the static table.</t>

<t>Entries are inserted into the dynamic table over time.  Each entry possesses
both an absolute index which is fixed for the lifetime of that entry and a
relative index which changes over time based on the context of the reference.
The first entry inserted has an absolute index of “1”; indices
increase sequentially with each insertion.</t>

<t>On the control stream, a relative index of “0” always refers to the most
recently inserted value in the dynamic table.  Note that this means the
entry referenced by a given relative index can change while interpreting
a HEADERS frame as new entries are inserted.</t>

<figure title="Example Dynamic Table Indexing - Control Stream"><artwork type="drawing"><![CDATA[
    +---+---------------+-------+
    | n |      ...      | d + 1 |  Absolute Index
    + - +---------------+   -   +
    | 0 |      ...      | n-d-1 |  Relative Index
    +---+---------------+-------+
      ^                     |
      |                     V
Insertion Point         Dropping Point

n = count of entries inserted
d = count of entries dropped
]]></artwork></figure>

<t>Because frames from request streams can be delivered out of order with
instructions on the control stream, relative indices are relative to the Base
Index at the beginning of the header block (see <xref target="absolute-index"/>). The Base
Index is the absolute index of the entry which has the relative index of zero
when interpreting the frame.  The relative indices of entries do not change
while interpreting headers on a request or push stream.</t>

<figure title="Example Dynamic Table Indexing - Request Stream"><artwork type="drawing"><![CDATA[
             Base Index
                 |
                 V
    +---+-----+-----+-----+-------+
    | n | n-1 | n-2 | ... |  d+1  |  Absolute Index
    +---+-----+  -  +-----+   -   +
              |  0  | ... | n-d-3 |  Relative Index
              +-----+-----+-------+

n = count of entries inserted
d = count of entries dropped
]]></artwork></figure>

<t>Entries with an absolute index greater than a frame’s Base Index can be
referenced using specific Post-Base instructions.  The relative indices of
Post-Base references count up from Base Index.</t>

<figure title="Dynamic Table Indexing - Post-Base References"><artwork type="drawing"><![CDATA[
             Base Index
                 |
                 V
    +---+-----+-----+-----+-----+
    | n | n-1 | n-2 | ... | d+1 |  Absolute Index
    +---+-----+-----+-----+-----+
    | 1 |  0  |                    Post-Base Index
    +---+-----+

n = count of entries inserted
d = count of entries dropped
]]></artwork></figure>

<t>If the decoder encounters a reference to an entry which has already been dropped
from the table or which is greater than the declared Largest Reference, this
MUST be treated as a stream error of type <spanx style="verb">HTTP_QPACK_DECOMPRESSION_FAILED</spanx>
error code.  If this reference occurs on the control stream, this MUST be
treated as a session error.</t>

</section>
<section anchor="qpack-encoder-stream" title="QPACK Encoder Stream">

<t>Table updates can add a table entry, possibly using existing entries to avoid
transmitting redundant information.  The name can be transmitted as a reference
to an existing entry in the static or the dynamic table or as a string literal.
For entries which already exist in the dynamic table, the full entry can also be
used by reference, creating a duplicate entry.</t>

<t>Each set of encoder instructions is prefaced by its length, encoded as a
variable length integer with an 8-bit prefix.  Instructions MUST NOT span more
than one block.</t>

<figure title="Encoder instruction block"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   |       Block Length (8+)       |
   +-------------------------------+
   |     Instruction Block (*)   ...
   +-------------------------------+
]]></artwork></figure>

<section anchor="insert-with-name-reference" title="Insert With Name Reference">

<t>An addition to the header table where the header field name matches the header
field name of an entry stored in the static table or the dynamic table starts
with the ‘1’ one-bit pattern.  The <spanx style="verb">S</spanx> bit indicates whether the reference is to
the static (S=1) or dynamic (S=0) table. The header field name is represented
using the relative index of that entry, which is represented as an integer with
a 6-bit prefix (see Section 5.1 of <xref target="RFC7541"></xref>).</t>

<t>The header name reference is followed by the header field value represented as a
string literal (see Section 5.2 of <xref target="RFC7541"></xref>).</t>

<figure title="Insert Header Field -- Indexed Name"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 1 | S |    Name Index (6+)    |
   +---+---+-----------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   | Value String (Length octets)  |
   +-------------------------------+
]]></artwork></figure>

</section>
<section anchor="insert-without-name-reference" title="Insert Without Name Reference">

<t>An addition to the header table where both the header field name and the header
field value are represented as string literals (see <xref target="primitives"/>) starts with
the ‘01’ two-bit pattern.</t>

<t>The name is represented as a 6-bit prefix string literal, while the value is
represented as an 8-bit prefix string literal.</t>

<figure title="Insert Header Field -- New Name"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 1 | H | Name Length (5+)  |
   +---+---+---+-------------------+
   |  Name String (Length octets)  |
   +---+---------------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   | Value String (Length octets)  |
   +-------------------------------+
]]></artwork></figure>

</section>
<section anchor="duplicate" title="Duplicate">

<t>Duplication of an existing entry in the dynamic table starts with the ‘000’
three-bit pattern.  The relative index of the existing entry is represented as
an integer with a 5-bit prefix.</t>

<figure title="Duplicate" anchor="fig-index-with-duplication"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 0 | 0 |    Index (5+)     |
   +---+---+---+-------------------+
]]></artwork></figure>

<t>The existing entry is re-inserted into the dynamic table without resending
either the name or the value. This is useful to mitigate 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 table blocking the ability to insert new
headers.</t>

</section>
<section anchor="dynamic-table-size-update" title="Dynamic Table Size Update">

<t>An encoder informs the decoder of a change to the size of the dynamic table
using an instruction which begins with the ‘001’ three-bit pattern.  The new
maximum table size is represented as an integer with a 5-bit prefix (see Section
5.1 of <xref target="RFC7541"></xref>).</t>

<figure title="Maximum Dynamic Table Size Change" anchor="fig-size-change"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 1 |   Max size (5+)   |
+---+---+---+-------------------+
]]></artwork></figure>

<t>The new maximum size MUST be lower than or equal to the limit determined by the
protocol using QPACK.  A value that exceeds this limit MUST be treated as a
decoding error.  In HTTP/QUIC, this limit is the value of the
SETTINGS_HEADER_TABLE_SIZE parameter (see <xref target="QUIC-HTTP"></xref>) received from the
decoder.</t>

<t>Reducing the maximum size of the dynamic table can cause entries to be evicted
(see Section 4.3 of <xref target="RFC7541"></xref>).  This MUST NOT cause the eviction of entries
with outstanding references (see <xref target="reference-tracking"/>).</t>

</section>
</section>
<section anchor="feedback" title="QPACK Decoder Stream">

<t>The decoder stream carries information used to ensure consistency of the dynamic
table. Information is sent from the QPACK decoder to the QPACK encoder; that is,
the server informs the client about the processing of the client’s header blocks
and table updates, and the client informs the server about the processing of the
server’s header blocks and table updates.</t>

<section anchor="table-state-synchronize" title="Table State Synchronize">

<t>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.</t>

<figure title="Table Size Synchronize" anchor="fig-size-sync"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 1 |     Insert Count (7+)     |
+---+---------------------------+
]]></artwork></figure>

</section>
<section anchor="header-acknowledgement" title="Header Acknowledgement">

<t>After processing a header block on a request or push stream, the decoder emits a
Header Acknowledgement instruction on the decoder stream.  The instruction
begins with the ‘0’ one-bit pattern and includes the request stream’s stream ID,
encoded as a 7-bit prefix integer.  It is used by the peer’s QPACK encoder to
know when it is safe to evict an entry.</t>

<t>The same Stream ID can be identified multiple times, as multiple header blocks
can be sent on a single stream in the case of intermediate responses, trailers,
and pushed requests.  Since header frames on each stream are received and
processed in order, this gives the encoder precise feedback on which header
blocks within a stream have been fully processed.</t>

<figure title="Header Acknowledgement" anchor="fig-header-ack"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 |      Stream ID (7+)       |
+---+---------------------------+
]]></artwork></figure>

</section>
</section>
<section anchor="request-and-push-streams" title="Request and Push Streams">

<t>HEADERS and PUSH_PROMISE frames on request and push streams reference the
dynamic table in a particular state without modifying it.  Frames on these
streams emit the headers for an HTTP request or response.</t>

<section anchor="absolute-index" title="Header Data Prefix">

<t>Header data is prefixed with two integers, <spanx style="verb">Largest Reference</spanx> and <spanx style="verb">Base Index</spanx>.</t>

<figure title="Frame Payload" anchor="fig-base-index"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
|     Largest Reference (8+)    |
+---+---------------------------+
| S |   Delta Base Index (7+)   |
+---+---------------------------+
|      Compressed Headers     ...
+-------------------------------+
]]></artwork></figure>

<t><spanx style="verb">Largest Reference</spanx> identifies the largest absolute dynamic index referenced in
the block.  Blocking decoders use the Largest Reference to determine when it is
safe to process the rest of the block.</t>

<t><spanx style="verb">Base Index</spanx> is used to resolve references in the dynamic table as described in
<xref target="indexing"/>.  To save space, Base Index is encoded relative to Largest
Reference using a one-bit sign flag.</t>

<figure><artwork><![CDATA[
baseIndex = largestReference + deltaBaseIndex
]]></artwork></figure>

<t>If the encoder inserted entries to the table while the encoding the block,
Largest Reference will be greater than Base Index, so deltaBaseIndex will be
negative and encoded with S=1.  If the block did not reference the most recent
entry in the table and did not insert any new entries, Largest Reference will be
less than Base Index, so deltaBaseIndex will be positive and encoded with S=0.
When Largest Reference and Base Index are equal, deltaBaseIndex is 0 and encoded
with S=0.</t>

</section>
<section anchor="instructions" title="Instructions">

<section anchor="indexed-header-field" title="Indexed Header Field">

<t>An indexed header field representation identifies an entry in either 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 <xref target="RFC7541"></xref>.</t>

<figure title="Indexed Header Field"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 1 | S |      Index (6+)       |
+---+---+-----------------------+
]]></artwork></figure>

<t>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 starts with the ‘1’
1-bit pattern, followed by the <spanx style="verb">S</spanx> bit indicating whether the reference is into
the static (S=1) or dynamic (S=0) table. Finally, the relative index of the
matching header field is represented as an integer with a 6-bit prefix (see
Section 5.1 of <xref target="RFC7541"></xref>).</t>

<figure title="Indexed Header Field"><artwork type="drawing"><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 |  Index (4+)   |
+---+---+-----------------------+
]]></artwork></figure>

<t>If the entry is in the dynamic table with an absolute index greater than Base
Index, the representation starts with the ‘0100’ 4-bit pattern, followed by the
post-base index (see <xref target="indexing"/>) of the matching header field, represented as
an integer with a 4-bit prefix (see Section 5.1 of <xref target="RFC7541"></xref>).</t>

</section>
<section anchor="literal-header-field-with-name-reference" title="Literal Header Field With Name Reference">

<t>A literal header field with a name reference represents a header where the
header field name matches the header field name of an entry stored in the static
table or the dynamic table.</t>

<t>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 starts with the ‘00’
two-bit pattern.  If the entry is in the dynamic table with an absolute index
greater than Base Index, the representation starts with the ‘0101’ four-bit
pattern.</t>

<t>The following bit, ‘N’, indicates whether an intermediary is permitted to add
this header to the dynamic header table on subsequent hops. When the ‘N’ bit is
set, the encoded header MUST always be encoded with a literal representation. In
particular, when 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 representation
to forward this header field.  This bit is intended for protecting header field
values that are not to be put at risk by compressing them (see Section 7.1 of
<xref target="RFC7541"></xref> for more details).</t>

<figure title="Literal Header Field With Name Reference"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 0 | N | S |Name Index (4+)|
   +---+---+-----------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   | Value String (Length octets)  |
   +-------------------------------+
]]></artwork></figure>

<t>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 name 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 <xref target="RFC7541"></xref>). The <spanx style="verb">S</spanx> bit indicates whether the
reference is to the static (S=1) or dynamic (S=0) table.</t>

<figure title="Literal Header Field With Post-Base Name Reference"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 1 | 0 | 1 | N |NameIdx(3+)|
   +---+---+-----------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   | Value String (Length octets)  |
   +-------------------------------+
]]></artwork></figure>

<t>For entries in the dynamic table with an absolute index greater than Base Index,
the header field name is represented using the post-base index of that entry
(see <xref target="indexing"/>) encoded as an integer with a 3-bit prefix.</t>

</section>
<section anchor="literal-header-field-without-name-reference" title="Literal Header Field Without Name Reference">

<t>An addition to the header table where both the header field name and the header
field value are represented as string literals (see <xref target="primitives"/>) starts with
the ‘011’ three-bit pattern.</t>

<t>The fourth bit, ‘N’, indicates whether an intermediary is permitted to add this
header to the dynamic header table on subsequent hops. When the ‘N’ bit is set,
the encoded header MUST always be encoded with a literal representation. In
particular, when 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 representation
to forward this header field.  This bit is intended for protecting header field
values that are not to be put at risk by compressing them (see Section 7.1 of
<xref target="RFC7541"></xref> for more details).</t>

<t>The name is represented as a 4-bit prefix string literal, while the value is
represented as an 8-bit prefix string literal.</t>

<figure title="Literal Header Field Without Name Reference"><artwork type="drawing"><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 1 | 1 | N | H |NameLen(3+)|
   +---+---+---+-------------------+
   |  Name String (Length octets)  |
   +---+---------------------------+
   | H |     Value Length (7+)     |
   +---+---------------------------+
   | Value String (Length octets)  |
   +-------------------------------+
]]></artwork></figure>

</section>
</section>
</section>
</section>
<section anchor="encoding-strategies" title="Encoding Strategies">

<section anchor="single-pass-encoding" title="Single pass encoding">

<t>An encoder making a single pass over a list of headers must choose Base Index
before knowing Largest Reference.  When trying to reference a header inserted to
the table after encoding has begun, the entry is encoded with different
instructions that tell the decoder to use an absolute index greater than the
Base Index.</t>

</section>
<section anchor="evictions" title="Preventing Eviction Races">

<t>Due to out-of-order arrival, QPACK’s eviction algorithm requires changes
(relative to HPACK) to avoid the possibility that an indexed representation is
decoded after the referenced entry has already been evicted.  QPACK employs a
two-phase eviction algorithm, in which the encoder will not evict entries that
have outstanding (unacknowledged) references.</t>

</section>
<section anchor="reference-tracking" title="Reference Tracking">

<t>An encoder MUST ensure that a header block which references a dynamic table
entry is not received by the decoder after the referenced entry has already been
evicted.  An encoder also respects the limit set by the decoder on the number of
streams that are allowed to become blocked. Even if the decoder is willing to
tolerate blocked streams, the encoder might choose to avoid them in certain
cases.</t>

<t>In order to enable this, the encoder will need to track outstanding
(unacknowledged) header blocks and table updates using feedback received from
the decoder.</t>

<section anchor="blocked-eviction" title="Blocked Eviction">

<t>The encoder MUST NOT permit an entry to be evicted while a reference to that
entry remains unacknowledged.  If a new header to be inserted into the dynamic
table would cause the eviction of such an entry, the encoder MUST NOT emit the
insert instruction until the reference has been processed by the decoder and
acknowledged.</t>

<t>The encoder can emit a literal representation for the new header in order to
avoid encoding delays, and MAY insert the header into the table later if
desired.</t>

<t>To ensure that the blocked eviction case is rare, references to the oldest
entries in the dynamic table SHOULD be avoided.  When one of the oldest entries
in the table is still actively used for references, the encoder SHOULD emit an
Duplicate representation instead (see <xref target="duplicate"/>).</t>

</section>
<section anchor="blocked-decoding" title="Blocked Decoding">

<t>For header blocks encoded in non-blocking mode, the encoder needs to forego
indexed representations that refer to table updates which have not yet been
acknowledged with <xref target="feedback"/>.  Since all table updates are processed in
sequence on the control stream, an index into the dynamic table is sufficient to
track which entries have been acknowledged.</t>

<t>To track blocked streams, the necessary Base Index value for each stream
can be used.  Whenever the decoder processes a table update, it can begin
decoding any blocked streams that now have their dependencies satisfied.</t>

</section>
</section>
<section anchor="speculative-updates" title="Speculative table updates">

<t>Implementations can <spanx style="emph">speculatively</spanx> send header frames on the HTTP Control
Streams which are not needed for any current HTTP request or response.  Such
headers could be used strategically to improve performance.  For instance, the
encoder might decide to <spanx style="emph">refresh</spanx> by sending Duplicate representations for
popular header fields (<xref target="duplicate"/>), ensuring they have small indices and
hence minimal size on the wire.</t>

</section>
<section anchor="sample-one-pass-encoding-algorithm" title="Sample One Pass Encoding Algorithm">

<t>Pseudo-code for single pass encoding, excluding handling of duplicates,
non-blocking mode, and reference tracking.</t>

<figure><artwork><![CDATA[
baseIndex = dynamicTable.baseIndex
largestReference = 0
for header in headers:
  staticIdx = staticTable.getIndex(header)
  if staticIdx:
    encodeIndexReference(streamBuffer, staticIdx)
    continue

  dynamicIdx = dynamicTable.getIndex(header)
  if !dynamicIdx:
    # No matching entry.  Either insert+index or encode literal
    nameIdx = getNameIndex(header)
    if shouldIndex(header) and dynamicTable.canIndex(header):
      encodeLiteralWithIncrementalIndex(controlBuffer, nameIdx,
                                        header)
      dynamicTable.add(header)
      dynamicIdx = dynamicTable.baseIndex

  if !dynamicIdx:
    # Couldn't index it, literal
    if nameIdx <= staticTable.size:
      encodeLiteral(streamBuffer, nameIndex, header)
    else:
      # encode literal, possibly with nameIdx above baseIndex
      encodeDynamicLiteral(streamBuffer, nameIndex, baseIndex,
                           header)
      largestReference = max(largestReference,
                             dynamicTable.toAbsolute(nameIdx))
  else:
    # Dynamic index reference
    assert(dynamicIdx)
    largestReference = max(largestReference, dynamicIdx)
    # Encode dynamicIdx, possibly with dynamicIdx above baseIndex
    encodeDynamicIndexReference(streamBuffer, dynamicIdx,
                                baseIndex)

# encode the prefix
encodeInteger(prefixBuffer, 0x00, largestReference, 8)
delta = largestReference - baseIndex
sign = delta > 0 ? 0x80 : 0
encodeInteger(prefixBuffer, sign, delta, 7)

return controlBuffer, prefixBuffer + streamBuffer
]]></artwork></figure>

</section>
</section>
<section anchor="security-considerations" title="Security Considerations">

<t>TBD.</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>None.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference anchor="QUIC-HTTP">
<front>
<title>Hypertext Transfer Protocol (HTTP) over QUIC</title>

<author initials='M' surname='Bishop' fullname='Mike Bishop'>
    <organization />
</author>

<date month='April' day='17' year='2018' />

<abstract><t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment.  This document describes a mapping of HTTP semantics over QUIC.  This document also identifies HTTP/2 features that are subsumed by QUIC, and describes how HTTP/2 extensions can be ported to QUIC.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-quic-http-12' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-http-12.txt' />
</reference>



<reference  anchor="RFC7541" target='https://www.rfc-editor.org/info/rfc7541'>
<front>
<title>HPACK: Header Compression for HTTP/2</title>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='H.' surname='Ruellan' fullname='H. Ruellan'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t></abstract>
</front>
<seriesInfo name='RFC' value='7541'/>
<seriesInfo name='DOI' value='10.17487/RFC7541'/>
</reference>



<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>




    </references>

    <references title='Informative References'>





<reference anchor="QUIC-TRANSPORT">
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>

<author initials='J' surname='Iyengar' fullname='Jana Iyengar'>
    <organization />
</author>

<author initials='M' surname='Thomson' fullname='Martin Thomson'>
    <organization />
</author>

<date month='April' day='17' year='2018' />

<abstract><t>This document defines the core of the QUIC transport protocol.  This document describes connection establishment, packet format, multiplexing and reliability.  Accompanying documents describe the cryptographic handshake and loss detection.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-quic-transport-11' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-transport-11.txt' />
</reference>



<reference  anchor="RFC7540" target='https://www.rfc-editor.org/info/rfc7540'>
<front>
<title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
<author initials='M.' surname='Belshe' fullname='M. Belshe'><organization /></author>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='M.' surname='Thomson' fullname='M. Thomson' role='editor'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t><t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t></abstract>
</front>
<seriesInfo name='RFC' value='7540'/>
<seriesInfo name='DOI' value='10.17487/RFC7540'/>
</reference>



<reference  anchor="RFC2360" target='https://www.rfc-editor.org/info/rfc2360'>
<front>
<title>Guide for Internet Standards Writers</title>
<author initials='G.' surname='Scott' fullname='G. Scott'><organization /></author>
<date year='1998' month='June' />
<abstract><t>This document is a guide for Internet standard writers.  It defines those characteristics that make standards coherent, unambiguous, and easy to interpret.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='22'/>
<seriesInfo name='RFC' value='2360'/>
<seriesInfo name='DOI' value='10.17487/RFC2360'/>
</reference>




    </references>


<section numbered="false" anchor="acknowledgments" title="Acknowledgments">

<t>This draft draws heavily on the text of <xref target="RFC7541"/>.  The indirect input of
those authors is gratefully acknowledged, as well as ideas from:</t>

<t><list style="symbols">
  <t>Ryan Hamilton</t>
  <t>Patrick McManus</t>
  <t>Kazuho Oku</t>
  <t>Biren Roy</t>
  <t>Ian Swett</t>
  <t>Dmitri Tikhonov</t>
</list></t>

</section>
<section anchor="change-log" title="Change Log">

<t><list style='empty'>
  <t><spanx style="strong">RFC Editor’s Note:</spanx>  Please remove this section prior to publication of a
final version of this document.</t>
</list></t>

<section anchor="since-draft-ietf-quic-qcram-00" title="Since draft-ietf-quic-qcram-00">

<t><list style="symbols">
  <t>Separate instruction sets for table updates and header blocks (#1235, #1142,
#1141)</t>
  <t>Reworked indexing scheme (#1176, #1145, #1136, #1130, #1125, #1314)</t>
  <t>Added mechanisms that support one-pass encoding (#1138, #1320)</t>
  <t>Added a setting to control the number of blocked decoders (#238, #1140, #1143)</t>
  <t>Moved table updates and acknowledgments to dedicated streams (#1121, #1122,
#1238)</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
zWfSlu8pFcuWg0BXneCuv/csnzebrT4G18xPewOlLEJ9VawurnMr08DrH1dq
dR8JGx+bCufHkH/+qQyEn47NnM9sOvVuBrLp2BOTwmq9crgw4v3GoM9xs93h
lVAFP1gK+cIkETEynb7CmRdhZGIG/T5apnkUI/92Yb+1VTWVO1w7gGVGHtmr
9ssmba5D6WZjsBiTZuPCKsJbXofV28rqbVElYkVK10Bna14+tzgbwZkG3Bbt
Bw2daa3Wrh11c5NIrZvPocjBSOBhLNit3/OJDHNZy+U3Ba3u7ZQsgTOSdGoC
dsoC9EhkJBYP+dyivHn4IbYxVdELe4+rs3uFSM4KeRFZkzlpssBu44VDXk+t
UgO9ZzRjQYG9WTSey9UCyD6iMjNlJNAuC8EMif3w+Z4tlMvUtmW01V+PrYWa
WwtVRxqIPGN5UFI/uBvB6/PrdTCYha/ZHX2v9WD9PFm3nt2Bos3Lq7PhzR6T
oDGmLEOvPQ2wz64/tGqGdkUNF/jQlU1X/PAzv5TRSuSLoHTR2jflCbe/P97L
EQZtwZ2VSN5XLYFDVIXzyVEbcdzskmT5d3DhmVK9lX1yzcalsKb263r+Q+s/
hGW0lXTVPVRuk5dfJY/XGeNyuR2F3x7iu1M/tXuyZPN5w81+HsvnbOlKCXhg
JYe/t6X2fM99tXm/VVJub3MIqqwYv92/qhxs1emsFyiqqTdthsJo90mLrtSO
1W2141/RR93zCwrCa4870qK/Hp/dzk9dPX5NG6olzu1ctLu3C0Hg41sZSS2w
b2zELYCEBU7hNdZ2x5r2Tqr37i4VPf6ifgHSqK+luB/U0rpbQ1wjQMCLMnWr
48CB6u0Ndb0jarXAvNo7or+gd+QWjT34X619qIDYqnk7R+GXsLFa67fck433
tvB0wwIhUmEVvtlaBt/19NbbrV5Hm40wJYf2DH5z9kRFBy7x9rfmwCV/bUFb
Qh4enpQvykFzZArMz2oZPGVT9TyX0FlbSrO7E1BCFyZy3BwiBbPXqgkwe+yR
R5RtwdxG7DG0WH1KVldNymGlj2a93PgLoVXYugmdN7gGROwvhIj1Oipi7aOS
xrUlBkZNcwwYhrhYyEF90FIsSg6yctvm0b1kXwa3vMJFOjUDtJg7C4S96Hmo
Y57y7uVmYxjOSQcuQHwTJWn5W/QIWUvzlj0cv08IjM6/W4/QfbU3Gke/i3RN
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
PV6moAsm2VH/DYxzasJAeQAA

-->

</rfc>

