<?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.3 -->

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

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

<rfc ipr="trust200902" docName="draft-bishop-quic-http-and-qpack-05" category="std">

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

    <author initials="M." surname="Bishop" fullname="Mike Bishop">
      <organization>Microsoft</organization>
      <address>
        <email>michael.bishop@microsoft.com</email>
      </address>
    </author>

    <date />

    <area>Transport</area>
    <workgroup>QUIC Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>HTTP/2 <xref target="RFC7540"></xref> uses HPACK <xref target="RFC7541"></xref> for header compression. However, HPACK
relies on the in-order message-based semantics of the HTTP/2 framing layer in
order to function.  Messages can only be successfully decoded if processed by
the decoder in the same order as generated by the encoder.  This draft refines
HPACK to loosen the ordering requirements for use over QUIC
<xref target="I-D.ietf-quic-transport"></xref>.</t>



    </abstract>


  </front>

  <middle>


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

<t>HPACK has a number of features that were intended to provide performance
advantages to HTTP/2, but which don’t live well in an out-of-order environment
such as that provided by QUIC.</t>

<t>The largest challenge is the fact that elements are referenced by a very fluid
index. Not only is the index implicit when an item is added to the header
table, the index will change without notice as other items are added to the
header table. Static entries occupy the first 61 values, followed by dynamic
entries. A newly-added dynamic entry would cause older dynamic entries to be
evicted, and the retained items are then renumbered beginning with 62. This
means that, without processing all preceding header sets, no index into the
dynamic table can be interpreted, and the index of a given entry cannot be
predicted.</t>

<t>Any solution to the above will almost certainly fall afoul of the memory
constraints the decompressor imposes. The automatic eviction of entries is done
based on the compressor’s declared dynamic table size, which MUST be less than
the maximum permitted by the decompressor (and relayed using an HTTP/2 SETTINGS
value).</t>

<t>Further, streams in QUIC are lossy in the presence of stream resets.  While
HTTP/2 (via TCP) guarantees the delivery of all previously-sent data on a stream
even if that stream is reset, QUIC does not retransmit lost frames if a stream
has been reset, and may discard data which has not yet been delivered to the
application.</t>

<t>Previous versions of QPACK were small deltas of HPACK to introduce
order-resiliency. This version departs from HPACK more substantially to add
resilience against reset message streams.</t>

<t>In the following sections, this document proposes a new version of HPACK which
makes different trade-offs, enabling partial out-of-order interpretation and
bounded memory consumption with minimal head-of-line blocking. None of the
proposed improvements to HPACK (strongly-typed fields, binary compression of
common header syntax) are currently included, but certainly could be.</t>

<section anchor="Terminology" title="Terminology">
<t>In this document, the key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL
NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” are to be
interpreted as described in BCP 14, <xref target="RFC2119"></xref> and indicate requirement levels
for compliant implementations.</t>

</section>
</section>
<section anchor="QPACK" title="QPACK">

<section anchor="basic-model" title="Basic model">

<t>HPACK combines header table modification and message header emission in a single
sequence of coded bytes.  QPACK bifurcates these into two channels:</t>

<t><list style="symbols">
  <t>Connection-wide sets of table update instructions sent on non-request
streams</t>
  <t>Non-modifying instructions which use the current header table state to
encode message headers on request streams</t>
</list></t>

<t>Because the per-message instructions introduce no changes to the header table
state, no state is lost if these instructions are discarded due to a stream
reset.  Because the updates to the header table supply their own order controls
(the delete logic), they can be processed in any order and therefore delivered
as messages using unidirectional QUIC streams.</t>

</section>
<section anchor="changes-to-static-and-dynamic-tables" title="Changes to Static and Dynamic Tables">

<t>QPACK uses two tables for associating header fields to indexes. The static
table is unchanged from <xref target="RFC7541"></xref>. Unlike in <xref target="RFC7541"></xref>, the tables are not
concatenated, but are referenced separately.</t>

