| draft-ietf-quic-http-05.txt | draft-ietf-quic-http-06.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Microsoft | Internet-Draft Microsoft | |||
| Intended status: Standards Track August 15, 2017 | Intended status: Standards Track September 22, 2017 | |||
| Expires: February 16, 2018 | Expires: March 26, 2018 | |||
| Hypertext Transfer Protocol (HTTP) over QUIC | Hypertext Transfer Protocol (HTTP) over QUIC | |||
| draft-ietf-quic-http-05 | draft-ietf-quic-http-06 | |||
| 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. | |||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org), which is archived at | |||
| https://mailarchive.ietf.org/arch/search/?email_list=quic. | https://mailarchive.ietf.org/arch/search/?email_list=quic . | |||
| Working Group information can be found at https://github.com/quicwg; | Working Group information can be found at https://github.com/quicwg ; | |||
| source code and issues list for this draft can be found at | source code and issues list for this draft can be found at | |||
| https://github.com/quicwg/base-drafts/labels/http. | https://github.com/quicwg/base-drafts/labels/http . | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| 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 February 16, 2018. | This Internet-Draft will expire on March 26, 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 40 ¶ | skipping to change at page 2, line 40 ¶ | |||
| 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. Request Prioritization . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . 11 | 5.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 11 | 5.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 11 | 5.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 11 | 5.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 5.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 13 | 5.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 5.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 14 | 5.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 16 | 5.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 17 | 5.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 19 | 5.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 6.1. HTTP-Defined QUIC Error Codes . . . . . . . . . . . . . . 19 | 6. Connection Management . . . . . . . . . . . . . . . . . . . . 20 | |||
| 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 21 | 7. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 7.1. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 21 | 7.1. HTTP-Defined QUIC Error Codes . . . . . . . . . . . . . . 21 | |||
| 7.2. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 23 | 8. Considerations for Transitioning from HTTP/2 . . . . . . . . 22 | |||
| 7.3. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 24 | 8.1. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 23 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 25 | 8.2. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 24 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 25 | 8.3. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 25 | |||
| 9.1. Registration of HTTP/QUIC Identification String . . . . . 25 | ||||
| 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 25 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 26 | |||
| 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 25 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 26 | 10.1. Registration of HTTP/QUIC Identification String . . . . 26 | |||
| 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 27 | 10.2. Registration of QUIC Version Hint Alt-Svc Parameter . . 27 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 10.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 30 | 10.4. Settings Parameters . . . . . . . . . . . . . . . . . . 28 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 31 | 10.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 31 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 31 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 31 | |||
| B.1. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 31 | 11.2. Informative References . . . . . . . . . . . . . . . . . 32 | |||
| B.2. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 31 | Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 32 | |||
| B.3. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 31 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 33 | |||
| B.4. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 32 | B.1. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 33 | |||
| B.5. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 32 | B.2. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 33 | |||
| B.6. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 33 | B.3. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 33 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 33 | B.4. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 33 | |||
| B.5. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 33 | ||||
| B.6. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 34 | ||||
| B.7. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 34 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 34 | ||||
| 1. Introduction | 1. Introduction | |||
| The QUIC transport protocol has several features that are desirable | The QUIC transport protocol has several features that are desirable | |||
| in a transport for HTTP, such as stream multiplexing, per-stream flow | in a transport for HTTP, such as stream multiplexing, per-stream flow | |||
| control, and low-latency connection establishment. This document | control, and low-latency connection establishment. This document | |||
| describes a mapping of HTTP semantics over QUIC, drawing heavily on | describes a mapping of HTTP semantics over QUIC, drawing heavily on | |||
| the existing TCP mapping, HTTP/2. Specifically, this document | the existing TCP mapping, HTTP/2. Specifically, this document | |||
| identifies HTTP/2 features that are subsumed by QUIC, and describes | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| how the other features can be implemented atop QUIC. | how the other features can be implemented atop QUIC. | |||
| skipping to change at page 6, line 21 ¶ | skipping to change at page 6, line 21 ¶ | |||
| 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 | |||
| single stream: This means that the client's first request occurs on | single stream: This means that the client's first request occurs on | |||
| QUIC stream 3, the second on stream 5, and so on. The server's first | QUIC stream 3, the second on stream 5, and so on. The server's first | |||
| push consumes stream 2. | push consumes stream 2. | |||
| This stream carries frames related to the request/response (see | This stream carries frames related to the request/response (see | |||
| Section 5.2). When a stream terminates cleanly, if the last frame on | Section 5.2). When a stream terminates cleanly, if the last frame on | |||
| the stream was truncated, this MUST be treated as a connection error | the stream was truncated, this MUST be treated as a connection error | |||
| (see HTTP_MALFORMED_* in Section 6.1). Streams which terminate | (see HTTP_MALFORMED_* in Section 7.1). Streams which terminate | |||
| abruptly may be reset at any point in the frame. | abruptly may be reset at any point in the frame. | |||
| Streams SHOULD be used sequentially, with no gaps. Streams used for | Streams SHOULD be used sequentially, with no gaps. Streams used for | |||
| pushed resources MAY be initiated out-of-order, but stream IDs SHOULD | pushed resources MAY be initiated out-of-order, but stream IDs SHOULD | |||
| be allocated to promised resources sequentially. | be allocated to promised resources sequentially. | |||
| 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 stream is closed in the appropriate direction. | corresponding QUIC stream is closed in the appropriate direction. | |||
| skipping to change at page 7, line 13 ¶ | skipping to change at page 7, line 13 ¶ | |||
| of DATA frames (see Section 5.2.1), | of DATA frames (see Section 5.2.1), | |||
| 3. optionally, one header block containing the trailer-part, if | 3. optionally, one header block containing the 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 containing | above, a response may contain zero or more header blocks containing | |||
| the message headers of informational (1xx) HTTP responses (see | the message headers of informational (1xx) HTTP responses (see | |||
| [RFC7230], Section 3.2 and [RFC7231], Section 6.2). | [RFC7230], Section 3.2 and [RFC7231], Section 6.2). | |||
| PUSH_PROMISE frames MAY be interleaved with the frames of a response | ||||
| message indicating a pushed resource related to the response. These | ||||
| PUSH_PROMISE frames are not part of the response, but carry the | ||||
| headers of a separate HTTP request message. See Section 4.4 for more | ||||
| details. | ||||
| The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | |||
| MUST NOT be used. | MUST NOT be used. | |||
| Trailing header fields are carried in an additional header block | Trailing header fields are carried in an additional header block | |||
| following the body. Such a header block is a sequence of HEADERS | following the body. Such a header block is a sequence of HEADERS | |||
| frames with End Header Block set on the last frame. Senders MUST | frames with End Header Block set on the last frame. Senders MUST | |||
| send only one header block in the trailers section; receivers MUST | send only one header block in the trailers section; receivers MUST | |||
| discard any subsequent header blocks. | discard any subsequent header blocks. | |||
| An HTTP request/response exchange fully consumes a QUIC stream. | An HTTP request/response exchange fully consumes a QUIC stream. | |||
| skipping to change at page 8, line 45 ¶ | skipping to change at page 8, line 51 ¶ | |||
| half-closes the request 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 stream. TCP | the FIN bit set, it will half-close the corresponding stream. TCP | |||
| connections which remain half-closed in a single direction are not | connections which remain half-closed in a single direction are not | |||
| invalid, but are often handled poorly by servers, so clients SHOULD | invalid, but are often handled poorly by servers, so clients SHOULD | |||
| NOT half-close connections on which they are still expecting data. | NOT half-close connections on which they are still expecting 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 7.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. Request Prioritization | 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 request can be | Section 5.3. In this priority scheme, a given request can be | |||
| designated as dependent upon another request, which expresses the | designated as dependent upon another request, which expresses the | |||
| preference that the latter stream (the "parent" request) be allocated | preference that the latter stream (the "parent" request) be allocated | |||
| resources before the former stream (the "dependent" request). Taken | resources before the former stream (the "dependent" request). Taken | |||
| skipping to change at page 9, line 30 ¶ | skipping to change at page 9, line 32 ¶ | |||
| request or by using a Push ID (Section 5.2.6). Other than the means | request or by using a Push ID (Section 5.2.6). Other than the means | |||
| of identifying requests, the prioritization system is identical to | of identifying requests, the prioritization system is identical to | |||
| that in HTTP/2. | that in HTTP/2. | |||
| Only a client can send PRIORITY frames. A server MUST NOT send a | Only a client can send PRIORITY frames. A server MUST NOT send a | |||
| PRIORITY frame. | PRIORITY frame. | |||
| 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 enables server push by sending a | |||
| to receive server pushes via the SETTINGS_ENABLE_PUSH setting in the | MAX_PUSH_ID frame (see Section 5.2.8). A server cannot use server | |||
| SETTINGS frame (see Section 3), which is disabled by default. | push until it receives a MAX_PUSH_ID frame. | |||
| As with server push for HTTP/2, the server initiates a server push by | As with server push for HTTP/2, the server initiates a server push by | |||
| sending a PUSH_PROMISE frame that includes request header fields | sending a PUSH_PROMISE frame that includes request header fields | |||
| attributed to the request. The PUSH_PROMISE frame is sent on a | attributed to the request. The PUSH_PROMISE frame is sent on a | |||
| response stream. Unlike HTTP/2, the PUSH_PROMISE does not reference | response stream. Unlike HTTP/2, the PUSH_PROMISE does not reference | |||
| a stream; when a server fulfills a promise, the stream that carries | a stream; when a server fulfills a promise, the stream that carries | |||
| the stream headers references the PUSH_PROMISE. This allows a server | the stream headers references the PUSH_PROMISE. This allows a server | |||
| to fulfill promises in the order that best suits its needs. | to fulfill promises in the order that best suits its needs. | |||
| The server push response is conveyed on a push stream. A push stream | The server push response is conveyed on a push stream. A push stream | |||
| skipping to change at page 10, line 13 ¶ | skipping to change at page 10, line 13 ¶ | |||
| (see Section 5.2.6). | (see Section 5.2.6). | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (32) | | | Push ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 1: Push Stream Header | Figure 1: Push Stream Header | |||
| A push stream always starts with a 32-bit Push ID. A client MUST | ||||
| treat receiving a push stream that contains fewer than 4 octets as a | ||||
| connection error of type HTTP_MALFORMED_PUSH. | ||||
| A server SHOULD use Push IDs sequentially, starting at 0. A client | ||||
| uses the MAX_PUSH_ID frame (Section 5.2.8) to limit the number of | ||||
| pushes that a server can promise. A client MUST treat receipt of a | ||||
| push stream with a Push ID that is greater than the maximum Push ID | ||||
| as a connection error of type HTTP_MALFORMED_PUSH. | ||||
| Each Push ID MUST only be used once in a push stream header. If a | Each Push ID MUST only be used once in a push stream header. If a | |||
| push stream header includes a Push ID that was used in another push | push stream header includes a Push ID that was used in another push | |||
| stream header, the client MUST treat this as a connection error of | 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 | type HTTP_MALFORMED_PUSH. The same Push ID can be used in multiple | |||
| PUSH_PROMISE frames (see Section 5.2.6). | PUSH_PROMISE frames (see Section 5.2.6). | |||
| After the push stream header, a push contains a response | After the push stream header, a push contains a response | |||
| (Section 4.2), with response headers, a response body (if any) | (Section 4.2), with response headers, a response body (if any) | |||
| carried by DATA frames, then trailers (if any) carried by HEADERS | carried by DATA frames, then trailers (if any) carried by HEADERS | |||
| frames. | frames. | |||
| If a promised server push is not needed by the client, the client | If a promised server push is not needed by the client, the client | |||
| SHOULD send a CANCEL_PUSH frame; if the push stream is already open, | SHOULD send a CANCEL_PUSH frame; if the push stream is already open, | |||
| a QUIC STOP_SENDING frame with an appropriate error code can be used | a QUIC STOP_SENDING frame with an appropriate error code can be used | |||
| instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | |||
| Section 6). This asks the server not to transfer the data and | Section 7). This asks the server not to transfer the data and | |||
| indicates that it will be discarded upon receipt. | indicates that it will be discarded upon receipt. | |||
| 5. HTTP Framing Layer | 5. HTTP Framing Layer | |||
| Frames are used on each stream. This section describes HTTP framing | Frames are used on each stream. This section describes HTTP framing | |||
| in QUIC and highlights some differences from HTTP/2 framing. For | in QUIC and highlights some differences from HTTP/2 framing. For | |||
| more detail on differences from HTTP/2, see Section 7.1. | more detail on differences from HTTP/2, see Section 8.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) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 11, line 16 ¶ | skipping to change at page 11, line 26 ¶ | |||
| 5.2.1. DATA | 5.2.1. DATA | |||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
| octets associated with an HTTP request or response payload. | octets associated with an HTTP request or response payload. | |||
| The DATA frame defines no flags. | The DATA frame defines no flags. | |||
| DATA frames MUST be associated with an HTTP request or response. If | DATA frames MUST be associated with an HTTP request or response. If | |||
| a DATA frame is received on the control stream, the recipient MUST | a DATA frame is received on the control stream, the recipient MUST | |||
| respond with a connection error (Section 6) of type | respond with a connection error (Section 7) of type | |||
| HTTP_WRONG_STREAM. | HTTP_WRONG_STREAM. | |||
| DATA frames MUST contain a non-zero-length payload. If a DATA frame | DATA frames MUST contain a non-zero-length payload. If a DATA frame | |||
| is received with a payload length of zero, the recipient MUST respond | is received with a payload length of zero, the recipient MUST respond | |||
| with a stream error (Section 6) of type HTTP_MALFORMED_DATA. | with a stream error (Section 7) of type HTTP_MALFORMED_DATA. | |||
| 5.2.2. HEADERS | 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 Section 4.2.1. | 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. | |||
| skipping to change at page 15, line 37 ¶ | skipping to change at page 15, line 47 ¶ | |||
| A SETTINGS frame MUST be sent as the first frame of the control | A SETTINGS frame MUST be sent as the first frame of the 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_WRONG_STREAM. If an endpoint | a connection error of type HTTP_WRONG_STREAM. If an endpoint | |||
| receives a second SETTINGS frame, the endpoint MUST respond with a | receives a second SETTINGS frame, the endpoint MUST respond 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 6) of type HTTP_MALFORMED_SETTINGS. | (Section 7) of type HTTP_MALFORMED_SETTINGS. | |||
| 5.2.5.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.5.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. This value MUST be zero. | 2^32 - 1. This value MUST be zero. | |||
| SETTINGS_ENABLE_PUSH (0x2): Transmitted as a Boolean | ||||
| 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.5.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: | |||
| skipping to change at page 17, line 24 ¶ | skipping to change at page 17, line 32 ¶ | |||
| The payload consists of: | The payload consists of: | |||
| Push ID: A 32-bit identifier for the server push request. A push ID | Push ID: A 32-bit identifier for the server push request. A push ID | |||
| is used in push stream header (Section 4.4), CANCEL_PUSH frames | is used in push stream header (Section 4.4), CANCEL_PUSH frames | |||
| (Section 5.2.4), and PRIORITY frames (Section 5.2.3). | (Section 5.2.4), and PRIORITY frames (Section 5.2.3). | |||
| Header Block: HPACK-compressed request headers for the promised | Header Block: HPACK-compressed request headers for the promised | |||
| response. | response. | |||
| A server MUST NOT use a Push ID that is larger than the client has | ||||
| provided in a MAX_PUSH_ID frame (Section 5.2.8). A client MUST treat | ||||
| receipt of a PUSH_PROMISE that contains a larger Push ID than the | ||||
| client has advertised as a connection error of type | ||||
| HTTP_MALFORMED_PUSH_PROMISE. | ||||
| A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | |||
| This allows the server to use the same server push in response to | This allows the server to use the same server push in response to | |||
| multiple concurrent requests. Referencing the same server push | multiple concurrent requests. Referencing the same server push | |||
| ensures that a PUSH_PROMISE can be made in relation to every response | ensures that a PUSH_PROMISE can be made in relation to every response | |||
| in which server push might be needed without duplicating pushes. | in which server push might be needed without duplicating pushes. | |||
| A server that uses the same Push ID in multiple PUSH_PROMISE frames | 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 | MUST include the same header fields each time. The octets of the | |||
| header block MAY be different due to differing encoding, but the | header block MAY be different due to differing encoding, but the | |||
| header fields and their values MUST be identical. Note that ordering | header fields and their values MUST be identical. Note that ordering | |||
| skipping to change at page 18, line 10 ¶ | skipping to change at page 18, line 26 ¶ | |||
| a connection by a server. GOAWAY allows a server to stop accepting | a connection by a server. GOAWAY allows a server to stop accepting | |||
| new requests while still finishing processing of previously received | new requests while still finishing processing of previously received | |||
| requests. This enables administrative actions, like server | requests. This enables administrative actions, like server | |||
| maintenance. GOAWAY by itself does not close a connection. (Note | maintenance. GOAWAY by itself does not close a connection. (Note | |||
| that clients do not need to send GOAWAY to gracefully close a | that clients do not need to send GOAWAY to gracefully close a | |||
| connection; they simply stop making new requests.) | connection; they simply stop making new requests.) | |||
| The GOAWAY frame does not define any flags, and the payload is a QUIC | 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 | stream identifier. The GOAWAY frame applies to the connection, not a | |||
| specific stream. An endpoint MUST treat a GOAWAY frame on a stream | specific stream. An endpoint MUST treat a GOAWAY frame on a stream | |||
| other than the control stream as a connection error (Section 6) of | other than the control stream as a connection error (Section 7) of | |||
| type HTTP_WRONG_STREAM. | type HTTP_WRONG_STREAM. | |||
| New client requests might already have been sent before the client | New client requests might already have been sent before the client | |||
| receives the server's GOAWAY frame. The GOAWAY frame contains the | receives the server's GOAWAY frame. The GOAWAY frame contains the | |||
| stream identifier of the last client-initiated request that was or | stream identifier of the last client-initiated request that was or | |||
| might be processed in this connection, which enables client and | might be processed in this connection, which enables client and | |||
| server to agree on which requests were accepted prior to the | server to agree on which requests were accepted prior to the | |||
| connection shutdown. This identifier MAY be lower than the stream | 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 | limit identified by a QUIC MAX_STREAM_ID frame, and MAY be zero if no | |||
| requests were processed. Servers SHOULD NOT increase the | requests were processed. Servers SHOULD NOT increase the | |||
| skipping to change at page 18, line 39 ¶ | skipping to change at page 19, line 6 ¶ | |||
| MUST NOT send new requests on the connection after receiving GOAWAY, | MUST NOT send new requests on the connection after receiving GOAWAY, | |||
| although requests might already be in transit. A new connection can | although requests might already be in transit. A new connection can | |||
| be established for new requests. | be established for new requests. | |||
| If the client has sent requests on streams with a higher stream | If the client has sent requests on streams with a higher stream | |||
| identifier than indicated in the GOAWAY frame, those requests were | identifier than indicated in the GOAWAY frame, those requests were | |||
| not and will not be processed. Endpoints SHOULD reset any streams | not and will not be processed. Endpoints SHOULD reset any streams | |||
| above this ID with the error code HTTP_REQUEST_CANCELLED. Servers | above this ID with the error code HTTP_REQUEST_CANCELLED. Servers | |||
| MAY also reset streams below the indicated ID with | MAY also reset streams below the indicated ID with | |||
| HTTP_REQUEST_CANCELLED if the associated requests were not processed. | HTTP_REQUEST_CANCELLED if the associated requests were not processed. | |||
| Servers MUST NOT use the HTTP_REQUEST_CANCELLED status for requests | ||||
| which were partially or fully processed. | ||||
| The client can treat requests cancelled by the server as though they | 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 | had never been sent at all, thereby allowing them to be retried later | |||
| on a new connection. Automatically retrying other requests is not | on a new connection. If a stream is cancelled after receiving a | |||
| possible, unless this is otherwise permitted (e.g. idempotent actions | complete response, the client MAY ignore the cancellation and use the | |||
| like GET, PUT, or DELETE). Requests on stream IDs less than or equal | response. However, if a stream is cancelled after receiving a | |||
| to the stream ID in the GOAWAY frame might have been processed; their | partial response, the response SHOULD NOT be used. Automatically | |||
| status cannot be known until they are completed successfully, reset, | retrying such requests is not possible, unless this is otherwise | |||
| or the connection terminates. | 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 individually, or the | ||||
| connection terminates. | ||||
| Servers SHOULD send a GOAWAY frame when the closing of a connection | Servers SHOULD send a GOAWAY frame when the closing of a connection | |||
| is known in advance, even if the advance notice is small, so that the | is known in advance, even if the advance notice is small, so that the | |||
| remote peer can know whether a stream has been partially processed or | remote peer can know whether a stream has been partially processed or | |||
| not. For example, if an HTTP client sends a POST at the same time | not. For example, if an HTTP client sends a POST at the same time | |||
| that a server closes a QUIC connection, the client cannot know if the | that a server closes a QUIC connection, the client cannot know if the | |||
| server started to process that POST request if the server does not | server started to process that POST request if the server does not | |||
| send a GOAWAY frame to indicate what streams it might have acted on. | send a GOAWAY frame to indicate what streams it might have acted on. | |||
| For unexpected closures caused by error conditions, a QUIC | For unexpected closures caused by error conditions, a QUIC | |||
| skipping to change at page 19, line 37 ¶ | skipping to change at page 20, line 10 ¶ | |||
| attempting to gracefully shut down a connection SHOULD send an | attempting to gracefully shut down a connection SHOULD send an | |||
| initial GOAWAY frame with the last stream identifier set to the | initial GOAWAY frame with the last stream identifier set to the | |||
| current value of QUIC's MAX_STREAM_ID and SHOULD NOT increase 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 | MAX_STREAM_ID thereafter. This signals to the client that a shutdown | |||
| is imminent and that initiating further requests is prohibited. | is imminent and that initiating further requests is prohibited. | |||
| After allowing time for any in-flight requests (at least one round- | After allowing time for any in-flight requests (at least one round- | |||
| trip time), the server MAY send another GOAWAY frame with an updated | trip time), the server MAY send another GOAWAY frame with an updated | |||
| last stream identifier. This ensures that a connection can be | last stream identifier. This ensures that a connection can be | |||
| cleanly shut down without losing requests. | cleanly shut down without losing requests. | |||
| 6. Error Handling | 5.2.8. MAX_PUSH_ID | |||
| The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | ||||
| number of server pushes that the server can initiate. This sets the | ||||
| maximum value for a Push ID that the server can use in a PUSH_PROMISE | ||||
| frame. Consequently, this also limits the number of push streams | ||||
| that the server can initiate in addition to the limit set by the QUIC | ||||
| MAX_STREAM_ID frame. | ||||
| The MAX_PUSH_ID frame is always sent on the control stream. Receipt | ||||
| of a MAX_PUSH_ID frame on any other stream MUST be treated as a | ||||
| connection error of type HTTP_WRONG_STREAM. | ||||
| A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the | ||||
| receipt of a MAX_PUSH_ID frame as a connection error of type | ||||
| HTTP_MALFORMED_MAX_PUSH_ID. | ||||
| The maximum Push ID is unset when a connection is created, meaning | ||||
| that a server cannot push until it receives a MAX_PUSH_ID frame. A | ||||
| client that wishes to manage the number of promised server pushes can | ||||
| increase the maximum Push ID by sending a MAX_PUSH_ID frame as the | ||||
| server fulfills or cancels server pushes. | ||||
| The MAX_PUSH_ID frame has no defined flags. | ||||
| The MAX_PUSH_ID frame carries a 32-bit Push ID that identifies the | ||||
| maximum value for a Push ID that the server can use (see | ||||
| Section 5.2.6). A MAX_PUSH_ID frame cannot reduce the maximum Push | ||||
| ID; receipt of a MAX_PUSH_ID that contains a smaller value than | ||||
| previously received MUST be treated as a connection error of type | ||||
| HTTP_MALFORMED_MAX_PUSH_ID. | ||||
| A server MUST treat a MAX_PUSH_ID frame payload that is other than 4 | ||||
| octets in length as a connection error of type | ||||
| HTTP_MALFORMED_MAX_PUSH_ID. | ||||
| 6. Connection Management | ||||
| QUIC connections are persistent. All of the considerations in | ||||
| Section 9.1 of [RFC7540] apply to the management of QUIC connections. | ||||
| HTTP clients are expected to use QUIC PING frames to keep connections | ||||
| open. Servers SHOULD NOT use PING frames to keep a connection open. | ||||
| A client SHOULD NOT use PING frames for this purpose unless there are | ||||
| responses outstanding for requests or server pushes. If the client | ||||
| is not expecting a response from the server, allowing an idle | ||||
| connection to time out (based on the idle_timeout transport | ||||
| parameter) is preferred over expending effort maintaining a | ||||
| connection that might not be needed. A gateway MAY use PING to | ||||
| maintain connections in anticipation of need rather than incur the | ||||
| latency cost of connection establishment to servers. | ||||
| 7. Error Handling | ||||
| QUIC allows the application to abruptly terminate (reset) individual | QUIC allows the application to abruptly terminate (reset) individual | |||
| streams or the entire connection when an error is encountered. These | streams or the entire connection when an error is encountered. These | |||
| are referred to as "stream errors" or "connection errors" and are | are referred to as "stream errors" or "connection errors" and are | |||
| described in more detail in [QUIC-TRANSPORT]. | described in more detail in [QUIC-TRANSPORT]. | |||
| This section describes HTTP-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 | 7.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 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. | |||
| skipping to change at page 21, line 5 ¶ | skipping to change at page 22, line 32 ¶ | |||
| 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_WRONG_STREAM (0x0F): A frame was received on stream where it is | HTTP_WRONG_STREAM (0x0F): A frame was received on stream where it is | |||
| not permitted. | 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_DUPLICATE_PUSH (0x11): Multiple push streams used the same Push | HTTP_MALFORMED_PUSH (0x11): A push stream header was malformed or | |||
| ID. | included an invalid Push ID. | |||
| 7. Considerations for Transitioning from HTTP/2 | HTTP_MALFORMED_MAX_PUSH_ID (0x12): A MAX_PUSH_ID frame has been | |||
| received with an invalid format. | ||||
| 8. Considerations for Transitioning from HTTP/2 | ||||
| HTTP/QUIC is strongly informed by HTTP/2, and bears many | HTTP/QUIC is strongly informed by HTTP/2, and bears many | |||
| similarities. This section describes the approach taken to design | similarities. This section describes the approach taken to design | |||
| HTTP/QUIC, points out important differences from HTTP/2, and | HTTP/QUIC, points out important differences from HTTP/2, and | |||
| describes how to map HTTP/2 extensions into HTTP/QUIC. | describes how to map HTTP/2 extensions into HTTP/QUIC. | |||
| HTTP/QUIC begins from the premise that HTTP/2 code reuse is a useful | HTTP/QUIC begins from the premise that HTTP/2 code reuse is a useful | |||
| feature, but not a hard requirement. HTTP/QUIC departs from HTTP/2 | feature, but not a hard requirement. HTTP/QUIC departs from HTTP/2 | |||
| primarily where necessary to accommodate the differences in behavior | primarily where necessary to accommodate the differences in behavior | |||
| between QUIC and TCP (lack of ordering, support for streams). We | between QUIC and TCP (lack of ordering, support for streams). We | |||
| intend to avoid gratuitous changes which make it difficult or | intend to avoid gratuitous changes which make it difficult or | |||
| impossible to build extensions with the same semantics applicable to | impossible to build extensions with the same semantics applicable to | |||
| both protocols at once. | both protocols at once. | |||
| These departures are noted in this section. | These departures are noted in this section. | |||
| 7.1. HTTP Frame Types | 8.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. | |||
| Frame payloads are largely drawn from [RFC7540]. However, QUIC | Frame payloads are largely drawn from [RFC7540]. However, QUIC | |||
| skipping to change at page 22, line 35 ¶ | skipping to change at page 24, line 17 ¶ | |||
| is not defined in HTTP/QUIC frames. See Section 5.2.2. | 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 control stream. See Section 5.2.3. | 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. The same code point is used | provides stream lifecycle management. The same code point is used | |||
| for the CANCEL_PUSH frame (Section 5.2.4). | 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.5 and Section 7.2. | the connection. See Section 5.2.5 and Section 8.2. | |||
| PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; | PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; | |||
| instead the push stream references the PUSH_PROMISE frame using a | instead the push stream references the PUSH_PROMISE frame using a | |||
| Push ID. See Section 5.2.6. | 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 is sent only from server to client and does not | GOAWAY (0x7): GOAWAY is sent only from server to client and does not | |||
| contain an error code. See Section 5.2.7. | contain an error code. See Section 5.2.7. | |||
| skipping to change at page 23, line 12 ¶ | skipping to change at page 24, line 39 ¶ | |||
| WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | |||
| provides flow control. | provides flow control. | |||
| CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | |||
| larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and | larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and | |||
| HEADERS frames can be used in series. | HEADERS frames can be used in series. | |||
| Frame types defined by extensions to HTTP/2 need to be separately | Frame types defined by extensions to HTTP/2 need to be separately | |||
| registered for HTTP/QUIC if still applicable. The IDs of frames | registered for HTTP/QUIC if still applicable. The IDs of frames | |||
| defined in [RFC7540] have been reserved for simplicity. See | defined in [RFC7540] have been reserved for simplicity. See | |||
| Section 9.3. | Section 10.3. | |||
| 7.2. HTTP/2 SETTINGS Parameters | 8.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.5.2. | SETTINGS_HEADER_TABLE_SIZE: See Section 5.2.5.2. | |||
| SETTINGS_ENABLE_PUSH: See Section 5.2.5.2. | SETTINGS_ENABLE_PUSH: This is removed in favor of the MAX_PUSH_ID | |||
| which provides a more granular control over server push. | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS: QUIC controls the largest open | SETTINGS_MAX_CONCURRENT_STREAMS: QUIC controls the largest open | |||
| stream ID as part of its flow control logic. Specifying | stream ID as part of its flow control logic. Specifying | |||
| SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error. | SETTINGS_MAX_CONCURRENT_STREAMS 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.5.2. | SETTINGS_MAX_HEADER_LIST_SIZE: See Section 5.2.5.2. | |||
| Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The | Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The | |||
| IDs of settings defined in [RFC7540] have been reserved for | IDs of settings defined in [RFC7540] have been reserved for | |||
| simplicity. See Section 9.4. | simplicity. See Section 10.4. | |||
| 7.3. HTTP/2 Error Codes | 8.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 7.1. | |||
| INTERNAL_ERROR (0x2): HTTP_INTERNAL_ERROR in Section 6.1. | INTERNAL_ERROR (0x2): HTTP_INTERNAL_ERROR in Section 7.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 | |||
| from the QUIC layer. | from the QUIC layer. | |||
| FRAME_SIZE_ERROR (0x6) No single mapping. See new error codes | FRAME_SIZE_ERROR (0x6) No single mapping. See new error codes | |||
| defined in Section 6.1. | defined in Section 7.1. | |||
| REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream | REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream | |||
| management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the | management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the | |||
| QUIC layer. | QUIC layer. | |||
| CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 6.1. | CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 7.1. | |||
| COMPRESSION_ERROR (0x9): HTTP_HPACK_DECOMPRESSION_FAILED in | COMPRESSION_ERROR (0x9): HTTP_HPACK_DECOMPRESSION_FAILED in | |||
| Section 6.1. | Section 7.1. | |||
| CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 6.1. | CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 7.1. | |||
| ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 6.1. | ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 7.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 7.1. | |||
| Error codes need to be defined for HTTP/2 and HTTP/QUIC separately. | Error codes need to be defined for HTTP/2 and HTTP/QUIC separately. | |||
| See Section 9.5. | See Section 10.5. | |||
| 8. Security Considerations | 9. Security Considerations | |||
| The security considerations of HTTP over QUIC should be comparable to | The security considerations of HTTP over QUIC should be comparable to | |||
| those of HTTP/2. | 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. | |||
| 9. IANA Considerations | 10. IANA Considerations | |||
| 9.1. Registration of HTTP/QUIC Identification String | 10.1. Registration of HTTP/QUIC Identification String | |||
| This document creates a new registration for the identification of | This document creates a new registration for the identification of | |||
| HTTP/QUIC in the "Application Layer Protocol Negotiation (ALPN) | HTTP/QUIC in the "Application Layer Protocol Negotiation (ALPN) | |||
| Protocol IDs" registry established in [RFC7301]. | Protocol IDs" registry established in [RFC7301]. | |||
| The "hq" string identifies HTTP/QUIC: | The "hq" string identifies HTTP/QUIC: | |||
| Protocol: HTTP over QUIC | Protocol: HTTP over QUIC | |||
| Identification Sequence: 0x68 0x71 ("hq") | Identification Sequence: 0x68 0x71 ("hq") | |||
| Specification: This document | Specification: This document | |||
| 9.2. Registration of QUIC Version Hint Alt-Svc Parameter | 10.2. Registration of QUIC Version Hint Alt-Svc Parameter | |||
| This document creates a new registration for version-negotiation | This document creates a new registration for version-negotiation | |||
| hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" | hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" | |||
| registry established in [RFC7838]. | registry established in [RFC7838]. | |||
| Parameter: "quic" | Parameter: "quic" | |||
| Specification: This document, Section 2.1 | Specification: This document, Section 2.1 | |||
| 9.3. Frame Types | 10.3. Frame Types | |||
| This document establishes a registry for HTTP/QUIC frame type codes. | This document establishes a registry for HTTP/QUIC frame type codes. | |||
| The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The | The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The | |||
| "HTTP/QUIC Frame Type" registry operates under either of the "IETF | "HTTP/QUIC Frame Type" registry operates under either of the "IETF | |||
| Review" or "IESG Approval" policies [RFC5226] for values between 0x00 | Review" or "IESG Approval" policies [RFC5226] for values between 0x00 | |||
| and 0xef, with values between 0xf0 and 0xff being reserved for | and 0xef, with values between 0xf0 and 0xff being reserved for | |||
| Experimental Use. | Experimental Use. | |||
| While this registry is separate from the "HTTP/2 Frame Type" registry | While this registry is separate from the "HTTP/2 Frame Type" registry | |||
| defined in [RFC7540], it is preferable that the assignments parallel | defined in [RFC7540], it is preferable that the assignments parallel | |||
| skipping to change at page 26, line 46 ¶ | skipping to change at page 28, line 27 ¶ | |||
| | | | | | | | | | | |||
| | PUSH_PROMISE | 0x5 | Section 5.2.6 | | | PUSH_PROMISE | 0x5 | Section 5.2.6 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x6 | N/A | | | Reserved | 0x6 | N/A | | |||
| | | | | | | | | | | |||
| | GOAWAY | 0x7 | Section 5.2.7 | | | GOAWAY | 0x7 | Section 5.2.7 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x8 | N/A | | | Reserved | 0x8 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x9 | N/A | | | Reserved | 0x9 | N/A | | |||
| | | | | | ||||
| | MAX_PUSH_ID | 0xD | Section 5.2.8 | | ||||
| +--------------+------+---------------+ | +--------------+------+---------------+ | |||
| 9.4. Settings Parameters | 10.4. Settings Parameters | |||
| This document establishes a registry for HTTP/QUIC settings. The | This document establishes a registry for HTTP/QUIC settings. The | |||
| "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | |||
| Settings" registry operates under the "Expert Review" policy | Settings" registry operates under the "Expert Review" policy | |||
| [RFC5226] for values in the range from 0x0000 to 0xefff, with values | [RFC5226] for values in the range from 0x0000 to 0xefff, with values | |||
| between and 0xf000 and 0xffff being reserved for Experimental Use. | between and 0xf000 and 0xffff being reserved for Experimental Use. | |||
| The designated experts are the same as those for the "HTTP/2 | The designated experts are the same as those for the "HTTP/2 | |||
| Settings" registry defined in [RFC7540]. | Settings" registry defined in [RFC7540]. | |||
| While this registry is separate from the "HTTP/2 Settings" registry | While this registry is separate from the "HTTP/2 Settings" registry | |||
| defined in [RFC7540], it is preferable that the assignments parallel | defined in [RFC7540], it is preferable that the assignments parallel | |||
| each other. If an entry is present in only one registry, every | each other. If an entry is present in only one registry, every | |||
| effort SHOULD be made to avoid assigning the corresponding value to | effort SHOULD be made to avoid assigning the corresponding value to | |||
| an unrelated operation. | an unrelated operation. | |||
| skipping to change at page 27, line 33 ¶ | skipping to change at page 29, line 15 ¶ | |||
| Specification: An optional reference to a specification that | Specification: An optional reference to a specification that | |||
| describes the use of the setting. | describes the use of the setting. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +----------------------+------+-----------------+ | +----------------------+------+-----------------+ | |||
| | Setting Name | Code | Specification | | | Setting Name | Code | Specification | | |||
| +----------------------+------+-----------------+ | +----------------------+------+-----------------+ | |||
| | HEADER_TABLE_SIZE | 0x1 | Section 5.2.5.2 | | | HEADER_TABLE_SIZE | 0x1 | Section 5.2.5.2 | | |||
| | | | | | | | | | | |||
| | ENABLE_PUSH | 0x2 | Section 5.2.5.2 | | | Reserved | 0x2 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x3 | N/A | | | Reserved | 0x3 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x4 | N/A | | | Reserved | 0x4 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x5 | N/A | | | Reserved | 0x5 | N/A | | |||
| | | | | | | | | | | |||
| | MAX_HEADER_LIST_SIZE | 0x6 | Section 5.2.5.2 | | | MAX_HEADER_LIST_SIZE | 0x6 | Section 5.2.5.2 | | |||
| +----------------------+------+-----------------+ | +----------------------+------+-----------------+ | |||
| 9.5. Error Codes | 10.5. Error Codes | |||
| This document establishes a registry for HTTP/QUIC error codes. The | This document establishes a registry for HTTP/QUIC error codes. The | |||
| "HTTP/QUIC Error Code" registry manages a 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 | |||
| registrations for possible duplication with existing error codes. | registrations for possible duplication with existing error codes. | |||
| Use of existing registrations is to be encouraged, but not mandated. | Use of existing registrations is to be encouraged, but not mandated. | |||
| skipping to change at page 28, line 26 ¶ | skipping to change at page 30, line 9 ¶ | |||
| Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
| defines the error code. | defines the error code. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +------------------------------+-----+--------------+---------------+ | +------------------------------+-----+--------------+---------------+ | |||
| | Name | Cod | Description | Specification | | | Name | Cod | Description | Specification | | |||
| | | e | | | | | | e | | | | |||
| +------------------------------+-----+--------------+---------------+ | +------------------------------+-----+--------------+---------------+ | |||
| | HTTP_PUSH_REFUSED | 0x0 | Client | Section 6.1 | | | HTTP_PUSH_REFUSED | 0x0 | Client | Section 7.1 | | |||
| | | 1 | refused | | | | | 1 | refused | | | |||
| | | | pushed | | | | | | pushed | | | |||
| | | | content | | | | | | content | | | |||
| | | | | | | | | | | | | |||
| | HTTP_INTERNAL_ERROR | 0x0 | Internal | Section 6.1 | | | HTTP_INTERNAL_ERROR | 0x0 | Internal | Section 7.1 | | |||
| | | 2 | error | | | | | 2 | error | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_ALREADY_IN_CACHE | 0x0 | Pushed | Section 6.1 | | | HTTP_PUSH_ALREADY_IN_CACHE | 0x0 | Pushed | Section 7.1 | | |||
| | | 3 | content | | | | | 3 | content | | | |||
| | | | already | | | | | | already | | | |||
| | | | cached | | | | | | cached | | | |||
| | | | | | | | | | | | | |||
| | HTTP_REQUEST_CANCELLED | 0x0 | Data no | Section 6.1 | | | HTTP_REQUEST_CANCELLED | 0x0 | Data no | Section 7.1 | | |||
| | | 4 | longer | | | | | 4 | longer | | | |||
| | | | needed | | | | | | needed | | | |||
| | | | | | | | | | | | | |||
| | HTTP_HPACK_DECOMPRESSION_FAI | 0x0 | HPACK cannot | Section 6.1 | | | HTTP_HPACK_DECOMPRESSION_FAI | 0x0 | HPACK cannot | Section 7.1 | | |||
| | LED | 5 | continue | | | | LED | 5 | continue | | | |||
| | | | | | | | | | | | | |||
| | HTTP_CONNECT_ERROR | 0x0 | TCP reset or | Section 6.1 | | | HTTP_CONNECT_ERROR | 0x0 | TCP reset or | Section 7.1 | | |||
| | | 6 | error on | | | | | 6 | error on | | | |||
| | | | CONNECT | | | | | | CONNECT | | | |||
| | | | request | | | | | | request | | | |||
| | | | | | | | | | | | | |||
| | HTTP_EXCESSIVE_LOAD | 0x0 | Peer | Section 6.1 | | | HTTP_EXCESSIVE_LOAD | 0x0 | Peer | Section 7.1 | | |||
| | | 7 | generating | | | | | 7 | generating | | | |||
| | | | excessive | | | | | | excessive | | | |||
| | | | load | | | | | | load | | | |||
| | | | | | | | | | | | | |||
| | HTTP_VERSION_FALLBACK | 0x0 | Retry over | Section 6.1 | | | HTTP_VERSION_FALLBACK | 0x0 | Retry over | Section 7.1 | | |||
| | | 8 | HTTP/2 | | | | | 8 | HTTP/2 | | | |||
| | | | | | | | | | | | | |||
| | HTTP_MALFORMED_HEADERS | 0x0 | Invalid | Section 6.1 | | | HTTP_MALFORMED_HEADERS | 0x0 | Invalid | Section 7.1 | | |||
| | | 9 | HEADERS | | | | | 9 | HEADERS | | | |||
| | | | frame | | | | | | frame | | | |||
| | | | | | | | | | | | | |||
| | HTTP_MALFORMED_PRIORITY | 0x0 | Invalid | Section 6.1 | | | HTTP_MALFORMED_PRIORITY | 0x0 | Invalid | Section 7.1 | | |||
| | | A | PRIORITY | | | | | A | PRIORITY | | | |||
| | | | frame | | | | | | frame | | | |||
| | | | | | | | | | | | | |||
| | HTTP_MALFORMED_SETTINGS | 0x0 | Invalid | Section 6.1 | | | HTTP_MALFORMED_SETTINGS | 0x0 | Invalid | Section 7.1 | | |||
| | | B | SETTINGS | | | | | B | SETTINGS | | | |||
| | | | frame | | | | | | frame | | | |||
| | | | | | | | | | | | | |||
| | HTTP_MALFORMED_PUSH_PROMISE | 0x0 | Invalid | Section 6.1 | | | HTTP_MALFORMED_PUSH_PROMISE | 0x0 | Invalid | Section 7.1 | | |||
| | | C | PUSH_PROMISE | | | | | C | PUSH_PROMISE | | | |||
| | | | frame | | | | | | frame | | | |||
| | | | | | | | | | | | | |||
| | HTTP_MALFORMED_DATA | 0x0 | Invalid DATA | Section 6.1 | | | HTTP_MALFORMED_DATA | 0x0 | Invalid DATA | Section 7.1 | | |||
| | | D | frame | | | | | D | frame | | | |||
| | | | | | | | | | | | | |||
| | HTTP_INTERRUPTED_HEADERS | 0x0 | Incomplete | Section 6.1 | | | HTTP_INTERRUPTED_HEADERS | 0x0 | Incomplete | Section 7.1 | | |||
| | | E | HEADERS | | | | | E | HEADERS | | | |||
| | | | block | | | | | | block | | | |||
| | | | | | | | | | | | | |||
| | HTTP_WRONG_STREAM | 0x0 | A frame was | Section 6.1 | | | HTTP_WRONG_STREAM | 0x0 | A frame was | Section 7.1 | | |||
| | | F | sent on the | | | | | F | sent on the | | | |||
| | | | wrong stream | | | | | | wrong stream | | | |||
| | | | | | | | | | | | | |||
| | HTTP_MULTIPLE_SETTINGS | 0x1 | Multiple | Section 6.1 | | | HTTP_MULTIPLE_SETTINGS | 0x1 | Multiple | Section 7.1 | | |||
| | | 0 | SETTINGS | | | | | 0 | SETTINGS | | | |||
| | | | frames | | | | | | frames | | | |||
| | | | | | | | | | | | | |||
| | HTTP_DUPLICATE_PUSH | 0x1 | Duplicate | Section 6.1 | | | HTTP_MALFORMED_PUSH | 0x1 | Invalid push | Section 7.1 | | |||
| | | 1 | server push | | | | | 1 | stream | | | |||
| | | | header | | | ||||
| | | | | | | ||||
| | HTTP_MALFORMED_MAX_PUSH_ID | 0x1 | Invalid | Section 7.1 | | ||||
| | | 2 | MAX_PUSH_ID | | | ||||
| | | | frame | | | ||||
| +------------------------------+-----+--------------+---------------+ | +------------------------------+-----+--------------+---------------+ | |||
| 10. References | 11. References | |||
| 10.1. Normative References | ||||
| 11.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), August 2017. | transport (work in progress), September 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>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, <https://www.rfc- | |||
| <http://www.rfc-editor.org/info/rfc2119>. | editor.org/info/rfc2119>. | |||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
| DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, <https://www.rfc- | |||
| <http://www.rfc-editor.org/info/rfc5234>. | 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>. | <https://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, <https://www.rfc- | |||
| <http://www.rfc-editor.org/info/rfc7231>. | editor.org/info/rfc7231>. | |||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, <https://www.rfc- | |||
| <http://www.rfc-editor.org/info/rfc7540>. | editor.org/info/rfc7540>. | |||
| [RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for | [RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for | |||
| 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>. | <https://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, <https://www.rfc-editor.org/info/rfc7838>. | |||
| 10.2. Informative References | 11.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", RFC 5226, | IANA Considerations Section in RFCs", RFC 5226, | |||
| DOI 10.17487/RFC5226, May 2008, | DOI 10.17487/RFC5226, May 2008, <https://www.rfc- | |||
| <http://www.rfc-editor.org/info/rfc5226>. | 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, <https://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-04 | B.1. Since draft-ietf-quic-http-05 | |||
| o Made push ID sequential, add MAX_PUSH_ID, remove | ||||
| SETTINGS_ENABLE_PUSH (#709) | ||||
| o Guidance about keep-alive and QUIC PINGs (#729) | ||||
| o Expanded text on GOAWAY and cancellation (#757) | ||||
| B.2. Since draft-ietf-quic-http-04 | ||||
| o Cite RFC 5234 (#404) | o Cite RFC 5234 (#404) | |||
| o Return to a single stream per request (#245,#557) | o Return to a single stream per request (#245,#557) | |||
| o Use separate frame type and settings registries from HTTP/2 (#81) | o Use separate frame type and settings registries from HTTP/2 (#81) | |||
| o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| o Restored GOAWAY (#696) | o Restored GOAWAY (#696) | |||
| o Identify server push using Push ID rather than a stream ID | o Identify server push using Push ID rather than a stream ID | |||
| (#702,#281) | (#702,#281) | |||
| o DATA frames cannot be empty (#700) | o DATA frames cannot be empty (#700) | |||
| B.2. Since draft-ietf-quic-http-03 | B.3. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.3. Since draft-ietf-quic-http-02 | B.4. Since draft-ietf-quic-http-02 | |||
| o Track changes in transport draft | o Track changes in transport draft | |||
| B.4. Since draft-ietf-quic-http-01 | B.5. Since draft-ietf-quic-http-01 | |||
| o SETTINGS changes (#181): | o SETTINGS changes (#181): | |||
| * SETTINGS can be sent only once at the start of a connection; no | * SETTINGS can be sent only once at the start of a connection; no | |||
| changes thereafter | changes thereafter | |||
| * SETTINGS_ACK removed | * SETTINGS_ACK removed | |||
| * Settings can only occur in the SETTINGS frame a single time | * Settings can only occur in the SETTINGS frame a single time | |||
| * Boolean format updated | * Boolean format updated | |||
| o Alt-Svc parameter changed from "v" to "quic"; format updated | o Alt-Svc parameter changed from "v" to "quic"; format updated | |||
| (#229) | (#229) | |||
| o Closing the connection control stream or any message control | o Closing the connection control stream or any message control | |||
| stream is a fatal error (#176) | stream is a fatal error (#176) | |||
| o HPACK Sequence counter can wrap (#173) | o HPACK Sequence counter can wrap (#173) | |||
| 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.5. Since draft-ietf-quic-http-00 | B.6. 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.6. Since draft-shade-quic-http2-mapping-00 | B.7. 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. 91 change blocks. | ||||
| 129 lines changed or deleted | 230 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/ | ||||