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

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

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

<rfc ipr="trust200902" docName="draft-bishop-quic-http-and-qpack-02" 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>A connection-wide series of table update instructions sent on a dedicated
headers stream</t>
  <t>Non-modifying instructions which use the current header table state to
encode message headers</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.</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>.</t>

<t>The dynamic table is a map from index to header field. Indices are arbitrary
numbers greater than the last index of the static table and less than 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. However, if the implementation chooses not to abort the
connection, the remainder of the header block MUST be decoded and the output
discarded.</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 on a dedicated control stream.  Message control 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.</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 the 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="format-of-header-management-stream" title="Format of Header Management stream">

<t>The header management stream contains a series of QPACK instructions with no
message boundaries.  Data on this stream SHOULD be processed as soon as it
arrives.</t>

<t>This section describes the instructions which are possible on the Header
Management stream.</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 index of the entry is
represented as an integer with an 8-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+)      |
   +---+---+-----------------------+
   |          Name Index (8+)      |
   +---+---------------------------+
   | 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 8-bit index, 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 represented as an integer with a 6-bit prefix.
This value is always greater than the number of entries in the static table.</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>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.</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
entry represented as an integer with a 6-bit prefix. This value is always
greater than the number of entries in the static table.</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 |        Index (7+)         |
+---+---------------------------+
]]></artwork></figure>

<t>An indexed header field starts with the ‘1’ 1-bit pattern, followed by the index
of the matching header field, represented as an integer with a 7-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 index of the entry is
represented as an integer with a 6-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 |    Name Index (6+)    |
   +---+---+-----------------------+
   | 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).</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>An additional control stream is reserved for header table updates. Alternately,
this could be carried by HEADERS frames on the connection control stream.</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="performance-considerations" title="Performance Considerations">

<t>While QPACK is designed to minimize head-of-line blocking between streams on
header decoding, there are some situations in which lost or delayed packets can
still impact the performance of header compression.</t>

<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>Since it is possible to insert header values without emitting them on a stream,
an encoder MAY proactively insert header values which it believes will be needed
on future requests.</t>

<t>Delayed frames 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>

</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='http://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='http://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='http://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='January' day='14' year='2017' />

<abstract><t>QUIC is a multiplexed and secure transport protocol that runs on top of UDP.  QUIC builds on past transport experience, and implements mechanisms that make it useful as a modern general-purpose transport protocol.  Using UDP as the basis of QUIC is intended to address compatibility issues with legacy clients and middleboxes.  QUIC authenticates all of its headers, preventing third parties from changing them.  QUIC encrypts most of its headers, thereby limiting protocol evolution to QUIC endpoints only.  Therefore, middleboxes, in large part, are not required to be updated as new protocol versions are deployed.  This document describes the core QUIC protocol, including the conceptual design, wire format, and mechanisms of the QUIC protocol for connection establishment, stream multiplexing, stream and connection-level flow control, and data reliability.  Accompanying documents describe QUIC's loss recovery and congestion control, and the use of TLS 1.3 for key negotiation.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-quic-transport-01' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-transport-01.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='January' day='14' 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.  Specifically, this document identifies HTTP/2 features that are subsumed by QUIC, and describes how the other features can be implemented atop QUIC.</t></abstract>

</front>

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




    </references>





  </back>

<!-- ##markdown-source:
H4sIAKy0m1gAA+1cbW8bR5L+ToD/oSF/sJ2QXMtJnF0BB5xsOWttbNlrKbs4
BL5Fc6ZJDjyc4U7PSGac3G+/eqqqe3pI+jW3ezncCnAikTPV3dX18tRL93Q6
HY/aoi3diXnibO4a86hebxrnfVFXZlE35snV1Yvf/fmH80fjkZ3PG3d9Yv78
4vTR9+NRXmeVXdObeWMX7XRe+FW9mf69K7Lpqm03U1vl079vbPZ6WtrW+Zbe
oP+fmLdnp1ePfxmPMvprWTfbE+PbfDwaj4pNc2LapvPt/Xv3/nDvPo3YOHti
rhpb+U3dEIWbunm9bOpuQ7OgOZm/0t9FtTR/xGfj0Wu3pSfyE3Neta6pXDs9
w9xA3Lc0n7/Zsq5oClvnx6NNcWJ+bOtsYjzRbtzC02/bNX55hTds167q5mQ8
MsQkQz9F5U/Ms5l5yCuVz4QDz4rXbvBx3SxtVfxkW2Ijvs6a2teYCL50a1uU
J2ZdZCvrypkw7t/X4aFZVq8xflU3ayJw7TAF8/K7R99+8/W98Pv94+M/JJ8f
8+/n07NZ4dqFbEIb2HbgO2zQCQYZj6bTqbFzT09nzCje8PvmRx3wlem88+YJ
9jx8ePyKRWMlEpP1EjMzT+obd+2aibwwHjWuLOh1EqZ25YiDU9oeemdNz9ul
m86td7nxxJGqLTJ6bsHP6RwWjV1jd0u7pXeKajySt9vaLLoqa3lE80xoeZPZ
igYqt2bujO+yjD5fdCX9nbuszmmcYmE2TY3P6Y/5lkSfxpIvQZ6H9rShRoax
3ixd5RqSUzzOX7uKn6Zhr1aFF9E3JDJFBZESLtH0yrr2TggyLayiccT6xq1d
1XrmHzHW1MQsI+r14zu279UsbNO6yPPS4a9bkPCmzjtmgjFvb9HC5qVb+194
D3keK1qANVW3ntMYxNmFs21HO0XTsq25cQ02pHUVWENzJgrXRe7MxjULiF6V
0VA2v6atYfbSI7IvEzPv6P0Vya/J6+p2a0qSUiJYluAidqFrp/VC99pV10VT
V1g3qWFHL1mdgo7IzAUPeKFXxLPSNjRia0hBytJVS5qoZ2YuSEjlXVcqJ8lG
YANoNTRhJmUNMXVrFmVXkF0paH1vZuaibkU4lBJ/bIr1piyyAqtxPPOidWs8
YnPlCp4VQSdxscTiSfL6TUFLpklihjcFmQviS1WTJDussaYHG6Yos0xpjkeq
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
T0y++n5Lduclz1muep1bGOX/Btgsyz+gWQAA

-->

</rfc>

