draft-ietf-quic-http-13.txt   draft-ietf-quic-http-14.txt 
QUIC M. Bishop, Ed. QUIC M. Bishop, Ed.
Internet-Draft Akamai Internet-Draft Akamai
Intended status: Standards Track June 28, 2018 Intended status: Standards Track August 15, 2018
Expires: December 30, 2018 Expires: February 16, 2019
Hypertext Transfer Protocol (HTTP) over QUIC Hypertext Transfer Protocol (HTTP) over QUIC
draft-ietf-quic-http-13 draft-ietf-quic-http-14
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 16, 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.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 15 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 15
4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 15 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 16
4.2.1. Reserved Frame Types . . . . . . . . . . . . . . . . 15 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 16
4.2.2. DATA . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2.1. Reserved Frame Types . . . . . . . . . . . . . . . . 16
4.2.3. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 16 4.2.2. DATA . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.4. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 16 4.2.3. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.5. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 18 4.2.4. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 17
4.2.6. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 19 4.2.5. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 19
4.2.7. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 21 4.2.6. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 20
4.2.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 23 4.2.7. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 23
4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 25 4.2.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 24
4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 26
5. Connection Management . . . . . . . . . . . . . . . . . . . . 26 5. Connection Management . . . . . . . . . . . . . . . . . . . . 27
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 26 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 27
6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 26 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 27
7. Considerations for Transitioning from HTTP/2 . . . . . . . . 28 7. Extensions to HTTP/QUIC . . . . . . . . . . . . . . . . . . . 29
7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 28 8. Considerations for Transitioning from HTTP/2 . . . . . . . . 30
7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 28 8.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 30 8.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 30
7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 31 8.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 32
8. Security Considerations . . . . . . . . . . . . . . . . . . . 32 8.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 33
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 32 9. Security Considerations . . . . . . . . . . . . . . . . . . . 34
9.1. Registration of HTTP/QUIC Identification String . . . . . 32 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34
9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 33 10.1. Registration of HTTP/QUIC Identification String . . . . 34
9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 33 10.2. Registration of QUIC Version Hint Alt-Svc Parameter . . 35
9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 34 10.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . 35
9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 35 10.4. Settings Parameters . . . . . . . . . . . . . . . . . . 36
9.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 38 10.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 37
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 10.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 40
10.1. Normative References . . . . . . . . . . . . . . . . . . 38 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 40
10.2. Informative References . . . . . . . . . . . . . . . . . 39 11.1. Normative References . . . . . . . . . . . . . . . . . . 41
10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 40 11.2. Informative References . . . . . . . . . . . . . . . . . 42
Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 40 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 42
A.1. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 40 Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 42
A.2. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 40 A.1. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 42
A.3. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 40 A.2. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 42
A.4. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 41 A.3. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 43
A.5. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 41 A.4. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 43
A.6. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 41 A.5. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 43
A.7. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 41 A.6. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 43
A.8. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 41 A.7. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 43
A.9. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 41 A.8. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 44
A.10. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 42 A.9. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 44
A.11. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 42 A.10. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 44
A.12. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 42 A.11. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 44
A.13. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 42 A.12. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 44
A.14. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 43 A.13. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 44
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 43 A.14. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 45
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 43 A.15. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 45
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 45
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 46
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 bidirectional QUIC
After sending a request, a client closes the stream for sending; stream. After sending a request, a client closes the stream for
after sending a response, the server closes the stream for sending sending; after sending a response, the server closes the stream for
and the QUIC stream is fully closed. sending 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 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
receiving a solicited RST_STREAM.
3.1.1. Header Compression Changes to the state of a request stream, including receiving a
RST_STREAM with any error code, do not affect the state of the
server's response. Servers do not abort a response in progress
solely due to a state change on the request stream. However, if the
request stream terminates without containing a usable HTTP request,
the server SHOULD abort its response with the error code
HTTP_INCOMPLETE_REQUEST.
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 10, line 11 skipping to change at page 10, line 39
A TCP connection error is signaled with RST_STREAM. A proxy treats A TCP connection error is signaled with RST_STREAM. A proxy treats
any error in the TCP connection, which includes receiving a TCP any error in the TCP connection, which includes receiving a TCP
segment with the RST bit set, as a stream error of type segment with the RST bit set, as a stream error of type
HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send
a TCP segment with the RST bit set if it detects an error with the a TCP segment with the RST bit set if it detects an error with the
stream or the QUIC connection. stream or the QUIC connection.
3.1.3. Request Cancellation 3.1.3. Request Cancellation
Either client or server can cancel requests by closing the stream Either client or server can cancel requests by aborting the stream
(QUIC RST_STREAM or STOP_SENDING frames, as appropriate) with an (QUIC RST_STREAM or STOP_SENDING frames, as appropriate) with an
error type of HTTP_REQUEST_CANCELLED (Section 6.1). When the client error code of HTTP_REQUEST_CANCELLED (Section 6.1). When the client
cancels a request or response, it indicates that the response is no cancels a response, it indicates that this response is no longer of
longer of interest. interest. Clients SHOULD cancel requests by aborting both directions
of a stream.
When the server cancels either direction of the request stream using When the server cancels its response stream using
HTTP_REQUEST_CANCELLED, it indicates that no application processing HTTP_REQUEST_CANCELLED, it indicates that no application processing
was performed. The client can treat requests cancelled by the server was performed. The client can treat requests cancelled by the server
as though they had never been sent at all, thereby allowing them to as though they had never been sent at all, thereby allowing them to
be retried later on a new connection. Servers MUST NOT use the be retried later on a new connection. Servers MUST NOT use the
HTTP_REQUEST_CANCELLED status for requests which were partially or HTTP_REQUEST_CANCELLED status for requests which were partially or
fully processed. fully processed.
Note: In this context, "processed" means that some data from the Note: In this context, "processed" means that some data from the
stream was passed to some higher layer of software that might have stream was passed to some higher layer of software that might have
taken some action as a result. taken some action as a result.
skipping to change at page 12, line 46 skipping to change at page 13, line 31
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 21, line 37 skipping to change at page 22, line 37
can be any value the implementation selects. can be any value the implementation selects.
Additional settings MAY be defined by extensions to HTTP/QUIC. Additional settings MAY be defined by extensions to HTTP/QUIC.
4.2.6.3. Initial SETTINGS Values 4.2.6.3. Initial SETTINGS Values
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 MUST store the settings the server provided in the frame. Clients MUST store the settings the server provided in the
session being resumed and MUST comply with stored settings until the session being resumed and MUST comply with stored settings until the
server's current settings are received. server's current settings are received. Remembered settings apply to
the new connection until the server's SETTINGS frame is received.
Servers MAY continue processing data from clients which exceed its A server can remember the settings that it advertised, or store an
current configuration during the initial flight. In this case, the integrity-protected copy of the values in the ticket and recover the
client MUST apply the new settings immediately upon receipt. information when accepting 0-RTT data. A server uses the HTTP/QUIC
settings values in determining whether to accept 0-RTT data.
A server MAY accept 0-RTT and subsequently provide different settings
in its SETTINGS frame. If 0-RTT data is accepted by the server, its
SETTINGS frame MUST NOT reduce any limits or alter any values that
might be violated by the client with its 0-RTT data.
When a 1-RTT QUIC connection is being used, the client MUST NOT send When a 1-RTT QUIC connection is being used, the client MUST NOT send
requests prior to receiving and processing the server's SETTINGS requests prior to receiving and processing the server's SETTINGS
frame. frame.
4.2.7. PUSH_PROMISE 4.2.7. 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. set from server to client, as in HTTP/2.
skipping to change at page 22, line 18 skipping to change at page 23, line 23
| 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 29
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 45
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 HTTP_INCOMPLETE_REQUEST (0x06): The client's stream terminated
frame and cannot continue. without containing a fully-formed request.
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.
skipping to change at page 27, line 47 skipping to change at page 28, line 50
HTTP_WRONG_STREAM_COUNT (0x0E): A unidirectional stream type was HTTP_WRONG_STREAM_COUNT (0x0E): A unidirectional stream type was
used more times than is permitted by that type. used more times than is permitted by that type.
HTTP_CLOSED_CRITICAL_STREAM (0x0F): A stream required by the HTTP_CLOSED_CRITICAL_STREAM (0x0F): A stream required by the
connection was closed or reset. connection was closed or reset.
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_EARLY_RESPONSE (0x0011): The remainder of the client's request
is not needed to produce a response. For use in STOP_SENDING
only.
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 14
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 36
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 24
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 14
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_INCOMPLETE_REQUEST | 0x000 | Stream | Section 6.1 |
| HTTP_HPACK_DECOMPRESSION_ | 0x000 | HPACK cannot | Section 6.1 | | | 6 | terminated | |
| FAILED | 6 | continue | | | | | early | |
| | | | | | | | | |
| HTTP_CONNECT_ERROR | 0x000 | TCP reset or | Section 6.1 | | HTTP_CONNECT_ERROR | 0x000 | TCP reset or | Section 6.1 |
| | 7 | error on | | | | 7 | error on | |
| | | CONNECT | | | | | CONNECT | |
| | | request | | | | | request | |
| | | | | | | | | |
| HTTP_EXCESSIVE_LOAD | 0x000 | Peer | Section 6.1 | | HTTP_EXCESSIVE_LOAD | 0x000 | Peer | Section 6.1 |
| | 8 | generating | | | | 8 | generating | |
| | | excessive | | | | | excessive | |
| | | load | | | | | load | |
| | | | | | | | | |
| HTTP_VERSION_FALLBACK | 0x000 | Retry over | Section 6.1 | | HTTP_VERSION_FALLBACK | 0x000 | Retry over | Section 6.1 |
| | 9 | HTTP/2 | | | | 9 | HTTP/2 | |
| | | | | | | | | |
| HTTP_WRONG_STREAM | 0x000 | A frame was | Section 6.1 | | HTTP_WRONG_STREAM | 0x000 | A frame was | Section 6.1 |
| | A | sent on the | | | | A | sent on the | |
| | | wrong stream | | | | | wrong stream | |
| | | | | | | | | |
| HTTP_PUSH_LIMIT_EXCEEDED | 0x000 | Maximum Push | Section 6.1 | | HTTP_PUSH_LIMIT_EXCEEDE | 0x000 | Maximum Push | Section 6.1 |
| | B | ID exceeded | | | D | B | ID exceeded | |
| | | | | | | | | |
| HTTP_DUPLICATE_PUSH | 0x000 | Push ID was | Section 6.1 | | HTTP_DUPLICATE_PUSH | 0x000 | Push ID was | Section 6.1 |
| | C | fulfilled | | | | C | fulfilled | |
| | | multiple | | | | | multiple | |
| | | times | | | | | times | |
| | | | | | | | | |
| HTTP_UNKNOWN_STREAM_TYPE | 0x000 | Unknown unid | Section 6.1 | | HTTP_UNKNOWN_STREAM_TYP | 0x000 | Unknown unidi | Section 6.1 |
| | D | irectional | | | E | D | rectional | |
| | | stream type | | | | | stream type | |
| | | | | | | | | |
| HTTP_WRONG_STREAM_COUNT | 0x000 | Too many uni | Section 6.1 | | HTTP_WRONG_STREAM_COUNT | 0x000 | Too many unid | Section 6.1 |
| | E | directional | | | | E | irectional | |
| | | streams | | | | | streams | |
| | | | | | | | | |
| HTTP_CLOSED_CRITICAL_STRE | 0x000 | Critical | Section 6.1 | | HTTP_CLOSED_CRITICAL_ST | 0x000 | Critical | Section 6.1 |
| AM | F | stream was | | | REAM | F | stream was | |
| | | closed | | | | | closed | |
| | | | | | | | | |
| HTTP_WRONG_STREAM_DIRECTI | 0x001 | Unidirection | Section 6.1 | | HTTP_WRONG_STREAM_DIREC | 0x001 | Unidirectiona | Section 6.1 |
| ON | 0 | al stream in | | | TION | 0 | l stream in | |
| | | wrong | | | | | wrong | |
| | | direction | | | | | direction | |
| | | | | | | | | |
| HTTP_MALFORMED_FRAME | 0x01X | Error in | Section 6.1 | | HTTP_EARLY_RESPONSE | 0x001 | Remainder of | Section 6.1 |
| | X | frame | | | | 1 | request not | |
| | | formatting | | | | | needed | |
| | | 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 32
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), June 2018. qpack-02 (work in progress), August 2018.
[QUIC-TRANSPORT] [QUIC-TRANSPORT]
Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
Multiplexed and Secure Transport", draft-ietf-quic- Multiplexed and Secure Transport", draft-ietf-quic-
transport-12 (work in progress), June 2018. transport-13 (work in progress), August 2018.
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7, [RFC0793] Postel, J., "Transmission Control Protocol", STD 7,
RFC 793, DOI 10.17487/RFC0793, September 1981, RFC 793, DOI 10.17487/RFC0793, September 1981,
<https://www.rfc-editor.org/info/rfc793>. <https://www.rfc-editor.org/info/rfc793>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
skipping to change at page 39, line 43 skipping to change at page 42, line 9
<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-13
o Reserved some frame types for grease (#1333, #1446)
o Unknown unidirectional stream types are tolerated, not errors;
some reserved for grease (#1490, #1525)
o Require settings to be remembered for 0-RTT, prohibit reductions
(#1541, #1641)
o Specify behavior for truncated requests (#1596, #1643)
A.2. 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)
o Removed flags from HTTP/QUIC frames (#1388, #1398) o Removed flags from HTTP/QUIC frames (#1388, #1398)
o Reserved frame types and settings for use in preserving o Reserved frame types and settings for use in preserving
extensibility (#1333, #1446) extensibility (#1333, #1446)
o Added general error code (#1391, #1397) o Added general error code (#1391, #1397)
o Unidirectional streams carry a type byte and are extensible o Unidirectional streams carry a type byte and are extensible
(#910,#1359) (#910,#1359)
o Priority mechanism now uses explicit placeholders to enable o Priority mechanism now uses explicit placeholders to enable
persistent structure in the tree (#441,#1421,#1422) persistent structure in the tree (#441,#1421,#1422)
A.2. Since draft-ietf-quic-http-11 A.3. Since draft-ietf-quic-http-11
o Moved QPACK table updates and acknowledgments to dedicated streams o Moved QPACK table updates and acknowledgments to dedicated streams
(#1121, #1122, #1238) (#1121, #1122, #1238)
A.3. Since draft-ietf-quic-http-10 A.4. Since draft-ietf-quic-http-10
o Settings need to be remembered when attempting and accepting 0-RTT o Settings need to be remembered when attempting and accepting 0-RTT
(#1157, #1207) (#1157, #1207)
A.4. Since draft-ietf-quic-http-09 A.5. Since draft-ietf-quic-http-09
o Selected QCRAM for header compression (#228, #1117) o Selected QCRAM for header compression (#228, #1117)
o The server_name TLS extension is now mandatory (#296, #495) o The server_name TLS extension is now mandatory (#296, #495)
o Specified handling of unsupported versions in Alt-Svc (#1093, o Specified handling of unsupported versions in Alt-Svc (#1093,
#1097) #1097)
A.5. Since draft-ietf-quic-http-08 A.6. Since draft-ietf-quic-http-08
o Clarified connection coalescing rules (#940, #1024) o Clarified connection coalescing rules (#940, #1024)
A.6. Since draft-ietf-quic-http-07 A.7. Since draft-ietf-quic-http-07
o Changes for integer encodings in QUIC (#595,#905) o Changes for integer encodings in QUIC (#595,#905)
o Use unidirectional streams as appropriate (#515, #240, #281, #886) o Use unidirectional streams as appropriate (#515, #240, #281, #886)
o Improvement to the description of GOAWAY (#604, #898) o Improvement to the description of GOAWAY (#604, #898)
o Improve description of server push usage (#947, #950, #957) o Improve description of server push usage (#947, #950, #957)
A.7. Since draft-ietf-quic-http-06 A.8. Since draft-ietf-quic-http-06
o Track changes in QUIC error code usage (#485) o Track changes in QUIC error code usage (#485)
A.8. Since draft-ietf-quic-http-05 A.9. Since draft-ietf-quic-http-05
o Made push ID sequential, add MAX_PUSH_ID, remove o Made push ID sequential, add MAX_PUSH_ID, remove
SETTINGS_ENABLE_PUSH (#709) SETTINGS_ENABLE_PUSH (#709)
o Guidance about keep-alive and QUIC PINGs (#729) o Guidance about keep-alive and QUIC PINGs (#729)
o Expanded text on GOAWAY and cancellation (#757) o Expanded text on GOAWAY and cancellation (#757)
A.9. Since draft-ietf-quic-http-04 A.10. Since draft-ietf-quic-http-04
o Cite RFC 5234 (#404) o Cite RFC 5234 (#404)
o Return to a single stream per request (#245,#557) o Return to a single stream per request (#245,#557)
o Use separate frame type and settings registries from HTTP/2 (#81) o Use separate frame type and settings registries from HTTP/2 (#81)
o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477)
o Restored GOAWAY (#696) o Restored GOAWAY (#696)
skipping to change at page 42, line 4 skipping to change at page 44, line 29
o Cite RFC 5234 (#404) o Cite RFC 5234 (#404)
o Return to a single stream per request (#245,#557) o Return to a single stream per request (#245,#557)
o Use separate frame type and settings registries from HTTP/2 (#81) o Use separate frame type and settings registries from HTTP/2 (#81)
o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477)
o Restored GOAWAY (#696) o Restored GOAWAY (#696)
o Identify server push using Push ID rather than a stream ID o Identify server push using Push ID rather than a stream ID
(#702,#281) (#702,#281)
o DATA frames cannot be empty (#700) o DATA frames cannot be empty (#700)
A.10. Since draft-ietf-quic-http-03 A.11. Since draft-ietf-quic-http-03
None. None.
A.11. Since draft-ietf-quic-http-02 A.12. Since draft-ietf-quic-http-02
o Track changes in transport draft o Track changes in transport draft
A.12. Since draft-ietf-quic-http-01 A.13. Since draft-ietf-quic-http-01
o SETTINGS changes (#181): o SETTINGS changes (#181):
* SETTINGS can be sent only once at the start of a connection; no * SETTINGS can be sent only once at the start of a connection; no
changes thereafter changes thereafter
* SETTINGS_ACK removed * SETTINGS_ACK removed
* Settings can only occur in the SETTINGS frame a single time * Settings can only occur in the SETTINGS frame a single time
* Boolean format updated * Boolean format updated
o Alt-Svc parameter changed from "v" to "quic"; format updated o Alt-Svc parameter changed from "v" to "quic"; format updated
(#229) (#229)
o Closing the connection control stream or any message control o Closing the connection control stream or any message control
stream is a fatal error (#176) stream is a fatal error (#176)
o HPACK Sequence counter can wrap (#173) o HPACK Sequence counter can wrap (#173)
skipping to change at page 42, line 43 skipping to change at page 45, line 19
o Closing the connection control stream or any message control o Closing the connection control stream or any message control
stream is a fatal error (#176) stream is a fatal error (#176)
o HPACK Sequence counter can wrap (#173) o HPACK Sequence counter can wrap (#173)
o 0-RTT guidance added o 0-RTT guidance added
o Guide to differences from HTTP/2 and porting HTTP/2 extensions o Guide to differences from HTTP/2 and porting HTTP/2 extensions
added (#127,#242) added (#127,#242)
A.13. Since draft-ietf-quic-http-00 A.14. 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)
A.14. Since draft-shade-quic-http2-mapping-00 A.15. 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
Acknowledgements Acknowledgements
The original authors of this specification were Robbie Shade and Mike The original authors of this specification were Robbie Shade and Mike
Warres. Warres.
 End of changes. 82 change blocks. 
268 lines changed or deleted 392 lines changed or added

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