<t>The dynamic table is a map from index to header field. Indices are arbitrary
numbers between 1 and 2^27. Each insert instruction will specify the index being
modified. While any index MAY be chosen for a new entry, smaller numbers will
yield better compression performance.</t>

<t>The dynamic table is still constrained to the size specified by the decoder. An
attempt to add a header to the dynamic table which causes it to exceed the
maximum size MUST be treated as an error by a decoder.  To enable encoders to
reclaim space, encoders can delete entries in the dynamic table, but can only
reuse the index or the space after receiving confirmation of a successful
deletion.</t>

<t>Because it is possible for QPACK frames to arrive which reference indices which
have not yet been defined, such frames MUST wait until another frame has
arrived and defined the index. In order to guard against malicious peers,
implementations SHOULD impose a time limit and treat expiration of the timer as
a decoding error.</t>

<section anchor="changes-to-header-table-size" title="Changes to Header Table Size">

<t>HTTP/QUIC prohibits mid-stream changes of settings.  As a result, only one table
size change is possible:  From the value a client assumes during the 0-RTT
flight to the actual value included in the server’s SETTINGS frame.  The assumed
value is required to be either a server’s previous value or zero.  A server
whose configuration has recently changed MAY overlook inadvertent violations of
its maximum table size during the first round-trip.</t>

<t>In the case that the value has increased, either from zero to a non-zero value
or from the cached value to a higher value, no action is required by the client.
The encoder can simply begin using the additional space.  In the case that the
value has decreased, the encoder MUST immediately emit delete instructions
which, upon completion, would bring the table within the required size.</t>

<t>Regardless of changes to header table size, the encoder MUST NOT add entries to
the table which would result in a size greater than the maximum permitted.  This
can imply that no additions are permitted while waiting for these delete
instructions to complete.</t>

</section>
<section anchor="dynamic-table-state-synchronization" title="Dynamic Table State Synchronization">

<t>In order to ensure table consistency, all modifications of the header table
occur as separate messages rather than on request streams.  Request streams
contain only indexed and literal header entries.</t>

<t>No entries are automatically evicted from the dynamic table. Size management is
purely the responsibility of the encoder, which MUST NOT exceed the declared
memory size of the decoder.</t>

<t>The encoder SHOULD track the following information about each entry in the
table:</t>

<t><list style="symbols">
  <t>The list of recently-active streams which reference the entry in a trailer
block, if any</t>
  <t>The list of recently-active streams which reference the entry in a
non-trailer block, if any</t>
</list></t>

<t>“Recently-active” streams are those which are still open or were closed less
than a reasonable number of RTTs ago.  An implementation MAY vary its definition
of “recent” to trade off memory consumption and timely completion of deletes,
and tracking no information is a functional (though potentially less performant)
choice in this space.</t>

<t>The encoder MUST consider memory as committed beginning when the indexed entry
is assigned.</t>

<t>When the encoder wishes to delete an inserted value, it flows through the
following set of states:</t>

<t><list style="numbers">
  <t><spanx style="strong">Delete requested.</spanx>  The encoder emits a delete instruction indicating
which streams might have referenced the entry.  The encoder MUST NOT
reference the entry in any subsequent frame until this state machine has
completed and MUST continue to include the entry in its calculation of
consumed memory.</t>
  <t><spanx style="strong">Delete pending.</spanx>  The decoder receives the delete instruction and
checks the current state of its incoming streams (see
<xref target="delete-validation"/>).  If more references might arrive, it stores the
streams still needed and waits for them to complete.</t>
  <t><spanx style="strong">Delete acknowledged.</spanx>  The decoder has received all QPACK frames which
reference the deleted value, and can safely delete the entry.  The decoder
SHOULD promptly emit a Delete-Ack instruction on a header management
stream.</t>
  <t><spanx style="strong">Delete completed.</spanx>  When the encoder receives a Delete-Ack instruction
