draft-ietf-quic-http-04.txt   draft-ietf-quic-http-05.txt 
QUIC M. Bishop, Ed. QUIC M. Bishop, Ed.
Internet-Draft Microsoft Internet-Draft Microsoft
Intended status: Standards Track June 13, 2017 Intended status: Standards Track August 15, 2017
Expires: December 15, 2017 Expires: February 16, 2018
Hypertext Transfer Protocol (HTTP) over QUIC Hypertext Transfer Protocol (HTTP) over QUIC
draft-ietf-quic-http-04 draft-ietf-quic-http-05
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 http://datatracker.ietf.org/drafts/current/. Drafts is at http://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 December 15, 2017. This Internet-Draft will expire on February 16, 2018.
Copyright Notice Copyright Notice
Copyright (c) 2017 IETF Trust and the persons identified as the Copyright (c) 2017 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
(http://trustee.ietf.org/license-info) in effect on the date of (http://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
skipping to change at page 2, line 26 skipping to change at page 2, line 26
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 . . . . . . . . . . . . . . . . . 3
2. QUIC Advertisement . . . . . . . . . . . . . . . . . . . . . 3 2. QUIC Advertisement . . . . . . . . . . . . . . . . . . . . . 3
2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . . . 4 2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . . . 4
3. Connection Establishment . . . . . . . . . . . . . . . . . . 4 3. Connection Establishment . . . . . . . . . . . . . . . . . . 5
3.1. Draft Version Identification . . . . . . . . . . . . . . 5 3.1. Draft Version Identification . . . . . . . . . . . . . . 5
4. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 5 4. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 5
4.1. Stream 1: Connection Control Stream . . . . . . . . . . . 6 4.1. Stream 1: Control Stream . . . . . . . . . . . . . . . . 6
4.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 6 4.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 6
4.2.1. Header Compression . . . . . . . . . . . . . . . . . 7 4.2.1. Header Compression . . . . . . . . . . . . . . . . . 7
4.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 8 4.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 8
4.3. Stream Priorities . . . . . . . . . . . . . . . . . . . . 9 4.3. Request Prioritization . . . . . . . . . . . . . . . . . 9
4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 9 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 9
5. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 10 5. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 10
5.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 10 5.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 10
5.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 10 5.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 11
5.2.1. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 10 5.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 11
5.2.2. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 11 5.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 11
5.2.3. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 12 5.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 11
5.2.4. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 15 5.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 13
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 15 5.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 14
6.1. HTTP-Defined QUIC Error Codes . . . . . . . . . . . . . . 16 5.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 16
7. Considerations for Transitioning from HTTP/2 . . . . . . . . 17 5.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 17
7.1. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 17 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 19
7.2. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 18 6.1. HTTP-Defined QUIC Error Codes . . . . . . . . . . . . . . 19
7.3. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 19 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 21
8. Security Considerations . . . . . . . . . . . . . . . . . . . 20 7.1. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 21
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 7.2. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 23
9.1. Registration of HTTP/QUIC Identification String . . . . . 21 7.3. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 24
9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 21 8. Security Considerations . . . . . . . . . . . . . . . . . . . 25
9.3. Existing Frame Types . . . . . . . . . . . . . . . . . . 21 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 25
9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 22 9.1. Registration of HTTP/QUIC Identification String . . . . . 25
9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 23 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 25
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 25 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 25
10.1. Normative References . . . . . . . . . . . . . . . . . . 25 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 26
10.2. Informative References . . . . . . . . . . . . . . . . . 26 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 27
Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 26 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 29
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 26 10.1. Normative References . . . . . . . . . . . . . . . . . . 30
B.1. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 26 10.2. Informative References . . . . . . . . . . . . . . . . . 31
B.2. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 27 Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 31
B.3. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 27 Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 31
B.4. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 28 B.1. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 31
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 28 B.2. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 31
B.3. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 31
B.4. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 32
B.5. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 32
B.6. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 33
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 33
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.
QUIC is described in [QUIC-TRANSPORT]. For a full description of QUIC is described in [QUIC-TRANSPORT]. For a full description of
HTTP/2, see [RFC7540]. HTTP/2, see [RFC7540].
1.1. Notational Conventions 1.1. Notational Conventions
The words "MUST", "MUST NOT", "SHOULD", and "MAY" are used in this The words "MUST", "MUST NOT", "SHOULD", and "MAY" are used in this
document. It's not shouting; when they are capitalized, they have document. It's not shouting; when they are capitalized, they have
the special meaning defined in [RFC2119]. the special meaning defined in [RFC2119].
Field definitions are given in Augmented Backus-Naur Form (ABNF), as
defined in [RFC5234].
2. QUIC Advertisement 2. QUIC Advertisement
An HTTP origin advertises the availability of an equivalent HTTP/QUIC An HTTP origin advertises the availability of an equivalent HTTP/QUIC
endpoint via the Alt-Svc HTTP response header or the HTTP/2 ALTSVC endpoint via the Alt-Svc HTTP response header or the HTTP/2 ALTSVC
frame ([RFC7838]), using the ALPN token defined in Section 3. frame ([RFC7838]), using the ALPN token defined in Section 3.
For example, an origin could indicate in an HTTP/1.1 or HTTP/2 For example, an origin could indicate in an HTTP/1.1 or HTTP/2
response that HTTP/QUIC was available on UDP port 50781 at the same response that HTTP/QUIC was available on UDP port 50781 at the same
hostname by including the following header in any response: hostname by including the following header in any response:
skipping to change at page 4, line 48 skipping to change at page 5, line 15
3. Connection Establishment 3. Connection Establishment
HTTP/QUIC connections are established as described in HTTP/QUIC connections are established as described in
[QUIC-TRANSPORT]. During connection establishment, HTTP/QUIC support [QUIC-TRANSPORT]. During connection establishment, HTTP/QUIC support
is indicated by selecting the ALPN token "hq" in the crypto is indicated by selecting the ALPN token "hq" in the crypto
handshake. handshake.
While connection-level options pertaining to the core QUIC protocol While connection-level options pertaining to the core QUIC protocol
are set in the initial crypto handshake, HTTP-specific settings are are set in the initial crypto handshake, HTTP-specific settings are
conveyed in the SETTINGS frame. After the QUIC connection is conveyed in the SETTINGS frame. After the QUIC connection is
established, a SETTINGS frame (Section 5.2.3) MUST be sent as the established, a SETTINGS frame (Section 5.2.5) MUST be sent as the
initial frame of the HTTP control stream (Stream ID 1, see initial frame of the HTTP control stream (Stream ID 1, see
Section 4). The server MUST NOT send data on any other stream until Section 4). The server MUST NOT send data on any other stream until
the client's SETTINGS frame has been received. the client's SETTINGS frame has been received.
3.1. Draft Version Identification 3.1. Draft Version Identification
*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.
Only implementations of the final, published RFC can identify Only implementations of the final, published RFC can identify
skipping to change at page 5, line 39 skipping to change at page 6, line 7
A QUIC stream provides reliable in-order delivery of bytes, but makes A QUIC stream provides reliable in-order delivery of bytes, but makes
no guarantees about order of delivery with regard to bytes on other no guarantees about order of delivery with regard to bytes on other
streams. On the wire, data is framed into QUIC STREAM frames, but streams. On the wire, data is framed into QUIC STREAM frames, but
this framing is invisible to the HTTP framing layer. A QUIC receiver this framing is invisible to the HTTP framing layer. A QUIC receiver
buffers and orders received STREAM frames, exposing the data buffers and orders received STREAM frames, exposing the data
contained within as a reliable byte stream to the application. contained within as a reliable byte stream to the application.
QUIC reserves Stream 0 for crypto operations (the handshake, crypto QUIC reserves Stream 0 for crypto operations (the handshake, crypto
config updates). Stream 1 is reserved for sending and receiving HTTP config updates). Stream 1 is reserved for sending and receiving HTTP
control frames, and is analogous to HTTP/2's Stream 0. This control frames, and is analogous to HTTP/2's Stream 0. This control
connection control stream is considered critical to the HTTP stream is considered critical to the HTTP connection. If the control
connection. If the connection control stream is closed for any stream is closed for any reason, this MUST be treated as a connection
reason, this MUST be treated as a connection error of type error of type QUIC_CLOSED_CRITICAL_STREAM.
QUIC_CLOSED_CRITICAL_STREAM.
When HTTP headers and data are sent over QUIC, the QUIC layer handles When HTTP headers and data are sent over QUIC, the QUIC layer handles
most of the stream management. An HTTP request/response consumes a most of the stream management. An HTTP request/response consumes a
pair of streams: This means that the client's first request occurs on single stream: This means that the client's first request occurs on
QUIC streams 3 and 5, the second on stream 7 and 9, and so on. The QUIC stream 3, the second on stream 5, and so on. The server's first
server's first push consumes streams 2 and 4. This amounts to the push consumes stream 2.
second least-significant bit differentiating the two streams in a
request.
The lower-numbered stream is called the message control stream and
carries frames related to the request/response, including HEADERS.
The higher-numbered stream is the data stream and carries the
request/response body with no additional framing. Note that a
request or response without a body will cause this stream to be half-
closed in the corresponding direction without transferring data.
Because the message control stream contains HPACK data which
manipulates connection-level state, the message control stream MUST
NOT be closed with a stream-level error. If an implementation
chooses to reject a request with a QUIC error code, it MUST trigger a
QUIC RST_STREAM on the data stream only. An implementation MAY close
(FIN) a message control stream without completing a full HTTP message
if the data stream has been abruptly closed. Data on message control
streams MUST be fully consumed, or the connection terminated.
All message control streams are considered critical to the HTTP This stream carries frames related to the request/response (see
connection. If a message control stream is terminated abruptly for Section 5.2). When a stream terminates cleanly, if the last frame on
any reason, this MUST be treated as a connection error of type the stream was truncated, this MUST be treated as a connection error
HTTP_RST_CONTROL_STREAM. When a message control stream terminates (see HTTP_MALFORMED_* in Section 6.1). Streams which terminate
cleanly, if the last frame on the stream was truncated, this MUST be abruptly may be reset at any point in the frame.
treated as a connection error (see HTTP_MALFORMED_* in Section 6.1).
Pairs of streams must be utilized sequentially, with no gaps. The Streams SHOULD be used sequentially, with no gaps. Streams used for
data stream is opened at the same time as the message control stream pushed resources MAY be initiated out-of-order, but stream IDs SHOULD
is opened and is closed after transferring the body. The data stream be allocated to promised resources sequentially.
is closed immediately after sending the request headers if there is
no body.
HTTP does not need to do any separate multiplexing when using QUIC - HTTP does not need to do any separate multiplexing when using QUIC -
data sent over a QUIC stream always maps to a particular HTTP data sent over a QUIC stream always maps to a particular HTTP
transaction. Requests and responses are considered complete when the transaction. Requests and responses are considered complete when the
corresponding QUIC streams are closed in the appropriate direction. corresponding QUIC stream is closed in the appropriate direction.
4.1. Stream 1: Connection Control Stream 4.1. Stream 1: Control Stream
Since most connection-level concerns will be managed by QUIC, the Since most connection-level concerns will be managed by QUIC, the
primary use of Stream 1 will be for the SETTINGS frame when the primary use of Stream 1 will be for the SETTINGS frame when the
connection opens and for PRIORITY frames subsequently. connection opens and for PRIORITY frames subsequently.
4.2. HTTP Message Exchanges 4.2. HTTP Message Exchanges
A client sends an HTTP request on a new pair of QUIC streams. A A client sends an HTTP request on a new QUIC stream. A server sends
server sends an HTTP response on the same streams as the request. an HTTP response on the same stream as the request.
An HTTP message (request or response) consists of: An HTTP message (request or response) consists of:
1. one header block (see Section 5.2.1) on the control stream 1. one header block (see Section 5.2.2) containing the message
containing the message headers (see [RFC7230], Section 3.2), headers (see [RFC7230], Section 3.2),
2. the payload body (see [RFC7230], Section 3.3), sent on the data 2. the payload body (see [RFC7230], Section 3.3), sent as a series
stream, of DATA frames (see Section 5.2.1),
3. optionally, one header block on the control stream containing the 3. optionally, one header block containing the trailer-part, if
trailer-part, if present (see [RFC7230], Section 4.1.2). present (see [RFC7230], Section 4.1.2).
In addition, prior to sending the message header block indicated In addition, prior to sending the message header block indicated
above, a response may contain zero or more header blocks on the above, a response may contain zero or more header blocks containing
control stream containing the message headers of informational (1xx) the message headers of informational (1xx) HTTP responses (see
HTTP responses (see [RFC7230], Section 3.2 and [RFC7231], [RFC7230], Section 3.2 and [RFC7231], Section 6.2).
Section 6.2).
The data stream MUST be half-closed immediately after the transfer of
the body. If the message does not contain a body, the corresponding
data stream MUST still be half-closed without transferring any data.
The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] The "chunked" transfer encoding defined in Section 4.1 of [RFC7230]
MUST NOT be used. MUST NOT be used.
Trailing header fields are carried in an additional header block on Trailing header fields are carried in an additional header block
the message control stream. Such a header block is a sequence of following the body. Such a header block is a sequence of HEADERS
HEADERS frames with End Header Block set on the last frame. Senders frames with End Header Block set on the last frame. Senders MUST
MUST send only one header block in the trailers section; receivers send only one header block in the trailers section; receivers MUST
MUST decode any subsequent header blocks in order to maintain HPACK discard any subsequent header blocks.
decoder state, but the resulting output MUST be discarded.
An HTTP request/response exchange fully consumes a pair of streams. An HTTP request/response exchange fully consumes a QUIC stream.
After sending a request, a client closes the streams for sending; After sending a request, a client closes the stream for sending;
after sending a response, the server closes its streams for sending after sending a response, the server closes the stream for sending
and the QUIC streams are fully closed. and the QUIC stream is fully closed.
A server can send a complete response prior to the client sending an A server can send a complete response prior to the client sending an
entire request if the response does not depend on any portion of the entire request if the response does not depend on any portion of the
request that has not been sent and received. When this is true, a request that has not been sent and received. When this is true, a
server MAY request that the client abort transmission of a request server MAY request that the client abort transmission of a request
without error by sending a RST_STREAM with an error code of NO_ERROR without error by triggering a QUIC STOP_SENDING with error code
after sending a complete response and closing its stream. Clients HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing
MUST NOT discard responses as a result of receiving such a its streams. Clients MUST NOT discard complete responses as a result
RST_STREAM, though clients can always discard responses at their of having their request terminated abruptly, though clients can
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
receiving a solicited RST_STREAM.
4.2.1. Header Compression 4.2.1. Header Compression
HTTP/QUIC uses HPACK header compression as described in [RFC7541]. HTTP/QUIC uses HPACK header compression as described in [RFC7541].
HPACK was designed for HTTP/2 with the assumption of in-order HPACK was designed for HTTP/2 with the assumption of in-order
delivery such as that provided by TCP. A sequence of encoded header delivery such as that provided by TCP. A sequence of encoded header
blocks must arrive (and be decoded) at an endpoint in the same order 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 in which they were encoded. This ensures that the dynamic state at
the two endpoints remains in sync. the two endpoints remains in sync.
QUIC streams provide in-order delivery of data sent on those streams, QUIC streams provide in-order delivery of data sent on those streams,
but there are no guarantees about order of delivery between streams. but there are no guarantees about order of delivery between streams.
To achieve in-order delivery of HEADERS frames in QUIC, the HPACK- QUIC anticipates moving to a modified version of HPACK without this
bearing frames contain a counter which can be used to ensure in-order assumption. In the meantime, by fixing the size of the dynamic table
processing. Data (request/response bodies) which arrive out of order at zero, HPACK can be used in an unordered environment.
are buffered until the corresponding HEADERS arrive.
This does introduce head-of-line blocking: if the packet containing
HEADERS for stream N is lost or reordered then the HEADERS for stream
N+4 cannot be processed until it has been retransmitted successfully,
even though the HEADERS for stream N+4 may have arrived.
DISCUSS: Keep HPACK with HOLB? Redesign HPACK to be order-
invariant? How much do we need to retain compatibility with
HTTP/2's HPACK?
4.2.2. The CONNECT Method 4.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 8, line 44 skipping to change at page 8, line 25
A CONNECT request in HTTP/QUIC functions in the same manner as in A CONNECT request in HTTP/QUIC functions in the same manner as in
HTTP/2. The request MUST be formatted as described in [RFC7540], HTTP/2. The request MUST be formatted as described in [RFC7540],
Section 8.3. A CONNECT request that does not conform to these Section 8.3. A CONNECT request that does not conform to these
restrictions is malformed. The message data stream MUST NOT be restrictions is malformed. The message data stream MUST NOT be
closed at the end of the request. closed at the end of the request.
A proxy that supports CONNECT establishes a TCP connection A proxy that supports CONNECT establishes a TCP connection
([RFC0793]) to the server identified in the ":authority" pseudo- ([RFC0793]) to the server identified in the ":authority" pseudo-
header field. Once this connection is successfully established, the header field. Once this connection is successfully established, the
proxy sends a HEADERS frame containing a 2xx series status code to proxy sends a HEADERS frame containing a 2xx series status code to
the client, as defined in [RFC7231], Section 4.3.6, on the message the client, as defined in [RFC7231], Section 4.3.6.
control stream.
All QUIC STREAM frames on the message data stream correspond to data All DATA frames on the request stream correspond to data sent on the
sent on the TCP connection. Any QUIC STREAM frame sent by the client TCP connection. Any DATA frame sent by the client is transmitted by
is transmitted by the proxy to the TCP server; data received from the the proxy to the TCP server; data received from the TCP server is
TCP server is written to the data stream by the proxy. Note that the packaged into DATA frames by the proxy. Note that the size and
size and number of TCP segments is not guaranteed to map predictably number of TCP segments is not guaranteed to map predictably to the
to the size and number of QUIC STREAM frames. size and number of HTTP DATA or QUIC STREAM frames.
The TCP connection can be closed by either peer. When the client The TCP connection can be closed by either peer. When the client
half-closes the data stream, the proxy will set the FIN bit on its half-closes the request stream, the proxy will set the FIN bit on its
connection to the TCP server. When the proxy receives a packet with connection to the TCP server. When the proxy receives a packet with
the FIN bit set, it will half-close the corresponding data stream. the FIN bit set, it will half-close the corresponding stream. TCP
TCP connections which remain half-closed in a single direction are connections which remain half-closed in a single direction are not
not invalid, but are often handled poorly by servers, so clients invalid, but are often handled poorly by servers, so clients SHOULD
SHOULD NOT half-close connections on which they are still expecting NOT half-close connections on which they are still expecting data.
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.
4.3. Stream Priorities 4.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 stream can be Section 5.3. In this priority scheme, a given request can be
designated as dependent upon another stream, which expresses the designated as dependent upon another request, which expresses the
preference that the latter stream (the "parent" stream) be allocated preference that the latter stream (the "parent" request) be allocated
resources before the former stream (the "dependent" stream). Taken resources before the former stream (the "dependent" request). Taken
together, the dependencies across all streams 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
streams. requests.
For consistency's sake, all PRIORITY frames MUST refer to the message HTTP/2 defines its priorities in terms of streams whereas HTTP over
control stream of the dependent request, not the data stream. QUIC identifies requests. The PRIORITY frame Section 5.2.3
identifies a request either by identifying the stream that carries a
request or by using a Push ID (Section 5.2.6). Other than the means
of identifying requests, the prioritization system is identical to
that in HTTP/2.
Only a client can send PRIORITY frames. A server MUST NOT send a
PRIORITY frame.
4.4. Server Push 4.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 indicates whether it is willing connection establishment, the client indicates whether it is willing
to receive server pushes via the SETTINGS_DISABLE_PUSH setting in the to receive server pushes via the SETTINGS_ENABLE_PUSH setting in the
SETTINGS frame (see Section 3), which defaults to 1 (true). SETTINGS frame (see Section 3), which is disabled by default.
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 containing the Stream ID of the stream sending a PUSH_PROMISE frame that includes request header fields
to be pushed, as well as request header fields attributed to the attributed to the request. The PUSH_PROMISE frame is sent on a
request. The PUSH_PROMISE frame is sent on the control stream of the response stream. Unlike HTTP/2, the PUSH_PROMISE does not reference
associated (client-initiated) request, while the Promised Stream ID a stream; when a server fulfills a promise, the stream that carries
field specifies the Stream ID of the control stream for the server- the stream headers references the PUSH_PROMISE. This allows a server
initiated request. to fulfill promises in the order that best suits its needs.
The server push response is conveyed in the same way as a non-server- The server push response is conveyed on a push stream. A push stream
push response, with response headers and (if present) trailers is a server-initiated stream. A push stream includes a header (see
carried by HEADERS frames sent on the control stream, and response Figure 1) that identifies the PUSH_PROMISE that it fulfills. This
body (if any) sent via the corresponding data stream. header consists of a 32-bit Push ID, which identifies a server push
(see Section 5.2.6).
5. HTTP Framing Layer 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Frames are used only on the connection (stream 1) and message Figure 1: Push Stream Header
(streams 3, 7, etc.) control streams. Other streams carry data
payload and are not framed at the HTTP layer.
This section describes HTTP framing in QUIC and highlights some Each Push ID MUST only be used once in a push stream header. If a
differences from HTTP/2 framing. For more detail on differences from push stream header includes a Push ID that was used in another push
HTTP/2, see Section 7.1. 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
PUSH_PROMISE frames (see Section 5.2.6).
After the push stream header, a push contains a response
(Section 4.2), with response headers, a response body (if any)
carried by DATA frames, then trailers (if any) carried by HEADERS
frames.
If a promised server push is not needed by the client, the client
SHOULD send a CANCEL_PUSH frame; if the push stream is already open,
a QUIC STOP_SENDING frame with an appropriate error code can be used
instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see
Section 6). This asks the server not to transfer the data and
indicates that it will be discarded upon receipt.
5. HTTP Framing Layer
Frames are used on each stream. This section describes HTTP framing
in QUIC and highlights some differences from HTTP/2 framing. For
more detail on differences from HTTP/2, see Section 7.1.
5.1. Frame Layout 5.1. Frame Layout
All frames have the following format: All frames have the following format:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length (16) | Type (8) | Flags (8) | | Length (16) | Type (8) | Flags (8) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame Payload (*) ... | Frame Payload (*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 1: HTTP/QUIC frame format Figure 2: HTTP/QUIC frame format
5.2. Frame Definitions 5.2. Frame Definitions
5.2.1. HEADERS 5.2.1. DATA
DATA frames (type=0x0) convey arbitrary, variable-length sequences of
octets associated with an HTTP request or response payload.
The DATA frame defines no flags.
DATA frames MUST be associated with an HTTP request or response. If
a DATA frame is received on the control stream, the recipient MUST
respond with a connection error (Section 6) of type
HTTP_WRONG_STREAM.
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
with a stream error (Section 6) of type HTTP_MALFORMED_DATA.
5.2.2. HEADERS
The HEADERS frame (type=0x1) is used to carry part of a header set, The HEADERS frame (type=0x1) is used to carry part of a header set,
compressed using HPACK [RFC7541]. compressed using HPACK Section 4.2.1.
One flag is defined: One flag is defined:
End Header Block (0x4): This frame concludes a header block. End Header Block (0x4): This frame concludes a header block.
A HEADERS frame with any other flags set MUST be treated as a A HEADERS frame with any other flags set MUST be treated as a
connection error of type HTTP_MALFORMED_HEADERS. connection error of type HTTP_MALFORMED_HEADERS.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence? (16) | Header Block Fragment (*)...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 2: HEADERS frame payload
The HEADERS frame payload has the following fields:
Sequence Number: Present only on the first frame of a header block
sequence. This MUST be set to zero on the first header block
sequence, and incremented on each header block.
The next frame on the same stream after a HEADERS frame without the The next frame on the same stream after a HEADERS frame without the
EHB flag set MUST be another HEADERS frame. A receiver MUST treat EHB flag set MUST be another HEADERS frame. A receiver MUST treat
the receipt of any other type of frame as a stream error of type the receipt of any other type of frame as a stream error of type
HTTP_INTERRUPTED_HEADERS. (Note that QUIC can intersperse data from HTTP_INTERRUPTED_HEADERS. (Note that QUIC can intersperse data from
other streams between frames, or even during transmission of frames, other streams between frames, or even during transmission of frames,
so multiplexing is not blocked by this requirement.) so multiplexing is not blocked by this requirement.)
A full header block is contained in a sequence of zero or more A full header block is contained in a sequence of zero or more
HEADERS frames without EHB set, followed by a HEADERS frame with EHB HEADERS frames without EHB set, followed by a HEADERS frame with EHB
set. set.
On receipt, header blocks (HEADERS, PUSH_PROMISE) MUST be processed 5.2.3. PRIORITY
by the HPACK decoder in sequence. If a block is missing, all
subsequent HPACK frames MUST be held until it arrives, or the
connection terminated.
When the Sequence counter reaches its maximum value (0xFFFF), the
next increment returns it to zero. An endpoint MUST NOT wrap the
Sequence counter to zero until the previous zero-value header block
has been confirmed received.
5.2.2. 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 from [RFC7540]. In order of a stream and is substantially different in format from [RFC7540].
to support ordering, it MUST be sent only on the connection control In order to ensure that prioritization is processed in a consistent
stream. The format has been modified to accommodate not being sent order, PRIORITY frames MUST be sent on the control stream. A
on-stream and the larger stream ID space of QUIC. PRIORITY frame sent on any other stream MUST be treated as a
HTTP_WRONG_STREAM error.
The semantics of the Stream Dependency, Weight, and E flag are the The format has been modified to accommodate not being sent on a
same as in HTTP/2. request stream, to allow for identification of server pushes, and the
larger stream ID space of QUIC. The semantics of the Stream
Dependency, Weight, and E flag are otherwise the same as in HTTP/2.
The flags defined are: The flags defined are:
PUSH_PRIORITIZED (0x04): Indicates that the Prioritized Stream is a
server push rather than a request.
PUSH_DEPENDENT (0x02): Indicates a dependency on a server push.
E (0x01): Indicates that the stream dependency is exclusive (see E (0x01): Indicates that the stream dependency is exclusive (see
[RFC7540] Section 5.3). [RFC7540], Section 5.3).
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prioritized Stream (32) | | Prioritized Request ID (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dependent Stream (32) | | Stream Dependency ID (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Weight (8) | | Weight (8) |
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
Figure 3: PRIORITY frame payload Figure 3: PRIORITY frame payload
The HEADERS frame payload has the following fields: The PRIORITY frame payload has the following fields:
Prioritized Stream: A 32-bit stream identifier for the message Prioritized Request ID: A 32-bit identifier for a request. This
control stream whose priority is being updated. contains the stream ID of a request stream when the
PUSH_PRIORITIZED flag is clear, or a Push ID when the
PUSH_PRIORITIZED flag is set.
Stream Dependency: A 32-bit stream identifier for the stream that Stream Dependency ID: A 32-bit stream identifier for a dependent
this stream depends on (see Section 4.3 and {!RFC7540}} request. This contains the stream ID of a request stream when the
Section 5.3). PUSH_DEPENDENT flag is clear, or a Push ID when the PUSH_DEPENDENT
flag is set. A request stream ID of 0 indicates a dependency on
the root stream. For details of dependencies, see Section 4.3 and
[RFC7540], Section 5.3.
Weight: An unsigned 8-bit integer representing a priority weight for Weight: An unsigned 8-bit integer representing a priority weight for
the stream (see [RFC7540] Section 5.3). Add one to the value to the stream (see [RFC7540], Section 5.3). Add one to the value to
obtain a weight between 1 and 256. obtain a weight between 1 and 256.
A PRIORITY frame MUST have a payload length of nine octets. A A PRIORITY frame identifies a request to priotize, and a request upon
PRIORITY frame of any other length MUST be treated as a connection which that request is dependent. A Prioritized Request ID or Stream
error of type HTTP_MALFORMED_PRIORITY. Dependency ID identifies a client-initiated request using the
corresponding stream ID when the corresponding PUSH_PRIORITIZED or
PUSH_DEPENDENT flag is not set. Setting the PUSH_PRIORITIZED or
PUSH_DEPENDENT flag causes the Prioritized Request ID or Stream
Dependency ID (respectively) to identify a server push using a Push
ID (see Section 5.2.6 for details).
5.2.3. SETTINGS A PRIORITY frame MAY identify a Stream Dependency ID using a stream
ID of 0; as in [RFC7540], this makes the request dependent on the
root of the dependency tree.
Stream ID 0 and stream ID 1 cannot be reprioritized. A Prioritized
Request ID that identifies Stream 0 or 1 MUST be treated as a
connection error of type HTTP_MALFORMED_PRIORITY.
A PRIORITY frame that does not reference a request MUST be treated as
a HTTP_MALFORMED_PRIORITY error, unless it references stream ID 0. A
PRIORITY that sets a PUSH_PRIORITIZED or PUSH_DEPENDENT flag, but
then references a non-existent Push ID MUST be treated as a
HTTP_MALFORMED_PRIORITY error.
The length of a PRIORITY frame is 9 octets. A PRIORITY frame with
any other length MUST be treated as a connection error of type
HTTP_MALFORMED_PRIORITY.
5.2.4. CANCEL_PUSH
The CANCEL_PUSH frame (type=0x3) is used to request cancellation of
server push prior to the push stream being created. The CANCEL_PUSH
frame identifies a server push request by Push ID (see
Section 5.2.6).
When a server receives this frame, it aborts sending the response for
the identified server push. If the server has not yet started to
send the server push, it can use the receipt of a CANCEL_PUSH frame
to avoid opening a stream. If the push stream has been opened by the
server, the server SHOULD sent a QUIC RST_STREAM frame on those
streams and cease transmission of the response.
A server can send this frame to indicate that it won't be sending a
response prior to creation of a push stream. Once the push stream
has been created, sending CANCEL_PUSH has no effect on the state of
the push stream. A QUIC RST_STREAM frame SHOULD be used instead to
cancel transmission of the server push response.
A CANCEL_PUSH frame is sent on the control stream. Sending a
CANCEL_PUSH frame on a stream other than the control stream MUST be
treated as a stream error of type HTTP_WRONG_STREAM.
The CANCEL_PUSH frame has no defined flags.
The CANCEL_PUSH frame carries a 32-bit Push ID that identifies the
server push that is being cancelled (see Section 5.2.6).
If the client receives a CANCEL_PUSH frame, that frame might identify
a Push ID that has not yet been mentioned by a PUSH_PROMISE frame.
A server MUST treat a CANCEL_PUSH frame payload that is other than 4
octets in length as a connection error of type
HTTP_MALFORMED_CANCEL_PUSH.
5.2.5. SETTINGS
The SETTINGS frame (type=0x4) conveys configuration parameters that The SETTINGS frame (type=0x4) conveys configuration parameters that
affect how endpoints communicate, such as preferences and constraints affect how endpoints communicate, such as preferences and constraints
on peer behavior, and is substantially different from [RFC7540]. on peer behavior, and is different from [RFC7540]. Individually, a
Individually, a SETTINGS parameter can also be referred to as a SETTINGS parameter can also be referred to as a "setting".
"setting".
SETTINGS parameters are not negotiated; they describe characteristics SETTINGS parameters are not negotiated; they describe characteristics
of the sending peer, which can be used by the receiving peer. of the sending peer, which can be used by the receiving peer.
However, a negotiation can be implied by the use of SETTINGS - a peer However, a negotiation can be implied by the use of SETTINGS - a peer
uses SETTINGS to advertise a set of supported values. The recipient uses SETTINGS to advertise a set of supported values. The recipient
can then choose which entries from this list are also acceptable and can then choose which entries from this list are also acceptable and
proceed with the value it has chosen. (This choice could be proceed with the value it has chosen. (This choice could be
announced in a field of an extension frame, or in its own value in announced in a field of an extension frame, or in its own value in
SETTINGS.) SETTINGS.)
Different values for the same parameter can be advertised by each Different values for the same parameter can be advertised by each
peer. For example, a client might permit a very large HPACK state peer. For example, a client might be willing to consume very large
table while a server chooses to use a small one to conserve memory. response headers, while servers are more cautious about request size.
Parameters MUST NOT occur more than once. A receiver MAY treat the Parameters MUST NOT occur more than once. A receiver MAY treat the
presence of the same parameter more than once as a connection error presence of the same parameter more than once as a connection error
of type HTTP_MALFORMED_SETTINGS. of type HTTP_MALFORMED_SETTINGS.
The SETTINGS frame defines no flags. The SETTINGS frame defines no flags.
The payload of a SETTINGS frame consists of zero or more parameters, The payload of a SETTINGS frame consists of zero or more parameters,
each consisting of an unsigned 16-bit setting identifier and a each consisting of an unsigned 16-bit setting identifier and a
length-prefixed binary value. length-prefixed binary value.
skipping to change at page 13, line 40 skipping to change at page 15, line 27
Non-zero-length values MUST be compared against the remaining length Non-zero-length values MUST be compared against the remaining length
of the SETTINGS frame. Any value which purports to cross the end of of the SETTINGS frame. Any value which purports to cross the end of
the frame MUST cause the SETTINGS frame to be considered malformed the frame MUST cause the SETTINGS frame to be considered malformed
and trigger a connection error of type HTTP_MALFORMED_SETTINGS. and trigger a connection error of type HTTP_MALFORMED_SETTINGS.
An implementation MUST ignore the contents for any SETTINGS An implementation MUST ignore the contents for any SETTINGS
identifier it does not understand. identifier it does not understand.
SETTINGS frames always apply to a connection, never a single stream. SETTINGS frames always apply to a connection, never a single stream.
A SETTINGS frame MUST be sent as the first frame of the connection A SETTINGS frame MUST be sent as the first frame of the control
control stream (see Section 4) by each peer, and MUST NOT be sent stream (see Section 4) by each peer, and MUST NOT be sent
subsequently or on any other stream. If an endpoint receives an subsequently or on any other stream. If an endpoint receives an
SETTINGS frame on a different stream, the endpoint MUST respond with SETTINGS frame on a different stream, the endpoint MUST respond with
a connection error of type HTTP_SETTINGS_ON_WRONG_STREAM. If an a connection error of type HTTP_WRONG_STREAM. If an endpoint
endpoint receives a second SETTINGS frame, the endpoint MUST respond receives a second SETTINGS frame, the endpoint MUST respond with a
with a connection error of type HTTP_MULTIPLE_SETTINGS. connection error of type HTTP_MULTIPLE_SETTINGS.
The SETTINGS frame affects connection state. A badly formed or The SETTINGS frame affects connection state. A badly formed or
incomplete SETTINGS frame MUST be treated as a connection error incomplete SETTINGS frame MUST be treated as a connection error
(Section 5.4.1) of type HTTP_MALFORMED_SETTINGS. (Section 6) of type HTTP_MALFORMED_SETTINGS.
5.2.3.1. Integer encoding 5.2.5.1. Integer encoding
Settings which are integers are transmitted in network byte order. Settings which are integers are transmitted in network byte order.
Leading zero octets are permitted, but implementations SHOULD use Leading zero octets are permitted, but implementations SHOULD use
only as many bytes as are needed to represent the value. An integer only as many bytes as are needed to represent the value. An integer
MUST NOT be represented in more bytes than would be used to transfer MUST NOT be represented in more bytes than would be used to transfer
the maximum permitted value. the maximum permitted value.
5.2.3.2. Defined SETTINGS Parameters 5.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^32 - 1. 2^32 - 1. This value MUST be zero.
SETTINGS_DISABLE_PUSH (0x2): Transmitted as a Boolean; replaces SETTINGS_ENABLE_PUSH (0x2): Transmitted as a Boolean
SETTINGS_ENABLE_PUSH
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^32 - 1. of 2^32 - 1
5.2.3.3. Usage in 0-RTT 5.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:
o SETTINGS_HEADER_TABLE_SIZE o SETTINGS_HEADER_TABLE_SIZE
o SETTINGS_MAX_HEADER_LIST_SIZE o SETTINGS_MAX_HEADER_LIST_SIZE
skipping to change at page 15, line 10 skipping to change at page 16, line 43
If the connection is closed because these or other constraints were If the connection is closed because these or other constraints were
violated during the 0-RTT flight (e.g. with violated during the 0-RTT flight (e.g. with
HTTP_HPACK_DECOMPRESSION_FAILED), clients MAY establish a new HTTP_HPACK_DECOMPRESSION_FAILED), clients MAY establish a new
connection and retry any 0-RTT requests using the settings sent by connection and retry any 0-RTT requests using the settings sent by
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.
5.2.4. PUSH_PROMISE 5.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. It defines no flags. set from server to client, as in HTTP/2. The PUSH_PROMISE frame
defines no flags.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Promised Stream ID (32) | | Push ID (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence? (16) | Header Block (*) ... | Header Block (*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 5: PUSH_PROMISE frame payload Figure 5: PUSH_PROMISE frame payload
The payload consists of: The payload consists of:
Promised Stream ID: A 32-bit Stream ID indicating the QUIC stream on Push ID: A 32-bit identifier for the server push request. A push ID
which the response headers will be sent. (The response body is used in push stream header (Section 4.4), CANCEL_PUSH frames
stream is implied by the headers stream, as defined in Section 4.) (Section 5.2.4), and PRIORITY frames (Section 5.2.3).
HPACK Sequence: A sixteen-bit counter, equivalent to the Sequence Header Block: HPACK-compressed request headers for the promised
field in HEADERS response.
Payload: HPACK-compressed request headers for the promised response. 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
multiple concurrent requests. Referencing the same server push
ensures that a PUSH_PROMISE can be made in relation to every response
in which server push might be needed without duplicating pushes.
A server that uses the same Push ID in multiple PUSH_PROMISE frames
MUST include the same header fields each time. The octets of the
header block MAY be different due to differing encoding, but the
header fields and their values MUST be identical. Note that ordering
of header fields is significant. A client MUST treat receipt of a
PUSH_PROMISE with conflicting header field values for the same Push
ID as a connection error of type HTTP_MALFORMED_PUSH_PROMISE.
Allowing duplicate references to the same Push ID is primarily to
reduce duplication caused by concurrent requests. A server SHOULD
avoid reusing a Push ID over a long period. Clients are likely to
consume server push responses and not retain them for reuse over
time. Clients that see a PUSH_PROMISE that uses a Push ID that they
have since consumed and discarded are forced to ignore the
PUSH_PROMISE.
5.2.7. GOAWAY
The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of
a connection by a server. GOAWAY allows a server to stop accepting
new requests while still finishing processing of previously received
requests. This enables administrative actions, like server
maintenance. GOAWAY by itself does not close a connection. (Note
that clients do not need to send GOAWAY to gracefully close a
connection; they simply stop making new requests.)
The GOAWAY frame does not define any flags, and the payload is a QUIC
stream identifier. The GOAWAY frame applies to the connection, not a
specific stream. An endpoint MUST treat a GOAWAY frame on a stream
other than the control stream as a connection error (Section 6) of
type HTTP_WRONG_STREAM.
New client requests might already have been sent before the client
receives the server's GOAWAY frame. The GOAWAY frame contains the
stream identifier of the last client-initiated request that was or
might be processed in this connection, which enables client and
server to agree on which requests were accepted prior to the
connection shutdown. This identifier MAY be lower than the stream
limit identified by a QUIC MAX_STREAM_ID frame, and MAY be zero if no
requests were processed. Servers SHOULD NOT increase the
MAX_STREAM_ID limit after sending a GOAWAY frame.
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.
Once sent, the server will refuse requests sent on streams with an
identifier higher than the included last stream identifier. Clients
MUST NOT send new requests on the connection after receiving GOAWAY,
although requests might already be in transit. A new connection can
be established for new requests.
If the client has sent requests on streams with a higher stream
identifier than indicated in the GOAWAY frame, those requests were
not and will not be processed. Endpoints SHOULD reset any streams
above this ID with the error code HTTP_REQUEST_CANCELLED. Servers
MAY also reset streams below the indicated ID with
HTTP_REQUEST_CANCELLED if the associated requests were not 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. Automatically retrying other 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 GOAWAY frame might have been processed; their
status cannot be known until they are completed successfully, reset,
or the connection terminates.
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
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
that a server closes a QUIC connection, the client cannot know if the
server started to process that POST request if the server does not
send a GOAWAY frame to indicate what streams it might have acted on.
For unexpected closures caused by error conditions, a QUIC
CONNECTION_CLOSE frame MUST be used. However, a GOAWAY MAY be sent
first to provide additional detail to clients. If a connection
terminates without a GOAWAY frame, the last stream identifier is
effectively the highest possible stream identifier (as determined by
QUIC's MAX_STREAM_ID).
An endpoint MAY send multiple GOAWAY frames if circumstances change.
For instance, an endpoint that sends GOAWAY without an error code
during graceful shutdown could subsequently encounter an error
condition. The last stream identifier from the last GOAWAY frame
received indicates which streams could have been acted upon.
Endpoints MUST NOT increase the value they send in the last stream
identifier, since the peers might already have retried unprocessed
requests on another connection.
A client that is unable to retry requests loses all requests that are
in flight when the server closes the connection. A server that is
attempting to gracefully shut down a connection SHOULD send an
initial GOAWAY frame with the last stream identifier set to the
current value of QUIC's MAX_STREAM_ID and SHOULD NOT increase the
MAX_STREAM_ID thereafter. This signals to the client that a shutdown
is imminent and that initiating further requests is prohibited.
After allowing time for any in-flight requests (at least one round-
trip time), the server MAY send another GOAWAY frame with an updated
last stream identifier. This ensures that a connection can be
cleanly shut down without losing requests.
6. Error Handling 6. Error Handling
QUIC allows the application to abruptly terminate individual streams QUIC allows the application to abruptly terminate (reset) individual
or the entire connection when an error is encountered. These are streams or the entire connection when an error is encountered. These
referred to as "stream errors" or "connection errors" and are are referred to as "stream errors" or "connection errors" and are
described in more detail in [QUIC-TRANSPORT]. described in more detail in [QUIC-TRANSPORT].
HTTP/QUIC requires that only data streams be terminated abruptly.
Terminating a message control stream will result in an error of type
HTTP_RST_CONTROL_STREAM.
This section describes HTTP-specific error codes which can be used to This section describes HTTP-specific error codes which can be used to
express the cause of a connection or stream error. express the cause of a connection or stream error.
6.1. HTTP-Defined QUIC Error Codes 6.1. HTTP-Defined QUIC Error Codes
QUIC allocates error codes 0x0000-0x3FFF to application protocol QUIC allocates error codes 0x0000-0x3FFF to application protocol
definition. The following error codes are defined by HTTP for use in definition. The following error codes are defined by HTTP for use in
QUIC RST_STREAM, GOAWAY, and CONNECTION_CLOSE frames. QUIC RST_STREAM and CONNECTION_CLOSE frames.
HTTP_PUSH_REFUSED (0x01): The server has attempted to push content HTTP_PUSH_REFUSED (0x01): The server has attempted to push content
which the client will not accept on this connection. which the client will not accept on this connection.
HTTP_INTERNAL_ERROR (0x02): An internal error has occurred in the HTTP_INTERNAL_ERROR (0x02): An internal error has occurred in the
HTTP stack. HTTP stack.
HTTP_PUSH_ALREADY_IN_CACHE (0x03): The server has attempted to push HTTP_PUSH_ALREADY_IN_CACHE (0x03): The server has attempted to push
content which the client has cached. content which the client has cached.
skipping to change at page 16, line 47 skipping to change at page 20, line 41
HTTP_MALFORMED_PRIORITY (0x0A): A PRIORITY frame has been received HTTP_MALFORMED_PRIORITY (0x0A): A PRIORITY frame has been received
with an invalid format. with an invalid format.
HTTP_MALFORMED_SETTINGS (0x0B): A SETTINGS frame has been received HTTP_MALFORMED_SETTINGS (0x0B): A SETTINGS frame has been received
with an invalid format. with an invalid format.
HTTP_MALFORMED_PUSH_PROMISE (0x0C): A PUSH_PROMISE frame has been HTTP_MALFORMED_PUSH_PROMISE (0x0C): A PUSH_PROMISE frame has been
received with an invalid format. received with an invalid format.
HTTP_MALFORMED_DATA (0x0D): A DATA frame has been received with an
invalid format.
HTTP_INTERRUPTED_HEADERS (0x0E): A HEADERS frame without the End HTTP_INTERRUPTED_HEADERS (0x0E): A HEADERS frame without the End
Header Block flag was followed by a frame other than HEADERS. Header Block flag was followed by a frame other than HEADERS.
HTTP_SETTINGS_ON_WRONG_STREAM (0x0F): A SETTINGS frame was received HTTP_WRONG_STREAM (0x0F): A frame was received on stream where it is
on a request control stream. not permitted.
HTTP_MULTIPLE_SETTINGS (0x10): More than one SETTINGS frame was HTTP_MULTIPLE_SETTINGS (0x10): More than one SETTINGS frame was
received. received.
HTTP_RST_CONTROL_STREAM (0x11): A message control stream closed HTTP_DUPLICATE_PUSH (0x11): Multiple push streams used the same Push
abruptly. ID.
7. Considerations for Transitioning from HTTP/2 7. Considerations for Transitioning from HTTP/2
HTTP/QUIC is strongly informed by HTTP/2, and bears many HTTP/QUIC is strongly informed by HTTP/2, and bears many
similarities. This section points out important differences from similarities. This section describes the approach taken to design
HTTP/2 and describes how to map HTTP/2 extensions into HTTP/QUIC. HTTP/QUIC, points out important differences from HTTP/2, and
describes how to map HTTP/2 extensions into HTTP/QUIC.
HTTP/QUIC begins from the premise that HTTP/2 code reuse is a useful
feature, but not a hard requirement. HTTP/QUIC departs from HTTP/2
primarily where necessary to accommodate the differences in behavior
between QUIC and TCP (lack of ordering, support for streams). We
intend to avoid gratuitous changes which make it difficult or
impossible to build extensions with the same semantics applicable to
both protocols at once.
These departures are noted in this section.
7.1. HTTP Frame Types 7.1. HTTP Frame Types
Many framing concepts from HTTP/2 can be elided away on QUIC, because Many framing concepts from HTTP/2 can be elided away on QUIC, because
the transport deals with them. Because frames are already on a the transport deals with them. Because frames are already on a
stream, they can omit the stream number. Because frames do not block stream, they can omit the stream number. Because frames do not block
multiplexing (QUIC's multiplexing occurs below this layer), the multiplexing (QUIC's multiplexing occurs below this layer), the
support for variable-maximum-length packets can be removed. Because support for variable-maximum-length packets can be removed. Because
stream termination is handled by QUIC, an END_STREAM flag is not stream termination is handled by QUIC, an END_STREAM flag is not
required. required.
skipping to change at page 17, line 50 skipping to change at page 22, line 9
be received in the order sent, HTTP/QUIC will break them. be received in the order sent, HTTP/QUIC will break them.
For example, implicit in the HTTP/2 prioritization scheme is the For example, implicit in the HTTP/2 prioritization scheme is the
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 connection control stream and QUIC, PRIORITY frames are sent on the control stream and the PRIORITY
the PRIORITY section is removed from the HEADERS frame. section is removed from the HEADERS frame.
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 1 portable to QUIC simply by replacing Stream 0 in HTTP/2 with Stream 1
in HTTP/QUIC. in HTTP/QUIC. HTTP/QUIC extensions will not assume ordering, but
would not be harmed by ordering, and would be portable to HTTP/2 in
the same manner.
Below is a listing of how each HTTP/2 frame type is mapped: Below is a listing of how each HTTP/2 frame type is mapped:
DATA (0x0): Instead of DATA frames, HTTP/QUIC uses a separate data DATA (0x0): Padding is not defined in HTTP/QUIC frames. See
stream. See Section 4. Section 5.2.1.
HEADERS (0x1): As described above, the PRIORITY region of HEADERS is HEADERS (0x1): As described above, the PRIORITY region of HEADERS is
not supported. A separate PRIORITY frame MUST be used. Padding not supported. A separate PRIORITY frame MUST be used. Padding
is not defined in HTTP/QUIC frames. See Section 5.2.1. is not defined in HTTP/QUIC frames. See Section 5.2.2.
PRIORITY (0x2): As described above, the PRIORITY frame is sent on PRIORITY (0x2): As described above, the PRIORITY frame is sent on
the connection control stream. See Section 5.2.2. the control stream. See Section 5.2.3.
RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC
provides stream lifecycle management. provides stream lifecycle management. The same code point is used
for the CANCEL_PUSH frame (Section 5.2.4).
SETTINGS (0x4): SETTINGS frames are sent only at the beginning of SETTINGS (0x4): SETTINGS frames are sent only at the beginning of
the connection. See Section 5.2.3 and Section 7.2. the connection. See Section 5.2.5 and Section 7.2.
PUSH_PROMISE (0x5): See Section 5.2.4. PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream;
instead the push stream references the PUSH_PROMISE frame using a
Push ID. See Section 5.2.6.
PING (0x6): PING frames do not exist, since QUIC provides equivalent PING (0x6): PING frames do not exist, since QUIC provides equivalent
functionality. functionality.
GOAWAY (0x7): GOAWAY frames do not exist, since QUIC provides GOAWAY (0x7): GOAWAY is sent only from server to client and does not
equivalent functionality. contain an error code. See Section 5.2.7.
WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC
provides flow control. provides flow control.
CONTINUATION (0x9): CONTINUATION frames do not exist; instead, CONTINUATION (0x9): CONTINUATION frames do not exist; instead,
larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and
HEADERS frames can be used in series. HEADERS frames can be used in series.
The IANA registry of frame types has been updated in Section 9.3 to Frame types defined by extensions to HTTP/2 need to be separately
include references to the definition for each frame type in HTTP/2 registered for HTTP/QUIC if still applicable. The IDs of frames
and in HTTP/QUIC. Frames not defined as available in HTTP/QUIC defined in [RFC7540] have been reserved for simplicity. See
SHOULD NOT be sent and SHOULD be ignored as unknown on receipt. Section 9.3.
7.2. HTTP/2 SETTINGS Parameters 7.2. HTTP/2 SETTINGS Parameters
An important difference from HTTP/2 is that settings are sent once, An important difference from HTTP/2 is that settings are sent once,
at the beginning of the connection, and thereafter cannot change. at the beginning of the connection, and thereafter cannot change.
This eliminates many corner cases around synchronization of changes. This eliminates many corner cases around synchronization of changes.
Some transport-level options that HTTP/2 specifies via the SETTINGS Some transport-level options that HTTP/2 specifies via the SETTINGS
frame are superseded by QUIC transport parameters in HTTP/QUIC. The frame are superseded by QUIC transport parameters in HTTP/QUIC. The
HTTP-level options that are retained in HTTP/QUIC have the same value HTTP-level options that are retained in HTTP/QUIC have the same value
as in HTTP/2. as in HTTP/2.
Below is a listing of how each HTTP/2 SETTINGS parameter is mapped: Below is a listing of how each HTTP/2 SETTINGS parameter is mapped:
SETTINGS_HEADER_TABLE_SIZE: See Section 5.2.3.2. SETTINGS_HEADER_TABLE_SIZE: See Section 5.2.5.2.
SETTINGS_ENABLE_PUSH: See SETTINGS_DISABLE_PUSH in Section 5.2.3.2. SETTINGS_ENABLE_PUSH: See Section 5.2.5.2.
SETTINGS_MAX_CONCURRENT_STREAMS: QUIC requires the maximum number of SETTINGS_MAX_CONCURRENT_STREAMS: QUIC controls the largest open
incoming streams per connection to be specified in the initial stream ID as part of its flow control logic. Specifying
transport handshake. Specifying SETTINGS_MAX_CONCURRENT_STREAMS SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error.
in the SETTINGS frame is an error.
SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and
connection flow control window sizes to be specified in the connection flow control window sizes to be specified in the
initial transport handshake. Specifying initial transport handshake. Specifying
SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error.
SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/ SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/
QUIC. Specifying it in the SETTINGS frame is an error. QUIC. Specifying it in the SETTINGS frame is an error.
SETTINGS_MAX_HEADER_LIST_SIZE: See Section 5.2.3.2. SETTINGS_MAX_HEADER_LIST_SIZE: See Section 5.2.5.2.
Settings defined by extensions to HTTP/2 MAY be expressed as integers Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The
with a maximum value of 2^32-1, if they are applicable to HTTP/QUIC, IDs of settings defined in [RFC7540] have been reserved for
but SHOULD have a specification describing their usage. Fields for simplicity. See Section 9.4.
this purpose have been added to the IANA registry in Section 9.4.
7.3. HTTP/2 Error Codes 7.3. HTTP/2 Error Codes
QUIC has the same concepts of "stream" and "connection" errors that QUIC has the same concepts of "stream" and "connection" errors that
HTTP/2 provides. However, because the error code space is shared HTTP/2 provides. However, because the error code space is shared
between multiple components, there is no direct portability of HTTP/2 between multiple components, there is no direct portability of HTTP/2
error codes. error codes.
The HTTP/2 error codes defined in Section 7 of [RFC7540] map to QUIC The HTTP/2 error codes defined in Section 7 of [RFC7540] map to QUIC
error codes as follows: error codes as follows:
NO_ERROR (0x0): QUIC_NO_ERROR NO_ERROR (0x0): QUIC_NO_ERROR
PROTOCOL_ERROR (0x1): No single mapping. See new HTTP_MALFORMED_* PROTOCOL_ERROR (0x1): No single mapping. See new HTTP_MALFORMED_*
error codes defined in Section 6.1. error codes defined in Section 6.1.
INTERNAL_ERROR (0x2) HTTP_INTERNAL_ERROR in Section 6.1. INTERNAL_ERROR (0x2): HTTP_INTERNAL_ERROR in Section 6.1.
FLOW_CONTROL_ERROR (0x3): Not applicable, since QUIC handles flow FLOW_CONTROL_ERROR (0x3): Not applicable, since QUIC handles flow
control. Would provoke a QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA control. Would provoke a QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA
from the QUIC layer. from the QUIC layer.
SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of
SETTINGS is defined. SETTINGS is defined.
STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream
management. Would provoke a QUIC_STREAM_DATA_AFTER_TERMINATION management. Would provoke a QUIC_STREAM_DATA_AFTER_TERMINATION
skipping to change at page 20, line 37 skipping to change at page 25, line 5
CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 6.1. CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 6.1.
ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 6.1. ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 6.1.
INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to
provide sufficient security on all connections. provide sufficient security on all connections.
HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 6.1. HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 6.1.
Error codes defined by HTTP/2 extensions need to be re-registered for Error codes need to be defined for HTTP/2 and HTTP/QUIC separately.
HTTP/QUIC if still applicable. See Section 9.5. See Section 9.5.
8. Security Considerations 8. Security Considerations
The security considerations of HTTP over QUIC should be comparable to The security considerations of HTTP over QUIC should be comparable to
those of HTTP/2. those of HTTP/2.
The modified SETTINGS format contains nested length elements, which The modified SETTINGS format contains nested length elements, which
could pose a security risk to an uncautious implementer. A SETTINGS could pose a security risk to an uncautious implementer. A SETTINGS
frame parser MUST ensure that the length of the frame exactly matches frame parser MUST ensure that the length of the frame exactly matches
the length of the settings it contains. the length of the settings it contains.
skipping to change at page 21, line 31 skipping to change at page 25, line 44
9.2. Registration of QUIC Version Hint Alt-Svc Parameter 9.2. Registration of QUIC Version Hint Alt-Svc Parameter
This document creates a new registration for version-negotiation This document creates a new registration for version-negotiation
hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter"
registry established in [RFC7838]. registry established in [RFC7838].
Parameter: "quic" Parameter: "quic"
Specification: This document, Section 2.1 Specification: This document, Section 2.1
9.3. Existing Frame Types 9.3. Frame Types
This document adds two new columns to the "HTTP/2 Frame Type"
registry defined in [RFC7540]:
Supported Protocols: Indicates which associated protocols use the This document establishes a registry for HTTP/QUIC frame type codes.
frame type. Values MUST be one of: The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The
"HTTP/QUIC Frame Type" registry operates under either of the "IETF
Review" or "IESG Approval" policies [RFC5226] for values between 0x00
and 0xef, with values between 0xf0 and 0xff being reserved for
Experimental Use.
* "HTTP/2 only" While this registry is separate from the "HTTP/2 Frame Type" registry
defined in [RFC7540], it is preferable that the assignments parallel
each other. If an entry is present in only one registry, every
effort SHOULD be made to avoid assigning the corresponding value to
an unrelated operation.
* "HTTP/QUIC only" New entries in this registry require the following information:
* "Both" Frame Type: A name or label for the frame type.
HTTP/QUIC Specification: Indicates where this frame's behavior over Code: The 8-bit code assigned to the frame type.
QUIC is defined; required if the frame is supported over QUIC.
Values for existing registrations are assigned by this document: Specification: A reference to a specification that includes a
description of the frame layout, its semantics, and flags that the
frame type uses, including any parts of the frame that are
conditionally present based on the value of flags.
+---------------+---------------------+-------------------------+ The entries in the following table are registered by this document.
| Frame Type | Supported Protocols | HTTP/QUIC Specification |
+---------------+---------------------+-------------------------+
| DATA | HTTP/2 only | N/A |
| | | |
| HEADERS | Both | Section 5.2.1 |
| | | |
| PRIORITY | Both | Section 5.2.2 |
| | | |
| RST_STREAM | HTTP/2 only | N/A |
| | | |
| SETTINGS | Both | Section 5.2.3 |
| | | |
| PUSH_PROMISE | Both | Section 5.2.4 |
| | | |
| PING | HTTP/2 only | N/A |
| | | |
| GOAWAY | HTTP/2 only | N/A |
| | | |
| WINDOW_UPDATE | HTTP/2 only | N/A |
| | | |
| CONTINUATION | HTTP/2 only | N/A |
+---------------+---------------------+-------------------------+
The "Specification" column is renamed to "HTTP/2 specification" and +--------------+------+---------------+
is only required if the frame is supported over HTTP/2. | Frame Type | Code | Specification |
+--------------+------+---------------+
| DATA | 0x0 | Section 5.2.1 |
| | | |
| HEADERS | 0x1 | Section 5.2.2 |
| | | |
| PRIORITY | 0x2 | Section 5.2.3 |
| | | |
| CANCEL_PUSH | 0x3 | Section 5.2.4 |
| | | |
| SETTINGS | 0x4 | Section 5.2.5 |
| | | |
| PUSH_PROMISE | 0x5 | Section 5.2.6 |
| | | |
| Reserved | 0x6 | N/A |
| | | |
| GOAWAY | 0x7 | Section 5.2.7 |
| | | |
| Reserved | 0x8 | N/A |
| | | |
| Reserved | 0x9 | N/A |
+--------------+------+---------------+
9.4. Settings Parameters 9.4. Settings Parameters
This document adds two new columns to the "HTTP/2 Settings" registry This document establishes a registry for HTTP/QUIC settings. The
defined in [RFC7540]: "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC
Settings" registry operates under the "Expert Review" policy
Supported Protocols: Indicates which associated protocols use the [RFC5226] for values in the range from 0x0000 to 0xefff, with values
setting. Values MUST be one of: between and 0xf000 and 0xffff being reserved for Experimental Use.
The designated experts are the same as those for the "HTTP/2
Settings" registry defined in [RFC7540].
* "HTTP/2 only" While this registry is separate from the "HTTP/2 Settings" registry
defined in [RFC7540], it is preferable that the assignments parallel
each other. If an entry is present in only one registry, every
effort SHOULD be made to avoid assigning the corresponding value to
an unrelated operation.
* "HTTP/QUIC only" New registrations are advised to provide the following information:
* "Both" Name: A symbolic name for the setting. Specifying a setting name is
optional.
HTTP/QUIC Specification: Indicates where this setting's behavior Code: The 16-bit code assigned to the setting.
over QUIC is defined; required if the frame is supported over
QUIC.
Values for existing registrations are assigned by this document: Specification: An optional reference to a specification that
describes the use of the setting.
+-------------------------+------------------+----------------------+ The entries in the following table are registered by this document.
| Setting Name | Supported | HTTP/QUIC |
| | Protocols | Specification |
+-------------------------+------------------+----------------------+
| HEADER_TABLE_SIZE | Both | Section 5.2.3.2 |
| | | |
| ENABLE_PUSH / | Both | Section 5.2.3.2 |
| DISABLE_PUSH | | |
| | | |
| MAX_CONCURRENT_STREAMS | HTTP/2 Only | N/A |
| | | |
| INITIAL_WINDOW_SIZE | HTTP/2 Only | N/A |
| | | |
| MAX_FRAME_SIZE | HTTP/2 Only | N/A |
| | | |
| MAX_HEADER_LIST_SIZE | Both | Section 5.2.3.2 |
+-------------------------+------------------+----------------------+
The "Specification" column is renamed to "HTTP/2 Specification" and +----------------------+------+-----------------+
is only required if the setting is supported over HTTP/2. | Setting Name | Code | Specification |
+----------------------+------+-----------------+
| HEADER_TABLE_SIZE | 0x1 | Section 5.2.5.2 |
| | | |
| ENABLE_PUSH | 0x2 | Section 5.2.5.2 |
| | | |
| Reserved | 0x3 | N/A |
| | | |
| Reserved | 0x4 | N/A |
| | | |
| Reserved | 0x5 | N/A |
| | | |
| MAX_HEADER_LIST_SIZE | 0x6 | Section 5.2.5.2 |
+----------------------+------+-----------------+
9.5. Error Codes 9.5. Error Codes
This document establishes a registry for HTTP/QUIC error codes. The This document establishes a registry for HTTP/QUIC error codes. The
"HTTP/QUIC Error Code" registry manages a 30-bit space. The "HTTP/ "HTTP/QUIC Error Code" registry manages a 30-bit space. The "HTTP/
QUIC Error Code" registry operates under the "Expert Review" policy QUIC Error Code" registry operates under the "Expert Review" policy
[RFC5226]. [RFC5226].
Registrations for error codes are required to include a description Registrations for error codes are required to include a description
of the error code. An expert reviewer is advised to examine new of the error code. An expert reviewer is advised to examine new
skipping to change at page 25, line 9 skipping to change at page 29, line 27
| | | frame | | | | | frame | |
| | | | | | | | | |
| HTTP_MALFORMED_SETTINGS | 0x0 | Invalid | Section 6.1 | | HTTP_MALFORMED_SETTINGS | 0x0 | Invalid | Section 6.1 |
| | B | SETTINGS | | | | B | SETTINGS | |
| | | frame | | | | | frame | |
| | | | | | | | | |
| HTTP_MALFORMED_PUSH_PROMISE | 0x0 | Invalid | Section 6.1 | | HTTP_MALFORMED_PUSH_PROMISE | 0x0 | Invalid | Section 6.1 |
| | C | PUSH_PROMISE | | | | C | PUSH_PROMISE | |
| | | frame | | | | | frame | |
| | | | | | | | | |
| HTTP_MALFORMED_DATA | 0x0 | Invalid DATA | Section 6.1 |
| | D | frame | |
| | | | |
| HTTP_INTERRUPTED_HEADERS | 0x0 | Incomplete | Section 6.1 | | HTTP_INTERRUPTED_HEADERS | 0x0 | Incomplete | Section 6.1 |
| | E | HEADERS | | | | E | HEADERS | |
| | | block | | | | | block | |
| | | | | | | | | |
| HTTP_SETTINGS_ON_WRONG_STREA | 0x0 | SETTINGS | Section 6.1 | | HTTP_WRONG_STREAM | 0x0 | A frame was | Section 6.1 |
| M | F | frame on a | | | | F | sent on the | |
| | | request | | | | | wrong stream | |
| | | control | |
| | | stream | |
| | | | | | | | | |
| HTTP_MULTIPLE_SETTINGS | 0x1 | Multiple | Section 6.1 | | HTTP_MULTIPLE_SETTINGS | 0x1 | Multiple | Section 6.1 |
| | 0 | SETTINGS | | | | 0 | SETTINGS | |
| | | frames | | | | | frames | |
| | | | | | | | | |
| HTTP_RST_CONTROL_STREAM | 0x1 | Message | Section 6.1 | | HTTP_DUPLICATE_PUSH | 0x1 | Duplicate | Section 6.1 |
| | 1 | control | | | | 1 | server push | |
| | | stream was | |
| | | RST | |
+------------------------------+-----+--------------+---------------+ +------------------------------+-----+--------------+---------------+
10. References 10. References
10.1. Normative References 10.1. Normative References
[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 (work in progress), June 2017. transport (work in progress), August 2017.
[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,
<http://www.rfc-editor.org/info/rfc793>. <http://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,
<http://www.rfc-editor.org/info/rfc2119>. <http://www.rfc-editor.org/info/rfc2119>.
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
Specifications: ABNF", STD 68, RFC 5234,
DOI 10.17487/RFC5234, January 2008,
<http://www.rfc-editor.org/info/rfc5234>.
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
Protocol (HTTP/1.1): Message Syntax and Routing", Protocol (HTTP/1.1): Message Syntax and Routing",
RFC 7230, DOI 10.17487/RFC7230, June 2014, RFC 7230, DOI 10.17487/RFC7230, June 2014,
<http://www.rfc-editor.org/info/rfc7230>. <http://www.rfc-editor.org/info/rfc7230>.
[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,
<http://www.rfc-editor.org/info/rfc7231>. <http://www.rfc-editor.org/info/rfc7231>.
skipping to change at page 26, line 26 skipping to change at page 31, line 8
HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015,
<http://www.rfc-editor.org/info/rfc7541>. <http://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, <http://www.rfc-editor.org/info/rfc7838>. April 2016, <http://www.rfc-editor.org/info/rfc7838>.
10.2. Informative References 10.2. Informative References
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
IANA Considerations Section in RFCs", BCP 26, RFC 5226, IANA Considerations Section in RFCs", RFC 5226,
DOI 10.17487/RFC5226, May 2008, DOI 10.17487/RFC5226, May 2008,
<http://www.rfc-editor.org/info/rfc5226>. <http://www.rfc-editor.org/info/rfc5226>.
[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan,
"Transport Layer Security (TLS) Application-Layer Protocol "Transport Layer Security (TLS) Application-Layer Protocol
Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301,
July 2014, <http://www.rfc-editor.org/info/rfc7301>. July 2014, <http://www.rfc-editor.org/info/rfc7301>.
Appendix A. Contributors Appendix A. Contributors
The original authors of this specification were Robbie Shade and Mike The original authors of this specification were Robbie Shade and Mike
Warres. Warres.
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-02 B.1. Since draft-ietf-quic-http-04
o Cite RFC 5234 (#404)
o Return to a single stream per request (#245,#557)
o Use separate frame type and settings registries from HTTP/2 (#81)
o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477)
o Restored GOAWAY (#696)
o Identify server push using Push ID rather than a stream ID
(#702,#281)
o DATA frames cannot be empty (#700)
B.2. Since draft-ietf-quic-http-03
None.
B.3. Since draft-ietf-quic-http-02
o Track changes in transport draft o Track changes in transport draft
B.2. Since draft-ietf-quic-http-01 B.4. 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
skipping to change at page 27, line 31 skipping to change at page 32, line 31
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.3. Since draft-ietf-quic-http-00 B.5. 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)
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.4. Since draft-shade-quic-http2-mapping-00 B.6. 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)
Microsoft Microsoft
 End of changes. 128 change blocks. 
364 lines changed or deleted 584 lines changed or added

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