draft-ietf-quic-http-10.txt   draft-ietf-quic-http-11.txt 
QUIC M. Bishop, Ed. QUIC M. Bishop, Ed.
Internet-Draft Akamai Internet-Draft Akamai
Intended status: Standards Track March 05, 2018 Intended status: Standards Track April 17, 2018
Expires: September 6, 2018 Expires: October 19, 2018
Hypertext Transfer Protocol (HTTP) over QUIC Hypertext Transfer Protocol (HTTP) over QUIC
draft-ietf-quic-http-10 draft-ietf-quic-http-11
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 September 6, 2018. This Internet-Draft will expire on October 19, 2018.
Copyright Notice Copyright Notice
Copyright (c) 2018 IETF Trust and the persons identified as the Copyright (c) 2018 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 42 skipping to change at page 2, line 42
3.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 8 3.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 8
3.2.1. Header Compression . . . . . . . . . . . . . . . . . 9 3.2.1. Header Compression . . . . . . . . . . . . . . . . . 9
3.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 3.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9
3.2.3. Request Cancellation . . . . . . . . . . . . . . . . 10 3.2.3. Request Cancellation . . . . . . . . . . . . . . . . 10
3.3. Request Prioritization . . . . . . . . . . . . . . . . . 11 3.3. Request Prioritization . . . . . . . . . . . . . . . . . 11
3.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 11 3.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 11
4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 12 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 12
4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 12 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 12
4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 13 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 13
4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 13 4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 14
4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 14 4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 14
4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 16 4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 16
4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 16 4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 17
4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 19 4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 19
4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 20 4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 20
4.2.8. HEADER_ACK . . . . . . . . . . . . . . . . . . . . . 22 4.2.8. HEADER_ACK . . . . . . . . . . . . . . . . . . . . . 22
4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 23 4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 23
5. Connection Management . . . . . . . . . . . . . . . . . . . . 24 5. Connection Management . . . . . . . . . . . . . . . . . . . . 24
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24
6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 24 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 25
7. Considerations for Transitioning from HTTP/2 . . . . . . . . 25 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 26
7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 25 7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 26
7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 26 7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 26
7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 28 7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 28
7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 28 7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 29
8. Security Considerations . . . . . . . . . . . . . . . . . . . 30 8. Security Considerations . . . . . . . . . . . . . . . . . . . 30
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30
9.1. Registration of HTTP/QUIC Identification String . . . . . 30 9.1. Registration of HTTP/QUIC Identification String . . . . . 30
9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 30 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 31
9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 30 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 31
9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 31 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 32
9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 32 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 33
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 34 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.1. Normative References . . . . . . . . . . . . . . . . . . 34 10.1. Normative References . . . . . . . . . . . . . . . . . . 35
10.2. Informative References . . . . . . . . . . . . . . . . . 35 10.2. Informative References . . . . . . . . . . . . . . . . . 36
10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 36 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 36 Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 36
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 36 Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 37
B.1. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 36 B.1. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 37
B.2. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 36 B.2. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 37
B.3. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 36 B.3. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 37
B.4. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 37 B.4. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 37
B.5. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 37 B.5. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 37
B.6. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 37 B.6. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 37
B.7. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 37 B.7. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 38
B.8. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 37 B.8. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 38
B.9. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 37 B.9. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 38
B.10. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 38 B.10. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 38
B.11. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 38 B.11. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 39
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 38 B.12. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 39
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 39
1. Introduction 1. Introduction
The QUIC transport protocol has several features that are desirable The QUIC transport protocol has several features that are desirable
in a transport for HTTP, such as stream multiplexing, per-stream flow in a transport for HTTP, such as stream multiplexing, per-stream flow
control, and low-latency connection establishment. This document control, and low-latency connection establishment. This document
describes a mapping of HTTP semantics over QUIC, drawing heavily on describes a mapping of HTTP semantics over QUIC, drawing heavily on
the existing TCP mapping, HTTP/2. Specifically, this document the existing TCP mapping, HTTP/2. Specifically, this document
identifies HTTP/2 features that are subsumed by QUIC, and describes identifies HTTP/2 features that are subsumed by QUIC, and describes
how the other features can be implemented atop QUIC. how the other features can be implemented atop QUIC.
skipping to change at page 4, line 39 skipping to change at page 4, line 39
An HTTP origin advertises the availability of an equivalent HTTP/QUIC An HTTP origin advertises the availability of an equivalent HTTP/QUIC
endpoint via the Alt-Svc HTTP response header or the HTTP/2 ALTSVC endpoint via the Alt-Svc HTTP response header or the HTTP/2 ALTSVC
frame ([RFC7838]), using the ALPN token defined in Section 2.2. frame ([RFC7838]), using the ALPN token defined in Section 2.2.
For example, an origin could indicate in an HTTP/1.1 or HTTP/2 For example, an origin could indicate in an HTTP/1.1 or HTTP/2
response that HTTP/QUIC was available on UDP port 50781 at the same response that HTTP/QUIC was available on UDP port 50781 at the same
hostname by including the following header in any response: hostname by including the following header in any response:
Alt-Svc: hq=":50781" Alt-Svc: hq=":50781"
On receipt of an Alt-Svc header indicating HTTP/QUIC support, a On receipt of an Alt-Svc record indicating HTTP/QUIC support, a
client MAY attempt to establish a QUIC connection to the indicated client MAY attempt to establish a QUIC connection to the indicated
host and port and, if successful, send HTTP requests using the host and port and, if successful, send HTTP requests using the
mapping described in this document. mapping described in this document.
Connectivity problems (e.g. firewall blocking UDP) can result in QUIC Connectivity problems (e.g. firewall blocking UDP) can result in QUIC
connection establishment failure, in which case the client SHOULD connection establishment failure, in which case the client SHOULD
continue using the existing connection or try another alternative continue using the existing connection or try another alternative
endpoint offered by the origin. endpoint offered by the origin.
Servers MAY serve HTTP/QUIC on any UDP port. Servers MUST use the Servers MAY serve HTTP/QUIC on any UDP port, since an alternative
same port across all IP addresses that serve a single domain, and always includes an explicit port.
SHOULD NOT change this port.
2.1.1. QUIC Version Hints 2.1.1. QUIC Version Hints
This document defines the "quic" parameter for Alt-Svc, which MAY be This document defines the "quic" parameter for Alt-Svc, which MAY be
used to provide version-negotiation hints to HTTP/QUIC clients. QUIC used to provide version-negotiation hints to HTTP/QUIC clients. QUIC
versions are four-octet sequences with no additional constraints on versions are four-octet sequences with no additional constraints on
format. Leading zeros SHOULD be omitted for brevity. format. Leading zeros SHOULD be omitted for brevity.
Syntax: Syntax:
skipping to change at page 9, line 24 skipping to change at page 9, line 24
without error by triggering a QUIC STOP_SENDING with error code without error by triggering a QUIC STOP_SENDING with error code
HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing
its streams. Clients MUST NOT discard complete responses as a result its streams. Clients MUST NOT discard complete responses as a result
of having their request terminated abruptly, though clients can of having their request terminated abruptly, though clients can
always discard responses at their discretion for other reasons. always discard responses at their discretion for other reasons.
Servers MUST NOT abort a response in progress as a result of Servers MUST NOT abort a response in progress as a result of
receiving a solicited RST_STREAM. receiving a solicited RST_STREAM.
3.2.1. Header Compression 3.2.1. Header Compression
HTTP/QUIC uses QCRAM header compression as described in [QCRAM], 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.2.2. The CONNECT Method 3.2.2. The CONNECT Method
The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily
used with HTTP proxies to establish a TLS session with an origin used with HTTP proxies to establish a TLS session with an origin
server for the purposes of interacting with "https" resources. In server for the purposes of interacting with "https" resources. In
HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a
skipping to change at page 11, line 26 skipping to change at page 11, line 26
The PRIORITY frame Section 4.2.3 identifies a request either by The PRIORITY frame Section 4.2.3 identifies a request either by
identifying the stream that carries a request or by using a Push ID identifying the stream that carries a request or by using a Push ID
(Section 4.2.6). (Section 4.2.6).
Only a client can send PRIORITY frames. A server MUST NOT send a Only a client can send PRIORITY frames. A server MUST NOT send a
PRIORITY frame. PRIORITY frame.
3.4. Server Push 3.4. Server Push
HTTP/QUIC supports server push as described in [RFC7540]. During HTTP/QUIC supports server push in a similar manner to [RFC7540], but
connection establishment, the client enables server push by sending a uses different mechanisms. During connection establishment, the
MAX_PUSH_ID frame (see Section 4.2.9). A server cannot use server client enables server push by sending a MAX_PUSH_ID frame (see
push until it receives a MAX_PUSH_ID frame. Section 4.2.9). A server cannot use server push until it receives a
MAX_PUSH_ID frame.
As with server push for HTTP/2, the server initiates a server push by As with server push for HTTP/2, the server initiates a server push by
sending a PUSH_PROMISE frame that includes request header fields sending a PUSH_PROMISE frame (see Section 4.2.6) that includes
attributed to the request. The PUSH_PROMISE frame is sent on the request headers for the promised request. Promised requests MUST
client-initiated, bidirectional stream that carried the request that conform to the requirements in Section 8.2 of [RFC7540].
generated the push. This allows the server push to be associated
with a request. Ordering of a PUSH_PROMISE in relation to certain The PUSH_PROMISE frame is sent on the client-initiated, bidirectional
parts of the response is important (see Section 8.2.1 of [RFC7540]). stream that carried the request that generated the push. This allows
the server push to be associated 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]).
Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it
contains a Push ID. The Push ID uniquely identifies a server push contains a Push ID. The Push ID uniquely identifies a server push.
(see Section 4.2.6). This allows a server to fulfill promises in the This allows a server to fulfill promises in the order that best suits
order that best suits its needs. its needs.
When a server later fulfills a promise, the server push response is When a server later fulfills a promise, the server push response is
conveyed on a push stream. A push stream is a server-initiated, conveyed on a push stream. A push stream is a server-initiated,
unidirectional stream. A push stream always begins with a header unidirectional stream. A push stream identifies the Push ID of the
(see Figure 1) that identifies the Push ID of the promise that it promise that it fulfills, encoded as a variable-length integer.
fulfills, encoded as a variable-length integer.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 1: Push Stream Header
A server SHOULD use Push IDs sequentially, starting at 0. A client A server SHOULD use Push IDs sequentially, starting at 0. A client
uses the MAX_PUSH_ID frame (Section 4.2.9) to limit the number of uses the MAX_PUSH_ID frame (Section 4.2.9) to limit the number of
pushes that a server can promise. A client MUST treat receipt of a pushes that a server can promise. A client MUST treat receipt of a
push stream with a Push ID that is greater than the maximum Push ID push stream with a Push ID that is greater than the maximum Push ID
as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED. as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED.
Each Push ID MUST only be used once in a push stream header. If a
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.6).
After the push stream header, a push contains a response
(Section 3.2), with response headers, a response body (if any)
carried by DATA frames, then trailers (if any) carried by HEADERS
frames.
If a promised server push is not needed by the client, the client 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.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 1: Push Stream Header
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.6).
After the header, a push stream contains a response (Section 3.2),
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 each stream. This section describes HTTP framing Frames are used on each stream. This section describes HTTP framing
in QUIC and highlights some differences from HTTP/2 framing. For in QUIC and highlights some differences from HTTP/2 framing. For
more detail on differences from HTTP/2, see Section 7.2. more detail on differences from HTTP/2, see Section 7.2.
4.1. Frame Layout 4.1. Frame Layout
All frames have the following format: All frames have the following format:
skipping to change at page 13, line 42 skipping to change at page 13, line 42
DATA frames (type=0x0) convey arbitrary, variable-length sequences of DATA frames (type=0x0) convey arbitrary, variable-length sequences of
octets associated with an HTTP request or response payload. octets associated with an HTTP request or response payload.
The DATA frame defines no flags. The DATA frame defines no flags.
DATA frames MUST be associated with an HTTP request or response. If DATA frames MUST be associated with an HTTP request or response. If
a DATA frame is received on either control stream, the recipient MUST a DATA frame is received on either control stream, the recipient MUST
respond with a connection error (Section 6) of type respond with a connection error (Section 6) of type
HTTP_WRONG_STREAM. HTTP_WRONG_STREAM.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload (*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 3: DATA frame payload
DATA frames MUST contain a non-zero-length payload. If a DATA frame DATA frames MUST contain a non-zero-length payload. If a DATA frame
is received with a payload length of zero, the recipient MUST respond is received with a payload length of zero, the recipient MUST respond
with a stream error (Section 6) of type HTTP_MALFORMED_FRAME. with a stream error (Section 6) of type HTTP_MALFORMED_FRAME.
4.2.2. HEADERS 4.2.2. HEADERS
The HEADERS frame (type=0x1) is used to carry a header block, The HEADERS frame (type=0x1) is used to carry a header block,
compressed using HPACK Section 3.2.1. compressed using QPACK. See [QPACK] for more details.
The HEADERS frame defines a single flag: The HEADERS frame defines a single flag:
BLOCKING (0x01): Indicates the stream might need to wait for BLOCKING (0x01): Indicates the stream might need to wait for
dependent headers before processing. If 0, the frame can be dependent headers before processing. If 0, the frame can be
processed immediately upon receipt. processed immediately upon receipt.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Header Block (*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4: HEADERS frame payload
HEADERS frames can be sent on the Control Stream as well as on HEADERS frames can be sent on the Control Stream as well as on
request / push streams. The value of BLOCKING MUST be 0 for HEADERS request / push streams. The value of BLOCKING MUST be 0 for HEADERS
frames on the Control Stream, since they can only depend on previous frames on the Control Stream, since they can only depend on previous
HEADERS on the same stream. HEADERS on the same stream.
4.2.3. PRIORITY 4.2.3. PRIORITY
The PRIORITY (type=0x02) frame specifies the sender-advised priority The PRIORITY (type=0x02) frame specifies the sender-advised priority
of a stream and is substantially different in format from [RFC7540]. of a stream and is substantially different in format from [RFC7540].
In order to ensure that prioritization is processed in a consistent In order to ensure that prioritization is processed in a consistent
skipping to change at page 14, line 48 skipping to change at page 15, line 15
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prioritized Request ID (i) | | Prioritized Request ID (i) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream Dependency ID (i) | | Stream Dependency ID (i) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Weight (8) | | Weight (8) |
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
Figure 3: PRIORITY frame payload Figure 5: PRIORITY frame payload
The PRIORITY frame payload has the following fields: The PRIORITY frame payload has the following fields:
Prioritized Request ID: A variable-length integer that identifies a Prioritized Request ID: A variable-length integer that identifies a
request. This contains the Stream ID of a request stream when the request. This contains the Stream ID of a request stream when the
PUSH_PRIORITIZED flag is clear, or a Push ID when the PUSH_PRIORITIZED flag is clear, or a Push ID when the
PUSH_PRIORITIZED flag is set. PUSH_PRIORITIZED flag is set.
Stream Dependency ID: A variable-length integer that identifies a Stream Dependency ID: A variable-length integer that identifies a
dependent request. This contains the Stream ID of a request dependent request. This contains the Stream ID of a request
skipping to change at page 16, line 31 skipping to change at page 16, line 46
has been created, sending CANCEL_PUSH has no effect on the state of has been created, sending CANCEL_PUSH has no effect on the state of
the push stream. A QUIC RST_STREAM frame SHOULD be used instead to the push stream. A QUIC RST_STREAM frame SHOULD be used instead to
cancel transmission of the server push response. cancel transmission of the server push response.
A CANCEL_PUSH frame is sent on the control stream. Sending a A CANCEL_PUSH frame is sent on the control stream. Sending a
CANCEL_PUSH frame on a stream other than the control stream MUST be CANCEL_PUSH frame on a stream other than the control stream MUST be
treated as a stream error of type HTTP_WRONG_STREAM. treated as a stream error of type HTTP_WRONG_STREAM.
The CANCEL_PUSH frame has no defined flags. The CANCEL_PUSH frame has no defined flags.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 6: CANCEL_PUSH frame payload
The CANCEL_PUSH frame carries a Push ID encoded as a variable-length The CANCEL_PUSH frame carries a Push ID encoded as a variable-length
integer. The Push ID identifies the server push that is being integer. The Push ID identifies the server push that is being
cancelled (see Section 4.2.6). cancelled (see Section 4.2.6).
If the client receives a CANCEL_PUSH frame, that frame might identify If the client receives a CANCEL_PUSH frame, that frame might identify
a Push ID that has not yet been mentioned by a PUSH_PROMISE frame. a Push ID that has not yet been mentioned by a PUSH_PROMISE frame.
An endpoint MUST treat a CANCEL_PUSH frame which does not contain An endpoint MUST treat a CANCEL_PUSH frame which does not contain
exactly one properly-formatted variable-length integer as a exactly one properly-formatted variable-length integer as a
connection error of type HTTP_MALFORMED_FRAME. connection error of type HTTP_MALFORMED_FRAME.
skipping to change at page 17, line 31 skipping to change at page 18, line 13
length-prefixed binary value. length-prefixed binary value.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier (16) | Length (i) ... | Identifier (16) | Length (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Contents (?) ... | Contents (?) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4: SETTINGS value format Figure 7: SETTINGS value format
A zero-length content indicates that the setting value is a Boolean A zero-length content indicates that the setting value is a Boolean
and true. False is indicated by the absence of the setting. and true. False is indicated by the absence of the setting.
Non-zero-length values MUST be compared against the remaining length Non-zero-length values MUST be compared against the remaining length
of the SETTINGS frame. Any value which purports to cross the end of of the SETTINGS frame. Any value which purports to cross the end of
the frame MUST cause the SETTINGS frame to be considered malformed the frame MUST cause the SETTINGS frame to be considered malformed
and trigger a connection error of type HTTP_MALFORMED_FRAME. and trigger a connection error of type HTTP_MALFORMED_FRAME.
An implementation MUST ignore the contents for any SETTINGS An implementation MUST ignore the contents for any SETTINGS
skipping to change at page 18, line 24 skipping to change at page 19, line 5
4.2.5.2. Defined SETTINGS Parameters 4.2.5.2. Defined SETTINGS Parameters
The following settings are defined in HTTP/QUIC: The following settings are defined in HTTP/QUIC:
SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of
2^30 - 1. 2^30 - 1.
SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value
of 2^30 - 1 of 2^30 - 1
4.2.5.3. Usage in 0-RTT 4.2.5.3. 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 SHOULD cache at least the following settings about frame. Clients MUST store the settings the server provided in the
servers: session being resumed and MUST comply with stored settings until the
server's current settings are received.
o SETTINGS_HEADER_TABLE_SIZE
o SETTINGS_MAX_HEADER_LIST_SIZE
Clients MUST comply with cached settings until the server's current
settings are received. If a client does not have cached values, it
SHOULD assume the following values:
o SETTINGS_HEADER_TABLE_SIZE: 0 octets
o SETTINGS_MAX_HEADER_LIST_SIZE: 16,384 octets
Servers MAY continue processing data from clients which exceed its Servers MAY continue processing data from clients which exceed its
current configuration during the initial flight. In this case, the current configuration during the initial flight. In this case, the
client MUST apply the new settings immediately upon receipt. client MUST apply the new settings immediately upon receipt.
If the connection is closed because these or other constraints were When a 1-RTT QUIC connection is being used, the client MUST NOT send
violated during the 0-RTT flight (e.g. with requests prior to receiving and processing the server's SETTINGS
HTTP_HPACK_DECOMPRESSION_FAILED), clients MAY establish a new frame.
connection and retry any 0-RTT requests using the settings sent by
the server on the closed connection. (This assumes that only
requests that are safe to retry are sent in 0-RTT.) If the
connection was closed before the SETTINGS frame was received, clients
SHOULD discard any cached values and use the defaults above on the
next connection.
4.2.6. PUSH_PROMISE 4.2.6. PUSH_PROMISE
The PUSH_PROMISE frame (type=0x05) is used to carry a request header The PUSH_PROMISE frame (type=0x05) is used to carry a request header
set from server to client, as in HTTP/2. The PUSH_PROMISE frame set from server to client, as in HTTP/2. The PUSH_PROMISE frame
defines a single flag: defines a single flag:
BLOCKING (0x01): Indicates the stream might need to wait for BLOCKING (0x01): Indicates the stream might need to wait for
dependent headers before processing. If 0, the frame can be dependent headers before processing. If 0, the frame can be
processed immediately upon receipt. processed immediately upon receipt.
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (i) ... | Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Header Block (*) ... | Header Block (*) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 5: PUSH_PROMISE frame payload Figure 8: PUSH_PROMISE frame payload
The payload consists of: The payload consists of:
Push ID: A variable-length integer that identifies the server push Push ID: A variable-length integer that identifies the server push
request. A push ID is used in push stream header (Section 3.4), request. A push ID is used in push stream header (Section 3.4),
CANCEL_PUSH frames (Section 4.2.4), and PRIORITY frames CANCEL_PUSH frames (Section 4.2.4), and PRIORITY frames
(Section 4.2.3). (Section 4.2.3).
Header Block: QCRAM-compressed request headers for the promised Header Block: QPACK-compressed request headers for the promised
response. See [QCRAM] 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
HTTP_MALFORMED_FRAME. HTTP_MALFORMED_FRAME.
A server MAY use the same Push ID in multiple PUSH_PROMISE frames. A server MAY use the same Push ID in multiple PUSH_PROMISE frames.
This allows the server to use the same server push in response to This allows the server to use the same server push in response to
multiple concurrent requests. Referencing the same server push multiple concurrent requests. Referencing the same server push
skipping to change at page 20, line 26 skipping to change at page 20, line 38
PUSH_PROMISE. PUSH_PROMISE.
4.2.7. GOAWAY 4.2.7. GOAWAY
The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of
a connection by a server. GOAWAY allows a server to stop accepting a connection by a server. GOAWAY allows a server to stop accepting
new requests while still finishing processing of previously received new requests while still finishing processing of previously received
requests. This enables administrative actions, like server requests. This enables administrative actions, like server
maintenance. GOAWAY by itself does not close a connection. maintenance. GOAWAY by itself does not close a connection.
The GOAWAY frame does not define any flags, and the payload is a QUIC The GOAWAY frame does not define any flags.
Stream ID for a client-initiated, bidirectional stream encoded as a
variable-length integer. A client MUST treat receipt of a GOAWAY 0 1 2 3
frame containing a Stream ID of any other type as a connection error 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
of type HTTP_MALFORMED_FRAME. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 9: GOAWAY frame payload
The GOAWAY frame carries a QUIC Stream ID for a client-initiated,
bidirectional stream encoded as a variable-length integer. A client
MUST treat receipt of a GOAWAY frame containing a Stream ID of any
other type as a connection error of type HTTP_MALFORMED_FRAME.
Clients do not need to send GOAWAY to initiate a graceful shutdown; Clients do not need to send GOAWAY to initiate a graceful shutdown;
they simply stop making new requests. A server MUST treat receipt of they simply stop making new requests. A server MUST treat receipt of
a GOAWAY frame as a connection error (Section 6) of type a GOAWAY frame as a connection error (Section 6) of type
HTTP_UNEXPECTED_GOAWAY. HTTP_UNEXPECTED_GOAWAY.
The GOAWAY frame applies to the connection, not a specific stream. The GOAWAY frame applies to the connection, not a specific stream.
An endpoint MUST treat a GOAWAY frame on a stream other than the An endpoint MUST treat a GOAWAY frame on a stream other than the
control stream as a connection error (Section 6) of type control stream as a connection error (Section 6) of type
HTTP_WRONG_STREAM. HTTP_WRONG_STREAM.
skipping to change at page 22, line 25 skipping to change at page 22, line 45
have been completed or cancelled, and all promised server push have been completed or cancelled, and all promised server push
responses associated with those requests have been completed or responses associated with those requests have been completed or
cancelled, the connection can be closed using an Immediate Close (see cancelled, the connection can be closed using an Immediate Close (see
[QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown [QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown
SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR
code. code.
4.2.8. HEADER_ACK 4.2.8. HEADER_ACK
The HEADER_ACK frame (type=0x8) is used by header compression to The HEADER_ACK frame (type=0x8) is used by header compression to
ensure consistency. The frames are sent from the QCRAM decoder to ensure consistency. The frames are sent from the QPACK decoder to
the QCRAM encoder; that is, the server sends them to the client to the QPACK encoder; that is, the server sends them to the client to
acknowledge processing of the client's header blocks, and the client acknowledge processing of the client's header blocks, and the client
sends them to the server to acknowledge processing of the server's sends them to the server to acknowledge processing of the server's
header blocks. header blocks.
The HEADER_ACK frame is sent on the Control Stream when the QCRAM The HEADER_ACK frame is sent on the Control Stream when the QPACK
decoder has fully processed a header block. It is used by the peer's decoder has fully processed a header block. It is used by the peer's
QCRAM encoder to determine whether subsequent indexed representations QPACK encoder to determine whether subsequent indexed representations
that might reference that block are vulnerable to head-of-line that might reference that block are vulnerable to head-of-line
blocking, and to prevent eviction races. See [QCRAM] for more blocking, and to prevent eviction races. See [QPACK] for more
details on the use of this information. details on the use of this information.
The HEADER_ACK frame indicates the stream on which the header block The HEADER_ACK frame indicates the stream on which the header block
was processed by encoding the Stream ID as a variable-length integer. was processed by encoding the Stream ID as a variable-length integer.
The same Stream ID can be identified multiple times, as multiple The same Stream ID can be identified multiple times, as multiple
header-containing blocks can be sent on a single stream in the case header-containing blocks can be sent on a single stream in the case
of intermediate responses, trailers, pushed requests, etc. as well as of intermediate responses, trailers, pushed requests, etc. as well as
on the Control Streams. Since header frames on each stream are on the Control Streams. Since header frames on each stream are
received and processed in order, this gives the encoder precise received and processed in order, this gives the encoder precise
feedback on which header blocks within a stream have been fully feedback on which header blocks within a stream have been fully
skipping to change at page 23, line 39 skipping to change at page 24, line 7
HTTP_MALFORMED_FRAME. HTTP_MALFORMED_FRAME.
The maximum Push ID is unset when a connection is created, meaning The maximum Push ID is unset when a connection is created, meaning
that a server cannot push until it receives a MAX_PUSH_ID frame. A that a server cannot push until it receives a MAX_PUSH_ID frame. A
client that wishes to manage the number of promised server pushes can client that wishes to manage the number of promised server pushes can
increase the maximum Push ID by sending a MAX_PUSH_ID frame as the increase the maximum Push ID by sending a MAX_PUSH_ID frame as the
server fulfills or cancels server pushes. server fulfills or cancels server pushes.
The MAX_PUSH_ID frame has no defined flags. The MAX_PUSH_ID frame has no defined flags.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Push ID (i) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 10: MAX_PUSH_ID frame payload
The MAX_PUSH_ID frame carries a single variable-length integer that The MAX_PUSH_ID frame carries a single variable-length integer that
identifies the maximum value for a Push ID that the server can use identifies the maximum value for a Push ID that the server can use
(see Section 4.2.6). A MAX_PUSH_ID frame cannot reduce the maximum (see Section 4.2.6). A MAX_PUSH_ID frame cannot reduce the maximum
Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than
previously received MUST be treated as a connection error of type previously received MUST be treated as a connection error of type
HTTP_MALFORMED_FRAME. HTTP_MALFORMED_FRAME.
A server MUST treat a MAX_PUSH_ID frame payload that does not contain A server MUST treat a MAX_PUSH_ID frame payload that does not contain
a single variable-length integer as a connection error of type a single variable-length integer as a connection error of type
HTTP_MALFORMED_FRAME. HTTP_MALFORMED_FRAME.
skipping to change at page 26, line 48 skipping to change at page 27, line 23
priority assignments in PRIORITY frames and (optionally) in HEADERS priority assignments in PRIORITY frames and (optionally) in HEADERS
frames. To achieve in-order delivery of priority changes in HTTP/ frames. To achieve in-order delivery of priority changes in HTTP/
QUIC, PRIORITY frames are sent on the control stream and the PRIORITY QUIC, PRIORITY frames are sent on the control stream and the PRIORITY
section is removed from the HEADERS frame. section is removed from the HEADERS frame.
Likewise, HPACK was designed with the assumption of in-order Likewise, HPACK was designed with the assumption of in-order
delivery. A sequence of encoded header blocks must arrive (and be delivery. A sequence of encoded header blocks must arrive (and be
decoded) at an endpoint in the same order in which they were encoded. decoded) at an endpoint in the same order in which they were encoded.
This ensures that the dynamic state at the two endpoints remains in This ensures that the dynamic state at the two endpoints remains in
sync. As a result, HTTP/QUIC uses a modified version of HPACK, sync. As a result, HTTP/QUIC uses a modified version of HPACK,
described in [QCRAM]. described in [QPACK].
Frame type definitions in HTTP/QUIC often use the QUIC variable- Frame type definitions in HTTP/QUIC often use the QUIC variable-
length integer encoding. In particular, Stream IDs use this length integer encoding. In particular, Stream IDs use this
encoding, which allow for a larger range of possible values than the encoding, which allow for a larger range of possible values than the
encoding used in HTTP/2. Some frames in HTTP/QUIC use an identifier encoding used in HTTP/2. Some frames in HTTP/QUIC use an identifier
rather than a Stream ID (e.g. Push IDs in PRIORITY frames). rather than a Stream ID (e.g. Push IDs in PRIORITY frames).
Redefinition of the encoding of extension frame types might be Redefinition of the encoding of extension frame types might be
necessary if the encoding includes a Stream ID. necessary if the encoding includes a Stream ID.
Other than this issue, frame type HTTP/2 extensions are typically Other than this issue, frame type HTTP/2 extensions are typically
skipping to change at page 31, line 20 skipping to change at page 32, line 5
Code: The 8-bit code assigned to the frame type. Code: The 8-bit code assigned to the frame type.
Specification: A reference to a specification that includes a Specification: A reference to a specification that includes a
description of the frame layout, its semantics, and flags that the description of the frame layout, its semantics, and flags that the
frame type uses, including any parts of the frame that are frame type uses, including any parts of the frame that are
conditionally present based on the value of flags. conditionally present based on the value of flags.
The entries in the following table are registered by this document. The entries in the following table are registered by this document.
+--------------+------+---------------------+ +--------------+------+---------------+
| Frame Type | Code | Specification | | Frame Type | Code | Specification |
+--------------+------+---------------------+ +--------------+------+---------------+
| DATA | 0x0 | Section 4.2.1 | | DATA | 0x0 | Section 4.2.1 |
| | | | | | | |
| HEADERS | 0x1 | Section 4.2.2 | | HEADERS | 0x1 | Section 4.2.2 |
| | | | | | | |
| PRIORITY | 0x2 | Section 4.2.3 | | PRIORITY | 0x2 | Section 4.2.3 |
| | | | | | | |
| CANCEL_PUSH | 0x3 | Section 4.2.4 | | CANCEL_PUSH | 0x3 | Section 4.2.4 |
| | | | | | | |
| SETTINGS | 0x4 | Section 4.2.5 | | SETTINGS | 0x4 | Section 4.2.5 |
| | | | | | | |
| PUSH_PROMISE | 0x5 | Section 4.2.6 | | PUSH_PROMISE | 0x5 | Section 4.2.6 |
| | | | | | | |
| Reserved | 0x6 | N/A | | Reserved | 0x6 | N/A |
| | | | | | | |
| GOAWAY | 0x7 | Section 4.2.7 | | GOAWAY | 0x7 | Section 4.2.7 |
| | | | | | | |
| HEADER_ACK | 0x8 | {{frame-header-ack} | | HEADER_ACK | 0x8 | Section 4.2.8 |
| | | | | | | |
| Reserved | 0x9 | N/A | | Reserved | 0x9 | N/A |
| | | | | | | |
| MAX_PUSH_ID | 0xD | Section 4.2.9 | | MAX_PUSH_ID | 0xD | Section 4.2.9 |
+--------------+------+---------------------+ +--------------+------+---------------+
9.4. Settings Parameters 9.4. Settings Parameters
This document establishes a registry for HTTP/QUIC settings. The This document establishes a registry for HTTP/QUIC settings. The
"HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC
Settings" registry operates under the "Expert Review" policy Settings" registry operates under the "Expert Review" policy
[RFC8126] for values in the range from 0x0000 to 0xefff, with values [RFC8126] for values in the range from 0x0000 to 0xefff, with values
between and 0xf000 and 0xffff being reserved for Experimental Use. between and 0xf000 and 0xffff being reserved for Experimental Use.
The designated experts are the same as those for the "HTTP/2 The designated experts are the same as those for the "HTTP/2
Settings" registry defined in [RFC7540]. Settings" registry defined in [RFC7540].
skipping to change at page 34, line 43 skipping to change at page 35, line 25
| HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 6.1 | | HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 6.1 |
| | | frame | | | | | frame | |
| | | formatting | | | | | formatting | |
| | | or use | | | | | or use | |
+----------------------------+--------+------------+----------------+ +----------------------------+--------+------------+----------------+
10. References 10. References
10.1. Normative References 10.1. Normative References
[QCRAM] Krasic, C., Bishop, M., and A. Frindell, Ed., "Header [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK:
Compression for HTTP over QUIC", draft-ietf-quic-qcram-00 Header Compression for HTTP over QUIC", draft-ietf-quic-
(work in progress), March 2018. qpack-00 (work in progress), April 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-10 (work in progress), March 2018. transport-11 (work in progress), April 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 36, line 31 skipping to change at page 37, line 13
Warres. Warres.
A substantial portion of Mike's contribution was supported by A substantial portion of Mike's contribution was supported by
Microsoft during his employment there. Microsoft during his employment there.
Appendix B. Change Log Appendix B. Change Log
*RFC Editor's Note:* Please remove this section prior to *RFC Editor's Note:* Please remove this section prior to
publication of a final version of this document. publication of a final version of this document.
B.1. Since draft-ietf-quic-http-09 B.1. Since draft-ietf-quic-http-10
o Settings need to be remembered when attempting and accepting 0-RTT
(#1157, #1207)
B.2. 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)
B.2. Since draft-ietf-quic-http-08 B.3. Since draft-ietf-quic-http-08
o Clarified connection coalescing rules (#940, #1024) o Clarified connection coalescing rules (#940, #1024)
B.3. Since draft-ietf-quic-http-07 B.4. Since draft-ietf-quic-http-07
o Changes for integer encodings in QUIC (#595,#905) o Changes for integer encodings in QUIC (#595,#905)
o Use unidirectional streams as appropriate (#515, #240, #281, #886) o Use unidirectional streams as appropriate (#515, #240, #281, #886)
o Improvement to the description of GOAWAY (#604, #898) o Improvement to the description of GOAWAY (#604, #898)
o Improve description of server push usage (#947, #950, #957) o Improve description of server push usage (#947, #950, #957)
B.4. Since draft-ietf-quic-http-06 B.5. Since draft-ietf-quic-http-06
o Track changes in QUIC error code usage (#485) o Track changes in QUIC error code usage (#485)
B.5. Since draft-ietf-quic-http-05 B.6. Since draft-ietf-quic-http-05
o Made push ID sequential, add MAX_PUSH_ID, remove o Made push ID sequential, add MAX_PUSH_ID, remove
SETTINGS_ENABLE_PUSH (#709) SETTINGS_ENABLE_PUSH (#709)
o Guidance about keep-alive and QUIC PINGs (#729) o Guidance about keep-alive and QUIC PINGs (#729)
o Expanded text on GOAWAY and cancellation (#757) o Expanded text on GOAWAY and cancellation (#757)
B.6. Since draft-ietf-quic-http-04 B.7. Since draft-ietf-quic-http-04
o Cite RFC 5234 (#404) o Cite RFC 5234 (#404)
o Return to a single stream per request (#245,#557) o Return to a single stream per request (#245,#557)
o Use separate frame type and settings registries from HTTP/2 (#81) o Use separate frame type and settings registries from HTTP/2 (#81)
o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477)
o Restored GOAWAY (#696) o Restored GOAWAY (#696)
o Identify server push using Push ID rather than a stream ID o Identify server push using Push ID rather than a stream ID
(#702,#281) (#702,#281)
o DATA frames cannot be empty (#700) o DATA frames cannot be empty (#700)
B.7. Since draft-ietf-quic-http-03 B.8. Since draft-ietf-quic-http-03
None. None.
B.8. Since draft-ietf-quic-http-02 B.9. Since draft-ietf-quic-http-02
o Track changes in transport draft o Track changes in transport draft
B.9. Since draft-ietf-quic-http-01 B.10. 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 38, line 15 skipping to change at page 39, line 4
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)
o 0-RTT guidance added o 0-RTT guidance added
o Guide to differences from HTTP/2 and porting HTTP/2 extensions o Guide to differences from HTTP/2 and porting HTTP/2 extensions
added (#127,#242) added (#127,#242)
B.10. Since draft-ietf-quic-http-00 B.11. Since draft-ietf-quic-http-00
o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29)
o Changed from using HTTP/2 framing within Stream 3 to new framing o Changed from using HTTP/2 framing within Stream 3 to new framing
format and two-stream-per-request model (#71,#72,#73) format and two-stream-per-request model (#71,#72,#73)
o Adopted SETTINGS format from draft-bishop-httpbis-extended- o Adopted SETTINGS format from draft-bishop-httpbis-extended-
settings-01 settings-01
o Reworked SETTINGS_ACK to account for indeterminate inter-stream o Reworked SETTINGS_ACK to account for indeterminate inter-stream
order (#75) order (#75)
o Described CONNECT pseudo-method (#95) o Described CONNECT pseudo-method (#95)
o Updated ALPN token and Alt-Svc guidance (#13,#87) o Updated ALPN token and Alt-Svc guidance (#13,#87)
o Application-layer-defined error codes (#19,#74) o Application-layer-defined error codes (#19,#74)
B.11. Since draft-shade-quic-http2-mapping-00 B.12. Since draft-shade-quic-http2-mapping-00
o Adopted as base for draft-ietf-quic-http o Adopted as base for draft-ietf-quic-http
o Updated authors/editors list o Updated authors/editors list
Author's Address Author's Address
Mike Bishop (editor) Mike Bishop (editor)
Akamai Akamai
 End of changes. 53 change blocks. 
152 lines changed or deleted 184 lines changed or added

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