acknowledging the delete, it no longer counts the size of the deleted entry
against the table size and MAY emit insert instructions for the field with
a new value.</t>
</list></t>

</section>
</section>
<section anchor="header-management-streams" title="Header Management Streams">

<t>Header management streams are unidirectional streams in either direction which
contain a series of QPACK instructions with no message boundaries.  Data on
these streams SHOULD be processed as soon as it arrives.</t>

<t>This section describes the instructions which are possible on header management
streams.</t>

<section anchor="insert" title="Insert">

<t>An addition to the header table starts with the ‘1’ one-bit pattern, followed
by the new index of the header represented as an integer with a 7-bit prefix.
This value is always greater than the number of entries in the static table.</t>

<t>If the header field name matches the header field name of an entry stored in the
static table or the dynamic table, the header field name can be represented
using the index of that entry. In this case, the <spanx style="verb">S</spanx> bit indicates whether the
reference is to the static (S=1) or dynamic (S=0) table and the index of the
entry is represented as an integer with an 7-bit prefix (see Section 5.1 of
<xref target="RFC7541"></xref>). This value is always non-zero.</t>

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

<t>Otherwise, the header field name is represented as a string literal (see Section
5.2 of <xref target="RFC7541"></xref>). A value 0 is used in place of the table reference, followed
by the header field name.</t>

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

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

<t>An encoder MUST NOT attempt to place a value at an index not known to be vacant.
A decoder MUST treat the attempt to insert into an occupied slot as a fatal
error.</t>

</section>
<section anchor="delete" title="Delete">

<t>A deletion from the header table starts with the ‘00’ two bit pattern, followed
by the index of the affected entry in the dynamic table represented as an
integer with a 6-bit prefix.</t>

<t>A delete instruction then encodes a series of stream IDs which might have
contained references to the entry in question.</t>

<figure title="Delete Instruction"><artwork><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 0 |      Index (6+)       |
   +---+---+-----------------------+
   |     Non-Trailer List (*)    ...
   +-------------------------------+
   |       Trailer List (*)      ...
   +-------------------------------+
]]></artwork></figure>

<t>Both the Non-Trailer List and Trailer List are Stream ID Lists (see below)
encoding a list of streams which might have referenced the entry either in
non-trailer or trailer blocks.</t>

<section anchor="stream-id-list" title="Stream ID List">

<t>A Stream ID List encodes a sequence of stream IDs in two parts:  First, a
Horizon value indicates the first non-occurrence about which data is maintained.
If data is maintained from the beginning of the connection, the Horizon is zero.
This allows senders to succinctly express both old state which has been
discarded and large regions where many or all streams contain references.</t>

<t>Following the horizon, a sequence of deltas indicates all streams since the
Horizon on which a value has been used.</t>

<t>This structure permits either side to adjust the amount of tracking complexity
it is willing to devote to ensure timely deletions.  In the simplest case, a
Stream ID List might be a horizon value followed by one zero byte.  This
indicates an absolute cut-off after which the entry is guaranteed not to be
referenced, and requires the receiver to wait until all prior requests have been
completed.  Similarly, the receiver can create equivalent-but-less-complex
forms of a Stream ID list by increasing the Horizon value and discarding all
explicit stream entries less than the new value.</t>

<figure title="Stream ID List"><artwork><![CDATA[
     0   1   2   3   4   5   6   7
   +-------------------------------+
   |          Horizon (8+)         |
   +-------------------------------+
   |         NumEntries (8+)       |
   +-------------------------------+
   |         [Delta1 (8+)]         |
   +-------------------------------+
   |         [Delta2 (8+)]         |
   +-------------------------------+
                  ...
   +-------------------------------+
   |         [DeltaN (8+)]         |
   +-------------------------------+
]]></artwork></figure>

<t>The field are as follows:</t>

<t><list style="hanging">
  <t hangText='Horizon:'>
  The ID of the first stream for which the sender retains state which does not
