| draft-ietf-quic-http-01.txt | draft-ietf-quic-http-02.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Microsoft | Internet-Draft Microsoft | |||
| Intended status: Standards Track January 14, 2017 | Intended status: Standards Track March 13, 2017 | |||
| Expires: July 18, 2017 | Expires: September 14, 2017 | |||
| Hypertext Transfer Protocol (HTTP) over QUIC | Hypertext Transfer Protocol (HTTP) over QUIC | |||
| draft-ietf-quic-http-01 | draft-ietf-quic-http-02 | |||
| 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. Specifically, this | describes a mapping of HTTP semantics over QUIC. This document also | |||
| document identifies HTTP/2 features that are subsumed by QUIC, and | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| describes how the other features can be implemented atop 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 . | |||
| 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 July 18, 2017. | This Internet-Draft will expire on September 14, 2017. | |||
| 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 34 ¶ | skipping to change at page 2, line 34 ¶ | |||
| 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 . . . . . . . . . . . . . . . . . . 4 | |||
| 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 3: Connection Control Stream . . . . . . . . . . . 6 | 4.1. Stream 3: Connection 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. Stream Priorities . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.4. Flow Control . . . . . . . . . . . . . . . . . . . . . . 9 | 4.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.5. 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 . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 11 | 5.2.1. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 11 | 5.2.2. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 12 | 5.2.3. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 5.2.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . 13 | 5.2.4. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 13 | 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 16 | 6.1. HTTP-Defined QUIC Error Codes . . . . . . . . . . . . . . 16 | |||
| 5.2.7. PING . . . . . . . . . . . . . . . . . . . . . . . . 17 | 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 17 | |||
| 5.2.8. GOAWAY frame . . . . . . . . . . . . . . . . . . . . 17 | 7.1. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.2.9. WINDOW_UPDATE frame . . . . . . . . . . . . . . . . . 17 | 7.2. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 18 | |||
| 5.2.10. CONTINUATION frame . . . . . . . . . . . . . . . . . 17 | 7.3. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 19 | |||
| 5.2.11. SETTINGS_ACK Frame . . . . . . . . . . . . . . . . . 18 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 20 | |||
| 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 19 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.1. HTTP-Defined QUIC Error Codes . . . . . . . . . . . . . . 19 | 9.1. Registration of HTTP/QUIC Identification String . . . . . 21 | |||
| 6.2. Mapping HTTP/2 Error Codes . . . . . . . . . . . . . . . 20 | 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 21 | |||
| 9.3. Existing Frame Types . . . . . . . . . . . . . . . . . . 21 | ||||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 22 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 8.1. Registration of HTTP/QUIC Identification String . . . . . 21 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 8.2. Registration of Version Hint Alt-Svc Parameter . . . . . 21 | 10.1. Normative References . . . . . . . . . . . . . . . . . . 25 | |||
| 8.3. Existing Frame Types . . . . . . . . . . . . . . . . . . 22 | 10.2. Informative References . . . . . . . . . . . . . . . . . 26 | |||
| 8.4. New Frame Types . . . . . . . . . . . . . . . . . . . . . 23 | Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 26 | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 23 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . 23 | B.1. Since draft-ietf-quic-http-01: . . . . . . . . . . . . . 26 | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . 24 | B.2. Since draft-ietf-quic-http-00: . . . . . . . . . . . . . 27 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 24 | B.3. Since draft-shade-quic-http2-mapping-00: . . . . . . . . 27 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 24 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| B.1. Since draft-ietf-quic-http-00: . . . . . . . . . . . . . 24 | ||||
| B.2. Since draft-shade-quic-http2-mapping-00: . . . . . . . . 25 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
| 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 3, line 41 ¶ | skipping to change at page 3, line 37 ¶ | |||
| 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]. | |||
| 2. QUIC Advertisement | 2. QUIC Advertisement | |||
| A server advertises that it can speak HTTP/QUIC via the Alt-Svc | An HTTP origin advertises the availability of an equivalent HTTP/QUIC | |||
| ([RFC7838]) HTTP response header (or the semantically equivalent Alt- | endpoint via the Alt-Svc HTTP response header or the HTTP/2 ALTSVC | |||
| Svc HTTP/2 Extension Frame Type), using the ALPN token defined in | frame ([RFC7838]), using the ALPN token defined in Section 3. | |||
| Section 3. | ||||
| Thus, a server could indicate in an HTTP/1.1 or HTTP/2 response that | For example, an origin could indicate in an HTTP/1.1 or HTTP/2 | |||
| HTTP/QUIC was available on UDP port 443 by including the following | response that HTTP/QUIC was available on UDP port 443 at the same | |||
| header in any response: | hostname by including the following header in any response: | |||
| Alt-Svc: hq=":443" | Alt-Svc: hq=":443" | |||
| On receipt of an Alt-Svc header indicating HTTP/QUIC support, a | ||||
| client MAY attempt to establish a QUIC connection to the indicated | ||||
| host and port and, if successful, send HTTP requests using the | ||||
| mapping described in this document. | ||||
| Connectivity problems (e.g. firewall blocking UDP) can result in QUIC | ||||
| connection establishment failure, in which case the client SHOULD | ||||
| continue using the existing connection or try another alternative | ||||
| endpoint offered by the origin. | ||||
| 2.1. QUIC Version Hints | 2.1. QUIC Version Hints | |||
| This document defines the "v" parameter for Alt-Svc, which is used to | This document defines the "quic" parameter for Alt-Svc, which MAY be | |||
| provide version-negotiation hints to HTTP/QUIC clients. Syntax: | used to provide version-negotiation hints to HTTP/QUIC clients. QUIC | |||
| versions are four-octet sequences with no additional constraints on | ||||
| format. Syntax: | ||||
| v = version | quic = version-number | |||
| version = DQUOTE ( "c" version-string / "x" version-number ) DQUOTE | version-number = 1*8HEXDIG; hex-encoded QUIC version | |||
| version-string = token; percent-encoded QUIC version | ||||
| version-number = 1*8 HEXDIG; hex-encoded QUIC version | ||||
| When multiple versions are supported, the "v" parameter MAY be | Leading zeros SHOULD be omitted for brevity. When multiple versions | |||
| repeated multiple times in a single Alt-Svc entry. For example, if a | are supported, the "quic" parameter MAY be repeated multiple times in | |||
| server supported both version "Q034" and version 0x00000001, it would | a single Alt-Svc entry. For example, if a server supported both | |||
| specify the following header: | version 0x00000001 and the version rendered in ASCII as "Q034", it | |||
| could specify the following header: | ||||
| Alt-Svc: hq=":443";v="x1";v="cQ034" | Alt-Svc: hq=":443";quic=1;quic=51303334 | |||
| Where multiple versions are listed, the order of the values reflects | Where multiple versions are listed, the order of the values reflects | |||
| the server's preference (with the first value being the most | the server's preference (with the first value being the most | |||
| preferred version). | preferred version). Origins SHOULD list only versions which are | |||
| supported by the alternative, but MAY omit supported versions for any | ||||
| QUIC versions are four-octet sequences with no additional constraints | reason. | |||
| on format. Versions containing octets not allowed in tokens | ||||
| ([RFC7230], Section 3.2.6) MUST be encoded using the hexidecimal | ||||
| representation. Versions containing only octets allowed in tokens | ||||
| MAY be encoded using either representation. | ||||
| On receipt of an Alt-Svc header indicating QUIC support, a client MAY | ||||
| attempt to establish a QUIC connection on the indicated port and, if | ||||
| successful, send HTTP requests using the mapping described in this | ||||
| document. Servers SHOULD list only versions which they support, but | ||||
| MAY omit supported versions for any reason. | ||||
| Connectivity problems (e.g. firewall blocking UDP) may result in QUIC | ||||
| connection establishment failure, in which case the client should | ||||
| gracefully fall back to HTTP/2. | ||||
| 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.5) MUST be sent as the | established, a SETTINGS frame (Section 5.2.3) MUST be sent as the | |||
| initial frame of the HTTP control stream (StreamID 3, see Section 4). | initial frame of the HTTP control stream (StreamID 3, see Section 4). | |||
| The server MUST NOT send data on any other stream until 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 | |||
| themselves as "hq". Until such an RFC exists, implementations MUST | themselves as "hq". Until such an RFC exists, implementations MUST | |||
| NOT identify themselves using these strings. | NOT identify themselves using this string. | |||
| Implementations of draft versions of the protocol MUST add the string | Implementations of draft versions of the protocol MUST add the string | |||
| "-" and the corresponding draft number to the identifier. For | "-" and the corresponding draft number to the identifier. For | |||
| example, draft-ietf-quic-http-01 is identified using the string "hq- | example, draft-ietf-quic-http-01 is identified using the string "hq- | |||
| 01". | 01". | |||
| Non-compatible experiments that are based on these draft versions | Non-compatible experiments that are based on these draft versions | |||
| MUST append the string "-" and an experiment name to the identifier. | MUST append the string "-" and an experiment name to the identifier. | |||
| For example, an experimental implementation based on draft-ietf-quic- | For example, an experimental implementation based on draft-ietf-quic- | |||
| http-09 which reserves an extra stream for unsolicited transmission | http-09 which reserves an extra stream for unsolicited transmission | |||
| skipping to change at page 5, line 41 ¶ | skipping to change at page 5, line 39 ¶ | |||
| 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 1 for crypto operations (the handshake, crypto | QUIC reserves Stream 1 for crypto operations (the handshake, crypto | |||
| config updates). Stream 3 is reserved for sending and receiving HTTP | config updates). Stream 3 is reserved for sending and receiving HTTP | |||
| control frames, and is analogous to HTTP/2's Stream 0. | control frames, and is analogous to HTTP/2's Stream 0. This | |||
| connection control stream is considered critical to the HTTP | ||||
| connection. If the connection control stream is closed for any | ||||
| reason, this MUST be treated as a connection error of type | ||||
| 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 | pair of streams: This means that the client's first request occurs on | |||
| QUIC streams 5 and 7, the second on stream 9 and 11, and so on. The | QUIC streams 5 and 7, the second on stream 9 and 11, and so on. The | |||
| server's first push consumes streams 2 and 4. This amounts to the | server's first push consumes streams 2 and 4. This amounts to the | |||
| second least-significant bit differentiating the two streams in a | second least-significant bit differentiating the two streams in a | |||
| request. | request. | |||
| The lower-numbered stream is called the message control stream and | The lower-numbered stream is called the message control stream and | |||
| carries frames related to the request/response, including HEADERS. | carries frames related to the request/response, including HEADERS. | |||
| All request control streams are exempt from connection-level flow | The higher-numbered stream is the data stream and carries the | |||
| control. The higher-numbered stream is the data stream and carries | request/response body with no additional framing. Note that a | |||
| the request/response body with no additional framing. Note that a | ||||
| request or response without a body will cause this stream to be half- | request or response without a body will cause this stream to be half- | |||
| closed in the corresponding direction without transferring data. | 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 | ||||
| connection. If a message control stream is terminated abruptly for | ||||
| any reason, this MUST be treated as a connection error of type | ||||
| HTTP_RST_CONTROL_STREAM. When a message control stream terminates | ||||
| cleanly, if the last frame on the stream was truncated, this MUST be | ||||
| treated as a connection error (see HTTP_MALFORMED_* in Section 6.1). | ||||
| Pairs of streams must be utilized sequentially, with no gaps. The | Pairs of streams must be utilized sequentially, with no gaps. The | |||
| data stream MUST be reserved with the QUIC implementation when the | data stream is opened at the same time as the message control stream | |||
| message control stream is opened or reserved, and MUST be closed | is opened and is closed after transferring the body. The data stream | |||
| after transferring the body, or else closed immediately after sending | is closed immediately after sending the request headers if there is | |||
| the request headers if there is no body. | 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 streams are closed in the appropriate direction. | |||
| 4.1. Stream 3: Connection Control Stream | 4.1. Stream 3: Connection Control Stream | |||
| Since most connection-level concerns from HTTP/2 will be managed by | Since most connection-level concerns will be managed by QUIC, the | |||
| QUIC, the primary use of Stream 3 will be for SETTINGS and PRIORITY | primary use of Stream 3 will be for the SETTINGS frame when the | |||
| frames. Stream 3 is exempt from connection-level flow-control. | 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 pair of QUIC streams. A | |||
| server sends an HTTP response on the same streams as the request. | server sends an HTTP response on the same streams as the request. | |||
| An HTTP message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
| 1. for a response only, zero or more header blocks (a sequence of | 1. one header block (see Section 5.2.1) on the control stream | |||
| HEADERS frames with End Header Block set on the last) on the | containing the message headers (see [RFC7230], Section 3.2), | |||
| control stream containing the message headers of informational | ||||
| (1xx) HTTP responses (see [RFC7230], Section 3.2 and [RFC7231], | ||||
| Section 6.2), | ||||
| 2. one header block on the control stream containing the message | ||||
| headers (see [RFC7230], Section 3.2), | ||||
| 3. the payload body (see [RFC7230], Section 3.3), sent on the data | 2. the payload body (see [RFC7230], Section 3.3), sent on the data | |||
| stream, | stream, | |||
| 4. optionally, one header block on the control stream containing the | 3. optionally, one header block on the control stream containing the | |||
| trailer-part, if present (see [RFC7230], Section 4.1.2). | trailer-part, if present (see [RFC7230], Section 4.1.2). | |||
| In addition, prior to sending the message header block indicated | ||||
| above, a response may contain zero or more header blocks on the | ||||
| control stream containing the message headers of informational (1xx) | ||||
| HTTP responses (see [RFC7230], Section 3.2 and [RFC7231], | ||||
| Section 6.2). | ||||
| The data stream MUST be half-closed immediately after the transfer of | The data stream MUST be half-closed immediately after the transfer of | |||
| the body. If the message does not contain a body, the corresponding | the body. If the message does not contain a body, the corresponding | |||
| data stream MUST still be half-closed without transferring any data. | 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 a header block following the | Trailing header fields are carried in an additional header block on | |||
| body. Such a header block is a sequence of HEADERS frames with End | the message control stream. Such a header block is a sequence of | |||
| Header Block set on the last frame. Header blocks after the first | HEADERS frames with End Header Block set on the last frame. Senders | |||
| but before the end of the stream are invalid. These MUST be decoded | MUST send only one header block in the trailers section; receivers | |||
| to maintain HPACK decoder state, but the resulting output MUST be | MUST decode any subsequent header blocks in order to maintain HPACK | |||
| discarded. | 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 pair of streams. | |||
| After sending a request, a client closes the streams for sending; | After sending a request, a client closes the streams for sending; | |||
| after sending a response, the server closes its streams for sending | after sending a response, the server closes its streams for sending | |||
| and the QUIC streams are fully closed. | and the QUIC streams are 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 sending a RST_STREAM with an error code of NO_ERROR | |||
| after sending a complete response and closing its stream. Clients | after sending a complete response and closing its stream. Clients | |||
| MUST NOT discard responses as a result of receiving such a | MUST NOT discard responses as a result of receiving such a | |||
| RST_STREAM, though clients can always discard responses at their | RST_STREAM, though clients can always discard responses at their | |||
| discretion for other reasons. | discretion for other reasons. | |||
| 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- | To achieve in-order delivery of HEADERS frames in QUIC, the HPACK- | |||
| bearing frames contain a counter which can be used to ensure in-order | bearing frames contain a counter which can be used to ensure in-order | |||
| processing. Data (request/response bodies) which arrive out of order | processing. Data (request/response bodies) which arrive out of order | |||
| skipping to change at page 9, line 16 ¶ | skipping to change at page 9, line 32 ¶ | |||
| 4.3. Stream Priorities | 4.3. Stream Priorities | |||
| 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 stream can be | |||
| designated as dependent upon another stream, which expresses the | designated as dependent upon another stream, which expresses the | |||
| preference that the latter stream (the "parent" stream) be allocated | preference that the latter stream (the "parent" stream) be allocated | |||
| resources before the former stream (the "dependent" stream). Taken | resources before the former stream (the "dependent" stream). Taken | |||
| together, the dependencies across all streams in a connection form a | together, the dependencies across all streams 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 | |||
| HEADERS and PRIORITY frames add, remove, or change the dependency | PRIORITY frames add, remove, or change the dependency links between | |||
| links between streams. | streams. | |||
| Implicit in this scheme is the notion of in-order delivery of | ||||
| priority changes (i.e., dependency tree mutations): since operations | ||||
| on the dependency tree such as reparenting a subtree are not | ||||
| commutative, both sender and receiver must apply them in the same | ||||
| order to ensure that both sides have a consistent view of the stream | ||||
| dependency tree. HTTP/2 specifies priority assignments in PRIORITY | ||||
| frames and (optionally) in HEADERS frames. To achieve in-order | ||||
| delivery of priority changes in HTTP/QUIC, PRIORITY frames are sent | ||||
| on the connection control stream and the PRIORITY section is removed | ||||
| from the HEADERS frame. The semantics of the Stream Dependency, | ||||
| Weight, E flag, and (for HEADERS frames) PRIORITY flag are the same | ||||
| as in HTTP/2. | ||||
| For consistency's sake, all PRIORITY frames MUST refer to the message | For consistency's sake, all PRIORITY frames MUST refer to the message | |||
| control stream of the dependent request, not the data stream. | control stream of the dependent request, not the data stream. | |||
| 4.4. Flow Control | 4.4. Server Push | |||
| QUIC provides stream and connection level flow control, similar in | ||||
| principle to HTTP/2's flow control but with some implementation | ||||
| differences. As flow control is handled by QUIC, the HTTP mapping | ||||
| need not concern itself with maintaining flow control state. The | ||||
| HTTP mapping MUST NOT send WINDOW_UPDATE frames at the HTTP level. | ||||
| 4.5. 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_ENABLE_PUSH setting in the | to receive server pushes via the SETTINGS_DISABLE_PUSH setting in the | |||
| SETTINGS frame (see Section 3), which defaults to 1 (true). | SETTINGS frame (see Section 3), which defaults to 1 (true). | |||
| 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 StreamID of the stream to | sending a PUSH_PROMISE frame containing the StreamID of the stream to | |||
| be pushed, as well as request header fields attributed to the | be pushed, as well as request header fields attributed to the | |||
| request. The PUSH_PROMISE frame is sent on the control stream of the | request. The PUSH_PROMISE frame is sent on the control stream of the | |||
| associated (client-initiated) request, while the Promised Stream ID | associated (client-initiated) request, while the Promised Stream ID | |||
| field specifies the Stream ID of the control stream for the server- | field specifies the Stream ID of the control stream for the server- | |||
| initiated request. | initiated request. | |||
| The server push response is conveyed in the same way as a non-server- | The server push response is conveyed in the same way as a non-server- | |||
| push response, with response headers and (if present) trailers | push response, with response headers and (if present) trailers | |||
| carried by HEADERS frames sent on the control stream, and response | carried by HEADERS frames sent on the control stream, and response | |||
| body (if any) sent via the corresponding data stream. | body (if any) sent via the corresponding data stream. | |||
| 5. HTTP Framing Layer | 5. HTTP Framing Layer | |||
| Many framing concepts from HTTP/2 can be elided away on QUIC, because | ||||
| the transport deals with them. Because frames are already on a | ||||
| stream, they can omit the stream number. Because frames do not block | ||||
| multiplexing (QUIC's multiplexing occurs below this layer), the | ||||
| support for variable-maximum-length packets can be removed. Because | ||||
| stream termination is handled by QUIC, an END_STREAM flag is not | ||||
| required. | ||||
| Frames are used only on the connection (stream 3) and message | Frames are used only on the connection (stream 3) and message | |||
| (streams 5, 9, etc.) control streams. Other streams carry data | (streams 5, 9, etc.) control streams. Other streams carry data | |||
| payload and are not framed at the HTTP layer. | payload and are not framed at the HTTP layer. | |||
| Frame payloads are largely drawn from [RFC7540]. However, QUIC | This section describes HTTP framing in QUIC and highlights some | |||
| includes some features (e.g. flow control) which are also present in | differences from HTTP/2 framing. For more detail on differences from | |||
| HTTP/2. In these cases, the HTTP mapping need not re-implement them. | HTTP/2, see Section 7.1. | |||
| As a result, some frame types are not required when using QUIC. | ||||
| Where an HTTP/2-defined frame is no longer used, the frame ID is | ||||
| reserved in order to maximize portability between HTTP/2 and HTTP/ | ||||
| QUIC implementations. However, equivalent frames between the two | ||||
| mappings are not necessarily identical. | ||||
| This section describes HTTP framing in QUIC and highlights | ||||
| differences from HTTP/2 framing. | ||||
| 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 (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| HTTP/QUIC frame format | Figure 1: HTTP/QUIC frame format | |||
| 5.2. Frame Definitions | 5.2. Frame Definitions | |||
| 5.2.1. DATA | 5.2.1. HEADERS | |||
| DATA frames do not exist. Frame type 0x0 is reserved. | ||||
| 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]. Because HEADERS frames from | compressed using HPACK [RFC7541]. | |||
| different streams will be delivered out-of-order and priority-changes | ||||
| are not commutative, the PRIORITY region of HEADERS is not supported. | ||||
| A separate PRIORITY frame MUST be used. | ||||
| Padding MUST NOT be used. The flags defined are: | ||||
| Reserved (0x1): Reserved for HTTP/2 compatibility. | One flag is defined: | |||
| End Header Block (0x4): This frame concludes a header block. | End Header Block (0x4): This frame concludes a header block. | |||
| Reserved (0x8): Reserved for HTTP/2 compatibility. | A HEADERS frame with any other flags set MUST be treated as a | |||
| Reserved (0x20): Reserved for HTTP/2 compatibility. | ||||
| A HEADERS frame with the Reserved bits 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 | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Sequence? (16) | Header Block Fragment (*)... | | Sequence? (16) | Header Block Fragment (*)... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| HEADERS frame payload | Figure 2: HEADERS frame payload | |||
| The HEADERS frame payload has the following fields: | The HEADERS frame payload has the following fields: | |||
| Sequence Number: Present only on the first frame of a header block | 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. This MUST be set to zero on the first header block | |||
| sequence, and incremented on each 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 | |||
| skipping to change at page 12, line 25 ¶ | skipping to change at page 11, line 35 ¶ | |||
| 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 | On receipt, header blocks (HEADERS, PUSH_PROMISE) MUST be processed | |||
| by the HPACK decoder in sequence. If a block is missing, all | by the HPACK decoder in sequence. If a block is missing, all | |||
| subsequent HPACK frames MUST be held until it arrives, or the | subsequent HPACK frames MUST be held until it arrives, or the | |||
| connection terminated. | connection terminated. | |||
| 5.2.3. PRIORITY | 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 from [RFC7540]. In order | |||
| to support ordering, it MUST be sent only on the connection control | to support ordering, it MUST be sent only on the connection control | |||
| stream. The format has been modified to accommodate not being sent | stream. The format has been modified to accommodate not being sent | |||
| on-stream and the larger stream ID space of QUIC. | on-stream and the larger stream ID space of QUIC. | |||
| The semantics of the Stream Dependency, Weight, and E flag are the | ||||
| same as in HTTP/2. | ||||
| The flags defined are: | The flags defined are: | |||
| 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 Stream (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Dependent Stream (32) | | | Dependent Stream (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Weight (8) | | | Weight (8) | | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| HEADERS frame payload | Figure 3: PRIORITY frame payload | |||
| The HEADERS frame payload has the following fields: | The HEADERS frame payload has the following fields: | |||
| Prioritized Stream: A 32-bit stream identifier for the message | Prioritized Stream: A 32-bit stream identifier for the message | |||
| control stream whose priority is being updated. | control stream whose priority is being updated. | |||
| Stream Dependency: A 32-bit stream identifier for the stream that | Stream Dependency: A 32-bit stream identifier for the stream that | |||
| this stream depends on (see Section 4.3 and {!RFC7540}} | this stream depends on (see Section 4.3 and {!RFC7540}} | |||
| Section 5.3). | 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 MUST have a payload length of nine octets. A | |||
| PRIORITY frame of any other length MUST be treated as a connection | PRIORITY frame of any other length MUST be treated as a connection | |||
| error of type HTTP_MALFORMED_PRIORITY. | error of type HTTP_MALFORMED_PRIORITY. | |||
| 5.2.4. RST_STREAM | 5.2.3. SETTINGS | |||
| RST_STREAM frames do not exist, since QUIC provides stream lifecycle | ||||
| management. Frame type 0x3 is reserved. | ||||
| 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 substantially different from [RFC7540]. | |||
| Individually, a SETTINGS parameter can also be referred to as a | Individually, 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 | |||
| skipping to change at page 13, line 41 ¶ | skipping to change at page 13, line 4 ¶ | |||
| "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 permit a very large HPACK state | |||
| table while a server chooses to use a small one to conserve memory. | table while a server chooses to use a small one to conserve memory. | |||
| A SETTINGS frame MAY be sent at any time by either endpoint over the | Parameters MUST NOT occur more than once. A receiver MAY treat the | |||
| lifetime of the connection. | presence of the same parameter more than once as a connection error | |||
| of type HTTP_MALFORMED_SETTINGS. | ||||
| Each parameter in a SETTINGS frame replaces any existing value for | ||||
| that parameter. Parameters are processed in the order in which they | ||||
| appear, and a receiver of a SETTINGS frame does not need to maintain | ||||
| any state other than the current value of its parameters. Therefore, | ||||
| the value of a SETTINGS parameter is the last value that is seen by a | ||||
| receiver. | ||||
| The SETTINGS frame defines the following flag: | ||||
| REQUEST_ACK (0x1): When set, bit 0 indicates that this frame | The SETTINGS frame defines no flags. | |||
| contains values which the sender wants to know were understood and | ||||
| applied. For more information, see Section 5.2.5.3. | ||||
| 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. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Identifier (16) |B| Length (15) | | | Identifier (16) | Length (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Contents (?) ... | | Contents (?) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 1: SETTINGS value format | Figure 4: SETTINGS value format | |||
| A zero-length content indicates that the setting value is a Boolean | A zero-length content indicates that the setting value is a Boolean | |||
| given by the B bit. If Length is not zero, the B bit MUST be zero, | and true. False is indicated by the absence of the setting. | |||
| and MUST be ignored by receivers. The initial value of each setting | ||||
| is "false" unless otherwise specified by the definition of the | ||||
| setting. | ||||
| Non-zero-length values MUST be compared against the remaining length | Non-zero-length values MUST be compared against the remaining length | |||
| of the SETTINGS frame. Any value which purports to cross the end of | of the SETTINGS frame. Any value which purports to cross the end of | |||
| the frame MUST cause the SETTINGS frame to be considered malformed | the frame MUST cause the SETTINGS frame to be considered malformed | |||
| and trigger a connection error. | 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. | |||
| and MUST only be sent on the connection control stream (Stream 3). | A SETTINGS frame MUST be sent as the first frame of the connection | |||
| If an endpoint receives an SETTINGS frame whose stream identifier | control stream (see Section 4) by each peer, and MUST NOT be sent | |||
| field is anything other than 0x0, the endpoint MUST respond with a | subsequently or on any other stream. If an endpoint receives an | |||
| connection error of type HTTP_SETTINGS_ON_WRONG_STREAM. | SETTINGS frame on a different stream, the endpoint MUST respond with | |||
| a connection error of type HTTP_SETTINGS_ON_WRONG_STREAM. If an | ||||
| endpoint receives a second SETTINGS frame, the endpoint MUST respond | ||||
| with a 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 5.4.1) of type HTTP_MALFORMED_SETTINGS. | |||
| 5.2.5.1. Integer encoding | 5.2.3.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.3.2. Defined SETTINGS Parameters | |||
| Some transport-level options that HTTP/2 specifies via the SETTINGS | ||||
| frame are superseded by QUIC transport parameters in HTTP/QUIC. | ||||
| Below is a listing of how each HTTP/2 SETTINGS parameter is mapped: | ||||
| SETTINGS_HEADER_TABLE_SIZE: An integer with a maximum value of 2^32 | ||||
| - 1. | ||||
| SETTINGS_ENABLE_PUSH: Transmitted as a Boolean. The default remains | ||||
| "true" as specified in [RFC7540]. | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS: QUIC requires the maximum number of | ||||
| incoming streams per connection to be specified in the initial | ||||
| crypto handshake, using the "MSPC" tag. Specifying | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error. | ||||
| SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and | ||||
| connection flow control window sizes to be specified in the | ||||
| initial crypto handshake, using the "SFCW" and "CFCW" tags, | ||||
| respectively. Specifying SETTINGS_INITIAL_WINDOW_SIZE in the | ||||
| SETTINGS frame is an error. | ||||
| SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in QUIC. | The following settings are defined in HTTP/QUIC: | |||
| Specifying it in the SETTINGS frame is an error. | ||||
| SETTINGS_MAX_HEADER_LIST_SIZE: An integer with a maximium value of | SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of | |||
| 2^32 - 1. | 2^32 - 1. | |||
| 5.2.5.3. Settings Synchronization | SETTINGS_DISABLE_PUSH (0x2): Transmitted as a Boolean; replaces | |||
| SETTINGS_ENABLE_PUSH | ||||
| Some values in SETTINGS benefit from or require an understanding of | ||||
| when the peer has received and applied the changed parameter values. | ||||
| In order to provide such synchronization timepoints, the recipient of | ||||
| a SETTINGS frame MUST apply the updated parameters as soon as | ||||
| possible upon receipt. The values in the SETTINGS frame MUST be | ||||
| processed in the order they appear, with no other frame processing | ||||
| between values. Unsupported parameters MUST be ignored. | ||||
| Once all values have been processed, if the REQUEST_ACK flag was set, | SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value | |||
| the recipient MUST emit the following frames: | of 2^32 - 1. | |||
| o On the connection control stream, a SETTINGS_ACK frame | 5.2.3.3. Usage in 0-RTT | |||
| (Section 5.2.11) listing the identifiers whose values were not | ||||
| understood. | ||||
| o On each request control stream which is not in the "half-closed | When a 0-RTT QUIC connection is being used, the client's initial | |||
| (local)" or "closed" state, an empty SETTINGS_ACK frame. | requests will be sent before the arrival of the server's SETTINGS | |||
| frame. Clients SHOULD cache at least the following settings about | ||||
| servers: | ||||
| The SETTINGS_ACK frame on the connection control stream contains the | o SETTINGS_HEADER_TABLE_SIZE | |||
| highest stream number which was open at the time the SETTINGS frame | ||||
| was received. All streams with higher numbers can safely be assumed | ||||
| to have the new settings in effect when they open. | ||||
| For already-open streams including the connection control stream, the | o SETTINGS_MAX_HEADER_LIST_SIZE | |||
| SETTINGS_ACK frame indicates the point at which the new settings took | ||||
| effect, if they did so before the peer half-closed the stream. If | ||||
| the peer closed the stream before receiving the SETTINGS frame, the | ||||
| previous settings were in effect for the full lifetime of that | ||||
| stream. | ||||
| In certain conditions, the SETTINGS_ACK frame can be the first frame | Clients MUST comply with cached settings until the server's current | |||
| on a given stream - this simply indicates that the new settings apply | settings are received. If a client does not have cached values, it | |||
| from the beginning of that stream. | SHOULD assume the following values: | |||
| If the sender of a SETTINGS frame with the REQUEST_ACK flag set does | o SETTINGS_HEADER_TABLE_SIZE: 0 octets | |||
| not receive full acknowledgement within a reasonable amount of time, | ||||
| it MAY issue a connection error (Section 6) of type | ||||
| HTTP_SETTINGS_TIMEOUT. A full acknowledgement has occurred when: | ||||
| o All previous SETTINGS frames have been fully acknowledged, | o SETTINGS_MAX_HEADER_LIST_SIZE: 16,384 octets | |||
| o A SETTINGS_ACK frame has been received on the connection control | Servers MAY continue processing data from clients which exceed its | |||
| stream, | current configuration during the initial flight. In this case, the | |||
| client MUST apply the new settings immediately upon receipt. | ||||
| o All message control streams with a Stream ID through those given | If the connection is closed because these or other constraints were | |||
| in the SETTINGS_ACK frame have either closed or received a | violated during the 0-RTT flight (e.g. with | |||
| SETTINGS_ACK frame. | HTTP_HPACK_DECOMPRESSION_FAILED), clients MAY establish a new | |||
| connection and retry any 0-RTT requests using the settings sent by | ||||
| the server on the closed connection. (This assumes that only | ||||
| requests that are safe to retry are sent in 0-RTT.) If the | ||||
| connection was closed before the SETTINGS frame was received, clients | ||||
| SHOULD discard any cached values and use the defaults above on the | ||||
| next connection. | ||||
| 5.2.6. PUSH_PROMISE | 5.2.4. 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. It 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) | | | Promised Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Sequence? (16) | Header Block (*) ... | | Sequence? (16) | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| 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 | Promised Stream ID: A 32-bit Stream ID indicating the QUIC stream on | |||
| which the response headers will be sent. (The response body | which the response headers will be sent. (The response body | |||
| stream is implied by the headers stream, as defined in Section 4.) | stream is implied by the headers stream, as defined in Section 4.) | |||
| HPACK Sequence: A sixteen-bit counter, equivalent to the Sequence | HPACK Sequence: A sixteen-bit counter, equivalent to the Sequence | |||
| field in HEADERS | field in HEADERS | |||
| Payload: HPACK-compressed request headers for the promised response. | Payload: HPACK-compressed request headers for the promised response. | |||
| TODOs: | 6. Error Handling | |||
| o QUIC stream space may be enlarged; would need to redefine Promised | ||||
| Stream field in this case. | ||||
| o No CONTINUATION - HEADERS have EHB; do we need it here? | ||||
| 5.2.7. PING | ||||
| PING frames do not exist, since QUIC provides equivalent | ||||
| functionality. Frame type 0x6 is reserved. | ||||
| 5.2.8. GOAWAY frame | ||||
| GOAWAY frames do not exist, since QUIC provides equivalent | ||||
| functionality. Frame type 0x7 is reserved. | ||||
| 5.2.9. WINDOW_UPDATE frame | ||||
| WINDOW_UPDATE frames do not exist, since QUIC provides equivalent | ||||
| functionality. Frame type 0x8 is reserved. | ||||
| 5.2.10. CONTINUATION frame | ||||
| CONTINUATION frames do not exist, since larger supported HEADERS/ | ||||
| PUSH_PROMISE frames provide equivalent functionality. Frame type 0x9 | ||||
| is reserved. | ||||
| 5.2.11. SETTINGS_ACK Frame | ||||
| The SETTINGS_ACK frame (id = 0x0b) acknowledges receipt and | ||||
| application of specific values in the peer's SETTINGS frame. | ||||
| Depending on the stream where it is sent, it takes two different | ||||
| forms. | ||||
| On the connection control stream, it contains information about how | ||||
| and when the sender has processed the most recently-received SETTINGS | ||||
| frame, and has the following payload: | ||||
| 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Highest Local Stream (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Highest Remote Stream (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Unrecognized Identifiers (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 2: SETTINGS_ACK connection control stream format | ||||
| Highest Local Stream (32 bits): The highest locally-initiated Stream | ||||
| ID which is not in the "idle" state | ||||
| Highest Remote Stream (32 bits): The highest peer-initiated Stream | ||||
| ID which is not in the "idle" state | ||||
| Unrecognized Identifiers: A list of 16-bit SETTINGS identifiers | ||||
| which the sender has not understood and therefore ignored. This | ||||
| list MAY be empty. | ||||
| On message control streams, the SETTINGS_ACK frame carries no | ||||
| payload, and is strictly a synchronization marker for settings | ||||
| application. See Section 5.2.5.3 for more detail. A SETTINGS_ACK | ||||
| frame with a non-zero length MUST be treated as a connection error of | ||||
| type HTTP_MALFORMED_SETTINGS_ACK. | ||||
| On the connection control stream, the SETTINGS_ACK frame MUST have a | QUIC allows the application to abruptly terminate individual streams | |||
| length which is a multiple of two octets. A SETTINGS_ACK frame of | or the entire connection when an error is encountered. These are | |||
| any other length MUST be treated as a connection error of type | referred to as "stream errors" or "connection errors" and are | |||
| HTTP_MALFORMED_SETTINGS_ACK. | described in more detail in [QUIC-TRANSPORT]. | |||
| 6. Error Handling | 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 the specific error codes defined by HTTP and | This section describes HTTP-specific error codes which can be used to | |||
| the mapping of HTTP/2 error codes into the QUIC error code space. | 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, GOAWAY, and CONNECTION_CLOSE frames. | |||
| HTTP_SETTINGS_TIMEOUT (0x00): After sending a SETTINGS frame which | ||||
| requested acknowledgement, the acknowledgement was not completed | ||||
| (see Section 5.2.5.3) in a timely manner. | ||||
| 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. | |||
| HTTP_REQUEST_CANCELLED (0x04): The client no longer needs the | HTTP_REQUEST_CANCELLED (0x04): The client no longer needs the | |||
| skipping to change at page 19, line 47 ¶ | skipping to change at page 16, line 38 ¶ | |||
| HTTP_EXCESSIVE_LOAD (0x07): The endpoint detected that its peer is | HTTP_EXCESSIVE_LOAD (0x07): The endpoint detected that its peer is | |||
| exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
| HTTP_VERSION_FALLBACK (0x08): The requested operation cannot be | HTTP_VERSION_FALLBACK (0x08): The requested operation cannot be | |||
| served over HTTP/QUIC. The peer should retry over HTTP/2. | served over HTTP/QUIC. The peer should retry over HTTP/2. | |||
| HTTP_MALFORMED_HEADERS (0x09): A HEADERS frame has been received | HTTP_MALFORMED_HEADERS (0x09): A HEADERS frame has been received | |||
| with an invalid format. | with an invalid format. | |||
| HTTP_MALFORMED_PRIORITY (0x0A): A HEADERS 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 HEADERS 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 HEADERS frame has been | HTTP_MALFORMED_PUSH_PROMISE (0x0C): A PUSH_PROMISE frame has been | |||
| received with an invalid format. | ||||
| HTTP_MALFORMED_SETTINGS_ACK (0x0D): A HEADERS frame has been | ||||
| received with an invalid format. | 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_SETTINGS_ON_WRONG_STREAM (0x0F): A SETTINGS frame was received | |||
| on a request control stream. | on a request control stream. | |||
| 6.2. Mapping HTTP/2 Error Codes | HTTP_MULTIPLE_SETTINGS (0x10): More than one SETTINGS frame was | |||
| received. | ||||
| HTTP_RST_CONTROL_STREAM (0x11): A message control stream closed | ||||
| abruptly. | ||||
| 7. Considerations for Transitioning from HTTP/2 | ||||
| HTTP/QUIC is strongly informed by HTTP/2, and bears many | ||||
| similarities. This section points out important differences from | ||||
| HTTP/2 and describes how to map HTTP/2 extensions into HTTP/QUIC. | ||||
| 7.1. HTTP Frame Types | ||||
| Many framing concepts from HTTP/2 can be elided away on QUIC, because | ||||
| the transport deals with them. Because frames are already on a | ||||
| stream, they can omit the stream number. Because frames do not block | ||||
| multiplexing (QUIC's multiplexing occurs below this layer), the | ||||
| support for variable-maximum-length packets can be removed. Because | ||||
| stream termination is handled by QUIC, an END_STREAM flag is not | ||||
| required. | ||||
| Frame payloads are largely drawn from [RFC7540]. However, QUIC | ||||
| includes many features (e.g. flow control) which are also present in | ||||
| HTTP/2. In these cases, the HTTP mapping does not re-implement them. | ||||
| As a result, several HTTP/2 frame types are not required in HTTP/ | ||||
| QUIC. Where an HTTP/2-defined frame is no longer used, the frame ID | ||||
| has been reserved in order to maximize portability between HTTP/2 and | ||||
| HTTP/QUIC implementations. However, even equivalent frames between | ||||
| the two mappings are not identical. | ||||
| Many of the differences arise from the fact that HTTP/2 provides an | ||||
| absolute ordering between frames across all streams, while QUIC | ||||
| provides this guarantee on each stream only. As a result, if a frame | ||||
| type makes assumptions that frames from different streams will still | ||||
| be received in the order sent, HTTP/QUIC will break them. | ||||
| For example, implicit in the HTTP/2 prioritization scheme is the | ||||
| notion of in-order delivery of priority changes (i.e., dependency | ||||
| tree mutations): since operations on the dependency tree such as | ||||
| reparenting a subtree are not commutative, both sender and receiver | ||||
| must apply them in the same order to ensure that both sides have a | ||||
| consistent view of the stream dependency tree. HTTP/2 specifies | ||||
| priority assignments in PRIORITY frames and (optionally) in HEADERS | ||||
| frames. To achieve in-order delivery of priority changes in HTTP/ | ||||
| QUIC, PRIORITY frames are sent on the connection control stream and | ||||
| the PRIORITY section is removed from the HEADERS frame. | ||||
| Other than this issue, frame type HTTP/2 extensions are typically | ||||
| portable to QUIC simply by replacing Stream 0 in HTTP/2 with Stream 3 | ||||
| in HTTP/QUIC. | ||||
| 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 | ||||
| stream. See Section 4. | ||||
| HEADERS (0x1): As described above, the PRIORITY region of HEADERS is | ||||
| not supported. A separate PRIORITY frame MUST be used. Padding | ||||
| is not defined in HTTP/QUIC frames. See Section 5.2.1. | ||||
| PRIORITY (0x2): As described above, the PRIORITY frame is sent on | ||||
| the connection control stream. See Section 5.2.2. | ||||
| RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC | ||||
| provides stream lifecycle management. | ||||
| SETTINGS (0x4): SETTINGS frames are sent only at the beginning of | ||||
| the connection. See Section 5.2.3 and Section 7.2. | ||||
| PUSH_PROMISE (0x5): See Section 5.2.4. | ||||
| PING (0x6): PING frames do not exist, since QUIC provides equivalent | ||||
| functionality. | ||||
| GOAWAY (0x7): GOAWAY frames do not exist, since QUIC provides | ||||
| equivalent functionality. | ||||
| WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | ||||
| provides flow control. | ||||
| CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | ||||
| larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and | ||||
| HEADERS frames can be used in series. | ||||
| The IANA registry of frame types has been updated in Section 9.3 to | ||||
| include references to the definition for each frame type in HTTP/2 | ||||
| and in HTTP/QUIC. Frames not defined as available in HTTP/QUIC | ||||
| SHOULD NOT be sent and SHOULD be ignored as unknown on receipt. | ||||
| 7.2. HTTP/2 SETTINGS Parameters | ||||
| An important difference from HTTP/2 is that settings are sent once, | ||||
| at the beginning of the connection, and thereafter cannot change. | ||||
| This eliminates many corner cases around synchronization of changes. | ||||
| Some transport-level options that HTTP/2 specifies via the SETTINGS | ||||
| frame are superseded by QUIC transport parameters in HTTP/QUIC. The | ||||
| HTTP-level options that are retained in HTTP/QUIC have the same value | ||||
| as in HTTP/2. | ||||
| Below is a listing of how each HTTP/2 SETTINGS parameter is mapped: | ||||
| SETTINGS_HEADER_TABLE_SIZE: See Section 5.2.3.2. | ||||
| SETTINGS_ENABLE_PUSH: See SETTINGS_DISABLE_PUSH in Section 5.2.3.2. | ||||
| SETTINGS_MAX_CONCURRENT_STREAMS: QUIC requires the maximum number of | ||||
| incoming streams per connection to be specified in the initial | ||||
| transport handshake. Specifying SETTINGS_MAX_CONCURRENT_STREAMS | ||||
| in the SETTINGS frame is an error. | ||||
| SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and | ||||
| connection flow control window sizes to be specified in the | ||||
| initial transport handshake. Specifying | ||||
| SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. | ||||
| SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/ | ||||
| QUIC. Specifying it in the SETTINGS frame is an error. | ||||
| SETTINGS_MAX_HEADER_LIST_SIZE: See Section 5.2.3.2. | ||||
| Settings defined by extensions to HTTP/2 MAY be expressed as integers | ||||
| with a maximum value of 2^32-1, if they are applicable to HTTP/QUIC, | ||||
| but SHOULD have a specification describing their usage. Fields for | ||||
| this purpose have been added to the IANA registry in Section 9.4. | ||||
| 7.3. HTTP/2 Error Codes | ||||
| QUIC has the same concepts of "stream" and "connection" errors that | ||||
| HTTP/2 provides. However, because the error code space is shared | ||||
| between multiple components, there is no direct portability of HTTP/2 | ||||
| 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): HTTP_SETTINGS_TIMEOUT in Section 6.1. | SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of | |||
| 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 6.1. | |||
| REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream | REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream | |||
| management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the | management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the | |||
| skipping to change at page 21, line 12 ¶ | skipping to change at page 20, line 37 ¶ | |||
| 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. | |||
| TODO: fill in missing error code mappings. | Error codes defined by HTTP/2 extensions need to be re-registered for | |||
| HTTP/QUIC if still applicable. See Section 9.5. | ||||
| 7. 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. | |||
| 8. IANA Considerations | 9. IANA Considerations | |||
| 8.1. Registration of HTTP/QUIC Identification String | 9.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 | |||
| 8.2. Registration of 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: "v" | Parameter: "quic" | |||
| Specification: This document, Section 2.1 | Specification: This document, Section 2.1 | |||
| 8.3. Existing Frame Types | 9.3. Existing Frame Types | |||
| This document adds two new columns to the "HTTP/2 Frame Type" | This document adds two new columns to the "HTTP/2 Frame Type" | |||
| registry defined in [RFC7540]: | registry defined in [RFC7540]: | |||
| Supported Protocols: Indicates which associated protocols use the | Supported Protocols: Indicates which associated protocols use the | |||
| frame type. Values MUST be one of: | frame type. Values MUST be one of: | |||
| * "HTTP/2 only" | * "HTTP/2 only" | |||
| * "HTTP/QUIC only" | * "HTTP/QUIC only" | |||
| * "Both" | * "Both" | |||
| HTTP/QUIC Specification: Indicates where this frame's behavior over | HTTP/QUIC Specification: Indicates where this frame's behavior over | |||
| QUIC is defined; required if the frame is supported over QUIC. | QUIC is defined; required if the frame is supported over QUIC. | |||
| Values for existing registrations are assigned by this document: | Values for existing registrations are assigned by this document: | |||
| +---+---------------+---------------------+-------------------------+ | +---------------+---------------------+-------------------------+ | |||
| | | Frame Type | Supported Protocols | HTTP/QUIC Specification | | | Frame Type | Supported Protocols | HTTP/QUIC Specification | | |||
| +---+---------------+---------------------+-------------------------+ | +---------------+---------------------+-------------------------+ | |||
| | | DATA | HTTP/2 only | N/A | | | DATA | HTTP/2 only | N/A | | |||
| | | | | | | | | | | | |||
| | | HEADERS | Both | Section 5.2.2 | | | HEADERS | Both | Section 5.2.1 | | |||
| | | | | | | | | | | | |||
| | | PRIORITY | Both | Section 5.2.3 | | | PRIORITY | Both | Section 5.2.2 | | |||
| | | | | | | | | | | | |||
| | | RST_STREAM | HTTP/2 only | N/A | | | RST_STREAM | HTTP/2 only | N/A | | |||
| | | | | | | | | | | | |||
| | | SETTINGS | Both | Section 5.2.5 | | | SETTINGS | Both | Section 5.2.3 | | |||
| | | | | | | | | | | | |||
| | | PUSH_PROMISE | Both | Section 5.2.6 | | | PUSH_PROMISE | Both | Section 5.2.4 | | |||
| | | | | | | | | | | | |||
| | | PING | HTTP/2 only | N/A | | | PING | HTTP/2 only | N/A | | |||
| | | | | | | | | | | | |||
| | | GOAWAY | HTTP/2 only | N/A | | | GOAWAY | HTTP/2 only | N/A | | |||
| | | | | | | | | | | | |||
| | | WINDOW_UPDATE | HTTP/2 only | N/A | | | WINDOW_UPDATE | HTTP/2 only | N/A | | |||
| | | | | | | | | | | | |||
| | | CONTINUATION | HTTP/2 only | N/A | | | CONTINUATION | HTTP/2 only | N/A | | |||
| +---+---------------+---------------------+-------------------------+ | +---------------+---------------------+-------------------------+ | |||
| The "Specification" column is renamed to "HTTP/2 specification" and | The "Specification" column is renamed to "HTTP/2 specification" and | |||
| is only required if the frame is supported over HTTP/2. | is only required if the frame is supported over HTTP/2. | |||
| 8.4. New Frame Types | 9.4. Settings Parameters | |||
| This document adds one new entry to the "HTTP/2 Frame Type" registry | This document adds two new columns to the "HTTP/2 Settings" registry | |||
| defined in [RFC7540]: | defined in [RFC7540]: | |||
| Frame Type: SETTINGS_ACK | Supported Protocols: Indicates which associated protocols use the | |||
| setting. Values MUST be one of: | ||||
| Code: 0x0b | * "HTTP/2 only" | |||
| HTTP/2 Specification: N/A | * "HTTP/QUIC only" | |||
| Supported Protocols: HTTP/QUIC only | * "Both" | |||
| HTTP/QUIC Specification: Section 5.2.11 | HTTP/QUIC Specification: Indicates where this setting's behavior | |||
| over QUIC is defined; required if the frame is supported over | ||||
| QUIC. | ||||
| 9. References | Values for existing registrations are assigned by this document: | |||
| 9.1. Normative References | +-------------------------+------------------+----------------------+ | |||
| | 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 | | ||||
| +-------------------------+------------------+----------------------+ | ||||
| [QUIC-TLS] | The "Specification" column is renamed to "HTTP/2 Specification" and | |||
| Thomson, M., Ed. and S. Turner, Ed, Ed., "Using Transport | is only required if the setting is supported over HTTP/2. | |||
| Layer Security (TLS) to Secure QUIC". | ||||
| 9.5. Error Codes | ||||
| This document establishes a registry for HTTP/QUIC error codes. The | ||||
| "HTTP/QUIC Error Code" registry manages a 30-bit space. The "HTTP/ | ||||
| QUIC Error Code" registry operates under the "Expert Review" policy | ||||
| [RFC5226]. | ||||
| Registrations for error codes are required to include a description | ||||
| of the error code. An expert reviewer is advised to examine new | ||||
| registrations for possible duplication with existing error codes. | ||||
| Use of existing registrations is to be encouraged, but not mandated. | ||||
| New registrations are advised to provide the following information: | ||||
| Name: A name for the error code. Specifying an error code name is | ||||
| optional. | ||||
| Code: The 30-bit error code value. | ||||
| Description: A brief description of the error code semantics, longer | ||||
| if no detailed specification is provided. | ||||
| Specification: An optional reference for a specification that | ||||
| defines the error code. | ||||
| The entries in the following table are registered by this document. | ||||
| +------------------------------+-----+--------------+---------------+ | ||||
| | Name | Cod | Description | Specification | | ||||
| | | e | | | | ||||
| +------------------------------+-----+--------------+---------------+ | ||||
| | HTTP_PUSH_REFUSED | 0x0 | Client | Section 6.1 | | ||||
| | | 1 | refused | | | ||||
| | | | pushed | | | ||||
| | | | content | | | ||||
| | | | | | | ||||
| | HTTP_INTERNAL_ERROR | 0x0 | Internal | Section 6.1 | | ||||
| | | 2 | error | | | ||||
| | | | | | | ||||
| | HTTP_PUSH_ALREADY_IN_CACHE | 0x0 | Pushed | Section 6.1 | | ||||
| | | 3 | content | | | ||||
| | | | already | | | ||||
| | | | cached | | | ||||
| | | | | | | ||||
| | HTTP_REQUEST_CANCELLED | 0x0 | Data no | Section 6.1 | | ||||
| | | 4 | longer | | | ||||
| | | | needed | | | ||||
| | | | | | | ||||
| | HTTP_HPACK_DECOMPRESSION_FAI | 0x0 | HPACK cannot | Section 6.1 | | ||||
| | LED | 5 | continue | | | ||||
| | | | | | | ||||
| | HTTP_CONNECT_ERROR | 0x0 | TCP reset or | Section 6.1 | | ||||
| | | 6 | error on | | | ||||
| | | | CONNECT | | | ||||
| | | | request | | | ||||
| | | | | | | ||||
| | HTTP_EXCESSIVE_LOAD | 0x0 | Peer | Section 6.1 | | ||||
| | | 7 | generating | | | ||||
| | | | excessive | | | ||||
| | | | load | | | ||||
| | | | | | | ||||
| | HTTP_VERSION_FALLBACK | 0x0 | Retry over | Section 6.1 | | ||||
| | | 8 | HTTP/2 | | | ||||
| | | | | | | ||||
| | HTTP_MALFORMED_HEADERS | 0x0 | Invalid | Section 6.1 | | ||||
| | | 9 | HEADERS | | | ||||
| | | | frame | | | ||||
| | | | | | | ||||
| | HTTP_MALFORMED_PRIORITY | 0x0 | Invalid | Section 6.1 | | ||||
| | | A | PRIORITY | | | ||||
| | | | frame | | | ||||
| | | | | | | ||||
| | HTTP_MALFORMED_SETTINGS | 0x0 | Invalid | Section 6.1 | | ||||
| | | B | SETTINGS | | | ||||
| | | | frame | | | ||||
| | | | | | | ||||
| | HTTP_MALFORMED_PUSH_PROMISE | 0x0 | Invalid | Section 6.1 | | ||||
| | | C | PUSH_PROMISE | | | ||||
| | | | frame | | | ||||
| | | | | | | ||||
| | HTTP_INTERRUPTED_HEADERS | 0x0 | Incomplete | Section 6.1 | | ||||
| | | E | HEADERS | | | ||||
| | | | block | | | ||||
| | | | | | | ||||
| | HTTP_SETTINGS_ON_WRONG_STREA | 0x0 | SETTINGS | Section 6.1 | | ||||
| | M | F | frame on a | | | ||||
| | | | request | | | ||||
| | | | control | | | ||||
| | | | stream | | | ||||
| | | | | | | ||||
| | HTTP_MULTIPLE_SETTINGS | 0x1 | Multiple | Section 6.1 | | ||||
| | | 0 | SETTINGS | | | ||||
| | | | frames | | | ||||
| | | | | | | ||||
| | HTTP_RST_CONTROL_STREAM | 0x1 | Message | Section 6.1 | | ||||
| | | 1 | control | | | ||||
| | | | stream was | | | ||||
| | | | RST | | | ||||
| +------------------------------+-----+--------------+---------------+ | ||||
| 10. 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". | Multiplexed and Secure Transport". | |||
| [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 | |||
| skipping to change at page 24, line 18 ¶ | skipping to change at page 26, line 23 ¶ | |||
| <http://www.rfc-editor.org/info/rfc7540>. | <http://www.rfc-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>. | <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>. | |||
| 9.2. Informative References | 10.2. Informative References | |||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | ||||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | ||||
| DOI 10.17487/RFC5226, May 2008, | ||||
| <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-00: | B.1. Since draft-ietf-quic-http-01: | |||
| o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout | o SETTINGS changes (#181): | |||
| * SETTINGS can be sent only once at the start of a connection; no | ||||
| changes thereafter | ||||
| * SETTINGS_ACK removed | ||||
| * Settings can only occur in the SETTINGS frame a single time | ||||
| * Boolean format updated | ||||
| o Alt-Svc parameter changed from "v" to "quic"; format updated | ||||
| (#229) | ||||
| o Closing the connection control stream or any message control | ||||
| stream is a fatal error (#176) | ||||
| o HPACK Sequence counter can wrap (#173) | ||||
| o 0-RTT guidance added | ||||
| o Guide to differences from HTTP/2 and porting HTTP/2 extensions | ||||
| added (#127,#242) | ||||
| B.2. Since draft-ietf-quic-http-00: | ||||
| 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 | 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. | order (#75) | |||
| o Described CONNECT pseudo-method | o Described CONNECT pseudo-method (#95) | |||
| o Updated ALPN token and Alt-Svc guidance | o Updated ALPN token and Alt-Svc guidance (#13,#87) | |||
| o Application-layer-defined error codes | o Application-layer-defined error codes (#19,#74) | |||
| B.2. Since draft-shade-quic-http2-mapping-00: | B.3. 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. 105 change blocks. | ||||
| 405 lines changed or deleted | 543 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/ | ||||