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