reference the deleted entry in the indicated block</t>
  <t hangText='NumEntries:'>
  The number of streams greater than the Horizon which might reference the entry
and are listed in the remainder of the instruction</t>
  <t hangText='Delta1..N:'>
  A sequence of streams greater than the Horizon which might reference the
entry, encoded as the difference in stream number from the previously-listed
stream.  This field is repeated NumEntries times.</t>
</list></t>

</section>
<section anchor="delete-validation" title="Delete Validation">

<t>In order to safely delete an entry, a decoder MUST ensure that all outstanding
references have arrived and been processed.  Because no data is available about
stream IDs less than the Horizon, a decoder MUST assume that any earlier stream
ID might have contained a reference to the value in question.</t>

<t>A decoder can ensure all outstanding references have been processed by verifying
that the following statements are true:</t>

<t><list style="symbols">
  <t>In the Non-Trailer Block, all streams less than the Horizon and all streams
explicitly listed are in one of two states:
  <list style="symbols">
      <t>closed</t>
      <t>headers completely processed</t>
    </list></t>
  <t>In the Trailer Block, all streams less than the Horizon and all streams
explicitly listed are in one of three states:
  <list style="symbols">
      <t>closed</t>
      <t>headers completely processed AND no trailers are expected</t>
      <t>trailers completely processed</t>
    </list></t>
</list></t>

<t>An implementation MAY omit the “trailers completely processed” case, since the
stream is expected to close immediately after receipt of the trailers block.</t>

<t>If these conditions are not met upon receipt of a Delete instruction, a decoder
MUST wait to emit a Delete-Ack instruction until the outstanding streams have
reached an appropriate state.</t>

<t>Note that a decoder MAY condense the list of specified streams by increasing the
Horizon value and discarding those explicitly-listed stream IDs which are less
than the new Horizon it has chosen.  This delays delete completion, but reduces
the amount of state to be tracked by the decoder without changing the
correctness of the requirements above.</t>

</section>
</section>
<section anchor="delete-ack" title="Delete-Ack">

<t>Confirmation that a delete has completed is expressed by an instruction which
starts with the ‘01’ two-bit pattern, followed by the index of the affected
dynamic table entry represented as an integer with a 6-bit prefix.</t>

<t>Note that unlike all other instructions, this instruction refers to the
receiver’s dynamic table, not the sender’s.</t>

<figure title="Delete-Ack Instruction"><artwork><![CDATA[
     0   1   2   3   4   5   6   7
   +---+---+---+---+---+---+---+---+
   | 0 | 1 |      Index (6+)       |
   +---+---+-----------------------+
]]></artwork></figure>

<t>This instruction MUST NOT be sent before the conditions described in
<xref target="delete-validation"/> have been satisfied, and SHOULD be sent as soon as
possible once they are.</t>

</section>
</section>
<section anchor="format-of-encoded-headers-on-message-streams" title="Format of Encoded Headers on Message Streams">

<t>Frames which carry HTTP message headers encode them using the following
instructions:</t>

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

<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><![CDATA[
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 1 | S |      Index (6+)       |
+---+---------------------------+
]]></artwork></figure>

<t>An indexed header field 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 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>

<t>The index value of 0 is not used.  It MUST be treated as a decoding error if
found in an indexed header field representation.</t>

</section>
<section anchor="literal-header-field-representation" title="Literal Header Field Representation">

<t>A literal header field representation starts with the ‘0’ 1-bit pattern and
causes a header field to be added the decoded header list.</t>

<t>The second 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 this specific 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 the same
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>If the header field name matches the header field name of an entry stored in the
static table or the dynamic table, the header field name can be represented
using the index of that entry. In this case, the <spanx style="verb">S</spanx> bit indicates whether the
reference is to the static (S=1) or dynamic (S=0) table and the index of the
entry is represented as an integer with an 5-bit prefix (see Section 5.1 of
<xref target="RFC7541"></xref>). This value is always non-zero.</t>

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

