draft-ietf-quic-http-13.txt   draft-ietf-quic-http-latest.txt 
QUIC Working Group M. Bishop, Ed. QUIC Working Group M. Bishop, Ed.
Internet-Draft Akamai Internet-Draft Akamai
Intended status: Standards Track June 28, 2018 Intended status: Standards Track August 8, 2018
Expires: December 30, 2018 Expires: February 9, 2019
Hypertext Transfer Protocol (HTTP) over QUIC Hypertext Transfer Protocol (HTTP) over QUIC
draft-ietf-quic-http-13 draft-ietf-quic-http-latest
Abstract Abstract
The QUIC transport protocol has several features that are desirable The QUIC transport protocol has several features that are desirable
in a transport for HTTP, such as stream multiplexing, per-stream flow in a transport for HTTP, such as stream multiplexing, per-stream flow
control, and low-latency connection establishment. This document control, and low-latency connection establishment. This document
describes a mapping of HTTP semantics over QUIC. This document also describes a mapping of HTTP semantics over QUIC. This document also
identifies HTTP/2 features that are subsumed by QUIC, and describes identifies HTTP/2 features that are subsumed by QUIC, and describes
how HTTP/2 extensions can be ported to QUIC. how HTTP/2 extensions can be ported to QUIC.
skipping to change at page 1, line 45 skipping to change at page 1, line 45
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on December 30, 2018. This Internet-Draft will expire on February 9, 2019.
Copyright Notice Copyright Notice
Copyright (c) 2018 IETF Trust and the persons identified as the Copyright (c) 2018 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 32 skipping to change at page 2, line 32
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4
2. Connection Setup and Management . . . . . . . . . . . . . . . 4 2. Connection Setup and Management . . . . . . . . . . . . . . . 4
2.1. Draft Version Identification . . . . . . . . . . . . . . 4 2.1. Draft Version Identification . . . . . . . . . . . . . . 4
2.2. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 5 2.2. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 5
2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 5 2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 5
2.3. Connection Establishment . . . . . . . . . . . . . . . . 6 2.3. Connection Establishment . . . . . . . . . . . . . . . . 6
2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6
3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7
3.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 7 3.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 7
3.1.1. Header Compression . . . . . . . . . . . . . . . . . 9 3.1.1. Header Formatting and Compression . . . . . . . . . . 9
3.1.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 3.1.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9
3.1.3. Request Cancellation . . . . . . . . . . . . . . . . 10 3.1.3. Request Cancellation . . . . . . . . . . . . . . . . 10
3.2. Request Prioritization . . . . . . . . . . . . . . . . . 10 3.2. Request Prioritization . . . . . . . . . . . . . . . . . 11
3.2.1. Placeholders . . . . . . . . . . . . . . . . . . . . 11 3.2.1. Placeholders . . . . . . . . . . . . . . . . . . . . 11
3.2.2. Priority Tree Maintenance . . . . . . . . . . . . . . 11 3.2.2. Priority Tree Maintenance . . . . . . . . . . . . . . 12
3.3. Unidirectional Streams . . . . . . . . . . . . . . . . . 12 3.3. Unidirectional Streams . . . . . . . . . . . . . . . . . 13
3.3.1. Control Streams . . . . . . . . . . . . . . . . . . . 13 3.3.1. Reserved Stream Types . . . . . . . . . . . . . . . . 13
3.3.2. Server Push . . . . . . . . . . . . . . . . . . . . . 13 3.3.2. Control Streams . . . . . . . . . . . . . . . . . . . 14
4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 14 3.3.3. Server Push . . . . . . . . . . . . . . . . . . . . . 14
4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 15
4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 15 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 15
4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 15 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 16
4.2.1. Reserved Frame Types . . . . . . . . . . . . . . . . 15 4.2.1. Reserved Frame Types . . . . . . . . . . . . . . . . 16
4.2.2. DATA . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2.2. DATA . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.3. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 16 4.2.3. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.4. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 16 4.2.4. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 17
4.2.5. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 18 4.2.5. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 19
4.2.6. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 19 4.2.6. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 20
4.2.7. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 21 4.2.7. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 22
4.2.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 23 4.2.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 24
4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 25 4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 26
5. Connection Management . . . . . . . . . . . . . . . . . . . . 27
5. Connection Management . . . . . . . . . . . . . . . . . . . . 26 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 27
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 26 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 27
6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 26 7. Extensions to HTTP/QUIC . . . . . . . . . . . . . . . . . . . 29
7. Considerations for Transitioning from HTTP/2 . . . . . . . . 28 8. Considerations for Transitioning from HTTP/2 . . . . . . . . 29
7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 28 8.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 28 8.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 30
7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 30 8.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 32
7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 31 8.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 33
8. Security Considerations . . . . . . . . . . . . . . . . . . . 32 9. Security Considerations . . . . . . . . . . . . . . . . . . . 34
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 32 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34
9.1. Registration of HTTP/QUIC Identification String . . . . . 32 10.1. Registration of HTTP/QUIC Identification String . . . . 34
9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 33 10.2. Registration of QUIC Version Hint Alt-Svc Parameter . . 35
9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 33 10.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . 35
9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 34 10.4. Settings Parameters . . . . . . . . . . . . . . . . . . 36
9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 35 10.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 37
9.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 38 10.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 39
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 40
10.1. Normative References . . . . . . . . . . . . . . . . . . 38 11.1. Normative References . . . . . . . . . . . . . . . . . . 40
10.2. Informative References . . . . . . . . . . . . . . . . . 39 11.2. Informative References . . . . . . . . . . . . . . . . . 41
10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 40 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 40 Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 42
A.1. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 40 A.1. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 42
A.2. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 40 A.2. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 42
A.3. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 40 A.3. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 42
A.4. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 41 A.4. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 43
A.5. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 41 A.5. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 43
A.6. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 41 A.6. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 43
A.7. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 41 A.7. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 43
A.8. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 41 A.8. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 43
A.9. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 41 A.9. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 43
A.10. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 42 A.10. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 44
A.11. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 42 A.11. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 44
A.12. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 42 A.12. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 44
A.13. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 42 A.13. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 44
A.14. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 43 A.14. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 45
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 43 Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 45
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 43 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 45
1. Introduction 1. Introduction
The QUIC transport protocol has several features that are desirable The QUIC transport protocol has several features that are desirable
in a transport for HTTP, such as stream multiplexing, per-stream flow in a transport for HTTP, such as stream multiplexing, per-stream flow
control, and low-latency connection establishment. This document control, and low-latency connection establishment. This document
describes a mapping of HTTP semantics over QUIC, drawing heavily on describes a mapping of HTTP semantics over QUIC, drawing heavily on
the existing TCP mapping, HTTP/2. Specifically, this document the existing TCP mapping, HTTP/2. Specifically, this document
identifies HTTP/2 features that are subsumed by QUIC, and describes identifies HTTP/2 features that are subsumed by QUIC, and describes
how the other features can be implemented atop QUIC. how the other features can be implemented atop QUIC.
skipping to change at page 6, line 37 skipping to change at page 6, line 41
During connection establishment, HTTP/QUIC support is indicated by During connection establishment, HTTP/QUIC support is indicated by
selecting the ALPN token "hq" in the TLS handshake. Support for selecting the ALPN token "hq" in the TLS handshake. Support for
other application-layer protocols MAY be offered in the same other application-layer protocols MAY be offered in the same
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/QUIC-specific settings are set in the initial crypto handshake, HTTP/QUIC-specific settings
are conveyed in the SETTINGS frame. After the QUIC connection is are conveyed in the SETTINGS frame. After the QUIC connection is
established, a SETTINGS frame (Section 4.2.6) MUST be sent by each established, a SETTINGS frame (Section 4.2.6) MUST be sent by each
endpoint as the initial frame of their respective HTTP control stream endpoint as the initial frame of their respective HTTP control stream
(see Section 3.3.1). The server MUST NOT send data on any other (see Section 3.3.2). The server MUST NOT send data on any other
stream until the client's SETTINGS frame has been received. stream until the client's SETTINGS frame has been received.
2.4. Connection Reuse 2.4. Connection Reuse
Once a connection exists to a server endpoint, this connection MAY be Once a connection exists to a server endpoint, this connection MAY be
reused for requests with multiple different URI authority components. reused for requests with multiple different URI authority components.
The client MAY send any requests for which the client considers the The client MAY send any requests for which the client considers the
server authoritative. server authoritative.
An authoritative HTTP/QUIC endpoint is typically discovered because An authoritative HTTP/QUIC endpoint is typically discovered because
skipping to change at page 8, line 23 skipping to change at page 8, line 25
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 containing above, a response may contain zero or more header blocks containing
the message headers of informational (1xx) HTTP responses (see the message headers of informational (1xx) HTTP responses (see
[RFC7230], Section 3.2 and [RFC7231], Section 6.2). [RFC7230], Section 3.2 and [RFC7231], Section 6.2).
PUSH_PROMISE frames (see Section 4.2.7) MAY be interleaved with the PUSH_PROMISE frames (see Section 4.2.7) MAY be interleaved with the
frames of a response message indicating a pushed resource related to frames of a response message indicating a pushed resource related to
the response. These PUSH_PROMISE frames are not part of the the response. These PUSH_PROMISE frames are not part of the
response, but carry the headers of a separate HTTP request message. response, but carry the headers of a separate HTTP request message.
See Section 3.3.2 for more details. See Section 3.3.3 for more details.
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 Trailing header fields are carried in an additional header block
following the body. Senders MUST send only one header block in the following the body. Senders MUST send only one header block in the
trailers section; receivers MUST discard any subsequent header trailers section; receivers MUST discard any subsequent header
blocks. blocks.
An HTTP request/response exchange fully consumes a QUIC stream. An HTTP request/response exchange fully consumes a QUIC stream.
skipping to change at page 9, line 5 skipping to change at page 9, line 5
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 triggering a QUIC STOP_SENDING with error code without error by triggering a QUIC STOP_SENDING with error code
HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing
its streams. Clients MUST NOT discard complete responses as a result its streams. Clients MUST NOT discard complete responses as a result
of having their request terminated abruptly, though clients can of having their request terminated abruptly, though clients can
always discard responses at their discretion for other reasons. always discard responses at their discretion for other reasons.
Servers MUST NOT abort a response in progress as a result of Servers MUST NOT abort a response in progress as a result of
receiving a solicited RST_STREAM. receiving a solicited RST_STREAM.
3.1.1. Header Compression 3.1.1. Header Formatting and Compression
HTTP header fields carry information as a series of key-value pairs.
For a listing of registered HTTP headers, see the "Message Header
Field" registry maintained at https://www.iana.org/assignments/
message-headers [4].
Just as in previous versions of HTTP, header field names are strings
of ASCII characters that are compared in a case-insensitive fashion.
Properties of HTTP header names and values are discussed in more
detail in Section 3.2 of [RFC7230], though the wire rendering in
HTTP/QUIC differs. As in HTTP/2, header field names MUST be
converted to lowercase prior to their encoding. A request or
response containing uppercase header field names MUST be treated as
malformed.
As in HTTP/2, HTTP/QUIC uses special pseudo-header fields beginning
with ':' character (ASCII 0x3a) to convey the target URI, the method
of the request, and the status code for the response. These pseudo-
header fields are defined in Section 8.1.2.3 and 8.1.2.4 of
[RFC7540]. Pseudo-header fields are not HTTP header fields.
Endpoints MUST NOT generate pseudo-header fields other than those
defined in [RFC7540]. The restrictions on the use of pseudo-header
fields in Section 8.1.2.1 of [RFC7540] also apply to HTTP/QUIC.
HTTP/QUIC uses QPACK header compression as described in [QPACK], a HTTP/QUIC uses QPACK header compression as described in [QPACK], a
variation of HPACK which allows the flexibility to avoid header- variation of HPACK which allows the flexibility to avoid header-
compression-induced head-of-line blocking. See that document for compression-induced head-of-line blocking. See that document for
additional details. additional details.
3.1.2. The CONNECT Method 3.1.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
skipping to change at page 12, line 46 skipping to change at page 13, line 24
structure of data that follows this header is determined by the structure of data that follows this header is determined by the
stream type. stream type.
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|Stream Type (8)| |Stream Type (8)|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
Figure 2: Unidirectional Stream Header Figure 2: Unidirectional Stream Header
Two stream types are defined in this document: control streams Some stream types are reserved (Section 3.3.1). Two stream types are
(Section 3.3.1) and push streams (Section 3.3.2). Other stream types defined in this document: control streams (Section 3.3.2) and push
can be defined by extensions to HTTP/QUIC. streams (Section 3.3.3). Other stream types can be defined by
extensions to HTTP/QUIC.
If the stream header indicates a stream type which is not supported If the stream header indicates a stream type which is not supported
by the recipient, this SHOULD be treated as a stream error of type by the recipient, the remainder of the stream cannot be consumed as
HTTP_UNKNOWN_STREAM_TYPE. The semantics of the remainder of the the semantics are unknown. Recipients of unknown stream types MAY
stream are unknown. Implementations SHOULD NOT send stream types the trigger a QUIC STOP_SENDING frame with an error code of
peer is not already known to support, since a stream error can be HTTP_UNKNOWN_STREAM_TYPE, but MUST NOT consider such streams to be an
promoted to a connection error at the peer's discretion (see error of any kind.
Section 6).
3.3.1. Control Streams Implementations MAY send stream types before knowing whether the peer
supports them. However, stream types which could modify the state or
semantics of existing protocol components, including QPACK or other
extensions, MUST NOT be sent until the peer is known to support them.
3.3.1. Reserved Stream Types
Stream types of the format "0x1f * N" are reserved to exercise the
requirement that unknown types be ignored. These streams have no
semantic meaning, and can be sent when application-layer padding is
desired. They MAY also be sent on connections where no request data
is currently being transferred. Endpoints MUST NOT consider these
streams to have any meaning upon receipt.
The payload and length of the stream are selected in any manner the
implementation chooses.
3.3.2. Control Streams
The control stream is indicated by a stream type of "0x43" (ASCII The control stream is indicated by a stream type of "0x43" (ASCII
'C'). Data on this stream consists of HTTP frames, as defined in 'C'). Data on this stream consists of HTTP/QUIC frames, as defined
Section 4.2. in Section 4.2.
Each side MUST initiate a single control stream at the beginning of Each side MUST initiate a single control stream at the beginning of
the connection and send its SETTINGS frame as the first frame on this the connection and send its SETTINGS frame as the first frame on this
stream. Only one control stream per peer is permitted; receipt of a stream. Only one control stream per peer is permitted; receipt of a
second stream which claims to be a control stream MUST be treated as second stream which claims to be a control stream MUST be treated as
a connection error of type HTTP_WRONG_STREAM_COUNT. If the control a connection error of type HTTP_WRONG_STREAM_COUNT. If the control
stream is closed at any point, this MUST be treated as a connection stream is closed at any point, this MUST be treated as a connection
error of type HTTP_CLOSED_CRITICAL_STREAM. error of type HTTP_CLOSED_CRITICAL_STREAM.
A pair of unidirectional streams is used rather than a single A pair of unidirectional streams is used rather than a single
bidirectional stream. This allows either peer to send data as soon bidirectional stream. This allows either peer to send data as soon
they are able. Depending on whether 0-RTT is enabled on the they are able. Depending on whether 0-RTT is enabled on the
connection, either client or server might be able to send stream data connection, either client or server might be able to send stream data
first after the cryptographic handshake completes. first after the cryptographic handshake completes.
3.3.2. Server Push 3.3.3. Server Push
HTTP/QUIC server push is similar to what is described in [RFC7540], HTTP/QUIC server push is similar to what is described in HTTP/2
but uses different mechanisms. During connection establishment, the [RFC7540], but uses different mechanisms.
client enables server push by sending a MAX_PUSH_ID frame (see
Section 4.2.9). A server cannot use server push until it receives a The PUSH_PROMISE frame (Section 4.2.7) is sent on the client-
MAX_PUSH_ID frame. Only servers can push; if a server receives a initiated bidirectional stream that carried the request that
client-initiated push stream, this MUST be treated as a stream error generated the push. This allows the server push to be associated
of type HTTP_WRONG_STREAM_DIRECTION. with a request. Ordering of a PUSH_PROMISE in relation to certain
parts of the response is important (see Section 8.2.1 of [RFC7540]).
The PUSH_PROMISE frame does not reference a stream; it contains a
Push ID that uniquely identifies a server push. This allows a server
to fulfill promises in the order that best suits its needs. The same
Push ID can be used in multiple PUSH_PROMISE frames (see
Section 4.2.7). When a server later fulfills a promise, the server
push response is conveyed on a push stream.
A push stream is indicated by a stream type of "0x50" (ASCII 'P'), A push stream is indicated by a stream type of "0x50" (ASCII 'P'),
followed by the Push ID of the promise that it fulfills, encoded as a followed by the Push ID of the promise that it fulfills, encoded as a
variable-length integer. variable-length integer. The remaining data on this stream consists
of HTTP/QUIC frames, as defined in Section 4.2, and carries the
response side of an HTTP message exchange as described in
Section 3.1. The request headers of the exchange are carried by a
PUSH_PROMISE frame (see Section 4.2.7) on the request stream which
generated the push. Promised requests MUST conform to the
requirements in Section 8.2 of [RFC7540].
Only servers can push; if a server receives a client-initiated push
stream, this MUST be treated as a stream error of type
HTTP_WRONG_STREAM_DIRECTION.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Stream Type (8)| Push ID (i) ... |Stream Type (8)| Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 3: Push Stream Header Figure 3: Push Stream Header
Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it Server push is only enabled on a connection when a client sends a
contains a Push ID. The Push ID uniquely identifies a server push. MAX_PUSH_ID frame (see Section 4.2.9). A server cannot use server
This allows a server to fulfill promises in the order that best suits push until it receives a MAX_PUSH_ID frame. A client sends
its needs. When a server later fulfills a promise, the server push additional MAX_PUSH_ID frames to control the number of pushes that a
response is conveyed on a push stream. server can promise. A server SHOULD use Push IDs sequentially,
starting at 0. A client MUST treat receipt of a push stream with a
A server SHOULD use Push IDs sequentially, starting at 0. A client Push ID that is greater than the maximum Push ID as a connection
uses the MAX_PUSH_ID frame (Section 4.2.9) to limit the number of error of type HTTP_PUSH_LIMIT_EXCEEDED.
pushes that a server can promise. A client MUST treat receipt of a
push stream with a Push ID that is greater than the maximum Push ID
as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED.
The remaining data on this stream consists of HTTP frames, as defined
in Section 4.2, and carries the response side of an HTTP message
exchange as described in Section 3.1. The request headers of the
exchange are carried by a PUSH_PROMISE frame (see Section 4.2.7) on
the request stream which generated the push. Promised requests MUST
conform to the requirements in Section 8.2 of [RFC7540].
The PUSH_PROMISE frame is sent on the client-initiated bidirectional Each Push ID MUST only be used once in a push stream header. If a
stream that carried the request that generated the push. This allows push stream header includes a Push ID that was used in another push
the server push to be associated with a request. Ordering of a stream header, the client MUST treat this as a connection error of
PUSH_PROMISE in relation to certain parts of the response is type HTTP_DUPLICATE_PUSH.
important (see Section 8.2.1 of [RFC7540]).
If a promised server push is not needed by the client, the client 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, 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 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 instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see
Section 6). This asks the server not to transfer the data and Section 6). This asks the server not to transfer the data and
indicates that it will be discarded upon receipt. indicates that it will be discarded upon receipt.
Push streams always begin with a header containing the Push ID. Each
Push ID MUST only be used once in a push stream header. If a push
stream header includes a Push ID that was used in another push 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 4.2.7).
After the header, a push stream contains a response (Section 3.1),
with response headers, a response body (if any) carried by DATA
frames, then trailers (if any) carried by HEADERS frames.
4. HTTP Framing Layer 4. HTTP Framing Layer
Frames are used on the control stream, request streams, and push Frames are used on the control stream, request streams, and push
streams. This section describes HTTP framing in QUIC and highlights streams. This section describes HTTP framing in QUIC and highlights
some differences from HTTP/2 framing. For more detail on differences some differences from HTTP/2 framing. For more detail on differences
from HTTP/2, see Section 7.2. from HTTP/2, see Section 8.2.
4.1. Frame Layout 4.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 (i) ... | Length (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
skipping to change at page 22, line 18 skipping to change at page 23, line 18
| Push ID (i) ... | Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Header Block (*) ... | Header Block (*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 10: PUSH_PROMISE frame payload Figure 10: PUSH_PROMISE frame payload
The payload consists of: The payload consists of:
Push ID: A variable-length integer that identifies the server push Push ID: A variable-length integer that identifies the server push
request. A push ID is used in push stream header (Section 3.3.2), request. A push ID is used in push stream header (Section 3.3.3),
CANCEL_PUSH frames (Section 4.2.5), and PRIORITY frames CANCEL_PUSH frames (Section 4.2.5), and PRIORITY frames
(Section 4.2.4). (Section 4.2.4).
Header Block: QPACK-compressed request headers for the promised Header Block: QPACK-compressed request headers for the promised
response. See [QPACK] for more details. response. See [QPACK] for more details.
A server MUST NOT use a Push ID that is larger than the client has A server MUST NOT use a Push ID that is larger than the client has
provided in a MAX_PUSH_ID frame (Section 4.2.9). A client MUST treat provided in a MAX_PUSH_ID frame (Section 4.2.9). A client MUST treat
receipt of a PUSH_PROMISE that contains a larger Push ID than the receipt of a PUSH_PROMISE that contains a larger Push ID than the
client has advertised as a connection error of type client has advertised as a connection error of type
skipping to change at page 24, line 26 skipping to change at page 25, line 26
Servers SHOULD send a GOAWAY frame when the closing of a connection Servers SHOULD send a GOAWAY frame when the closing of a connection
is known in advance, even if the advance notice is small, so that the is known in advance, even if the advance notice is small, so that the
remote peer can know whether a stream has been partially processed or remote peer can know whether a stream has been partially processed or
not. For example, if an HTTP client sends a POST at the same time not. For example, if an HTTP client sends a POST at the same time
that a server closes a QUIC connection, the client cannot know if the that a server closes a QUIC connection, the client cannot know if the
server started to process that POST request if the server does not 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. send a GOAWAY frame to indicate what streams it might have acted on.
For unexpected closures caused by error conditions, a QUIC For unexpected closures caused by error conditions, a QUIC
CONNECTION_CLOSE or APPLICATION_CLOSE frame MUST be used. However, a APPLICATION_CLOSE frame MUST be used. However, a GOAWAY MAY be sent
GOAWAY MAY be sent first to provide additional detail to clients and first to provide additional detail to clients and to allow the client
to allow the client to retry requests. Including the GOAWAY frame in to retry requests. Including the GOAWAY frame in the same packet as
the same packet as the QUIC CONNECTION_CLOSE or APPLICATION_CLOSE the QUIC APPLICATION_CLOSE frame improves the chances of the frame
frame improves the chances of the frame being received by clients. being received by clients.
If a connection terminates without a GOAWAY frame, the last Stream ID If a connection terminates without a GOAWAY frame, the last Stream ID
is effectively the highest possible Stream ID (as determined by is effectively the highest possible Stream ID (as determined by
QUIC's MAX_STREAM_ID). QUIC's MAX_STREAM_ID).
An endpoint MAY send multiple GOAWAY frames if circumstances change. An endpoint MAY send multiple GOAWAY frames if circumstances change.
For instance, an endpoint that sends GOAWAY without an error code For instance, an endpoint that sends GOAWAY without an error code
during graceful shutdown could subsequently encounter an error during graceful shutdown could subsequently encounter an error
condition. The last stream identifier from the last GOAWAY frame condition. The last stream identifier from the last GOAWAY frame
received indicates which streams could have been acted upon. A received indicates which streams could have been acted upon. A
skipping to change at page 26, line 40 skipping to change at page 27, line 40
streams or the entire connection when an error is encountered. These streams or the entire connection when an error is encountered. These
are 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].
This section describes HTTP/QUIC-specific error codes which can be This section describes HTTP/QUIC-specific error codes which can be
used to express the cause of a connection or stream error. used to express the cause of a connection or stream error.
6.1. HTTP/QUIC Error Codes 6.1. HTTP/QUIC Error Codes
The following error codes are defined for use in QUIC RST_STREAM, The following error codes are defined for use in QUIC RST_STREAM,
STOP_SENDING, and CONNECTION_CLOSE frames when using HTTP/QUIC. STOP_SENDING, and APPLICATION_CLOSE frames when using HTTP/QUIC.
STOPPING (0x00): This value is reserved by the transport to be used STOPPING (0x00): This value is reserved by the transport to be used
in response to QUIC STOP_SENDING frames. in response to QUIC STOP_SENDING frames.
HTTP_NO_ERROR (0x01): No error. This is used when the connection or HTTP_NO_ERROR (0x01): No error. This is used when the connection or
stream needs to be closed, but there is no error to signal. stream needs to be closed, but there is no error to signal.
HTTP_PUSH_REFUSED (0x02): The server has attempted to push content HTTP_PUSH_REFUSED (0x02): 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 (0x03): An internal error has occurred in the HTTP_INTERNAL_ERROR (0x03): An internal error has occurred in the
HTTP stack. HTTP stack.
HTTP_PUSH_ALREADY_IN_CACHE (0x04): The server has attempted to push HTTP_PUSH_ALREADY_IN_CACHE (0x04): The server has attempted to push
content which the client has cached. content which the client has cached.
HTTP_REQUEST_CANCELLED (0x05): The client no longer needs the HTTP_REQUEST_CANCELLED (0x05): The client no longer needs the
requested data. requested data.
HTTP_QPACK_DECOMPRESSION_FAILED (0x06): QPACK failed to decompress a
frame and cannot continue.
HTTP_CONNECT_ERROR (0x07): The connection established in response to HTTP_CONNECT_ERROR (0x07): The connection established in response to
a CONNECT request was reset or abnormally closed. a CONNECT request was reset or abnormally closed.
HTTP_EXCESSIVE_LOAD (0x08): The endpoint detected that its peer is HTTP_EXCESSIVE_LOAD (0x08): The endpoint detected that its peer is
exhibiting a behavior that might be generating excessive load. exhibiting a behavior that might be generating excessive load.
HTTP_VERSION_FALLBACK (0x09): The requested operation cannot be HTTP_VERSION_FALLBACK (0x09): The requested operation cannot be
served over HTTP/QUIC. The peer should retry over HTTP/2. served over HTTP/QUIC. The peer should retry over HTTP/2.
HTTP_WRONG_STREAM (0x0A): A frame was received on a stream where it HTTP_WRONG_STREAM (0x0A): A frame was received on a stream where it
skipping to change at page 28, line 4 skipping to change at page 28, line 50
HTTP_WRONG_STREAM_DIRECTION (0x0010): A unidirectional stream type HTTP_WRONG_STREAM_DIRECTION (0x0010): A unidirectional stream type
was used by a peer which is not permitted to do so. was used by a peer which is not permitted to do so.
HTTP_GENERAL_PROTOCOL_ERROR (0x00FF): Peer violated protocol HTTP_GENERAL_PROTOCOL_ERROR (0x00FF): Peer violated protocol
requirements in a way which doesn't match a more specific error requirements in a way which doesn't match a more specific error
code, or endpoint declines to use the more specific error code. code, or endpoint declines to use the more specific error code.
HTTP_MALFORMED_FRAME (0x01XX): An error in a specific frame type. HTTP_MALFORMED_FRAME (0x01XX): An error in a specific frame type.
The frame type is included as the last octet of the error code. The frame type is included as the last octet of the error code.
For example, an error in a MAX_PUSH_ID frame would be indicated For example, an error in a MAX_PUSH_ID frame would be indicated
with the code (0x10D). with the code (0x10D).
7. Considerations for Transitioning from HTTP/2 7. Extensions to HTTP/QUIC
HTTP/QUIC permits extension of the protocol. Within the limitations
described in this section, protocol extensions can be used to provide
additional services or alter any aspect of the protocol. Extensions
are effective only within the scope of a single HTTP/QUIC connection.
This applies to the protocol elements defined in this document. This
does not affect the existing options for extending HTTP, such as
defining new methods, status codes, or header fields.
Extensions are permitted to use new frame types (Section 4.2), new
settings (Section 4.2.6.2), new error codes (Section 6), or new
unidirectional stream types (Section 3.3). Registries are
established for managing these extension points: frame types
(Section 10.3), settings (Section 10.4), error codes (Section 10.5),
and stream types (Section 10.6).
Implementations MUST ignore unknown or unsupported values in all
extensible protocol elements. Implementations MUST discard frames
and unidirectional streams that have unknown or unsupported types.
This means that any of these extension points can be safely used by
extensions without prior arrangement or negotiation.
Extensions that could change the semantics of existing protocol
components MUST be negotiated before being used. For example, an
extension that changes the layout of the HEADERS frame cannot be used
until the peer has given a positive signal that this is acceptable.
In this case, it could also be necessary to coordinate when the
revised layout comes into effect.
This document doesn't mandate a specific method for negotiating the
use of an extension but notes that a setting (Section 4.2.6.2) could
be used for that purpose. If both peers set a value that indicates
willingness to use the extension, then the extension can be used. If
a setting is used for extension negotiation, the default value MUST
be defined in such a fashion that the extension is disabled if the
setting is omitted.
8. 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 describes the approach taken to design similarities. This section describes the approach taken to design
HTTP/QUIC, points out important differences from HTTP/2, and HTTP/QUIC, points out important differences from HTTP/2, and
describes how to map HTTP/2 extensions into HTTP/QUIC. describes how to map HTTP/2 extensions into HTTP/QUIC.
HTTP/QUIC begins from the premise that HTTP/2 code reuse is a useful 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 feature, but not a hard requirement. HTTP/QUIC departs from HTTP/2
primarily where necessary to accommodate the differences in behavior primarily where necessary to accommodate the differences in behavior
between QUIC and TCP (lack of ordering, support for streams). We between QUIC and TCP (lack of ordering, support for streams). We
intend to avoid gratuitous changes which make it difficult or intend to avoid gratuitous changes which make it difficult or
impossible to build extensions with the same semantics applicable to impossible to build extensions with the same semantics applicable to
both protocols at once. both protocols at once.
These departures are noted in this section. These departures are noted in this section.
7.1. Streams 8.1. Streams
HTTP/QUIC permits use of a larger number of streams (2^62-1) than HTTP/QUIC permits use of a larger number of streams (2^62-1) than
HTTP/2. The considerations about exhaustion of stream identifier HTTP/2. The considerations about exhaustion of stream identifier
space apply, though the space is significantly larger such that it is space apply, though the space is significantly larger such that it is
likely that other limits in QUIC are reached first, such as the limit likely that other limits in QUIC are reached first, such as the limit
on the connection flow control window. on the connection flow control window.
7.2. HTTP Frame Types 8.2. 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. This permits the removal of the Flags field from the required. This permits the removal of the Flags field from the
generic frame layout. generic frame layout.
skipping to change at page 30, line 18 skipping to change at page 32, line 6
PRIORITY (0x2): As described above, the PRIORITY frame is sent on PRIORITY (0x2): As described above, the PRIORITY frame is sent on
the control stream and can reference either a Stream ID or a Push the control stream and can reference either a Stream ID or a Push
ID. See Section 4.2.4. ID. See Section 4.2.4.
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. The same code point is used provides stream lifecycle management. The same code point is used
for the CANCEL_PUSH frame (Section 4.2.5). for the CANCEL_PUSH frame (Section 4.2.5).
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 4.2.6 and Section 7.3. the connection. See Section 4.2.6 and Section 8.3.
PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream;
instead the push stream references the PUSH_PROMISE frame using a instead the push stream references the PUSH_PROMISE frame using a
Push ID. See Section 4.2.7. Push ID. See Section 4.2.7.
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 is sent only from server to client and does not GOAWAY (0x7): GOAWAY is sent only from server to client and does not
contain an error code. See Section 4.2.8. contain an error code. See Section 4.2.8.
skipping to change at page 30, line 40 skipping to change at page 32, line 28
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.
Frame types defined by extensions to HTTP/2 need to be separately Frame types defined by extensions to HTTP/2 need to be separately
registered for HTTP/QUIC if still applicable. The IDs of frames registered for HTTP/QUIC if still applicable. The IDs of frames
defined in [RFC7540] have been reserved for simplicity. See defined in [RFC7540] have been reserved for simplicity. See
Section 9.3. Section 10.3.
7.3. HTTP/2 SETTINGS Parameters 8.3. 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.
skipping to change at page 31, line 28 skipping to change at page 33, line 17
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 4.2.6.2. SETTINGS_MAX_HEADER_LIST_SIZE: See Section 4.2.6.2.
Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The
IDs of settings defined in [RFC7540] have been reserved for IDs of settings defined in [RFC7540] have been reserved for
simplicity. See Section 9.4. simplicity. See Section 10.4.
7.4. HTTP/2 Error Codes 8.4. 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 the The HTTP/2 error codes defined in Section 7 of [RFC7540] map to the
HTTP over QUIC error codes as follows: HTTP over QUIC error codes as follows:
NO_ERROR (0x0): HTTP_NO_ERROR in Section 6.1. NO_ERROR (0x0): HTTP_NO_ERROR in Section 6.1.
skipping to change at page 32, line 18 skipping to change at page 34, line 7
FRAME_SIZE_ERROR (0x6): No single mapping. See new error codes FRAME_SIZE_ERROR (0x6): No single mapping. See new error codes
defined in Section 6.1. defined in Section 6.1.
REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream
management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the
QUIC layer. QUIC layer.
CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 6.1. CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 6.1.
COMPRESSION_ERROR (0x9): HTTP_HPACK_DECOMPRESSION_FAILED in COMPRESSION_ERROR (0x9): HTTP_QPACK_DECOMPRESSION_FAILED in [QPACK].
Section 6.1.
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 need to be defined for HTTP/2 and HTTP/QUIC separately. Error codes need to be defined for HTTP/2 and HTTP/QUIC separately.
See Section 9.5. See Section 10.5.
8. Security Considerations 9. 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 with TLS. those of HTTP/2 with TLS. Note that where HTTP/2 employs PADDING
frames to make a connection more resistant to traffic analysis, HTTP/
QUIC can rely on QUIC's own PADDING frames or employ the reserved
frame and stream types discussed in Section 4.2.1 and Section 3.3.1.
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 incautious 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.
9. IANA Considerations 10. IANA Considerations
9.1. Registration of HTTP/QUIC Identification String 10.1. Registration of HTTP/QUIC Identification String
This document creates a new registration for the identification of This document creates a new registration for the identification of
HTTP/QUIC in the "Application Layer Protocol Negotiation (ALPN) HTTP/QUIC in the "Application Layer Protocol Negotiation (ALPN)
Protocol IDs" registry established in [RFC7301]. Protocol IDs" registry established in [RFC7301].
The "hq" string identifies HTTP/QUIC: The "hq" string identifies HTTP/QUIC:
Protocol: HTTP over QUIC Protocol: HTTP over QUIC
Identification Sequence: 0x68 0x71 ("hq") Identification Sequence: 0x68 0x71 ("hq")
Specification: This document Specification: This document
9.2. Registration of QUIC Version Hint Alt-Svc Parameter 10.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.2.1 Specification: This document, Section 2.2.1
9.3. Frame Types 10.3. Frame Types
This document establishes a registry for HTTP/QUIC frame type codes. This document establishes a registry for HTTP/QUIC frame type codes.
The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The
"HTTP/QUIC Frame Type" registry operates under either of the "IETF "HTTP/QUIC Frame Type" registry operates under either of the "IETF
Review" or "IESG Approval" policies [RFC8126] for values from 0x00 up Review" or "IESG Approval" policies [RFC8126] for values from 0x00 up
to and including 0xef, with values from 0xf0 up to and including 0xff to and including 0xef, with values from 0xf0 up to and including 0xff
being reserved for Experimental Use. being reserved for Experimental Use.
While this registry is separate from the "HTTP/2 Frame Type" registry While this registry is separate from the "HTTP/2 Frame Type" registry
defined in [RFC7540], it is preferable that the assignments parallel defined in [RFC7540], it is preferable that the assignments parallel
skipping to change at page 34, line 32 skipping to change at page 36, line 32
| GOAWAY | 0x7 | Section 4.2.8 | | GOAWAY | 0x7 | Section 4.2.8 |
| | | | | | | |
| Reserved | 0x8 | N/A | | Reserved | 0x8 | N/A |
| | | | | | | |
| Reserved | 0x9 | N/A | | Reserved | 0x9 | N/A |
| | | | | | | |
| MAX_PUSH_ID | 0xD | Section 4.2.9 | | MAX_PUSH_ID | 0xD | Section 4.2.9 |
+--------------+------+----------------+ +--------------+------+----------------+
Additionally, each code of the format "0xb + (0x1f * N)" for values Additionally, each code of the format "0xb + (0x1f * N)" for values
of N in the range (0..7) (that is, "0xb", "0x2a", etc., through of N in the range (0..7) (that is, "0xb", "0x2a", "0x49", "0x68",
"0xe4"), the following values should be registered: "0x87", "0xa6", "0xc5", and "0xe4"), the following values should be
registered:
Frame Type: Reserved - GREASE Frame Type: Reserved - GREASE
Specification: Section 4.2.1 Specification: Section 4.2.1
9.4. Settings Parameters 10.4. Settings Parameters
This document establishes a registry for HTTP/QUIC settings. The This document establishes a registry for HTTP/QUIC settings. The
"HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC
Settings" registry operates under the "Expert Review" policy Settings" registry operates under the "Expert Review" policy
[RFC8126] for values in the range from 0x0000 to 0xefff, with values [RFC8126] for values in the range from 0x0000 to 0xefff, with values
between and 0xf000 and 0xffff being reserved for Experimental Use. between and 0xf000 and 0xffff being reserved for Experimental Use.
The designated experts are the same as those for the "HTTP/2 The designated experts are the same as those for the "HTTP/2
Settings" registry defined in [RFC7540]. Settings" registry defined in [RFC7540].
While this registry is separate from the "HTTP/2 Settings" registry While this registry is separate from the "HTTP/2 Settings" registry
skipping to change at page 35, line 41 skipping to change at page 37, line 41
+----------------------+------+------------------+ +----------------------+------+------------------+
Additionally, each code of the format "0x?a?a" where each "?" is any Additionally, each code of the format "0x?a?a" where each "?" is any
four bits (that is, "0x0a0a", "0x0a1a", etc. through "0xfafa"), the four bits (that is, "0x0a0a", "0x0a1a", etc. through "0xfafa"), the
following values should be registered: following values should be registered:
Name: Reserved - GREASE Name: Reserved - GREASE
Specification: Section 4.2.6.2 Specification: Section 4.2.6.2
9.5. Error Codes 10.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 16-bit space. The "HTTP/ "HTTP/QUIC Error Code" registry manages a 16-bit space. The "HTTP/
QUIC Error Code" registry operates under the "Expert Review" policy QUIC Error Code" registry operates under the "Expert Review" policy
[RFC8126]. [RFC8126].
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
registrations for possible duplication with existing error codes. registrations for possible duplication with existing error codes.
Use of existing registrations is to be encouraged, but not mandated. Use of existing registrations is to be encouraged, but not mandated.
skipping to change at page 36, line 20 skipping to change at page 38, line 20
Code: The 16-bit error code value. Code: The 16-bit error code value.
Description: A brief description of the error code semantics, longer Description: A brief description of the error code semantics, longer
if no detailed specification is provided. if no detailed specification is provided.
Specification: An optional reference for a specification that Specification: An optional reference for a specification that
defines the error code. defines the error code.
The entries in the following table are registered by this document. The entries in the following table are registered by this document.
+---------------------------+-------+--------------+----------------+ +-------------------------+-------+---------------+-----------------+
| Name | Code | Description | Specification | | Name | Code | Description | Specification |
+---------------------------+-------+--------------+----------------+ +-------------------------+-------+---------------+-----------------+
| STOPPING | 0x000 | Reserved by | [QUIC-TRANSPOR | | STOPPING | 0x000 | Reserved by | [QUIC-TRANSPORT |
| | 0 | QUIC | T] | | | 0 | QUIC | ] |
| | | | | | | | | |
| HTTP_NO_ERROR | 0x000 | No error | Section 6.1 | | HTTP_NO_ERROR | 0x000 | No error | Section 6.1 |
| | 1 | | | | | 1 | | |
| | | | | | | | | |
| HTTP_PUSH_REFUSED | 0x000 | Client | Section 6.1 | | HTTP_PUSH_REFUSED | 0x000 | Client | Section 6.1 |
| | 2 | refused | | | | 2 | refused | |
| | | pushed | | | | | pushed | |
| | | content | | | | | content | |
| | | | | | | | | |
| HTTP_INTERNAL_ERROR | 0x000 | Internal | Section 6.1 | | HTTP_INTERNAL_ERROR | 0x000 | Internal | Section 6.1 |
| | 3 | error | | | | 3 | error | |
| | | | | | | | | |
| HTTP_PUSH_ALREADY_IN_CACH | 0x000 | Pushed | Section 6.1 | | HTTP_PUSH_ALREADY_IN_CA | 0x000 | Pushed | Section 6.1 |
| E | 4 | content | | | CHE | 4 | content | |
| | | already | | | | | already | |
| | | cached | | | | | cached | |
| | | | | | | | | |
| HTTP_REQUEST_CANCELLED | 0x000 | Data no | Section 6.1 | | HTTP_REQUEST_CANCELLED | 0x000 | Data no | Section 6.1 |
| | 5 | longer | | | | 5 | longer needed | |
| | | needed | | | | | | |
| | | | | | HTTP_CONNECT_ERROR | 0x000 | TCP reset or | Section 6.1 |
| HTTP_HPACK_DECOMPRESSION_ | 0x000 | HPACK cannot | Section 6.1 | | | 7 | error on | |
| FAILED | 6 | continue | | | | | CONNECT | |
| | | | | | | | request | |
| HTTP_CONNECT_ERROR | 0x000 | TCP reset or | Section 6.1 | | | | | |
| | 7 | error on | | | HTTP_EXCESSIVE_LOAD | 0x000 | Peer | Section 6.1 |
| | | CONNECT | | | | 8 | generating | |
| | | request | | | | | excessive | |
| | | | | | | | load | |
| HTTP_EXCESSIVE_LOAD | 0x000 | Peer | Section 6.1 | | | | | |
| | 8 | generating | | | HTTP_VERSION_FALLBACK | 0x000 | Retry over | Section 6.1 |
| | | excessive | | | | 9 | HTTP/2 | |
| | | load | | | | | | |
| | | | | | HTTP_WRONG_STREAM | 0x000 | A frame was | Section 6.1 |
| HTTP_VERSION_FALLBACK | 0x000 | Retry over | Section 6.1 | | | A | sent on the | |
| | 9 | HTTP/2 | | | | | wrong stream | |
| | | | | | | | | |
| HTTP_WRONG_STREAM | 0x000 | A frame was | Section 6.1 | | HTTP_PUSH_LIMIT_EXCEEDE | 0x000 | Maximum Push | Section 6.1 |
| | A | sent on the | | | D | B | ID exceeded | |
| | | wrong stream | | | | | | |
| | | | | | HTTP_DUPLICATE_PUSH | 0x000 | Push ID was | Section 6.1 |
| HTTP_PUSH_LIMIT_EXCEEDED | 0x000 | Maximum Push | Section 6.1 | | | C | fulfilled | |
| | B | ID exceeded | | | | | multiple | |
| | | | | | | | times | |
| HTTP_DUPLICATE_PUSH | 0x000 | Push ID was | Section 6.1 | | | | | |
| | C | fulfilled | | | HTTP_UNKNOWN_STREAM_TYP | 0x000 | Unknown unidi | Section 6.1 |
| | | multiple | | | E | D | rectional | |
| | | times | | | | | stream type | |
| | | | | | | | | |
| HTTP_UNKNOWN_STREAM_TYPE | 0x000 | Unknown unid | Section 6.1 | | HTTP_WRONG_STREAM_COUNT | 0x000 | Too many unid | Section 6.1 |
| | D | irectional | | | | E | irectional | |
| | | stream type | | | | | streams | |
| | | | | | | | | |
| HTTP_WRONG_STREAM_COUNT | 0x000 | Too many uni | Section 6.1 | | HTTP_CLOSED_CRITICAL_ST | 0x000 | Critical | Section 6.1 |
| | E | directional | | | REAM | F | stream was | |
| | | streams | | | | | closed | |
| | | | | | | | | |
| HTTP_CLOSED_CRITICAL_STRE | 0x000 | Critical | Section 6.1 | | HTTP_WRONG_STREAM_DIREC | 0x001 | Unidirectiona | Section 6.1 |
| AM | F | stream was | | | TION | 0 | l stream in | |
| | | closed | | | | | wrong | |
| | | | | | | | direction | |
| HTTP_WRONG_STREAM_DIRECTI | 0x001 | Unidirection | Section 6.1 | | | | | |
| ON | 0 | al stream in | | | HTTP_MALFORMED_FRAME | 0x01X | Error in | Section 6.1 |
| | | wrong | | | | X | frame | |
| | | direction | | | | | formatting or | |
| | | | | | | | use | |
| HTTP_MALFORMED_FRAME | 0x01X | Error in | Section 6.1 | +-------------------------+-------+---------------+-----------------+
| | X | frame | |
| | | formatting | |
| | | or use | |
+---------------------------+-------+--------------+----------------+
9.6. Stream Types 10.6. Stream Types
This document establishes a registry for HTTP/QUIC unidirectional This document establishes a registry for HTTP/QUIC unidirectional
stream types. The "HTTP/QUIC Stream Type" registry manages an 8-bit stream types. The "HTTP/QUIC Stream Type" registry manages an 8-bit
space. The "HTTP/QUIC Stream Type" registry operates under either of space. The "HTTP/QUIC Stream Type" registry operates under either of
the "IETF Review" or "IESG Approval" policies [RFC8126] for values the "IETF Review" or "IESG Approval" policies [RFC8126] for values
from 0x00 up to and including 0xef, with values from 0xf0 up to and from 0x00 up to and including 0xef, with values from 0xf0 up to and
including 0xff being reserved for Experimental Use. including 0xff being reserved for Experimental Use.
New entries in this registry require the following information: New entries in this registry require the following information:
skipping to change at page 38, line 32 skipping to change at page 40, line 23
its payload. its payload.
Sender: Which endpoint on a connection may initiate a stream of this Sender: Which endpoint on a connection may initiate a stream of this
type. Values are "Client", "Server", or "Both". type. Values are "Client", "Server", or "Both".
The entries in the following table are registered by this document. The entries in the following table are registered by this document.
+----------------+------+----------------+--------+ +----------------+------+----------------+--------+
| Stream Type | Code | Specification | Sender | | Stream Type | Code | Specification | Sender |
+----------------+------+----------------+--------+ +----------------+------+----------------+--------+
| Control Stream | 0x43 | Section 3.3.1 | Both | | Control Stream | 0x43 | Section 3.3.2 | Both |
| | | | | | | | | |
| Push Stream | 0x50 | Section 3.3.2 | Server | | Push Stream | 0x50 | Section 3.3.3 | Server |
+----------------+------+----------------+--------+ +----------------+------+----------------+--------+
10. References Additionally, for each code of the format "0x1f * N" for values of N
in the range (0..8) (that is, "0x00", "0x1f", "0x3e", "0x5d", "0x7c",
"0x9b", "0xba", "0xd9", "0xf8"), the following values should be
registered:
10.1. Normative References Stream Type: Reserved - GREASE
Specification: Section 3.3.1
Sender: Both
11. References
11.1. Normative References
[QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK:
Header Compression for HTTP over QUIC", draft-ietf-quic- Header Compression for HTTP over QUIC", draft-ietf-quic-
qpack-01 (work in progress). qpack-latest (work in progress).
[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-13 (work in progress). transport-latest (work in progress).
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7, [RFC0793] Postel, J., "Transmission Control Protocol", STD 7,
RFC 793, DOI 10.17487/RFC0793, September 1981, RFC 793, DOI 10.17487/RFC0793, September 1981,
<https://www.rfc-editor.org/info/rfc793>. <https://www.rfc-editor.org/info/rfc793>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
skipping to change at page 39, line 43 skipping to change at page 41, line 47
<https://www.rfc-editor.org/info/rfc7540>. <https://www.rfc-editor.org/info/rfc7540>.
[RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP [RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP
Alternative Services", RFC 7838, DOI 10.17487/RFC7838, Alternative Services", RFC 7838, DOI 10.17487/RFC7838,
April 2016, <https://www.rfc-editor.org/info/rfc7838>. April 2016, <https://www.rfc-editor.org/info/rfc7838>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
10.2. Informative References 11.2. Informative References
[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, <https://www.rfc-editor.org/info/rfc7301>. July 2014, <https://www.rfc-editor.org/info/rfc7301>.
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
Writing an IANA Considerations Section in RFCs", BCP 26, Writing an IANA Considerations Section in RFCs", BCP 26,
RFC 8126, DOI 10.17487/RFC8126, June 2017, RFC 8126, DOI 10.17487/RFC8126, June 2017,
<https://www.rfc-editor.org/info/rfc8126>. <https://www.rfc-editor.org/info/rfc8126>.
10.3. URIs 11.3. URIs
[1] https://mailarchive.ietf.org/arch/search/?email_list=quic [1] https://mailarchive.ietf.org/arch/search/?email_list=quic
[2] https://github.com/quicwg [2] https://github.com/quicwg
[3] https://github.com/quicwg/base-drafts/labels/-http [3] https://github.com/quicwg/base-drafts/labels/-http
[4] https://www.iana.org/assignments/message-headers
Appendix A. Change Log Appendix A. 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.
A.1. Since draft-ietf-quic-http-12 A.1. Since draft-ietf-quic-http-12
o TLS SNI extension isn't mandatory if an alternative method is used o TLS SNI extension isn't mandatory if an alternative method is used
(#1459, #1462, #1466) (#1459, #1462, #1466)
 End of changes. 58 change blocks. 
237 lines changed or deleted 321 lines changed or added

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