draft-ietf-quic-http-09.txt   draft-ietf-quic-http-10.txt 
QUIC M. Bishop, Ed. QUIC M. Bishop, Ed.
Internet-Draft Akamai Internet-Draft Akamai
Intended status: Standards Track January 28, 2018 Intended status: Standards Track March 05, 2018
Expires: August 1, 2018 Expires: September 6, 2018
Hypertext Transfer Protocol (HTTP) over QUIC Hypertext Transfer Protocol (HTTP) over QUIC
draft-ietf-quic-http-09 draft-ietf-quic-http-10
Abstract Abstract
The QUIC transport protocol has several features that are desirable The QUIC transport protocol has several features that are desirable
in a transport for HTTP, such as stream multiplexing, per-stream flow in a transport for HTTP, such as stream multiplexing, per-stream flow
control, and low-latency connection establishment. This document control, and low-latency connection establishment. This document
describes a mapping of HTTP semantics over QUIC. This document also describes a mapping of HTTP semantics over QUIC. This document also
identifies HTTP/2 features that are subsumed by QUIC, and describes identifies HTTP/2 features that are subsumed by QUIC, and describes
how HTTP/2 extensions can be ported to QUIC. how HTTP/2 extensions can be ported to QUIC.
skipping to change at page 1, line 45 skipping to change at page 1, line 45
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on August 1, 2018. This Internet-Draft will expire on September 6, 2018.
Copyright Notice Copyright Notice
Copyright (c) 2018 IETF Trust and the persons identified as the Copyright (c) 2018 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License. described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Notational Conventions . . . . . . . . . . . . . . . . . 3 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4
2. Connection Setup and Management . . . . . . . . . . . . . . . 4 2. Connection Setup and Management . . . . . . . . . . . . . . . 4
2.1. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 4 2.1. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 4
2.1.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 4 2.1.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 5
2.2. Connection Establishment . . . . . . . . . . . . . . . . 5 2.2. Connection Establishment . . . . . . . . . . . . . . . . 5
2.2.1. Draft Version Identification . . . . . . . . . . . . 5 2.2.1. Draft Version Identification . . . . . . . . . . . . 6
2.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 2.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6
3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 6 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7
3.1. Control Streams . . . . . . . . . . . . . . . . . . . . . 7 3.1. Control Streams . . . . . . . . . . . . . . . . . . . . . 8
3.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 7 3.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 8
3.2.1. Header Compression . . . . . . . . . . . . . . . . . 9 3.2.1. Header Compression . . . . . . . . . . . . . . . . . 9
3.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 3.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9
3.3. Request Prioritization . . . . . . . . . . . . . . . . . 10 3.2.3. Request Cancellation . . . . . . . . . . . . . . . . 10
3.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 10 3.3. Request Prioritization . . . . . . . . . . . . . . . . . 11
4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 11 3.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 11
4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 12
4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 12 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 12
4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 12 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 13
4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 12 4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 13 4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 13
4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 13 4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 14
4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 15 4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 16
4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 15 4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 16
4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 18 4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 19
4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 19 4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 20
4.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 21 4.2.8. HEADER_ACK . . . . . . . . . . . . . . . . . . . . . 22
5. Connection Management . . . . . . . . . . . . . . . . . . . . 22 4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 23
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 22 5. Connection Management . . . . . . . . . . . . . . . . . . . . 24
6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 23 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24
7. Considerations for Transitioning from HTTP/2 . . . . . . . . 24 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 24
7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 24
7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 24 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 25
7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 26 7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 27 7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 26
8. Security Considerations . . . . . . . . . . . . . . . . . . . 28 7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 28
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 28 7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 28
9.1. Registration of HTTP/QUIC Identification String . . . . . 28 8. Security Considerations . . . . . . . . . . . . . . . . . . . 30
9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 28 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30
9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 29 9.1. Registration of HTTP/QUIC Identification String . . . . . 30
9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 30 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 30
9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 31 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 30
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 33 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 31
10.1. Normative References . . . . . . . . . . . . . . . . . . 33 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 32
10.2. Informative References . . . . . . . . . . . . . . . . . 34 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 34
10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 34 10.1. Normative References . . . . . . . . . . . . . . . . . . 34
Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 35 10.2. Informative References . . . . . . . . . . . . . . . . . 35
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 35 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 36
B.1. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 35 Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 36
B.2. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 35 Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 36
B.3. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 35 B.1. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 36
B.4. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 35 B.2. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 36
B.5. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 35 B.3. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 36
B.6. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 36 B.4. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 37
B.7. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 36 B.5. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 37
B.8. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 36 B.6. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 37
B.9. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 36 B.7. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 37
B.10. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 37 B.8. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 37
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 37 B.9. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 37
B.10. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 38
B.11. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 38
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 38
1. Introduction 1. Introduction
The QUIC transport protocol has several features that are desirable The QUIC transport protocol has several features that are desirable
in a transport for HTTP, such as stream multiplexing, per-stream flow in a transport for HTTP, such as stream multiplexing, per-stream flow
control, and low-latency connection establishment. This document control, and low-latency connection establishment. This document
describes a mapping of HTTP semantics over QUIC, drawing heavily on describes a mapping of HTTP semantics over QUIC, drawing heavily on
the existing TCP mapping, HTTP/2. Specifically, this document the existing TCP mapping, HTTP/2. Specifically, this document
identifies HTTP/2 features that are subsumed by QUIC, and describes identifies HTTP/2 features that are subsumed by QUIC, and describes
how the other features can be implemented atop QUIC. how the other features can be implemented atop QUIC.
skipping to change at page 4, line 50 skipping to change at page 5, line 10
Servers MAY serve HTTP/QUIC on any UDP port. Servers MUST use the Servers MAY serve HTTP/QUIC on any UDP port. Servers MUST use the
same port across all IP addresses that serve a single domain, and same port across all IP addresses that serve a single domain, and
SHOULD NOT change this port. SHOULD NOT change this port.
2.1.1. QUIC Version Hints 2.1.1. QUIC Version Hints
This document defines the "quic" parameter for Alt-Svc, which MAY be This document defines the "quic" parameter for Alt-Svc, which MAY be
used to provide version-negotiation hints to HTTP/QUIC clients. QUIC used to provide version-negotiation hints to HTTP/QUIC clients. QUIC
versions are four-octet sequences with no additional constraints on versions are four-octet sequences with no additional constraints on
format. Syntax: format. Leading zeros SHOULD be omitted for brevity.
quic = version-number
version-number = 1*8HEXDIG; hex-encoded QUIC version
Leading zeros SHOULD be omitted for brevity. When multiple versions Syntax:
are supported, the "quic" parameter MAY be repeated multiple times in
a single Alt-Svc entry. For example, if a server supported both
version 0x00000001 and the version rendered in ASCII as "Q034", it
could specify the following header:
Alt-Svc: hq=":49288";quic=1;quic=51303334 quic = DQUOTE version-number [ "," version-number ] * DQUOTE
version-number = 1*8HEXDIG; hex-encoded QUIC version
Where multiple versions are listed, the order of the values reflects Where multiple versions are listed, the order of the values reflects
the server's preference (with the first value being the most the server's preference (with the first value being the most
preferred version). Origins SHOULD list only versions which are preferred version). Reserved versions MAY be listed, but unreserved
supported by the alternative, but MAY omit supported versions for any versions which are not supported by the alternative SHOULD NOT be
present in the list. Origins MAY omit supported versions for any
reason. reason.
Clients MUST ignore any included versions which they do not support.
The "quic" parameter MUST NOT occur more than once; clients SHOULD
process only the first occurrence.
For example, suppose a server supported both version 0x00000001 and
the version rendered in ASCII as "Q034". If it opted to include the
reserved versions (from Section 4 of [QUIC-TRANSPORT]) 0x0 and
0x1abadaba, it could specify the following header:
Alt-Svc: hq=":49288";quic="1,1abadaba,51303334,0"
A client acting on this header would drop the reserved versions
(because it does not support them), then attempt to connect to the
alternative using the first version in the list which it does
support.
2.2. Connection Establishment 2.2. Connection Establishment
HTTP/QUIC relies on QUIC as the underlying transport. The QUIC HTTP/QUIC relies on QUIC as the underlying transport. The QUIC
version being used MUST use TLS version 1.3 or greater as its version being used MUST use TLS version 1.3 or greater as its
handshake protocol. The Server Name Indication (SNI) extension handshake protocol. The Server Name Indication (SNI) extension
[RFC6066] MUST be included in the TLS handshake. [RFC6066] MUST be included in the TLS handshake.
QUIC connections are established as described in [QUIC-TRANSPORT]. QUIC connections are established as described in [QUIC-TRANSPORT].
During connection establishment, HTTP/QUIC support is indicated by During connection establishment, HTTP/QUIC support is indicated by
selecting the ALPN token "hq" in the TLS handshake. Support for selecting the ALPN token "hq" in the TLS handshake. Support for
skipping to change at page 9, line 7 skipping to change at page 9, line 24
without error by triggering a QUIC STOP_SENDING with error code without error by triggering a QUIC STOP_SENDING with error code
HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing
its streams. Clients MUST NOT discard complete responses as a result its streams. Clients MUST NOT discard complete responses as a result
of having their request terminated abruptly, though clients can of having their request terminated abruptly, though clients can
always discard responses at their discretion for other reasons. always discard responses at their discretion for other reasons.
Servers MUST NOT abort a response in progress as a result of Servers MUST NOT abort a response in progress as a result of
receiving a solicited RST_STREAM. receiving a solicited RST_STREAM.
3.2.1. Header Compression 3.2.1. Header Compression
HTTP/QUIC uses HPACK header compression as described in [RFC7541]. HTTP/QUIC uses QCRAM header compression as described in [QCRAM], a
HPACK was designed for HTTP/2 with the assumption of in-order variation of HPACK which allows the flexibility to avoid header-
delivery such as that provided by TCP. A sequence of encoded header compression-induced head-of-line blocking. See that document for
blocks must arrive (and be decoded) at an endpoint in the same order additional details.
in which they were encoded. This ensures that the dynamic state at
the two endpoints remains in sync.
QUIC streams provide in-order delivery of data sent on those streams,
but there are no guarantees about order of delivery between streams.
QUIC anticipates moving to a modified version of HPACK without this
assumption. In the meantime, by fixing the size of the dynamic table
at zero, HPACK can be used in an unordered environment.
3.2.2. The CONNECT Method 3.2.2. The CONNECT Method
The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily
used with HTTP proxies to establish a TLS session with an origin used with HTTP proxies to establish a TLS session with an origin
server for the purposes of interacting with "https" resources. In server for the purposes of interacting with "https" resources. In
HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a
tunnel to a remote host. In HTTP/2, the CONNECT method is used to tunnel to a remote host. In HTTP/2, the CONNECT method is used to
establish a tunnel over a single HTTP/2 stream to a remote host for establish a tunnel over a single HTTP/2 stream to a remote host for
similar purposes. similar purposes.
skipping to change at page 10, line 17 skipping to change at page 10, line 26
so clients SHOULD NOT cause send a STREAM frame with a FIN bit for so clients SHOULD NOT cause send a STREAM frame with a FIN bit for
connections on which they are still expecting data. connections on which they are still expecting data.
A TCP connection error is signaled with RST_STREAM. A proxy treats A TCP connection error is signaled with RST_STREAM. A proxy treats
any error in the TCP connection, which includes receiving a TCP any error in the TCP connection, which includes receiving a TCP
segment with the RST bit set, as a stream error of type segment with the RST bit set, as a stream error of type
HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send
a TCP segment with the RST bit set if it detects an error with the a TCP segment with the RST bit set if it detects an error with the
stream or the QUIC connection. stream or the QUIC connection.
3.2.3. Request Cancellation
Either client or server can cancel requests by closing the stream
(QUIC RST_STREAM or STOP_SENDING frames, as appropriate) with an
error type of HTTP_REQUEST_CANCELLED (Section 6.1). When the client
cancels a request or response, it indicates that the response is no
longer of interest.
When the server cancels either direction of the request stream using
HTTP_REQUEST_CANCELLED, it indicates that no application processing
was performed. The client can treat requests cancelled by the server
as though they had never been sent at all, thereby allowing them to
be retried later on a new connection. Servers MUST NOT use the
HTTP_REQUEST_CANCELLED status for requests which were partially or
fully processed.
Note: In this context, "processed" means that some data from the
stream was passed to some higher layer of software that might have
taken some action as a result.
If a stream is cancelled after receiving a complete response, the
client MAY ignore the cancellation and use the response. However, if
a stream is cancelled after receiving a partial response, the
response SHOULD NOT be used. Automatically retrying such requests is
not possible, unless this is otherwise permitted (e.g., idempotent
actions like GET, PUT, or DELETE).
3.3. Request Prioritization 3.3. Request Prioritization
HTTP/QUIC uses the priority scheme described in [RFC7540], HTTP/QUIC uses the priority scheme described in [RFC7540],
Section 5.3. In this priority scheme, a given request can be Section 5.3. In this priority scheme, a given request can be
designated as dependent upon another request, which expresses the designated as dependent upon another request, which expresses the
preference that the latter stream (the "parent" request) be allocated preference that the latter stream (the "parent" request) be allocated
resources before the former stream (the "dependent" request). Taken resources before the former stream (the "dependent" request). Taken
together, the dependencies across all requests in a connection form a together, the dependencies across all requests in a connection form a
dependency tree. The structure of the dependency tree changes as dependency tree. The structure of the dependency tree changes as
PRIORITY frames add, remove, or change the dependency links between PRIORITY frames add, remove, or change the dependency links between
skipping to change at page 10, line 40 skipping to change at page 11, line 28
identifying the stream that carries a request or by using a Push ID identifying the stream that carries a request or by using a Push ID
(Section 4.2.6). (Section 4.2.6).
Only a client can send PRIORITY frames. A server MUST NOT send a Only a client can send PRIORITY frames. A server MUST NOT send a
PRIORITY frame. PRIORITY frame.
3.4. Server Push 3.4. Server Push
HTTP/QUIC supports server push as described in [RFC7540]. During HTTP/QUIC supports server push as described in [RFC7540]. During
connection establishment, the client enables server push by sending a connection establishment, the client enables server push by sending a
MAX_PUSH_ID frame (see Section 4.2.8). A server cannot use server MAX_PUSH_ID frame (see Section 4.2.9). A server cannot use server
push until it receives a MAX_PUSH_ID frame. push until it receives a MAX_PUSH_ID frame.
As with server push for HTTP/2, the server initiates a server push by As with server push for HTTP/2, the server initiates a server push by
sending a PUSH_PROMISE frame that includes request header fields sending a PUSH_PROMISE frame that includes request header fields
attributed to the request. The PUSH_PROMISE frame is sent on the attributed to the request. The PUSH_PROMISE frame is sent on the
client-initiated, bidirectional stream that carried the request that client-initiated, bidirectional stream that carried the request that
generated the push. This allows the server push to be associated generated the push. This allows the server push to be associated
with a request. Ordering of a PUSH_PROMISE in relation to certain with a request. Ordering of a PUSH_PROMISE in relation to certain
parts of the response is important (see Section 8.2.1 of [RFC7540]). parts of the response is important (see Section 8.2.1 of [RFC7540]).
skipping to change at page 11, line 25 skipping to change at page 12, line 14
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (i) ... | Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 1: Push Stream Header Figure 1: Push Stream Header
A server SHOULD use Push IDs sequentially, starting at 0. A client A server SHOULD use Push IDs sequentially, starting at 0. A client
uses the MAX_PUSH_ID frame (Section 4.2.8) to limit the number of uses the MAX_PUSH_ID frame (Section 4.2.9) to limit the number of
pushes that a server can promise. A client MUST treat receipt of a pushes that a server can promise. A client MUST treat receipt of a
push stream with a Push ID that is greater than the maximum Push ID push stream with a Push ID that is greater than the maximum Push ID
as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED. as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED.
Each Push ID MUST only be used once in a push stream header. If a Each Push ID MUST only be used once in a push stream header. If a
push stream header includes a Push ID that was used in another push push stream header includes a Push ID that was used in another push
stream header, the client MUST treat this as a connection error of stream header, the client MUST treat this as a connection error of
type HTTP_DUPLICATE_PUSH. The same Push ID can be used in multiple type HTTP_DUPLICATE_PUSH. The same Push ID can be used in multiple
PUSH_PROMISE frames (see Section 4.2.6). PUSH_PROMISE frames (see Section 4.2.6).
skipping to change at page 13, line 10 skipping to change at page 13, line 51
DATA frames MUST contain a non-zero-length payload. If a DATA frame DATA frames MUST contain a non-zero-length payload. If a DATA frame
is received with a payload length of zero, the recipient MUST respond is received with a payload length of zero, the recipient MUST respond
with a stream error (Section 6) of type HTTP_MALFORMED_FRAME. with a stream error (Section 6) of type HTTP_MALFORMED_FRAME.
4.2.2. HEADERS 4.2.2. HEADERS
The HEADERS frame (type=0x1) is used to carry a header block, The HEADERS frame (type=0x1) is used to carry a header block,
compressed using HPACK Section 3.2.1. compressed using HPACK Section 3.2.1.
No flags are defined for the HEADERS frame. The HEADERS frame defines a single flag:
A HEADERS frame with any flags set MUST be treated as a connection BLOCKING (0x01): Indicates the stream might need to wait for
error of type HTTP_MALFORMED_FRAME. dependent headers before processing. If 0, the frame can be
processed immediately upon receipt.
HEADERS frames can be sent on the Control Stream as well as on
request / push streams. The value of BLOCKING MUST be 0 for HEADERS
frames on the Control Stream, since they can only depend on previous
HEADERS on the same stream.
4.2.3. PRIORITY 4.2.3. PRIORITY
The PRIORITY (type=0x02) frame specifies the sender-advised priority The PRIORITY (type=0x02) frame specifies the sender-advised priority
of a stream and is substantially different in format from [RFC7540]. of a stream and is substantially different in format from [RFC7540].
In order to ensure that prioritization is processed in a consistent In order to ensure that prioritization is processed in a consistent
order, PRIORITY frames MUST be sent on the control stream. A order, PRIORITY frames MUST be sent on the control stream. A
PRIORITY frame sent on any other stream MUST be treated as a PRIORITY frame sent on any other stream MUST be treated as a
HTTP_WRONG_STREAM error. HTTP_WRONG_STREAM error.
skipping to change at page 17, line 19 skipping to change at page 18, line 19
4.2.5.1. Integer encoding 4.2.5.1. Integer encoding
Settings which are integers use the QUIC variable-length integer Settings which are integers use the QUIC variable-length integer
encoding. encoding.
4.2.5.2. Defined SETTINGS Parameters 4.2.5.2. Defined SETTINGS Parameters
The following settings are defined in HTTP/QUIC: The following settings are defined in HTTP/QUIC:
SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of
2^30 - 1. This value MUST be zero. 2^30 - 1.
SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value
of 2^30 - 1 of 2^30 - 1
4.2.5.3. Usage in 0-RTT 4.2.5.3. Usage in 0-RTT
When a 0-RTT QUIC connection is being used, the client's initial When a 0-RTT QUIC connection is being used, the client's initial
requests will be sent before the arrival of the server's SETTINGS requests will be sent before the arrival of the server's SETTINGS
frame. Clients SHOULD cache at least the following settings about frame. Clients SHOULD cache at least the following settings about
servers: servers:
skipping to change at page 18, line 12 skipping to change at page 19, line 12
the server on the closed connection. (This assumes that only the server on the closed connection. (This assumes that only
requests that are safe to retry are sent in 0-RTT.) If the requests that are safe to retry are sent in 0-RTT.) If the
connection was closed before the SETTINGS frame was received, clients connection was closed before the SETTINGS frame was received, clients
SHOULD discard any cached values and use the defaults above on the SHOULD discard any cached values and use the defaults above on the
next connection. next connection.
4.2.6. PUSH_PROMISE 4.2.6. PUSH_PROMISE
The PUSH_PROMISE frame (type=0x05) is used to carry a request header The PUSH_PROMISE frame (type=0x05) is used to carry a request header
set from server to client, as in HTTP/2. The PUSH_PROMISE frame set from server to client, as in HTTP/2. The PUSH_PROMISE frame
defines no flags. defines a single flag:
BLOCKING (0x01): Indicates the stream might need to wait for
dependent headers before processing. If 0, the frame can be
processed immediately upon receipt.
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (i) ... | Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Header Block (*) ... | Header Block (*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 5: PUSH_PROMISE frame payload Figure 5: PUSH_PROMISE frame payload
The payload consists of: The payload consists of:
Push ID: A variable-length integer that identifies the server push Push ID: A variable-length integer that identifies the server push
request. A push ID is used in push stream header (Section 3.4), request. A push ID is used in push stream header (Section 3.4),
CANCEL_PUSH frames (Section 4.2.4), and PRIORITY frames CANCEL_PUSH frames (Section 4.2.4), and PRIORITY frames
(Section 4.2.3). (Section 4.2.3).
Header Block: HPACK-compressed request headers for the promised Header Block: QCRAM-compressed request headers for the promised
response. response. See [QCRAM] for more details.
A server MUST NOT use a Push ID that is larger than the client has A server MUST NOT use a Push ID that is larger than the client has
provided in a MAX_PUSH_ID frame (Section 4.2.8). A client MUST treat provided in a MAX_PUSH_ID frame (Section 4.2.9). A client MUST treat
receipt of a PUSH_PROMISE that contains a larger Push ID than the receipt of a PUSH_PROMISE that contains a larger Push ID than the
client has advertised as a connection error of type client has advertised as a connection error of type
HTTP_MALFORMED_FRAME. HTTP_MALFORMED_FRAME.
A server MAY use the same Push ID in multiple PUSH_PROMISE frames. A server MAY use the same Push ID in multiple PUSH_PROMISE frames.
This allows the server to use the same server push in response to This allows the server to use the same server push in response to
multiple concurrent requests. Referencing the same server push multiple concurrent requests. Referencing the same server push
ensures that a PUSH_PROMISE can be made in relation to every response ensures that a PUSH_PROMISE can be made in relation to every response
in which server push might be needed without duplicating pushes. in which server push might be needed without duplicating pushes.
skipping to change at page 19, line 25 skipping to change at page 20, line 28
4.2.7. GOAWAY 4.2.7. GOAWAY
The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of
a connection by a server. GOAWAY allows a server to stop accepting a connection by a server. GOAWAY allows a server to stop accepting
new requests while still finishing processing of previously received new requests while still finishing processing of previously received
requests. This enables administrative actions, like server requests. This enables administrative actions, like server
maintenance. GOAWAY by itself does not close a connection. maintenance. GOAWAY by itself does not close a connection.
The GOAWAY frame does not define any flags, and the payload is a QUIC The GOAWAY frame does not define any flags, and the payload is a QUIC
Stream ID for a client-initiated, bidirectional stream encoded as a Stream ID for a client-initiated, bidirectional stream encoded as a
variable-length integer. variable-length integer. A client MUST treat receipt of a GOAWAY
frame containing a Stream ID of any other type as a connection error
of type HTTP_MALFORMED_FRAME.
Clients do not need to send GOAWAY to initiate a graceful shutdown; Clients do not need to send GOAWAY to initiate a graceful shutdown;
they simply stop making new requests. A server MUST treat receipt of they simply stop making new requests. A server MUST treat receipt of
a GOAWAY frame as a connection error (Section 6) of type a GOAWAY frame as a connection error (Section 6) of type
HTTP_UNEXPECTED_GOAWAY. HTTP_UNEXPECTED_GOAWAY.
A client MUST treat receipt of a GOAWAY frame containing a Stream ID
of any other type as a connection error of type HTTP_MALFORMED_FRAME.
The GOAWAY frame applies to the connection, not a specific stream. The GOAWAY frame applies to the connection, not a specific stream.
An endpoint MUST treat a GOAWAY frame on a stream other than the An endpoint MUST treat a GOAWAY frame on a stream other than the
control stream as a connection error (Section 6) of type control stream as a connection error (Section 6) of type
HTTP_WRONG_STREAM. HTTP_WRONG_STREAM.
New client requests might already have been sent before the client New client requests might already have been sent before the client
receives the server's GOAWAY frame. The GOAWAY frame contains the receives the server's GOAWAY frame. The GOAWAY frame contains the
Stream ID of the last client-initiated request that was or might be Stream ID of the last client-initiated request that was or might be
processed in this connection, which enables client and server to processed in this connection, which enables client and server to
agree on which requests were accepted prior to the connection agree on which requests were accepted prior to the connection
shutdown. This identifier MAY be lower than the stream limit shutdown. This identifier MAY be lower than the stream limit
identified by a QUIC MAX_STREAM_ID frame, and MAY be zero if no identified by a QUIC MAX_STREAM_ID frame, and MAY be zero if no
requests were processed. Servers SHOULD NOT increase the requests were processed. Servers SHOULD NOT increase the
MAX_STREAM_ID limit after sending a GOAWAY frame. MAX_STREAM_ID limit after sending a GOAWAY frame.
Note: In this context, "processed" means that some data from the Once sent, the server MUST cancel requests sent on streams with an
stream was passed to some higher layer of software that might have
taken some action as a result.
Once sent, the server will refuse requests sent on streams with an
identifier higher than the included last Stream ID. Clients MUST NOT identifier higher than the included last Stream ID. Clients MUST NOT
send new requests on the connection after receiving GOAWAY, although send new requests on the connection after receiving GOAWAY, although
requests might already be in transit. A new connection can be requests might already be in transit. A new connection can be
established for new requests. established for new requests.
If the client has sent requests on streams with a higher Stream ID If the client has sent requests on streams with a higher Stream ID
than indicated in the GOAWAY frame, those requests were not and will than indicated in the GOAWAY frame, those requests are considered
not be processed. Endpoints SHOULD reset any streams above this ID cancelled (Section 3.2.3). Clients SHOULD reset any streams above
with the error code HTTP_REQUEST_CANCELLED. Servers MAY also reset this ID with the error code HTTP_REQUEST_CANCELLED. Servers MAY also
streams below the indicated ID with HTTP_REQUEST_CANCELLED if the cancel requests on streams below the indicated ID if these requests
associated requests were not processed. Servers MUST NOT use the were not processed.
HTTP_REQUEST_CANCELLED status for requests which were partially or
fully processed.
The client can treat requests cancelled by the server as though they
had never been sent at all, thereby allowing them to be retried later
on a new connection. If a stream is cancelled after receiving a
complete response, the client MAY ignore the cancellation and use the
response. However, if a stream is cancelled after receiving a
partial response, the response SHOULD NOT be used. Automatically
retrying such requests is not possible, unless this is otherwise
permitted (e.g., idempotent actions like GET, PUT, or DELETE).
Requests on Stream IDs less than or equal to the Stream ID in the Requests on Stream IDs less than or equal to the Stream ID in the
GOAWAY frame might have been processed; their status cannot be known GOAWAY frame might have been processed; their status cannot be known
until they are completed successfully, reset individually, or the until they are completed successfully, reset individually, or the
connection terminates. connection terminates.
Servers SHOULD send a GOAWAY frame when the closing of a connection Servers SHOULD send a GOAWAY frame when the closing of a connection
is known in advance, even if the advance notice is small, so that the is known in advance, even if the advance notice is small, so that the
remote peer can know whether a stream has been partially processed or remote peer can know whether a stream has been partially processed or
not. For example, if an HTTP client sends a POST at the same time not. For example, if an HTTP client sends a POST at the same time
that a server closes a QUIC connection, the client cannot know if the that a server closes a QUIC connection, the client cannot know if the
skipping to change at page 21, line 38 skipping to change at page 22, line 22
losing requests. losing requests.
Once all requests on streams at or below the identified stream number Once all requests on streams at or below the identified stream number
have been completed or cancelled, and all promised server push have been completed or cancelled, and all promised server push
responses associated with those requests have been completed or responses associated with those requests have been completed or
cancelled, the connection can be closed using an Immediate Close (see cancelled, the connection can be closed using an Immediate Close (see
[QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown [QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown
SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR
code. code.
4.2.8. MAX_PUSH_ID 4.2.8. HEADER_ACK
The HEADER_ACK frame (type=0x8) is used by header compression to
ensure consistency. The frames are sent from the QCRAM decoder to
the QCRAM encoder; that is, the server sends them to the client to
acknowledge processing of the client's header blocks, and the client
sends them to the server to acknowledge processing of the server's
header blocks.
The HEADER_ACK frame is sent on the Control Stream when the QCRAM
decoder has fully processed a header block. It is used by the peer's
QCRAM encoder to determine whether subsequent indexed representations
that might reference that block are vulnerable to head-of-line
blocking, and to prevent eviction races. See [QCRAM] for more
details on the use of this information.
The HEADER_ACK frame indicates the stream on which the header block
was processed by encoding the Stream ID as a variable-length integer.
The same Stream ID can be identified multiple times, as multiple
header-containing blocks can be sent on a single stream in the case
of intermediate responses, trailers, pushed requests, etc. as well as
on the Control Streams. 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.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| Stream ID (i) ...
+---+---+---+---+---+---+---+---+
HEADER_ACK frame
The HEADER_ACK frame does not define any flags.
4.2.9. MAX_PUSH_ID
The MAX_PUSH_ID frame (type=0xD) is used by clients to control the The MAX_PUSH_ID frame (type=0xD) is used by clients to control the
number of server pushes that the server can initiate. This sets the number of server pushes that the server can initiate. This sets the
maximum value for a Push ID that the server can use in a PUSH_PROMISE maximum value for a Push ID that the server can use in a PUSH_PROMISE
frame. Consequently, this also limits the number of push streams frame. Consequently, this also limits the number of push streams
that the server can initiate in addition to the limit set by the QUIC that the server can initiate in addition to the limit set by the QUIC
MAX_STREAM_ID frame. MAX_STREAM_ID frame.
The MAX_PUSH_ID frame is always sent on a control stream. Receipt of The MAX_PUSH_ID frame is always sent on a control stream. Receipt of
a MAX_PUSH_ID frame on any other stream MUST be treated as a a MAX_PUSH_ID frame on any other stream MUST be treated as a
skipping to change at page 25, line 18 skipping to change at page 26, line 43
notion of in-order delivery of priority changes (i.e., dependency notion of in-order delivery of priority changes (i.e., dependency
tree mutations): since operations on the dependency tree such as tree mutations): since operations on the dependency tree such as
reparenting a subtree are not commutative, both sender and receiver reparenting a subtree are not commutative, both sender and receiver
must apply them in the same order to ensure that both sides have a must apply them in the same order to ensure that both sides have a
consistent view of the stream dependency tree. HTTP/2 specifies consistent view of the stream dependency tree. HTTP/2 specifies
priority assignments in PRIORITY frames and (optionally) in HEADERS priority assignments in PRIORITY frames and (optionally) in HEADERS
frames. To achieve in-order delivery of priority changes in HTTP/ frames. To achieve in-order delivery of priority changes in HTTP/
QUIC, PRIORITY frames are sent on the control stream and the PRIORITY QUIC, PRIORITY frames are sent on the control stream and the PRIORITY
section is removed from the HEADERS frame. section is removed from the HEADERS frame.
Likewise, HPACK was designed with the assumption of in-order
delivery. A sequence of encoded header blocks must arrive (and be
decoded) at an endpoint in the same order in which they were encoded.
This ensures that the dynamic state at the two endpoints remains in
sync. As a result, HTTP/QUIC uses a modified version of HPACK,
described in [QCRAM].
Frame type definitions in HTTP/QUIC often use the QUIC variable- Frame type definitions in HTTP/QUIC often use the QUIC variable-
length integer encoding. In particular, Stream IDs use this length integer encoding. In particular, Stream IDs use this
encoding, which allow for a larger range of possible values than the encoding, which allow for a larger range of possible values than the
encoding used in HTTP/2. Some frames in HTTP/QUIC use an identifier encoding used in HTTP/2. Some frames in HTTP/QUIC use an identifier
rather than a Stream ID (e.g. Push IDs in PRIORITY frames). rather than a Stream ID (e.g. Push IDs in PRIORITY frames).
Redefinition of the encoding of extension frame types might be Redefinition of the encoding of extension frame types might be
necessary if the encoding includes a Stream ID. necessary if the encoding includes a Stream ID.
Other than this issue, frame type HTTP/2 extensions are typically Other than this issue, frame type HTTP/2 extensions are typically
portable to QUIC simply by replacing Stream 0 in HTTP/2 with Stream 2 portable to QUIC simply by replacing Stream 0 in HTTP/2 with Stream 2
skipping to change at page 30, line 5 skipping to change at page 31, line 20
Code: The 8-bit code assigned to the frame type. Code: The 8-bit code assigned to the frame type.
Specification: A reference to a specification that includes a Specification: A reference to a specification that includes a
description of the frame layout, its semantics, and flags that the description of the frame layout, its semantics, and flags that the
frame type uses, including any parts of the frame that are frame type uses, including any parts of the frame that are
conditionally present based on the value of flags. conditionally present based on the value of flags.
The entries in the following table are registered by this document. The entries in the following table are registered by this document.
+--------------+------+---------------+ +--------------+------+---------------------+
| Frame Type | Code | Specification | | Frame Type | Code | Specification |
+--------------+------+---------------+ +--------------+------+---------------------+
| DATA | 0x0 | Section 4.2.1 | | DATA | 0x0 | Section 4.2.1 |
| | | | | | | |
| HEADERS | 0x1 | Section 4.2.2 | | HEADERS | 0x1 | Section 4.2.2 |
| | | | | | | |
| PRIORITY | 0x2 | Section 4.2.3 | | PRIORITY | 0x2 | Section 4.2.3 |
| | | | | | | |
| CANCEL_PUSH | 0x3 | Section 4.2.4 | | CANCEL_PUSH | 0x3 | Section 4.2.4 |
| | | | | | | |
| SETTINGS | 0x4 | Section 4.2.5 | | SETTINGS | 0x4 | Section 4.2.5 |
| | | | | | | |
| PUSH_PROMISE | 0x5 | Section 4.2.6 | | PUSH_PROMISE | 0x5 | Section 4.2.6 |
| | | | | | | |
| Reserved | 0x6 | N/A | | Reserved | 0x6 | N/A |
| | | | | | | |
| GOAWAY | 0x7 | Section 4.2.7 | | GOAWAY | 0x7 | Section 4.2.7 |
| | | | | | | |
| Reserved | 0x8 | N/A | | HEADER_ACK | 0x8 | {{frame-header-ack} |
| | | | | | | |
| Reserved | 0x9 | N/A | | Reserved | 0x9 | N/A |
| | | | | | | |
| MAX_PUSH_ID | 0xD | Section 4.2.8 | | MAX_PUSH_ID | 0xD | Section 4.2.9 |
+--------------+------+---------------+ +--------------+------+---------------------+
9.4. Settings Parameters 9.4. Settings Parameters
This document establishes a registry for HTTP/QUIC settings. The This document establishes a registry for HTTP/QUIC settings. The
"HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC
Settings" registry operates under the "Expert Review" policy Settings" registry operates under the "Expert Review" policy
[RFC8126] for values in the range from 0x0000 to 0xefff, with values [RFC8126] for values in the range from 0x0000 to 0xefff, with values
between and 0xf000 and 0xffff being reserved for Experimental Use. between and 0xf000 and 0xffff being reserved for Experimental Use.
The designated experts are the same as those for the "HTTP/2 The designated experts are the same as those for the "HTTP/2
Settings" registry defined in [RFC7540]. Settings" registry defined in [RFC7540].
skipping to change at page 33, line 25 skipping to change at page 34, line 43
| HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 6.1 | | HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 6.1 |
| | | frame | | | | | frame | |
| | | formatting | | | | | formatting | |
| | | or use | | | | | or use | |
+----------------------------+--------+------------+----------------+ +----------------------------+--------+------------+----------------+
10. References 10. References
10.1. Normative References 10.1. Normative References
[QCRAM] Krasic, C., Bishop, M., and A. Frindell, Ed., "Header
Compression for HTTP over QUIC", draft-ietf-quic-qcram-00
(work in progress), March 2018.
[QUIC-TRANSPORT] [QUIC-TRANSPORT]
Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
Multiplexed and Secure Transport", draft-ietf-quic- Multiplexed and Secure Transport", draft-ietf-quic-
transport-09 (work in progress), January 2018. transport-10 (work in progress), March 2018.
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7, [RFC0793] Postel, J., "Transmission Control Protocol", STD 7,
RFC 793, DOI 10.17487/RFC0793, September 1981, RFC 793, DOI 10.17487/RFC0793, September 1981,
<https://www.rfc-editor.org/info/rfc793>. <https://www.rfc-editor.org/info/rfc793>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
skipping to change at page 34, line 20 skipping to change at page 35, line 39
[RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
Protocol (HTTP/1.1): Semantics and Content", RFC 7231, Protocol (HTTP/1.1): Semantics and Content", RFC 7231,
DOI 10.17487/RFC7231, June 2014, DOI 10.17487/RFC7231, June 2014,
<https://www.rfc-editor.org/info/rfc7231>. <https://www.rfc-editor.org/info/rfc7231>.
[RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext
Transfer Protocol Version 2 (HTTP/2)", RFC 7540, Transfer Protocol Version 2 (HTTP/2)", RFC 7540,
DOI 10.17487/RFC7540, May 2015, DOI 10.17487/RFC7540, May 2015,
<https://www.rfc-editor.org/info/rfc7540>. <https://www.rfc-editor.org/info/rfc7540>.
[RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for
HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015,
<https://www.rfc-editor.org/info/rfc7541>.
[RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP [RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP
Alternative Services", RFC 7838, DOI 10.17487/RFC7838, Alternative Services", RFC 7838, DOI 10.17487/RFC7838,
April 2016, <https://www.rfc-editor.org/info/rfc7838>. April 2016, <https://www.rfc-editor.org/info/rfc7838>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
10.2. Informative References 10.2. Informative References
skipping to change at page 35, line 18 skipping to change at page 36, line 31
Warres. Warres.
A substantial portion of Mike's contribution was supported by A substantial portion of Mike's contribution was supported by
Microsoft during his employment there. Microsoft during his employment there.
Appendix B. Change Log Appendix B. Change Log
*RFC Editor's Note:* Please remove this section prior to *RFC Editor's Note:* Please remove this section prior to
publication of a final version of this document. publication of a final version of this document.
B.1. Since draft-ietf-quic-http-08 B.1. Since draft-ietf-quic-http-09
o Selected QCRAM for header compression (#228, #1117)
o The server_name TLS extension is now mandatory (#296, #495)
o Specified handling of unsupported versions in Alt-Svc (#1093,
#1097)
B.2. Since draft-ietf-quic-http-08
o Clarified connection coalescing rules (#940, #1024) o Clarified connection coalescing rules (#940, #1024)
B.2. Since draft-ietf-quic-http-07 B.3. Since draft-ietf-quic-http-07
o Changes for integer encodings in QUIC (#595,#905) o Changes for integer encodings in QUIC (#595,#905)
o Use unidirectional streams as appropriate (#515, #240, #281, #886) o Use unidirectional streams as appropriate (#515, #240, #281, #886)
o Improvement to the description of GOAWAY (#604, #898) o Improvement to the description of GOAWAY (#604, #898)
o Improve description of server push usage (#947, #950, #957) o Improve description of server push usage (#947, #950, #957)
B.3. Since draft-ietf-quic-http-06 B.4. Since draft-ietf-quic-http-06
o Track changes in QUIC error code usage (#485) o Track changes in QUIC error code usage (#485)
B.4. Since draft-ietf-quic-http-05 B.5. Since draft-ietf-quic-http-05
o Made push ID sequential, add MAX_PUSH_ID, remove o Made push ID sequential, add MAX_PUSH_ID, remove
SETTINGS_ENABLE_PUSH (#709) SETTINGS_ENABLE_PUSH (#709)
o Guidance about keep-alive and QUIC PINGs (#729) o Guidance about keep-alive and QUIC PINGs (#729)
o Expanded text on GOAWAY and cancellation (#757) o Expanded text on GOAWAY and cancellation (#757)
B.5. Since draft-ietf-quic-http-04 B.6. Since draft-ietf-quic-http-04
o Cite RFC 5234 (#404) o Cite RFC 5234 (#404)
o Return to a single stream per request (#245,#557) o Return to a single stream per request (#245,#557)
o Use separate frame type and settings registries from HTTP/2 (#81) o Use separate frame type and settings registries from HTTP/2 (#81)
o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477)
o Restored GOAWAY (#696) o Restored GOAWAY (#696)
o Identify server push using Push ID rather than a stream ID o Identify server push using Push ID rather than a stream ID
(#702,#281) (#702,#281)
o DATA frames cannot be empty (#700) o DATA frames cannot be empty (#700)
B.6. Since draft-ietf-quic-http-03 B.7. Since draft-ietf-quic-http-03
None. None.
B.7. Since draft-ietf-quic-http-02 B.8. Since draft-ietf-quic-http-02
o Track changes in transport draft o Track changes in transport draft
B.8. Since draft-ietf-quic-http-01 B.9. Since draft-ietf-quic-http-01
o SETTINGS changes (#181): o SETTINGS changes (#181):
* SETTINGS can be sent only once at the start of a connection; no * SETTINGS can be sent only once at the start of a connection; no
changes thereafter changes thereafter
* SETTINGS_ACK removed * SETTINGS_ACK removed
* Settings can only occur in the SETTINGS frame a single time * Settings can only occur in the SETTINGS frame a single time
* Boolean format updated * Boolean format updated
o Alt-Svc parameter changed from "v" to "quic"; format updated o Alt-Svc parameter changed from "v" to "quic"; format updated
(#229) (#229)
o Closing the connection control stream or any message control o Closing the connection control stream or any message control
stream is a fatal error (#176) stream is a fatal error (#176)
o HPACK Sequence counter can wrap (#173) o HPACK Sequence counter can wrap (#173)
skipping to change at page 36, line 47 skipping to change at page 38, line 19
o Closing the connection control stream or any message control o Closing the connection control stream or any message control
stream is a fatal error (#176) stream is a fatal error (#176)
o HPACK Sequence counter can wrap (#173) o HPACK Sequence counter can wrap (#173)
o 0-RTT guidance added o 0-RTT guidance added
o Guide to differences from HTTP/2 and porting HTTP/2 extensions o Guide to differences from HTTP/2 and porting HTTP/2 extensions
added (#127,#242) added (#127,#242)
B.9. Since draft-ietf-quic-http-00 B.10. Since draft-ietf-quic-http-00
o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29)
o Changed from using HTTP/2 framing within Stream 3 to new framing o Changed from using HTTP/2 framing within Stream 3 to new framing
format and two-stream-per-request model (#71,#72,#73) format and two-stream-per-request model (#71,#72,#73)
o Adopted SETTINGS format from draft-bishop-httpbis-extended- o Adopted SETTINGS format from draft-bishop-httpbis-extended-
settings-01 settings-01
o Reworked SETTINGS_ACK to account for indeterminate inter-stream o Reworked SETTINGS_ACK to account for indeterminate inter-stream
order (#75) order (#75)
o Described CONNECT pseudo-method (#95) o Described CONNECT pseudo-method (#95)
skipping to change at page 37, line 19 skipping to change at page 38, line 38
o Reworked SETTINGS_ACK to account for indeterminate inter-stream o Reworked SETTINGS_ACK to account for indeterminate inter-stream
order (#75) order (#75)
o Described CONNECT pseudo-method (#95) o Described CONNECT pseudo-method (#95)
o Updated ALPN token and Alt-Svc guidance (#13,#87) o Updated ALPN token and Alt-Svc guidance (#13,#87)
o Application-layer-defined error codes (#19,#74) o Application-layer-defined error codes (#19,#74)
B.10. Since draft-shade-quic-http2-mapping-00 B.11. Since draft-shade-quic-http2-mapping-00
o Adopted as base for draft-ietf-quic-http o Adopted as base for draft-ietf-quic-http
o Updated authors/editors list o Updated authors/editors list
Author's Address Author's Address
Mike Bishop (editor) Mike Bishop (editor)
Akamai Akamai
 End of changes. 49 change blocks. 
153 lines changed or deleted 234 lines changed or added

This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/