<t>Otherwise, the header field name is represented as a string literal (see Section
5.2 of <xref target="RFC7541"></xref>). A value 0 is used in place of the 6-bit index, followed by
the header field name.</t>

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

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

</section>
</section>
</section>
<section anchor="use-in-httpquic" title="Use in HTTP/QUIC">

<t>HTTP/QUIC <xref target="I-D.ietf-quic-http"></xref> currently retains the HPACK encoder/decoder from
HTTP/2, using a Sequence number to enforce ordering. Using QPACK instead would
entail the following changes:</t>

<t><list style="symbols">
  <t>The Sequence field is removed from HEADERS frames (Section 5.2.2) and
PUSH_PROMISE frames (Section 5.2.6).</t>
  <t>Header Block Fragments consist of QPACK data instead of HPACK data.</t>
  <t>Just as unidirectional push streams have a stream header identifying their
type and Push ID, a header will need to be added to differentiate header table
update streams from requests and pushes.</t>
</list></t>

<t>A HEADERS or PUSH_PROMISE frame MAY contain an arbitrary number of QPACK
instructions, but QPACK instructions SHOULD NOT cross a boundary between
successive HEADERS frames.  A partial HEADERS or PUSH_PROMISE frame MAY be
processed upon arrival and the resulting partial header set emitted or buffered
according to implementation requirements.</t>

</section>
<section anchor="implementation-trade-offs" title="Implementation trade-offs">

<t>This document specifies a means for the encoder to express the choices it made
while encoding, but intentionally does not mandate what those choices should be.
In this section, potential areas for implementation tuning are explored.</t>

<section anchor="compression-efficiency-versus-blocking-avoidance" title="Compression Efficiency versus Blocking Avoidance">

<t>References to indexed entries will block if the frame containing the entry
definition is lost or delayed. Encoders MAY choose to trade off compression
efficiency and avoid blocking by using literal instructions rather than
referencing the dynamic table until the insertion is believed to be complete.</t>

<t>The most efficient compression algorithm will reference a table entry whenever
it exists in the table, but risks blocking when subject to packet loss or
reordering.  The most conservative algorithm will always emit literals to
guarantee that no blocking will ever occur.  Most implementations will choose a
balance between these two extremes.</t>

<t>Better efficiency while being similarly conservative can be achieved by
permitting references to table entries only once these entries are confirmed to
be present in the table.  More optimization can be achieved when the reference
is known to be in the same packet as the definition.</t>

<t>Increases in efficiency can be achieved by assuming greater risk of blocking –
implementations might choose a particular balance, or adjust their
aggressiveness based on observed network characteristics.</t>

<t>Since it is possible to insert header values without emitting them on a stream,
an encoder MAY also proactively insert header values which it believes will be
needed on future requests, at the cost of reduced compression efficiency for
incorrect predictions.</t>

<t>The ability to split updates to the header table into discrete messages reduces
the possibility for head-of-line blocking within the table update streams.
Implementations SHOULD limit the size of table update messages to avoid
head-of-line blocking within these messages.</t>

</section>
<section anchor="timely-delete-completion-versus-state-commitment" title="Timely Delete Completion versus State Commitment">

<t>Anything which prevent deletes from completing can prevent the encoder from
adding any new entries due to the maximum table size. This does not block the
encoder from continuing to make requests, but could sharply limit compression
performance. Encoders would be well-served to delete entries in advance of
encountering the table maximum. Decoders SHOULD be prompt about emitting
Delete-Ack instructions to enable the encoder to recover the table space.</t>

<t>The encoder can enable deletes to complete more quickly by maintaining a
complete history of which streams have referenced any given table entry and
providing this list as part of the delete instruction.  The encoder can also
choose to maintain less state by advancing the Horizon value (see
<xref target="stream-id-list"/>).  This value indicates the starting point of the provided
history, and can be advanced arbitrarily far to discard history.  This comes at
the potential cost of a decoder taking longer to acknowledge that entries have
been removed, but this cost is zero if all previous requests are known to have
completed.  Therefore, this history can be pruned without performance impact by
removing entries where all data is known to have been successfully delivered and
interpreted, if some transport coordination is employed.</t>

<t>An encoder which chooses to maintain no history would simply supply a Horizon
value of a stream which has not yet been used, meaning that deletes cannot
complete until all currently-active requests have completed.</t>

<t>A decoder can perform the same trade-off in the event the encoder’s supplied
history is more state than it wishes to track.</t>

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

<t>A malicious encoder might attempt to consume a large amount of space on the
decoder by opening the maximum number of streams, adding entries to the table,
then sending delete instructions enumerating many streams in a Stream ID List.</t>

<t>To guard against such attacks, a decoder SHOULD bound its state tracking by
generalizing the list of streams to be tracked.  This is most easily achieved by
advancing the Horizon to a later value and discarding explicit Stream IDs to
track, but can also be accomplished by eliding explicit streams in ranges.  This
does not cause any loss of consistency for deletes, but could delay completion
and reduce performance if done aggressively.</t>

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

<t>This document currently makes no request of IANA, and might not need to.</t>

</section>
<section anchor="ack" title="Acknowledgements">

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

<t><list style="symbols">
  <t>Jana Iyengar</t>
  <t>Patrick McManus</t>
  <t>Martin Thomson</t>
  <t>Charles ‘Buck’ Krasic</t>
  <t>Kyle Rose</t>
</list></t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<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="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="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="I-D.ietf-quic-transport">
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>

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

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

<date month='September' day='22' year='2017' />

<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-06' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-transport-06.txt' />
</reference>



<reference anchor="I-D.ietf-quic-http">
<front>
<title>Hypertext Transfer Protocol (HTTP) over QUIC</title>

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

<date month='September' day='22' year='2017' />

<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-06' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-http-06.txt' />
</reference>




    </references>





  </back>

<!-- ##markdown-source:
H4sIANaWylkAA+1da3Mbx5X9zir+hy7pgyQbQETFjw2rUrW0JEdMLFkR6aS2
XN54ADSAiQYzyMyAFKx4f/vec+7txwCQ/MhuNqkNq5SQwEz37ft+9fV4PD49
6cu+8ufumS/mvnWPm/Wm9V1XNrVbNK17dn398he//+ry8elJMZ22/ubc/f7l
xePfnZ7Mm1ldrOXNeVss+vG07FbNZvyXbTkbr/p+My7q+fgvm2L2elwVve96
eUP+/9y9fXJx/fT705OZ/LVs2t256/r56cnpSblpz13fbrv+0cOHv3r4SHZs
fXHurtui7jZNKyvcNu3rZdtsNwKFwOT+KH+X9dL9Bp+dnrz2O3lifu4u6963
te/HTwAbFu96gedPRdXUAsLOd6cnm/Lcfd03s5HrZO3WLzr5bbfGL9/gjWLb
r5r2/PTECZKc/JR1d+6eT9xnPKl+phh4Xr72g4+bdlnU5XdFL2jE17O26RoA
gi/9uiirc7cuZ6vCVxNF3L+vw0OTWbPG/nXTrmWBGw8Q3KvPH3/68UcPw++P
zs5+lX1+xt8vx08mpe8XSoQ+oO3IdyDQOTY5PRmPx66YdvL0jIgiwR+5r23D
b9y28517BpqHD8++IWuslGNmiWMm7llz6298O9IXTk9aX5XyujBTv/KCwbGQ
R95Zy/PF0o+nRefnrhOM1H05k+cWfM5gWLTFGtStip28U9anJ/p237jFtp71
3NE917U6Nytq2ajaual33XY2k88X20r+nvtZM5d9yoXbtA0+lz+mO2F92Uu/
xPLcuhOCOt2m6NzS174VPsXj/NrXfFq2vV6VnbK+E5Ypa7CUYknAq5qm87og
18IpWi+ob/3a131H/AliXSPIcipeX7+DfN9MApnW5Xxeefx1FxzeNvMtkeDc
27tysGnl1933pCHhWMkBCldv11PZQzC78EW/FUoJWEXvbn0LgvS+BmoEZlnh
ppx7t/HtAqxXz2SrYn4jpCF65RGly8hNt/L+SvjXzZv6Xu8q4VJZsKqARVBh
24+bhdHa1zdl29Q4t4jhVl4qDATbkcgFDnjQa8FZVbSyY+9EQKrK10sBtCMy
F8Kk+q6vDJOiI0AAOY0AzKUKJ0jduUW1LUWvlHK+NxP3oumVOWwlfuzK9aYq
ZyVO4wl52fs1HinmhhU8q4wu7FIIikfZ67elHFmABIS3pagLwUvdCCd7nLGR
B1uuqFDma56emPRwzYm76kXUZ4KrvqW8zGbbjXLcomwFE5+cuZui2nrRUYum
qkTKeNT5ThRQOTs9sRcn7sLV/rbajXUz+57r7txts63mIiZkvAq759+XSuOp
wOZvypkw/UgwMicQre8LYfF5dpoeGBOkk70AjV+WdQ1GBybcJ48mFJHTk7UX
RibRRhFJJoZ4Wigsf3qhHf4yrHS+l5PWTSBTHbAWACbaKPFT5eJW1hiArG8K
2xduKexZGw7kFaEQTylvzHlO8t1FvRNDUG0pUEb4YtqAsUHlolo34EjfAhPC
RwsAXiwEpUFrrf1azJkYtqaGOi3BnUHDqIoUoReOE9XQATmy/rZv1kp4YBw7
y1qBGNAvYq5OT1RLmg5Na93rsLTISkZoxUtXfid8qhL6/KurayCpkndAhVrV
3rp4U663a0j7uuwzDTeA9j6wKTpcFPBc9BXpVQf1fPX0+vryxW+uTk/Img+I
xs+3LdheTKmY1EJ4RTQCTTV4pmq6bhc0LfaAzOLI+rDDJ73gxv1xVULR2Ub3
b8rCXT9++cAtt4Woxd77gFloHqEqyKx8dFM22074X5bunTgcBfBW2AbgbOGE
cqE6xHYVPHPjkQI6b2R18IgwFHSwoAeA9zRHIMsiWw86duopCVwB+FoXIphl
NyvauUKghMCjWHbne33FoM90QrGBOqLXQGS+tPNAocG+0kDS/VL13a1xalmn
L/hVtD+lWQdvJnMs4JViievZTsUyrCgvb4oWBqlt1va+cDEM6BQuU18WsKCy
pCgUmHNbRnh3KRze9XrwYNAD1Qn9pdJZ9RVYp/Pk8Q4qlMw920KHQxtQKGCt
/G0ELR6I+BNFUryWZ+blgspe7EArukLsDBw3XwvjYw+cRmAemqCoIIhaEEmE
qtnS8qnUOgjtdr3h91Rg4nmUgl5qJKwkq3s3rZoZHE7Yk9qb4EOT8ABzSLfY
NLNMMJiE/75gpamXwpX9biNPLUpfzQXoaVkX3Dq53M0C+mO9ll+DKtyJ/X3z
gPIz27Y4OaxYPau2c+g72OKklWZU8VNPAty9664h3nVTNcudiz9v72Yff2+E
ygiiJk6caQdvunN3oEPujPT/3Ysv+furpyItr54+we9Xzy6++CL+cnpij1w9
+/KrL56k39Krj798/vzpiyf69vOL/7ijknPny5fXl1++uPjijpoYtUaZeodZ
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
aYG++P8G6sWjIttmAAA=

-->

</rfc>

