| draft-ietf-quic-http-12.txt | draft-ietf-quic-http-13.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track May 22, 2018 | Intended status: Standards Track June 28, 2018 | |||
| Expires: November 23, 2018 | Expires: December 30, 2018 | |||
| Hypertext Transfer Protocol (HTTP) over QUIC | Hypertext Transfer Protocol (HTTP) over QUIC | |||
| draft-ietf-quic-http-12 | draft-ietf-quic-http-13 | |||
| Abstract | Abstract | |||
| The QUIC transport protocol has several features that are desirable | The QUIC transport protocol has several features that are desirable | |||
| in a transport for HTTP, such as stream multiplexing, per-stream flow | in a transport for HTTP, such as stream multiplexing, per-stream flow | |||
| control, and low-latency connection establishment. This document | control, and low-latency connection establishment. This document | |||
| describes a mapping of HTTP semantics over QUIC. This document also | describes a mapping of HTTP semantics over QUIC. This document also | |||
| identifies HTTP/2 features that are subsumed by QUIC, and describes | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| how HTTP/2 extensions can be ported to QUIC. | how HTTP/2 extensions can be ported to QUIC. | |||
| skipping to change at page 1, line 45 ¶ | skipping to change at page 1, line 45 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on November 23, 2018. | This Internet-Draft will expire on December 30, 2018. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 25 ¶ | skipping to change at page 2, line 25 ¶ | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 | 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 | |||
| 2. Connection Setup and Management . . . . . . . . . . . . . . . 4 | 2. Connection Setup and Management . . . . . . . . . . . . . . . 4 | |||
| 2.1. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 4 | 2.1. Draft Version Identification . . . . . . . . . . . . . . 4 | |||
| 2.1.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 5 | 2.2. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 5 | |||
| 2.2. Connection Establishment . . . . . . . . . . . . . . . . 5 | 2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 5 | |||
| 2.2.1. Draft Version Identification . . . . . . . . . . . . 6 | 2.3. Connection Establishment . . . . . . . . . . . . . . . . 6 | |||
| 2.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 | 2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 | |||
| 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. Control Streams . . . . . . . . . . . . . . . . . . . . . 8 | 3.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 7 | |||
| 3.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 8 | 3.1.1. Header Compression . . . . . . . . . . . . . . . . . 9 | |||
| 3.2.1. Header Compression . . . . . . . . . . . . . . . . . 9 | 3.1.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 | |||
| 3.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 | 3.1.3. Request Cancellation . . . . . . . . . . . . . . . . 10 | |||
| 3.2.3. Request Cancellation . . . . . . . . . . . . . . . . 10 | 3.2. Request Prioritization . . . . . . . . . . . . . . . . . 10 | |||
| 3.3. Request Prioritization . . . . . . . . . . . . . . . . . 11 | 3.2.1. Placeholders . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 11 | 3.2.2. Priority Tree Maintenance . . . . . . . . . . . . . . 11 | |||
| 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 12 | 3.3. Unidirectional Streams . . . . . . . . . . . . . . . . . 12 | |||
| 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 13 | 3.3.1. Control Streams . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 13 | 3.3.2. Server Push . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 13 | 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 16 | 4.2.1. Reserved Frame Types . . . . . . . . . . . . . . . . 15 | |||
| 4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 17 | 4.2.2. DATA . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 19 | 4.2.3. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 20 | 4.2.4. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 22 | 4.2.5. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 5. Connection Management . . . . . . . . . . . . . . . . . . . . 23 | 4.2.6. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24 | 4.2.7. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 21 | |||
| 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 24 | 4.2.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 25 | 4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
| 7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 25 | 5. Connection Management . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 27 | 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 28 | 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 26 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 29 | 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 28 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29 | 7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 9.1. Registration of HTTP/QUIC Identification String . . . . . 29 | 7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 28 | |||
| 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 30 | 7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 30 | |||
| 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 30 | 7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 31 | |||
| 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 31 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 32 | |||
| 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 32 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 34 | 9.1. Registration of HTTP/QUIC Identification String . . . . . 32 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 34 | 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 33 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 35 | 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 34 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 36 | 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 36 | 9.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| B.1. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 36 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| B.2. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 36 | 10.1. Normative References . . . . . . . . . . . . . . . . . . 38 | |||
| B.3. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 36 | 10.2. Informative References . . . . . . . . . . . . . . . . . 39 | |||
| B.4. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 36 | 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| B.5. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 36 | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 40 | |||
| B.6. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 37 | A.1. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 40 | |||
| B.7. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 37 | A.2. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 40 | |||
| B.8. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 37 | A.3. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 40 | |||
| B.9. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 37 | A.4. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 41 | |||
| B.10. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 37 | A.5. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 41 | |||
| B.11. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 37 | A.6. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 41 | |||
| B.12. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 38 | A.7. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 41 | |||
| B.13. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 38 | A.8. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 41 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 38 | A.9. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 41 | |||
| A.10. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 42 | ||||
| A.11. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 42 | ||||
| A.12. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 42 | ||||
| A.13. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 42 | ||||
| A.14. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 43 | ||||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 43 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 43 | ||||
| 1. Introduction | 1. Introduction | |||
| The QUIC transport protocol has several features that are desirable | The QUIC transport protocol has several features that are desirable | |||
| in a transport for HTTP, such as stream multiplexing, per-stream flow | in a transport for HTTP, such as stream multiplexing, per-stream flow | |||
| control, and low-latency connection establishment. This document | control, and low-latency connection establishment. This document | |||
| describes a mapping of HTTP semantics over QUIC, drawing heavily on | describes a mapping of HTTP semantics over QUIC, drawing heavily on | |||
| the existing TCP mapping, HTTP/2. Specifically, this document | the existing TCP mapping, HTTP/2. Specifically, this document | |||
| identifies HTTP/2 features that are subsumed by QUIC, and describes | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| how the other features can be implemented atop QUIC. | how the other features can be implemented atop QUIC. | |||
| skipping to change at page 4, line 27 ¶ | skipping to change at page 4, line 30 ¶ | |||
| [QUIC-TRANSPORT]. | [QUIC-TRANSPORT]. | |||
| Protocol elements called "frames" exist in both this document and | Protocol elements called "frames" exist in both this document and | |||
| [QUIC-TRANSPORT]. Where frames from [QUIC-TRANSPORT] are referenced, | [QUIC-TRANSPORT]. Where frames from [QUIC-TRANSPORT] are referenced, | |||
| the frame name will be prefaced with "QUIC." For example, "QUIC | the frame name will be prefaced with "QUIC." For example, "QUIC | |||
| APPLICATION_CLOSE frames." References without this preface refer to | APPLICATION_CLOSE frames." References without this preface refer to | |||
| frames defined in Section 4.2. | frames defined in Section 4.2. | |||
| 2. Connection Setup and Management | 2. Connection Setup and Management | |||
| 2.1. Discovering an HTTP/QUIC Endpoint | 2.1. Draft Version Identification | |||
| *RFC Editor's Note:* Please remove this section prior to | ||||
| publication of a final version of this document. | ||||
| HTTP/QUIC uses the token "hq" to identify itself in ALPN and Alt-Svc. | ||||
| Only implementations of the final, published RFC can identify | ||||
| themselves as "hq". Until such an RFC exists, implementations MUST | ||||
| NOT identify themselves using this string. | ||||
| Implementations of draft versions of the protocol MUST add the string | ||||
| "-" and the corresponding draft number to the identifier. For | ||||
| example, draft-ietf-quic-http-01 is identified using the string "hq- | ||||
| 01". | ||||
| Non-compatible experiments that are based on these draft versions | ||||
| MUST append the string "-" and an experiment name to the identifier. | ||||
| For example, an experimental implementation based on draft-ietf-quic- | ||||
| http-09 which reserves an extra stream for unsolicited transmission | ||||
| of 1980s pop music might identify itself as "hq-09-rickroll". Note | ||||
| that any label MUST conform to the "token" syntax defined in | ||||
| Section 3.2.6 of [RFC7230]. Experimenters are encouraged to | ||||
| coordinate their experiments on the quic@ietf.org mailing list. | ||||
| 2.2. Discovering an HTTP/QUIC Endpoint | ||||
| An HTTP origin advertises the availability of an equivalent HTTP/QUIC | An HTTP origin advertises the availability of an equivalent HTTP/QUIC | |||
| endpoint via the Alt-Svc HTTP response header or the HTTP/2 ALTSVC | endpoint via the Alt-Svc HTTP response header or the HTTP/2 ALTSVC | |||
| frame ([RFC7838]), using the ALPN token defined in Section 2.2. | frame ([RFC7838]), using the ALPN token defined in Section 2.3. | |||
| For example, an origin could indicate in an HTTP/1.1 or HTTP/2 | For example, an origin could indicate in an HTTP/1.1 or HTTP/2 | |||
| response that HTTP/QUIC was available on UDP port 50781 at the same | response that HTTP/QUIC was available on UDP port 50781 at the same | |||
| hostname by including the following header in any response: | hostname by including the following header in any response: | |||
| Alt-Svc: hq=":50781" | Alt-Svc: hq=":50781" | |||
| On receipt of an Alt-Svc record indicating HTTP/QUIC support, a | On receipt of an Alt-Svc record indicating HTTP/QUIC support, a | |||
| client MAY attempt to establish a QUIC connection to the indicated | client MAY attempt to establish a QUIC connection to the indicated | |||
| host and port and, if successful, send HTTP requests using the | host and port and, if successful, send HTTP requests using the | |||
| mapping described in this document. | mapping described in this document. | |||
| Connectivity problems (e.g. firewall blocking UDP) can result in QUIC | Connectivity problems (e.g. firewall blocking UDP) can result in QUIC | |||
| connection establishment failure, in which case the client SHOULD | connection establishment failure, in which case the client SHOULD | |||
| continue using the existing connection or try another alternative | continue using the existing connection or try another alternative | |||
| endpoint offered by the origin. | endpoint offered by the origin. | |||
| Servers MAY serve HTTP/QUIC on any UDP port, since an alternative | Servers MAY serve HTTP/QUIC on any UDP port, since an alternative | |||
| always includes an explicit port. | always includes an explicit port. | |||
| 2.1.1. QUIC Version Hints | 2.2.1. QUIC Version Hints | |||
| This document defines the "quic" parameter for Alt-Svc, which MAY be | This document defines the "quic" parameter for Alt-Svc, which MAY be | |||
| used to provide version-negotiation hints to HTTP/QUIC clients. QUIC | used to provide version-negotiation hints to HTTP/QUIC clients. QUIC | |||
| versions are four-octet sequences with no additional constraints on | versions are four-octet sequences with no additional constraints on | |||
| format. Leading zeros SHOULD be omitted for brevity. | format. Leading zeros SHOULD be omitted for brevity. | |||
| Syntax: | Syntax: | |||
| quic = DQUOTE version-number [ "," version-number ] * DQUOTE | quic = DQUOTE version-number [ "," version-number ] * DQUOTE | |||
| version-number = 1*8HEXDIG; hex-encoded QUIC version | version-number = 1*8HEXDIG; hex-encoded QUIC version | |||
| skipping to change at page 5, line 40 ¶ | skipping to change at page 6, line 17 ¶ | |||
| reserved versions (from Section 4 of [QUIC-TRANSPORT]) 0x0 and | reserved versions (from Section 4 of [QUIC-TRANSPORT]) 0x0 and | |||
| 0x1abadaba, it could specify the following header: | 0x1abadaba, it could specify the following header: | |||
| Alt-Svc: hq=":49288";quic="1,1abadaba,51303334,0" | Alt-Svc: hq=":49288";quic="1,1abadaba,51303334,0" | |||
| A client acting on this header would drop the reserved versions | A client acting on this header would drop the reserved versions | |||
| (because it does not support them), then attempt to connect to the | (because it does not support them), then attempt to connect to the | |||
| alternative using the first version in the list which it does | alternative using the first version in the list which it does | |||
| support. | support. | |||
| 2.2. Connection Establishment | 2.3. Connection Establishment | |||
| HTTP/QUIC relies on QUIC as the underlying transport. The QUIC | HTTP/QUIC relies on QUIC as the underlying transport. The QUIC | |||
| version being used MUST use TLS version 1.3 or greater as its | version being used MUST use TLS version 1.3 or greater as its | |||
| handshake protocol. The Server Name Indication (SNI) extension | handshake protocol. HTTP/QUIC clients MUST indicate the target | |||
| [RFC6066] MUST be included in the TLS handshake. | domain name during the TLS handshake. This may be done using the | |||
| Server Name Indication (SNI) [RFC6066] extension to TLS or using some | ||||
| other mechanism. | ||||
| QUIC connections are established as described in [QUIC-TRANSPORT]. | QUIC connections are established as described in [QUIC-TRANSPORT]. | |||
| During connection establishment, HTTP/QUIC support is indicated by | During connection establishment, HTTP/QUIC support is indicated by | |||
| selecting the ALPN token "hq" in the TLS handshake. Support for | selecting the ALPN token "hq" in the TLS handshake. Support for | |||
| other application-layer protocols MAY be offered in the same | other application-layer protocols MAY be offered in the same | |||
| handshake. | handshake. | |||
| While connection-level options pertaining to the core QUIC protocol | While connection-level options pertaining to the core QUIC protocol | |||
| are set in the initial crypto handshake, HTTP-specific settings are | are set in the initial crypto handshake, HTTP/QUIC-specific settings | |||
| conveyed in the SETTINGS frame. After the QUIC connection is | are conveyed in the SETTINGS frame. After the QUIC connection is | |||
| established, a SETTINGS frame (Section 4.2.5) MUST be sent by each | established, a SETTINGS frame (Section 4.2.6) MUST be sent by each | |||
| endpoint as the initial frame of their respective HTTP control stream | endpoint as the initial frame of their respective HTTP control stream | |||
| (Stream ID 2 or 3, see Section 3). The server MUST NOT send data on | (see Section 3.3.1). The server MUST NOT send data on any other | |||
| any other stream until the client's SETTINGS frame has been received. | stream until the client's SETTINGS frame has been received. | |||
| 2.2.1. Draft Version Identification | ||||
| *RFC Editor's Note:* Please remove this section prior to | ||||
| publication of a final version of this document. | ||||
| Only implementations of the final, published RFC can identify | ||||
| themselves as "hq". Until such an RFC exists, implementations MUST | ||||
| NOT identify themselves using this string. | ||||
| Implementations of draft versions of the protocol MUST add the string | ||||
| "-" and the corresponding draft number to the identifier. For | ||||
| example, draft-ietf-quic-http-01 is identified using the string "hq- | ||||
| 01". | ||||
| Non-compatible experiments that are based on these draft versions | ||||
| MUST append the string "-" and an experiment name to the identifier. | ||||
| For example, an experimental implementation based on draft-ietf-quic- | ||||
| http-09 which reserves an extra stream for unsolicited transmission | ||||
| of 1980s pop music might identify itself as "hq-09-rickroll". Note | ||||
| that any label MUST conform to the "token" syntax defined in | ||||
| Section 3.2.6 of [RFC7230]. Experimenters are encouraged to | ||||
| coordinate their experiments on the quic@ietf.org mailing list. | ||||
| 2.3. Connection Reuse | 2.4. Connection Reuse | |||
| Once a connection exists to a server endpoint, this connection MAY be | Once a connection exists to a server endpoint, this connection MAY be | |||
| reused for requests with multiple different URI authority components. | reused for requests with multiple different URI authority components. | |||
| The client MAY send any requests for which the client considers the | The client MAY send any requests for which the client considers the | |||
| server authoritative. | server authoritative. | |||
| An authoritative HTTP/QUIC endpoint is typically discovered because | An authoritative HTTP/QUIC endpoint is typically discovered because | |||
| the client has received an Alt-Svc record from the request's origin | the client has received an Alt-Svc record from the request's origin | |||
| which nominates the endpoint as a valid HTTP Alternative Service for | which nominates the endpoint as a valid HTTP Alternative Service for | |||
| that origin. As required by [RFC7838], clients MUST check that the | that origin. As required by [RFC7838], clients MUST check that the | |||
| skipping to change at page 7, line 19 ¶ | skipping to change at page 7, line 21 ¶ | |||
| 3. Stream Mapping and Usage | 3. Stream Mapping and Usage | |||
| 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 the first client-initiated, bidirectional stream | ||||
| (Stream 0) for cryptographic operations. HTTP over QUIC reserves the | ||||
| first unidirectional stream sent by either peer (Streams 2 and 3) for | ||||
| sending and receiving HTTP control frames. This pair of | ||||
| unidirectional streams is analogous to HTTP/2's Stream 0. HTTP over | ||||
| QUIC also reserves the second and third unidirectional streams for | ||||
| each peer's QPACK encoder and decoder. The client's QPACK encoder | ||||
| uses stream 6 and decoder uses stream 10. The server's encoder and | ||||
| decoder use streams 7 and 11, respectively. The data sent on these | ||||
| streams is critical to the HTTP connection. If any 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. | most of the stream management. | |||
| An HTTP request/response consumes a single client-initiated, | All client-initiated bidirectional streams are used for HTTP requests | |||
| bidirectional stream. A bidirectional stream ensures that the | and responses. A bidirectional stream ensures that the response can | |||
| response can be readily correlated with the request. This means that | be readily correlated with the request. This means that the client's | |||
| the client's first request occurs on QUIC stream 4, with subsequent | first request occurs on QUIC stream 0, with subsequent requests on | |||
| requests on stream 8, 12, and so on. | stream 4, 8, and so on. HTTP/QUIC does not use server-initiated | |||
| bidirectional streams. The use of unidirectional streams is | ||||
| Server push uses server-initiated, unidirectional streams. Thus, the | discussed in Section 3.3. | |||
| server's first push consumes stream 7 and subsequent pushes use | ||||
| stream 11, 15, and so on. | ||||
| These streams carry frames related to the request/response (see | These streams carry frames related to the request/response (see | |||
| Section 4.2). When a stream terminates cleanly, if the last frame on | Section 4.2). When a stream terminates cleanly, if the last frame on | |||
| the stream was truncated, this MUST be treated as a connection error | the stream was truncated, this MUST be treated as a connection error | |||
| (see HTTP_MALFORMED_FRAME in Section 6.1). Streams which terminate | (see HTTP_MALFORMED_FRAME in Section 6.1). Streams which terminate | |||
| abruptly may be reset at any point in the frame. | abruptly may be reset at any point in the frame. | |||
| Streams SHOULD be used sequentially, with no gaps. | ||||
| HTTP does not need to do any separate multiplexing when using QUIC - | HTTP does not need to do any separate multiplexing when using QUIC - | |||
| data sent over a QUIC stream always maps to a particular HTTP | data sent over a QUIC stream always maps to a particular HTTP | |||
| transaction. Requests and responses are considered complete when the | transaction. Requests and responses are considered complete when the | |||
| corresponding QUIC stream is closed in the appropriate direction. | corresponding QUIC stream is closed in the appropriate direction. | |||
| 3.1. Control Streams | 3.1. HTTP Message Exchanges | |||
| Since most connection-level concerns will be managed by QUIC, the | ||||
| primary use of Streams 2 and 3 will be for the SETTINGS frame when | ||||
| the connection opens and for PRIORITY frames subsequently. | ||||
| A pair of unidirectional streams is used rather than a single | ||||
| bidirectional stream. This allows either peer to send data as soon | ||||
| they are able. Depending on whether 0-RTT is enabled on the | ||||
| connection, either client or server might be able to send stream data | ||||
| first after the cryptographic handshake completes. | ||||
| 3.2. HTTP Message Exchanges | ||||
| A client sends an HTTP request on a client-initiated, bidirectional | A client sends an HTTP request on a client-initiated bidirectional | |||
| QUIC stream. A server sends an HTTP response on the same stream as | QUIC stream. A server sends an HTTP response on the same stream as | |||
| the request. | the request. | |||
| An HTTP message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
| 1. one header block (see Section 4.2.2) containing the message | 1. one header block (see Section 4.2.3) containing the message | |||
| headers (see [RFC7230], Section 3.2), | headers (see [RFC7230], Section 3.2), | |||
| 2. the payload body (see [RFC7230], Section 3.3), sent as a series | 2. the payload body (see [RFC7230], Section 3.3), sent as a series | |||
| of DATA frames (see Section 4.2.1), | of DATA frames (see Section 4.2.2), | |||
| 3. optionally, one header block containing the trailer-part, if | 3. optionally, one header block containing the trailer-part, if | |||
| present (see [RFC7230], Section 4.1.2). | present (see [RFC7230], Section 4.1.2). | |||
| In addition, prior to sending the message header block indicated | In addition, prior to sending the message header block indicated | |||
| above, a response may contain zero or more header blocks containing | above, a response may contain zero or more header blocks containing | |||
| the message headers of informational (1xx) HTTP responses (see | the message headers of informational (1xx) HTTP responses (see | |||
| [RFC7230], Section 3.2 and [RFC7231], Section 6.2). | [RFC7230], Section 3.2 and [RFC7231], Section 6.2). | |||
| PUSH_PROMISE frames MAY be interleaved with the frames of a response | PUSH_PROMISE frames (see Section 4.2.7) MAY be interleaved with the | |||
| message indicating a pushed resource related to the response. These | frames of a response message indicating a pushed resource related to | |||
| PUSH_PROMISE frames are not part of the response, but carry the | the response. These PUSH_PROMISE frames are not part of the | |||
| headers of a separate HTTP request message. See Section 3.4 for more | response, but carry the headers of a separate HTTP request message. | |||
| details. | See Section 3.3.2 for more details. | |||
| The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | |||
| MUST NOT be used. | MUST NOT be used. | |||
| Trailing header fields are carried in an additional header block | Trailing header fields are carried in an additional header block | |||
| following the body. Such a header block is a sequence of HEADERS | following the body. Senders MUST send only one header block in the | |||
| frames with End Header Block set on the last frame. Senders MUST | trailers section; receivers MUST discard any subsequent header | |||
| send only one header block in the trailers section; receivers MUST | blocks. | |||
| discard any subsequent header blocks. | ||||
| An HTTP request/response exchange fully consumes a QUIC stream. | An HTTP request/response exchange fully consumes a QUIC stream. | |||
| After sending a request, a client closes the stream for sending; | After sending a request, a client closes the stream for sending; | |||
| after sending a response, the server closes the stream for sending | after sending a response, the server closes the stream for sending | |||
| and the QUIC stream is fully closed. | and the QUIC stream is fully closed. | |||
| A server can send a complete response prior to the client sending an | A server can send a complete response prior to the client sending an | |||
| entire request if the response does not depend on any portion of the | entire request if the response does not depend on any portion of the | |||
| request that has not been sent and received. When this is true, a | request that has not been sent and received. When this is true, a | |||
| server MAY request that the client abort transmission of a request | server MAY request that the client abort transmission of a request | |||
| without error by triggering a QUIC STOP_SENDING with error code | without error by triggering a QUIC STOP_SENDING with error code | |||
| HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing | HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing | |||
| its streams. Clients MUST NOT discard complete responses as a result | its streams. Clients MUST NOT discard complete responses as a result | |||
| of having their request terminated abruptly, though clients can | of having their request terminated abruptly, though clients can | |||
| always discard responses at their discretion for other reasons. | always discard responses at their discretion for other reasons. | |||
| Servers MUST NOT abort a response in progress as a result of | Servers MUST NOT abort a response in progress as a result of | |||
| receiving a solicited RST_STREAM. | receiving a solicited RST_STREAM. | |||
| 3.2.1. Header Compression | 3.1.1. Header Compression | |||
| HTTP/QUIC uses QPACK header compression as described in [QPACK], a | HTTP/QUIC uses QPACK header compression as described in [QPACK], a | |||
| variation of HPACK which allows the flexibility to avoid header- | variation of HPACK which allows the flexibility to avoid header- | |||
| compression-induced head-of-line blocking. See that document for | compression-induced head-of-line blocking. See that document for | |||
| additional details. | additional details. | |||
| 3.2.2. The CONNECT Method | 3.1.2. The CONNECT Method | |||
| The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily | The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily | |||
| used with HTTP proxies to establish a TLS session with an origin | used with HTTP proxies to establish a TLS session with an origin | |||
| server for the purposes of interacting with "https" resources. In | server for the purposes of interacting with "https" resources. In | |||
| HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a | HTTP/1.x, CONNECT is used to convert an entire HTTP connection into a | |||
| tunnel to a remote host. In HTTP/2, the CONNECT method is used to | tunnel to a remote host. In HTTP/2, the CONNECT method is used to | |||
| establish a tunnel over a single HTTP/2 stream to a remote host for | establish a tunnel over a single HTTP/2 stream to a remote host for | |||
| similar purposes. | similar purposes. | |||
| A CONNECT request in HTTP/QUIC functions in the same manner as in | A CONNECT request in HTTP/QUIC functions in the same manner as in | |||
| skipping to change at page 10, line 32 ¶ | skipping to change at page 10, line 9 ¶ | |||
| so clients SHOULD NOT cause send a STREAM frame with a FIN bit for | so clients SHOULD NOT cause send a STREAM frame with a FIN bit for | |||
| connections on which they are still expecting data. | connections on which they are still expecting data. | |||
| A TCP connection error is signaled with RST_STREAM. A proxy treats | A TCP connection error is signaled with RST_STREAM. A proxy treats | |||
| any error in the TCP connection, which includes receiving a TCP | any error in the TCP connection, which includes receiving a TCP | |||
| segment with the RST bit set, as a stream error of type | segment with the RST bit set, as a stream error of type | |||
| HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send | HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send | |||
| a TCP segment with the RST bit set if it detects an error with the | a TCP segment with the RST bit set if it detects an error with the | |||
| stream or the QUIC connection. | stream or the QUIC connection. | |||
| 3.2.3. Request Cancellation | 3.1.3. Request Cancellation | |||
| Either client or server can cancel requests by closing the stream | Either client or server can cancel requests by closing the stream | |||
| (QUIC RST_STREAM or STOP_SENDING frames, as appropriate) with an | (QUIC RST_STREAM or STOP_SENDING frames, as appropriate) with an | |||
| error type of HTTP_REQUEST_CANCELLED (Section 6.1). When the client | error type of HTTP_REQUEST_CANCELLED (Section 6.1). When the client | |||
| cancels a request or response, it indicates that the response is no | cancels a request or response, it indicates that the response is no | |||
| longer of interest. | longer of interest. | |||
| When the server cancels either direction of the request stream using | When the server cancels either direction of the request stream using | |||
| HTTP_REQUEST_CANCELLED, it indicates that no application processing | HTTP_REQUEST_CANCELLED, it indicates that no application processing | |||
| was performed. The client can treat requests cancelled by the server | was performed. The client can treat requests cancelled by the server | |||
| skipping to change at page 11, line 12 ¶ | skipping to change at page 10, line 36 ¶ | |||
| stream was passed to some higher layer of software that might have | stream was passed to some higher layer of software that might have | |||
| taken some action as a result. | taken some action as a result. | |||
| If a stream is cancelled after receiving a complete response, the | If a stream is cancelled after receiving a complete response, the | |||
| client MAY ignore the cancellation and use the response. However, if | client MAY ignore the cancellation and use the response. However, if | |||
| a stream is cancelled after receiving a partial response, the | a stream is cancelled after receiving a partial response, the | |||
| response SHOULD NOT be used. Automatically retrying such requests is | response SHOULD NOT be used. Automatically retrying such requests is | |||
| not possible, unless this is otherwise permitted (e.g., idempotent | not possible, unless this is otherwise permitted (e.g., idempotent | |||
| actions like GET, PUT, or DELETE). | actions like GET, PUT, or DELETE). | |||
| 3.3. Request Prioritization | 3.2. Request Prioritization | |||
| HTTP/QUIC uses the priority scheme described in [RFC7540], | HTTP/QUIC uses a priority scheme similar to that described in | |||
| Section 5.3. In this priority scheme, a given request can be | [RFC7540], Section 5.3. In this priority scheme, a given stream can | |||
| designated as dependent upon another request, which expresses the | be designated as dependent upon another request, which expresses the | |||
| preference that the latter stream (the "parent" request) be allocated | preference that the latter stream (the "parent" request) be allocated | |||
| resources before the former stream (the "dependent" request). Taken | resources before the former stream (the "dependent" request). Taken | |||
| together, the dependencies across all requests in a connection form a | together, the dependencies across all requests in a connection form a | |||
| dependency tree. The structure of the dependency tree changes as | dependency tree. The structure of the dependency tree changes as | |||
| PRIORITY frames add, remove, or change the dependency links between | PRIORITY frames add, remove, or change the dependency links between | |||
| requests. | requests. | |||
| The PRIORITY frame Section 4.2.3 identifies a request either by | The PRIORITY frame Section 4.2.4 identifies a prioritized element. | |||
| identifying the stream that carries a request or by using a Push ID | The elements which can be prioritized are: | |||
| (Section 4.2.6). | ||||
| o Requests, identified by the ID of the request stream | ||||
| o Pushes, identified by the Push ID of the promised resource | ||||
| (Section 4.2.7) | ||||
| o Placeholders, identified by a Placeholder ID | ||||
| An element can depend on another element or on the root of the tree. | ||||
| A reference to an element which is no longer in the tree is treated | ||||
| as a reference to the root of the tree. | ||||
| Only a client can send PRIORITY frames. A server MUST NOT send a | Only a client can send PRIORITY frames. A server MUST NOT send a | |||
| PRIORITY frame. | PRIORITY frame. | |||
| 3.4. Server Push | 3.2.1. Placeholders | |||
| HTTP/QUIC supports server push in a similar manner to [RFC7540], but | In HTTP/2, certain implementations used closed or unused streams as | |||
| uses different mechanisms. During connection establishment, the | placeholders in describing the relative priority of requests. | |||
| However, this created confusion as servers could not reliably | ||||
| identify which elements of the priority tree could safely be | ||||
| discarded. Clients could potentially reference closed streams long | ||||
| after the server had discarded state, leading to disparate views of | ||||
| the prioritization the client had attempted to express. | ||||
| In HTTP/QUIC, a number of placeholders are explicitly permitted by | ||||
| the server using the "SETTINGS_NUM_PLACEHOLDERS" setting. Because | ||||
| the server commits to maintain these IDs in the tree, clients can use | ||||
| them with confidence that the server will not have discarded the | ||||
| state. | ||||
| Placeholders are identified by an ID between zero and one less than | ||||
| the number of placeholders the server has permitted. | ||||
| 3.2.2. Priority Tree Maintenance | ||||
| Servers can aggressively prune inactive regions from the priority | ||||
| tree, because placeholders will be used to "root" any persistent | ||||
| structure of the tree which the client cares about retaining. For | ||||
| prioritization purposes, a node in the tree is considered "inactive" | ||||
| when the corresponding stream has been closed for at least two round- | ||||
| trip times (using any reasonable estimate available on the server). | ||||
| This delay helps mitigate race conditions where the server has pruned | ||||
| a node the client believed was still active and used as a Stream | ||||
| Dependency. | ||||
| Specifically, the server MAY at any time: | ||||
| o Identify and discard branches of the tree containing only inactive | ||||
| nodes (i.e. a node with only other inactive nodes as descendants, | ||||
| along with those descendants) | ||||
| o Identify and condense interior regions of the tree containing only | ||||
| inactive nodes, allocating weight appropriately | ||||
| x x x | ||||
| | | | | ||||
| P P P | ||||
| / \ | | | ||||
| I I ==> I ==> A | ||||
| / \ | | | ||||
| A I A A | ||||
| | | | ||||
| A A | ||||
| Figure 1: Example of Priority Tree Pruning | ||||
| In the example in Figure 1, "P" represents a Placeholder, "A" | ||||
| represents an active node, and "I" represents an inactive node. In | ||||
| the first step, the server discards two inactive branches (each a | ||||
| single node). In the second step, the server condenses an interior | ||||
| inactive node. Note that these transformations will result in no | ||||
| change in the resources allocated to a particular active stream. | ||||
| Clients SHOULD assume the server is actively performing such pruning | ||||
| and SHOULD NOT declare a dependency on a stream it knows to have been | ||||
| closed. | ||||
| 3.3. Unidirectional Streams | ||||
| Unidirectional streams, in either direction, are used for a range of | ||||
| purposes. The purpose is indicated by a stream type, which is sent | ||||
| as a single octet header at the start of the stream. The format and | ||||
| structure of data that follows this header is determined by the | ||||
| stream type. | ||||
| 0 1 2 3 4 5 6 7 | ||||
| +-+-+-+-+-+-+-+-+ | ||||
| |Stream Type (8)| | ||||
| +-+-+-+-+-+-+-+-+ | ||||
| Figure 2: Unidirectional Stream Header | ||||
| Two stream types are defined in this document: control streams | ||||
| (Section 3.3.1) and push streams (Section 3.3.2). Other stream types | ||||
| can be defined by extensions to HTTP/QUIC. | ||||
| If the stream header indicates a stream type which is not supported | ||||
| by the recipient, this SHOULD be treated as a stream error of type | ||||
| HTTP_UNKNOWN_STREAM_TYPE. The semantics of the remainder of the | ||||
| stream are unknown. Implementations SHOULD NOT send stream types the | ||||
| peer is not already known to support, since a stream error can be | ||||
| promoted to a connection error at the peer's discretion (see | ||||
| Section 6). | ||||
| 3.3.1. Control Streams | ||||
| The control stream is indicated by a stream type of "0x43" (ASCII | ||||
| 'C'). Data on this stream consists of HTTP frames, as defined in | ||||
| Section 4.2. | ||||
| Each side MUST initiate a single control stream at the beginning of | ||||
| the connection and send its SETTINGS frame as the first frame on this | ||||
| stream. Only one control stream per peer is permitted; receipt of a | ||||
| second stream which claims to be a control stream MUST be treated as | ||||
| a connection error of type HTTP_WRONG_STREAM_COUNT. If the control | ||||
| stream is closed at any point, this MUST be treated as a connection | ||||
| error of type HTTP_CLOSED_CRITICAL_STREAM. | ||||
| A pair of unidirectional streams is used rather than a single | ||||
| bidirectional stream. This allows either peer to send data as soon | ||||
| they are able. Depending on whether 0-RTT is enabled on the | ||||
| connection, either client or server might be able to send stream data | ||||
| first after the cryptographic handshake completes. | ||||
| 3.3.2. Server Push | ||||
| HTTP/QUIC server push is similar to what is described in [RFC7540], | ||||
| but uses different mechanisms. During connection establishment, the | ||||
| client enables server push by sending a MAX_PUSH_ID frame (see | client enables server push by sending a MAX_PUSH_ID frame (see | |||
| Section 4.2.8). A server cannot use server push until it receives a | Section 4.2.9). A server cannot use server push until it receives a | |||
| MAX_PUSH_ID frame. | MAX_PUSH_ID frame. Only servers can push; if a server receives a | |||
| client-initiated push stream, this MUST be treated as a stream error | ||||
| of type HTTP_WRONG_STREAM_DIRECTION. | ||||
| As with server push for HTTP/2, the server initiates a server push by | A push stream is indicated by a stream type of "0x50" (ASCII 'P'), | |||
| sending a PUSH_PROMISE frame (see Section 4.2.6) that includes | followed by the Push ID of the promise that it fulfills, encoded as a | |||
| request headers for the promised request. Promised requests MUST | variable-length integer. | |||
| conform to the requirements in Section 8.2 of [RFC7540]. | ||||
| The PUSH_PROMISE frame is sent on the client-initiated, bidirectional | 0 1 2 3 | |||
| stream that carried the request that generated the push. This allows | 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 | |||
| the server push to be associated with a request. Ordering of a | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| PUSH_PROMISE in relation to certain parts of the response is | |Stream Type (8)| Push ID (i) ... | |||
| important (see Section 8.2.1 of [RFC7540]). | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: Push Stream Header | ||||
| Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it | Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it | |||
| contains a Push ID. The Push ID uniquely identifies a server push. | contains a Push ID. The Push ID uniquely identifies a server push. | |||
| This allows a server to fulfill promises in the order that best suits | This allows a server to fulfill promises in the order that best suits | |||
| its needs. | its needs. When a server later fulfills a promise, the server push | |||
| response is conveyed on a push stream. | ||||
| When a server later fulfills a promise, the server push response is | ||||
| conveyed on a push stream. A push stream is a server-initiated, | ||||
| unidirectional stream. A push stream identifies the Push ID of the | ||||
| promise that it fulfills, encoded as a variable-length integer. | ||||
| A server SHOULD use Push IDs sequentially, starting at 0. A client | A server SHOULD use Push IDs sequentially, starting at 0. A client | |||
| uses the MAX_PUSH_ID frame (Section 4.2.8) to limit the number of | uses the MAX_PUSH_ID frame (Section 4.2.9) to limit the number of | |||
| pushes that a server can promise. A client MUST treat receipt of a | pushes that a server can promise. A client MUST treat receipt of a | |||
| push stream with a Push ID that is greater than the maximum Push ID | push stream with a Push ID that is greater than the maximum Push ID | |||
| as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED. | as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED. | |||
| The remaining data on this stream consists of HTTP frames, as defined | ||||
| in Section 4.2, and carries the response side of an HTTP message | ||||
| exchange as described in Section 3.1. The request headers of the | ||||
| exchange are carried by a PUSH_PROMISE frame (see Section 4.2.7) on | ||||
| the request stream which generated the push. Promised requests MUST | ||||
| conform to the requirements in Section 8.2 of [RFC7540]. | ||||
| The PUSH_PROMISE frame is sent on the client-initiated bidirectional | ||||
| stream that carried the request that generated the push. This allows | ||||
| the server push to be associated with a request. Ordering of a | ||||
| PUSH_PROMISE in relation to certain parts of the response is | ||||
| important (see Section 8.2.1 of [RFC7540]). | ||||
| If a promised server push is not needed by the client, the client | If a promised server push is not needed by the client, the client | |||
| SHOULD send a CANCEL_PUSH frame; if the push stream is already open, | SHOULD send a CANCEL_PUSH frame; if the push stream is already open, | |||
| a QUIC STOP_SENDING frame with an appropriate error code can be used | a QUIC STOP_SENDING frame with an appropriate error code can be used | |||
| instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | |||
| Section 6). This asks the server not to transfer the data and | Section 6). This asks the server not to transfer the data and | |||
| indicates that it will be discarded upon receipt. | indicates that it will be discarded upon receipt. | |||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Push ID (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 1: Push Stream Header | ||||
| Push streams always begin with a header containing the Push ID. Each | Push streams always begin with a header containing the Push ID. Each | |||
| Push ID MUST only be used once in a push stream header. If a push | Push ID MUST only be used once in a push stream header. If a push | |||
| stream header includes a Push ID that was used in another push stream | stream header includes a Push ID that was used in another push stream | |||
| header, the client MUST treat this as a connection error of type | header, the client MUST treat this as a connection error of type | |||
| HTTP_DUPLICATE_PUSH. The same Push ID can be used in multiple | HTTP_DUPLICATE_PUSH. The same Push ID can be used in multiple | |||
| PUSH_PROMISE frames (see Section 4.2.6). | PUSH_PROMISE frames (see Section 4.2.7). | |||
| After the header, a push stream contains a response (Section 3.2), | After the header, a push stream contains a response (Section 3.1), | |||
| with response headers, a response body (if any) carried by DATA | with response headers, a response body (if any) carried by DATA | |||
| frames, then trailers (if any) carried by HEADERS frames. | frames, then trailers (if any) carried by HEADERS frames. | |||
| 4. HTTP Framing Layer | 4. HTTP Framing Layer | |||
| Frames are used on each stream. This section describes HTTP framing | Frames are used on the control stream, request streams, and push | |||
| in QUIC and highlights some differences from HTTP/2 framing. For | streams. This section describes HTTP framing in QUIC and highlights | |||
| more detail on differences from HTTP/2, see Section 7.2. | some differences from HTTP/2 framing. For more detail on differences | |||
| from HTTP/2, see Section 7.2. | ||||
| 4.1. Frame Layout | 4.1. Frame Layout | |||
| All frames have the following format: | All frames have the following format: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (i) ... | | Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type (8) | Flags (8) | Frame Payload (*) ... | | Type (8) | Frame Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 2: HTTP/QUIC frame format | Figure 4: HTTP/QUIC frame format | |||
| A frame includes the following fields: | A frame includes the following fields: | |||
| Length: A variable-length integer that describes the length of the | Length: A variable-length integer that describes the length of the | |||
| Frame Payload. This length does not include the frame header. | Frame Payload. This length does not include the frame header. | |||
| Type: An 8-bit type for the frame. | Type: An 8-bit type for the frame. | |||
| Flags: An 8-bit field containing flags. The Type field determines | ||||
| the semantics of flags. | ||||
| Frame Payload: A payload, the semantics of which are determined by | Frame Payload: A payload, the semantics of which are determined by | |||
| the Type field. | the Type field. | |||
| 4.2. Frame Definitions | 4.2. Frame Definitions | |||
| 4.2.1. DATA | 4.2.1. Reserved Frame Types | |||
| Frame types of the format "0xb + (0x1f * N)" are reserved to exercise | ||||
| the requirement that unknown types be ignored. These frames have no | ||||
| semantic meaning, and can be sent when application-layer padding is | ||||
| desired. They MAY also be sent on connections where no request data | ||||
| is currently being transferred. Endpoints MUST NOT consider these | ||||
| frames to have any meaning upon receipt. | ||||
| The payload and length of the frames are selected in any manner the | ||||
| implementation chooses. | ||||
| 4.2.2. DATA | ||||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
| octets associated with an HTTP request or response payload. | octets associated with an HTTP request or response payload. | |||
| The DATA frame defines no flags. | ||||
| DATA frames MUST be associated with an HTTP request or response. If | DATA frames MUST be associated with an HTTP request or response. If | |||
| a DATA frame is received on either control stream, the recipient MUST | a DATA frame is received on either control stream, the recipient MUST | |||
| respond with a connection error (Section 6) of type | respond with a connection error (Section 6) of type | |||
| HTTP_WRONG_STREAM. | HTTP_WRONG_STREAM. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Payload (*) ... | | Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: DATA frame payload | Figure 5: DATA frame payload | |||
| DATA frames MUST contain a non-zero-length payload. If a DATA frame | DATA frames MUST contain a non-zero-length payload. If a DATA frame | |||
| is received with a payload length of zero, the recipient MUST respond | is received with a payload length of zero, the recipient MUST respond | |||
| with a stream error (Section 6) of type HTTP_MALFORMED_FRAME. | with a stream error (Section 6) of type HTTP_MALFORMED_FRAME. | |||
| 4.2.2. HEADERS | 4.2.3. HEADERS | |||
| The HEADERS frame (type=0x1) is used to carry a header block, | The HEADERS frame (type=0x1) is used to carry a header block, | |||
| compressed using QPACK. See [QPACK] for more details. | compressed using QPACK. See [QPACK] for more details. | |||
| The HEADERS frame defines no flags. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 4: HEADERS frame payload | Figure 6: HEADERS frame payload | |||
| HEADERS frames can only be sent on request / push streams. | HEADERS frames can only be sent on request / push streams. | |||
| 4.2.3. PRIORITY | 4.2.4. PRIORITY | |||
| The PRIORITY (type=0x02) frame specifies the sender-advised priority | The PRIORITY (type=0x02) frame specifies the sender-advised priority | |||
| of a stream and is substantially different in format from [RFC7540]. | of a stream and is substantially different in format from [RFC7540]. | |||
| In order to ensure that prioritization is processed in a consistent | In order to ensure that prioritization is processed in a consistent | |||
| order, PRIORITY frames MUST be sent on the control stream. A | order, PRIORITY frames MUST be sent on the control stream. A | |||
| PRIORITY frame sent on any other stream MUST be treated as a | PRIORITY frame sent on any other stream MUST be treated as a | |||
| HTTP_WRONG_STREAM error. | HTTP_WRONG_STREAM error. | |||
| The format has been modified to accommodate not being sent on a | The format has been modified to accommodate not being sent on a | |||
| request stream, to allow for identification of server pushes, and the | request stream, to allow for identification of server pushes, and the | |||
| larger stream ID space of QUIC. The semantics of the Stream | larger stream ID space of QUIC. The semantics of the Stream | |||
| Dependency, Weight, and E flag are otherwise the same as in HTTP/2. | Dependency, Weight, and E flag are otherwise the same as in HTTP/2. | |||
| The flags defined are: | ||||
| PUSH_PRIORITIZED (0x04): Indicates that the Prioritized Stream is a | ||||
| server push rather than a request. | ||||
| PUSH_DEPENDENT (0x02): Indicates a dependency on a server push. | ||||
| E (0x01): Indicates that the stream dependency is exclusive (see | ||||
| [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 Request ID (i) | | |PT |DT |Empty|E| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream Dependency ID (i) | | | Prioritized Element ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Element Dependency ID (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Weight (8) | | | Weight (8) | | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| Figure 5: PRIORITY frame payload | Figure 7: PRIORITY frame payload | |||
| The PRIORITY frame payload has the following fields: | The PRIORITY frame payload has the following fields: | |||
| Prioritized Request ID: A variable-length integer that identifies a | Prioritized Type: A two-bit field indicating the type of element | |||
| request. This contains the Stream ID of a request stream when the | being prioritized. | |||
| PUSH_PRIORITIZED flag is clear, or a Push ID when the | ||||
| PUSH_PRIORITIZED flag is set. | ||||
| Stream Dependency ID: A variable-length integer that identifies a | Dependency Type: A two-bit field indicating the type of element | |||
| dependent request. This contains the Stream ID of a request | being depended on. | |||
| stream when the PUSH_DEPENDENT flag is clear, or a Push ID when | ||||
| the PUSH_DEPENDENT flag is set. A request Stream ID of 0 | Empty: A three-bit field which MUST be zero when sent and MUST be | |||
| indicates a dependency on the root stream. For details of | ignored on receipt. | |||
| dependencies, see Section 3.3 and [RFC7540], Section 5.3. | ||||
| Exclusive: A flag which indicates that the stream dependency is | ||||
| exclusive (see [RFC7540], Section 5.3). | ||||
| Prioritized Element ID: A variable-length integer that identifies | ||||
| the element being prioritized. Depending on the value of | ||||
| Prioritized Type, this contains the Stream ID of a request stream, | ||||
| the Push ID of a promised resource, or a Placeholder ID of a | ||||
| placeholder. | ||||
| Element Dependency ID: A variable-length integer that identifies the | ||||
| element on which a dependency is being expressed. Depending on | ||||
| the value of Dependency Type, this contains the Stream ID of a | ||||
| request stream, the Push ID of a promised resource, or a | ||||
| Placeholder ID of a placeholder. For details of dependencies, see | ||||
| Section 3.2 and [RFC7540], Section 5.3. | ||||
| Weight: An unsigned 8-bit integer representing a priority weight for | Weight: An unsigned 8-bit integer representing a priority weight for | |||
| the stream (see [RFC7540], Section 5.3). Add one to the value to | the stream (see [RFC7540], Section 5.3). Add one to the value to | |||
| obtain a weight between 1 and 256. | obtain a weight between 1 and 256. | |||
| A PRIORITY frame identifies a request to prioritize, and a request | A PRIORITY frame identifies an element to prioritize, and an element | |||
| upon which that request is dependent. A Prioritized Request ID or | upon which it depends. A Prioritized ID or Dependency ID identifies | |||
| Stream Dependency ID identifies a client-initiated request using the | a client-initiated request using the corresponding stream ID, a | |||
| corresponding stream ID when the corresponding PUSH_PRIORITIZED or | server push using a Push ID (see Section 4.2.7), or a placeholder | |||
| PUSH_DEPENDENT flag is not set. Setting the PUSH_PRIORITIZED or | using a Placeholder ID (see Section 3.2.1). | |||
| PUSH_DEPENDENT flag causes the Prioritized Request ID or Stream | ||||
| Dependency ID (respectively) to identify a server push using a Push | ||||
| ID (see Section 4.2.6 for details). | ||||
| A PRIORITY frame MAY identify a Stream Dependency ID using a Stream | The values for the Prioritized Element Type and Element Dependency | |||
| ID of 0; as in [RFC7540], this makes the request dependent on the | Type imply the interpretation of the associated Element ID fields. | |||
| root of the dependency tree. | ||||
| A PRIORITY frame MUST identify a client-initiated, bidirectional | +-----------+------------------+---------------------+ | |||
| stream. A server MUST treat receipt of PRIORITY frame with a Stream | | Type Bits | Type Description | Element ID Contents | | |||
| ID of any other type as a connection error of type | +-----------+------------------+---------------------+ | |||
| HTTP_MALFORMED_FRAME. | | 00 | Request stream | Stream ID | | |||
| | | | | | ||||
| | 01 | Push stream | Push ID | | ||||
| | | | | | ||||
| | 10 | Placeholder | Placeholder ID | | ||||
| | | | | | ||||
| | 11 | Root of the tree | Ignored | | ||||
| +-----------+------------------+---------------------+ | ||||
| Stream ID 0 cannot be reprioritized. A Prioritized Request ID that | Note that the root of the tree cannot be referenced using a Stream ID | |||
| identifies Stream 0 MUST be treated as a connection error of type | of 0, as in [RFC7540]; QUIC stream 0 carries a valid HTTP request. | |||
| HTTP_MALFORMED_FRAME. | The root of the tree cannot be reprioritized. A PRIORITY frame that | |||
| prioritizes the root of the tree MUST be treated as a connection | ||||
| error of type HTTP_MALFORMED_FRAME. | ||||
| A PRIORITY frame that does not reference a request MUST be treated as | When a PRIORITY frame claims to reference a request, the associated | |||
| a HTTP_MALFORMED_FRAME error, unless it references Stream ID 0. A | ID MUST identify a client-initiated bidirectional stream. A server | |||
| PRIORITY that sets a PUSH_PRIORITIZED or PUSH_DEPENDENT flag, but | MUST treat receipt of PRIORITY frame with a Stream ID of any other | |||
| then references a non-existent Push ID MUST be treated as a | type as a connection error of type HTTP_MALFORMED_FRAME. | |||
| A PRIORITY frame that references a non-existent Push ID or a | ||||
| Placeholder ID greater than the server's limit MUST be treated as a | ||||
| HTTP_MALFORMED_FRAME error. | HTTP_MALFORMED_FRAME error. | |||
| A PRIORITY frame MUST contain only the identified fields. A PRIORITY | A PRIORITY frame MUST contain only the identified fields. A PRIORITY | |||
| frame that contains more or fewer fields, or a PRIORITY frame that | frame that contains more or fewer fields, or a PRIORITY frame that | |||
| includes a truncated integer encoding MUST be treated as a connection | includes a truncated integer encoding MUST be treated as a connection | |||
| error of type HTTP_MALFORMED_FRAME. | error of type HTTP_MALFORMED_FRAME. | |||
| 4.2.4. CANCEL_PUSH | 4.2.5. CANCEL_PUSH | |||
| The CANCEL_PUSH frame (type=0x3) is used to request cancellation of | The CANCEL_PUSH frame (type=0x3) is used to request cancellation of | |||
| server push prior to the push stream being created. The CANCEL_PUSH | server push prior to the push stream being created. The CANCEL_PUSH | |||
| frame identifies a server push request by Push ID (see Section 4.2.6) | frame identifies a server push request by Push ID (see Section 4.2.7) | |||
| using a variable-length integer. | using a variable-length integer. | |||
| When a server receives this frame, it aborts sending the response for | When a server receives this frame, it aborts sending the response for | |||
| the identified server push. If the server has not yet started to | the identified server push. If the server has not yet started to | |||
| send the server push, it can use the receipt of a CANCEL_PUSH frame | send the server push, it can use the receipt of a CANCEL_PUSH frame | |||
| to avoid opening a stream. If the push stream has been opened by the | to avoid opening a stream. If the push stream has been opened by the | |||
| server, the server SHOULD sent a QUIC RST_STREAM frame on those | server, the server SHOULD sent a QUIC RST_STREAM frame on those | |||
| streams and cease transmission of the response. | streams and cease transmission of the response. | |||
| A server can send this frame to indicate that it won't be sending a | A server can send this frame to indicate that it won't be sending a | |||
| response prior to creation of a push stream. Once the push stream | response prior to creation of a push stream. Once the push stream | |||
| has been created, sending CANCEL_PUSH has no effect on the state of | has been created, sending CANCEL_PUSH has no effect on the state of | |||
| the push stream. A QUIC RST_STREAM frame SHOULD be used instead to | the push stream. A QUIC RST_STREAM frame SHOULD be used instead to | |||
| cancel transmission of the server push response. | cancel transmission of the server push response. | |||
| A CANCEL_PUSH frame is sent on the control stream. Sending a | A CANCEL_PUSH frame is sent on the control stream. Sending a | |||
| CANCEL_PUSH frame on a stream other than the control stream MUST be | CANCEL_PUSH frame on a stream other than the control stream MUST be | |||
| treated as a stream error of type HTTP_WRONG_STREAM. | treated as a stream error of type HTTP_WRONG_STREAM. | |||
| The CANCEL_PUSH frame has no defined flags. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 6: CANCEL_PUSH frame payload | Figure 8: CANCEL_PUSH frame payload | |||
| The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | |||
| integer. The Push ID identifies the server push that is being | integer. The Push ID identifies the server push that is being | |||
| cancelled (see Section 4.2.6). | cancelled (see Section 4.2.7). | |||
| If the client receives a CANCEL_PUSH frame, that frame might identify | If the client receives a CANCEL_PUSH frame, that frame might identify | |||
| a Push ID that has not yet been mentioned by a PUSH_PROMISE frame. | a Push ID that has not yet been mentioned by a PUSH_PROMISE frame. | |||
| An endpoint MUST treat a CANCEL_PUSH frame which does not contain | An endpoint MUST treat a CANCEL_PUSH frame which does not contain | |||
| exactly one properly-formatted variable-length integer as a | exactly one properly-formatted variable-length integer as a | |||
| connection error of type HTTP_MALFORMED_FRAME. | connection error of type HTTP_MALFORMED_FRAME. | |||
| 4.2.5. SETTINGS | 4.2.6. 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 different from [RFC7540]. Individually, a | on peer behavior, and is different from [RFC7540]. Individually, a | |||
| SETTINGS parameter can also be referred to as a "setting". | SETTINGS parameter can also be referred to as a "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 | |||
| skipping to change at page 17, line 31 ¶ | skipping to change at page 20, line 4 ¶ | |||
| SETTINGS parameter can also be referred to as a "setting". | SETTINGS parameter can also be referred to as a "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 be willing to consume very large | peer. For example, a client might be willing to consume very large | |||
| response headers, while servers are more cautious about request size. | response headers, while servers are more cautious about request size. | |||
| Parameters MUST NOT occur more than once. A receiver MAY treat the | Parameters MUST NOT occur more than once. A receiver MAY treat the | |||
| presence of the same parameter more than once as a connection error | presence of the same parameter more than once as a connection error | |||
| of type HTTP_MALFORMED_FRAME. | of type HTTP_MALFORMED_FRAME. | |||
| The SETTINGS frame defines no flags. | ||||
| The payload of a SETTINGS frame consists of zero or more parameters, | The payload of a SETTINGS frame consists of zero or more parameters, | |||
| each consisting of an unsigned 16-bit setting identifier and a | each consisting of an unsigned 16-bit setting identifier and a | |||
| length-prefixed binary value. | length-prefixed binary value. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Identifier (16) | Length (i) ... | | Identifier (16) | Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Contents (?) ... | | Contents (?) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 7: SETTINGS value format | Figure 9: SETTINGS value format | |||
| A zero-length content indicates that the setting value is a Boolean | A zero-length content indicates that the setting value is a Boolean | |||
| and true. False is indicated by the absence of the setting. | and true. False is indicated by the absence of the setting. | |||
| Non-zero-length values MUST be compared against the remaining length | Non-zero-length values MUST be compared against the remaining length | |||
| of the SETTINGS frame. Any value which purports to cross the end of | of the SETTINGS frame. Any value which purports to cross the end of | |||
| the frame MUST cause the SETTINGS frame to be considered malformed | the frame MUST cause the SETTINGS frame to be considered malformed | |||
| and trigger a connection error of type HTTP_MALFORMED_FRAME. | and trigger a connection error of type HTTP_MALFORMED_FRAME. | |||
| An implementation MUST ignore the contents for any SETTINGS | An implementation MUST ignore the contents for any SETTINGS | |||
| skipping to change at page 18, line 39 ¶ | skipping to change at page 21, line 5 ¶ | |||
| subsequently or on any other stream. If an endpoint receives an | subsequently or on any other stream. If an endpoint receives an | |||
| SETTINGS frame on a different stream, the endpoint MUST respond with | SETTINGS frame on a different stream, the endpoint MUST respond with | |||
| a connection error of type HTTP_WRONG_STREAM. If an endpoint | a connection error of type HTTP_WRONG_STREAM. If an endpoint | |||
| receives a second SETTINGS frame, the endpoint MUST respond with a | receives a second SETTINGS frame, the endpoint MUST respond with a | |||
| connection error of type HTTP_MALFORMED_FRAME. | connection error of type HTTP_MALFORMED_FRAME. | |||
| The SETTINGS frame affects connection state. A badly formed or | The SETTINGS frame affects connection state. A badly formed or | |||
| incomplete SETTINGS frame MUST be treated as a connection error | incomplete SETTINGS frame MUST be treated as a connection error | |||
| (Section 6) of type HTTP_MALFORMED_FRAME. | (Section 6) of type HTTP_MALFORMED_FRAME. | |||
| 4.2.5.1. Integer encoding | 4.2.6.1. Integer encoding | |||
| Settings which are integers use the QUIC variable-length integer | Settings which are integers use the QUIC variable-length integer | |||
| encoding. | encoding. | |||
| 4.2.5.2. Defined SETTINGS Parameters | 4.2.6.2. Defined SETTINGS Parameters | |||
| The following settings are defined in HTTP/QUIC: | The following settings are defined in HTTP/QUIC: | |||
| SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of | SETTINGS_NUM_PLACEHOLDERS (0x3): An integer with a maximum value of | |||
| 2^30 - 1. The default value is 4,096 bytes. | 2^16 - 1. The value SHOULD be non-zero. The default value is 16. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value | SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value | |||
| of 2^30 - 1. The default value is unlimited. | of 2^30 - 1. The default value is unlimited. | |||
| SETTINGS_QPACK_BLOCKED_STREAMS (0x7): An integer with a maximum | Settings values of the format "0x?a?a" are reserved to exercise the | |||
| value of 2^16 - 1. The default value is 100. | requirement that unknown parameters be ignored. Such settings have | |||
| no defined meaning. Endpoints SHOULD include at least one such | ||||
| setting in their SETTINGS frame. Endpoints MUST NOT consider such | ||||
| settings to have any meaning upon receipt. | ||||
| 4.2.5.3. Initial SETTINGS Values | Because the setting has no defined meaning, the value of the setting | |||
| can be any value the implementation selects. | ||||
| Additional settings MAY be defined by extensions to HTTP/QUIC. | ||||
| 4.2.6.3. Initial SETTINGS Values | ||||
| When a 0-RTT QUIC connection is being used, the client's initial | When a 0-RTT QUIC connection is being used, the client's initial | |||
| requests will be sent before the arrival of the server's SETTINGS | requests will be sent before the arrival of the server's SETTINGS | |||
| frame. Clients MUST store the settings the server provided in the | frame. Clients MUST store the settings the server provided in the | |||
| session being resumed and MUST comply with stored settings until the | session being resumed and MUST comply with stored settings until the | |||
| server's current settings are received. | server's current settings are received. | |||
| Servers MAY continue processing data from clients which exceed its | Servers MAY continue processing data from clients which exceed its | |||
| current configuration during the initial flight. In this case, the | current configuration during the initial flight. In this case, the | |||
| client MUST apply the new settings immediately upon receipt. | client MUST apply the new settings immediately upon receipt. | |||
| When a 1-RTT QUIC connection is being used, the client MUST NOT send | When a 1-RTT QUIC connection is being used, the client MUST NOT send | |||
| requests prior to receiving and processing the server's SETTINGS | requests prior to receiving and processing the server's SETTINGS | |||
| frame. | frame. | |||
| 4.2.6. PUSH_PROMISE | 4.2.7. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x05) is used to carry a request header | The PUSH_PROMISE frame (type=0x05) is used to carry a request header | |||
| set from server to client, as in HTTP/2. The PUSH_PROMISE frame | set from server to client, as in HTTP/2. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: PUSH_PROMISE frame payload | Figure 10: PUSH_PROMISE frame payload | |||
| The payload consists of: | The payload consists of: | |||
| Push ID: A variable-length integer that identifies the server push | Push ID: A variable-length integer that identifies the server push | |||
| request. A push ID is used in push stream header (Section 3.4), | request. A push ID is used in push stream header (Section 3.3.2), | |||
| CANCEL_PUSH frames (Section 4.2.4), and PRIORITY frames | CANCEL_PUSH frames (Section 4.2.5), and PRIORITY frames | |||
| (Section 4.2.3). | (Section 4.2.4). | |||
| Header Block: QPACK-compressed request headers for the promised | Header Block: QPACK-compressed request headers for the promised | |||
| response. See [QPACK] for more details. | response. See [QPACK] for more details. | |||
| A server MUST NOT use a Push ID that is larger than the client has | A server MUST NOT use a Push ID that is larger than the client has | |||
| provided in a MAX_PUSH_ID frame (Section 4.2.8). A client MUST treat | provided in a MAX_PUSH_ID frame (Section 4.2.9). A client MUST treat | |||
| receipt of a PUSH_PROMISE that contains a larger Push ID than the | receipt of a PUSH_PROMISE that contains a larger Push ID than the | |||
| client has advertised as a connection error of type | client has advertised as a connection error of type | |||
| HTTP_MALFORMED_FRAME. | HTTP_MALFORMED_FRAME. | |||
| A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | |||
| This allows the server to use the same server push in response to | This allows the server to use the same server push in response to | |||
| multiple concurrent requests. Referencing the same server push | multiple concurrent requests. Referencing the same server push | |||
| ensures that a PUSH_PROMISE can be made in relation to every response | ensures that a PUSH_PROMISE can be made in relation to every response | |||
| in which server push might be needed without duplicating pushes. | in which server push might be needed without duplicating pushes. | |||
| skipping to change at page 20, line 29 ¶ | skipping to change at page 23, line 5 ¶ | |||
| ID as a connection error of type HTTP_MALFORMED_FRAME. | ID as a connection error of type HTTP_MALFORMED_FRAME. | |||
| Allowing duplicate references to the same Push ID is primarily to | Allowing duplicate references to the same Push ID is primarily to | |||
| reduce duplication caused by concurrent requests. A server SHOULD | reduce duplication caused by concurrent requests. A server SHOULD | |||
| avoid reusing a Push ID over a long period. Clients are likely to | avoid reusing a Push ID over a long period. Clients are likely to | |||
| consume server push responses and not retain them for reuse over | consume server push responses and not retain them for reuse over | |||
| time. Clients that see a PUSH_PROMISE that uses a Push ID that they | time. Clients that see a PUSH_PROMISE that uses a Push ID that they | |||
| have since consumed and discarded are forced to ignore the | have since consumed and discarded are forced to ignore the | |||
| PUSH_PROMISE. | PUSH_PROMISE. | |||
| 4.2.7. GOAWAY | 4.2.8. GOAWAY | |||
| The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | |||
| a connection by a server. GOAWAY allows a server to stop accepting | a connection by a server. GOAWAY allows a server to stop accepting | |||
| new requests while still finishing processing of previously received | new requests while still finishing processing of previously received | |||
| requests. This enables administrative actions, like server | requests. This enables administrative actions, like server | |||
| maintenance. GOAWAY by itself does not close a connection. | maintenance. GOAWAY by itself does not close a connection. | |||
| The GOAWAY frame does not define any flags. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 9: GOAWAY frame payload | Figure 11: GOAWAY frame payload | |||
| The GOAWAY frame carries a QUIC Stream ID for a client-initiated, | The GOAWAY frame carries a QUIC Stream ID for a client-initiated | |||
| bidirectional stream encoded as a variable-length integer. A client | bidirectional stream encoded as a variable-length integer. A client | |||
| MUST treat receipt of a GOAWAY frame containing a Stream ID of any | MUST treat receipt of a GOAWAY frame containing a Stream ID of any | |||
| other type as a connection error of type HTTP_MALFORMED_FRAME. | other type as a connection error of type HTTP_MALFORMED_FRAME. | |||
| Clients do not need to send GOAWAY to initiate a graceful shutdown; | Clients do not need to send GOAWAY to initiate a graceful shutdown; | |||
| they simply stop making new requests. A server MUST treat receipt of | they simply stop making new requests. A server MUST treat receipt of | |||
| a GOAWAY frame as a connection error (Section 6) of type | a GOAWAY frame as a connection error (Section 6) of type | |||
| HTTP_UNEXPECTED_GOAWAY. | HTTP_UNEXPECTED_GOAWAY. | |||
| The GOAWAY frame applies to the connection, not a specific stream. | The GOAWAY frame applies to the connection, not a specific stream. | |||
| skipping to change at page 21, line 33 ¶ | skipping to change at page 24, line 7 ¶ | |||
| MAX_STREAM_ID limit after sending a GOAWAY frame. | MAX_STREAM_ID limit after sending a GOAWAY frame. | |||
| Once sent, the server MUST cancel requests sent on streams with an | Once sent, the server MUST cancel requests sent on streams with an | |||
| identifier higher than the included last Stream ID. Clients MUST NOT | identifier higher than the included last Stream ID. Clients MUST NOT | |||
| send new requests on the connection after receiving GOAWAY, although | send new requests on the connection after receiving GOAWAY, although | |||
| requests might already be in transit. A new connection can be | requests might already be in transit. A new connection can be | |||
| established for new requests. | established for new requests. | |||
| If the client has sent requests on streams with a higher Stream ID | If the client has sent requests on streams with a higher Stream ID | |||
| than indicated in the GOAWAY frame, those requests are considered | than indicated in the GOAWAY frame, those requests are considered | |||
| cancelled (Section 3.2.3). Clients SHOULD reset any streams above | cancelled (Section 3.1.3). Clients SHOULD reset any streams above | |||
| this ID with the error code HTTP_REQUEST_CANCELLED. Servers MAY also | this ID with the error code HTTP_REQUEST_CANCELLED. Servers MAY also | |||
| cancel requests on streams below the indicated ID if these requests | cancel requests on streams below the indicated ID if these requests | |||
| were not processed. | were not processed. | |||
| Requests on Stream IDs less than or equal to the Stream ID in the | Requests on Stream IDs less than or equal to the Stream ID in the | |||
| GOAWAY frame might have been processed; their status cannot be known | GOAWAY frame might have been processed; their status cannot be known | |||
| until they are completed successfully, reset individually, or the | until they are completed successfully, reset individually, or the | |||
| connection terminates. | connection terminates. | |||
| Servers SHOULD send a GOAWAY frame when the closing of a connection | Servers SHOULD send a GOAWAY frame when the closing of a connection | |||
| skipping to change at page 22, line 42 ¶ | skipping to change at page 25, line 16 ¶ | |||
| losing requests. | losing requests. | |||
| Once all requests on streams at or below the identified stream number | Once all requests on streams at or below the identified stream number | |||
| have been completed or cancelled, and all promised server push | have been completed or cancelled, and all promised server push | |||
| responses associated with those requests have been completed or | responses associated with those requests have been completed or | |||
| cancelled, the connection can be closed using an Immediate Close (see | cancelled, the connection can be closed using an Immediate Close (see | |||
| [QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown | [QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown | |||
| SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR | SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR | |||
| code. | code. | |||
| 4.2.8. MAX_PUSH_ID | 4.2.9. MAX_PUSH_ID | |||
| The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | |||
| number of server pushes that the server can initiate. This sets the | number of server pushes that the server can initiate. This sets the | |||
| maximum value for a Push ID that the server can use in a PUSH_PROMISE | maximum value for a Push ID that the server can use in a PUSH_PROMISE | |||
| frame. Consequently, this also limits the number of push streams | frame. Consequently, this also limits the number of push streams | |||
| that the server can initiate in addition to the limit set by the QUIC | that the server can initiate in addition to the limit set by the QUIC | |||
| MAX_STREAM_ID frame. | MAX_STREAM_ID frame. | |||
| The MAX_PUSH_ID frame is always sent on a control stream. Receipt of | The MAX_PUSH_ID frame is always sent on a control stream. Receipt of | |||
| a MAX_PUSH_ID frame on any other stream MUST be treated as a | a MAX_PUSH_ID frame on any other stream MUST be treated as a | |||
| skipping to change at page 23, line 19 ¶ | skipping to change at page 25, line 39 ¶ | |||
| A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the | A server MUST NOT send a MAX_PUSH_ID frame. A client MUST treat the | |||
| receipt of a MAX_PUSH_ID frame as a connection error of type | receipt of a MAX_PUSH_ID frame as a connection error of type | |||
| HTTP_MALFORMED_FRAME. | HTTP_MALFORMED_FRAME. | |||
| The maximum Push ID is unset when a connection is created, meaning | The maximum Push ID is unset when a connection is created, meaning | |||
| that a server cannot push until it receives a MAX_PUSH_ID frame. A | that a server cannot push until it receives a MAX_PUSH_ID frame. A | |||
| client that wishes to manage the number of promised server pushes can | client that wishes to manage the number of promised server pushes can | |||
| increase the maximum Push ID by sending a MAX_PUSH_ID frame as the | increase the maximum Push ID by sending a MAX_PUSH_ID frame as the | |||
| server fulfills or cancels server pushes. | server fulfills or cancels server pushes. | |||
| The MAX_PUSH_ID frame has no defined flags. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 10: MAX_PUSH_ID frame payload | Figure 12: MAX_PUSH_ID frame payload | |||
| The MAX_PUSH_ID frame carries a single variable-length integer that | The MAX_PUSH_ID frame carries a single variable-length integer that | |||
| identifies the maximum value for a Push ID that the server can use | identifies the maximum value for a Push ID that the server can use | |||
| (see Section 4.2.6). A MAX_PUSH_ID frame cannot reduce the maximum | (see Section 4.2.7). A MAX_PUSH_ID frame cannot reduce the maximum | |||
| Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | |||
| previously received MUST be treated as a connection error of type | previously received MUST be treated as a connection error of type | |||
| HTTP_MALFORMED_FRAME. | HTTP_MALFORMED_FRAME. | |||
| A server MUST treat a MAX_PUSH_ID frame payload that does not contain | A server MUST treat a MAX_PUSH_ID frame payload that does not contain | |||
| a single variable-length integer as a connection error of type | a single variable-length integer as a connection error of type | |||
| HTTP_MALFORMED_FRAME. | HTTP_MALFORMED_FRAME. | |||
| 5. Connection Management | 5. Connection Management | |||
| skipping to change at page 24, line 14 ¶ | skipping to change at page 26, line 34 ¶ | |||
| maintain connections in anticipation of need rather than incur the | maintain connections in anticipation of need rather than incur the | |||
| latency cost of connection establishment to servers. | latency cost of connection establishment to servers. | |||
| 6. Error Handling | 6. Error Handling | |||
| QUIC allows the application to abruptly terminate (reset) individual | QUIC allows the application to abruptly terminate (reset) individual | |||
| streams or the entire connection when an error is encountered. These | streams or the entire connection when an error is encountered. These | |||
| are referred to as "stream errors" or "connection errors" and are | are referred to as "stream errors" or "connection errors" and are | |||
| described in more detail in [QUIC-TRANSPORT]. | described in more detail in [QUIC-TRANSPORT]. | |||
| This section describes HTTP-specific error codes which can be used to | This section describes HTTP/QUIC-specific error codes which can be | |||
| express the cause of a connection or stream error. | used to express the cause of a connection or stream error. | |||
| 6.1. HTTP/QUIC Error Codes | 6.1. HTTP/QUIC Error Codes | |||
| The following error codes are defined for use in QUIC RST_STREAM, | The following error codes are defined for use in QUIC RST_STREAM, | |||
| STOP_SENDING, and CONNECTION_CLOSE frames when using HTTP/QUIC. | STOP_SENDING, and CONNECTION_CLOSE frames when using HTTP/QUIC. | |||
| STOPPING (0x00): This value is reserved by the transport to be used | STOPPING (0x00): This value is reserved by the transport to be used | |||
| in response to QUIC STOP_SENDING frames. | in response to QUIC STOP_SENDING frames. | |||
| HTTP_NO_ERROR (0x01): No error. This is used when the connection or | HTTP_NO_ERROR (0x01): No error. This is used when the connection or | |||
| skipping to change at page 25, line 5 ¶ | skipping to change at page 27, line 26 ¶ | |||
| HTTP_CONNECT_ERROR (0x07): The connection established in response to | HTTP_CONNECT_ERROR (0x07): The connection established in response to | |||
| a CONNECT request was reset or abnormally closed. | a CONNECT request was reset or abnormally closed. | |||
| HTTP_EXCESSIVE_LOAD (0x08): The endpoint detected that its peer is | HTTP_EXCESSIVE_LOAD (0x08): The endpoint detected that its peer is | |||
| exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
| HTTP_VERSION_FALLBACK (0x09): The requested operation cannot be | HTTP_VERSION_FALLBACK (0x09): The requested operation cannot be | |||
| served over HTTP/QUIC. The peer should retry over HTTP/2. | served over HTTP/QUIC. The peer should retry over HTTP/2. | |||
| HTTP_WRONG_STREAM (0x0A): A frame was received on stream where it is | HTTP_WRONG_STREAM (0x0A): A frame was received on a stream where it | |||
| not permitted. | is not permitted. | |||
| HTTP_PUSH_LIMIT_EXCEEDED (0x0B): A Push ID greater than the current | HTTP_PUSH_LIMIT_EXCEEDED (0x0B): A Push ID greater than the current | |||
| maximum Push ID was referenced. | maximum Push ID was referenced. | |||
| HTTP_DUPLICATE_PUSH (0x0C): A Push ID was referenced in two | HTTP_DUPLICATE_PUSH (0x0C): A Push ID was referenced in two | |||
| different stream headers. | different stream headers. | |||
| HTTP_UNKNOWN_STREAM_TYPE (0x0D): A unidirectional stream header | ||||
| contained an unknown stream type. | ||||
| HTTP_WRONG_STREAM_COUNT (0x0E): A unidirectional stream type was | ||||
| used more times than is permitted by that type. | ||||
| HTTP_CLOSED_CRITICAL_STREAM (0x0F): A stream required by the | ||||
| connection was closed or reset. | ||||
| HTTP_WRONG_STREAM_DIRECTION (0x0010): A unidirectional stream type | ||||
| was used by a peer which is not permitted to do so. | ||||
| HTTP_GENERAL_PROTOCOL_ERROR (0x00FF): Peer violated protocol | ||||
| requirements in a way which doesn't match a more specific error | ||||
| code, or endpoint declines to use the more specific error code. | ||||
| HTTP_MALFORMED_FRAME (0x01XX): An error in a specific frame type. | HTTP_MALFORMED_FRAME (0x01XX): An error in a specific frame type. | |||
| The frame type is included as the last octet of the error code. | The frame type is included as the last octet of the error code. | |||
| For example, an error in a MAX_PUSH_ID frame would be indicated | For example, an error in a MAX_PUSH_ID frame would be indicated | |||
| with the code (0x10D). | with the code (0x10D). | |||
| 7. Considerations for Transitioning from HTTP/2 | 7. Considerations for Transitioning from HTTP/2 | |||
| HTTP/QUIC is strongly informed by HTTP/2, and bears many | HTTP/QUIC is strongly informed by HTTP/2, and bears many | |||
| similarities. This section describes the approach taken to design | similarities. This section describes the approach taken to design | |||
| HTTP/QUIC, points out important differences from HTTP/2, and | HTTP/QUIC, points out important differences from HTTP/2, and | |||
| describes how to map HTTP/2 extensions into HTTP/QUIC. | describes how to map HTTP/2 extensions into HTTP/QUIC. | |||
| skipping to change at page 25, line 52 ¶ | skipping to change at page 28, line 41 ¶ | |||
| on the connection flow control window. | on the connection flow control window. | |||
| 7.2. HTTP Frame Types | 7.2. HTTP Frame Types | |||
| Many framing concepts from HTTP/2 can be elided away on QUIC, because | Many framing concepts from HTTP/2 can be elided away on QUIC, because | |||
| the transport deals with them. Because frames are already on a | the transport deals with them. Because frames are already on a | |||
| stream, they can omit the stream number. Because frames do not block | stream, they can omit the stream number. Because frames do not block | |||
| multiplexing (QUIC's multiplexing occurs below this layer), the | multiplexing (QUIC's multiplexing occurs below this layer), the | |||
| support for variable-maximum-length packets can be removed. Because | support for variable-maximum-length packets can be removed. Because | |||
| stream termination is handled by QUIC, an END_STREAM flag is not | stream termination is handled by QUIC, an END_STREAM flag is not | |||
| required. | required. This permits the removal of the Flags field from the | |||
| generic frame layout. | ||||
| Frame payloads are largely drawn from [RFC7540]. However, QUIC | Frame payloads are largely drawn from [RFC7540]. However, QUIC | |||
| includes many features (e.g. flow control) which are also present in | 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. | 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/ | 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 | 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 | has been reserved in order to maximize portability between HTTP/2 and | |||
| HTTP/QUIC implementations. However, even equivalent frames between | HTTP/QUIC implementations. However, even equivalent frames between | |||
| the two mappings are not identical. | the two mappings are not identical. | |||
| skipping to change at page 26, line 46 ¶ | skipping to change at page 29, line 37 ¶ | |||
| described in [QPACK]. | described in [QPACK]. | |||
| Frame type definitions in HTTP/QUIC often use the QUIC variable- | Frame type definitions in HTTP/QUIC often use the QUIC variable- | |||
| length integer encoding. In particular, Stream IDs use this | length integer encoding. In particular, Stream IDs use this | |||
| encoding, which allow for a larger range of possible values than the | encoding, which allow for a larger range of possible values than the | |||
| encoding used in HTTP/2. Some frames in HTTP/QUIC use an identifier | encoding used in HTTP/2. Some frames in HTTP/QUIC use an identifier | |||
| rather than a Stream ID (e.g. Push IDs in PRIORITY frames). | rather than a Stream ID (e.g. Push IDs in PRIORITY frames). | |||
| Redefinition of the encoding of extension frame types might be | Redefinition of the encoding of extension frame types might be | |||
| necessary if the encoding includes a Stream ID. | necessary if the encoding includes a Stream ID. | |||
| Because the Flags field is not present in generic HTTP/QUIC frames, | ||||
| those frames which depend on the presence of flags need to allocate | ||||
| space for flags as part of their frame payload. | ||||
| Other than this issue, frame type HTTP/2 extensions are typically | Other than this issue, frame type HTTP/2 extensions are typically | |||
| portable to QUIC simply by replacing Stream 0 in HTTP/2 with Stream 2 | portable to QUIC simply by replacing Stream 0 in HTTP/2 with a | |||
| or 3 in HTTP/QUIC. HTTP/QUIC extensions will not assume ordering, | control stream in HTTP/QUIC. HTTP/QUIC extensions will not assume | |||
| but would not be harmed by ordering, and would be portable to HTTP/2 | ordering, but would not be harmed by ordering, and would be portable | |||
| in the same manner. | to HTTP/2 in the same manner. | |||
| Below is a listing of how each HTTP/2 frame type is mapped: | Below is a listing of how each HTTP/2 frame type is mapped: | |||
| DATA (0x0): Padding is not defined in HTTP/QUIC frames. See | DATA (0x0): Padding is not defined in HTTP/QUIC frames. See | |||
| Section 4.2.1. | Section 4.2.2. | |||
| HEADERS (0x1): As described above, the PRIORITY region of HEADERS is | HEADERS (0x1): As described above, the PRIORITY region of HEADERS is | |||
| not supported. A separate PRIORITY frame MUST be used. Padding | not supported. A separate PRIORITY frame MUST be used. Padding | |||
| is not defined in HTTP/QUIC frames. See Section 4.2.2. | is not defined in HTTP/QUIC frames. See Section 4.2.3. | |||
| PRIORITY (0x2): As described above, the PRIORITY frame is sent on | PRIORITY (0x2): As described above, the PRIORITY frame is sent on | |||
| the control stream and can reference either a Stream ID or a Push | the control stream and can reference either a Stream ID or a Push | |||
| ID. See Section 4.2.3. | ID. See Section 4.2.4. | |||
| RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC | RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC | |||
| provides stream lifecycle management. The same code point is used | provides stream lifecycle management. The same code point is used | |||
| for the CANCEL_PUSH frame (Section 4.2.4). | for the CANCEL_PUSH frame (Section 4.2.5). | |||
| SETTINGS (0x4): SETTINGS frames are sent only at the beginning of | SETTINGS (0x4): SETTINGS frames are sent only at the beginning of | |||
| the connection. See Section 4.2.5 and Section 7.3. | the connection. See Section 4.2.6 and Section 7.3. | |||
| PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; | PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; | |||
| instead the push stream references the PUSH_PROMISE frame using a | instead the push stream references the PUSH_PROMISE frame using a | |||
| Push ID. See Section 4.2.6. | Push ID. See Section 4.2.7. | |||
| PING (0x6): PING frames do not exist, since QUIC provides equivalent | PING (0x6): PING frames do not exist, since QUIC provides equivalent | |||
| functionality. | functionality. | |||
| GOAWAY (0x7): GOAWAY is sent only from server to client and does not | GOAWAY (0x7): GOAWAY is sent only from server to client and does not | |||
| contain an error code. See Section 4.2.7. | contain an error code. See Section 4.2.8. | |||
| WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | |||
| provides flow control. | provides flow control. | |||
| CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | |||
| larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and | larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and | |||
| HEADERS frames can be used in series. | HEADERS frames can be used in series. | |||
| Frame types defined by extensions to HTTP/2 need to be separately | Frame types defined by extensions to HTTP/2 need to be separately | |||
| registered for HTTP/QUIC if still applicable. The IDs of frames | registered for HTTP/QUIC if still applicable. The IDs of frames | |||
| skipping to change at page 28, line 9 ¶ | skipping to change at page 31, line 7 ¶ | |||
| at the beginning of the connection, and thereafter cannot change. | at the beginning of the connection, and thereafter cannot change. | |||
| This eliminates many corner cases around synchronization of changes. | This eliminates many corner cases around synchronization of changes. | |||
| Some transport-level options that HTTP/2 specifies via the SETTINGS | Some transport-level options that HTTP/2 specifies via the SETTINGS | |||
| frame are superseded by QUIC transport parameters in HTTP/QUIC. The | frame are superseded by QUIC transport parameters in HTTP/QUIC. The | |||
| HTTP-level options that are retained in HTTP/QUIC have the same value | HTTP-level options that are retained in HTTP/QUIC have the same value | |||
| as in HTTP/2. | as in HTTP/2. | |||
| Below is a listing of how each HTTP/2 SETTINGS parameter is mapped: | Below is a listing of how each HTTP/2 SETTINGS parameter is mapped: | |||
| SETTINGS_HEADER_TABLE_SIZE: See Section 4.2.5.2. | SETTINGS_HEADER_TABLE_SIZE: See Section 4.2.6.2. | |||
| SETTINGS_ENABLE_PUSH: This is removed in favor of the MAX_PUSH_ID | SETTINGS_ENABLE_PUSH: This is removed in favor of the MAX_PUSH_ID | |||
| which provides a more granular control over server push. | which provides a more granular control over server push. | |||
| SETTINGS_MAX_CONCURRENT_STREAMS: QUIC controls the largest open | SETTINGS_MAX_CONCURRENT_STREAMS: QUIC controls the largest open | |||
| Stream ID as part of its flow control logic. Specifying | Stream ID as part of its flow control logic. Specifying | |||
| SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error. | SETTINGS_MAX_CONCURRENT_STREAMS in the SETTINGS frame is an error. | |||
| SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and | SETTINGS_INITIAL_WINDOW_SIZE: QUIC requires both stream and | |||
| connection flow control window sizes to be specified in the | connection flow control window sizes to be specified in the | |||
| initial transport handshake. Specifying | initial transport handshake. Specifying | |||
| SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. | SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. | |||
| SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/ | SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/ | |||
| QUIC. Specifying it in the SETTINGS frame is an error. | QUIC. Specifying it in the SETTINGS frame is an error. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE: See Section 4.2.5.2. | SETTINGS_MAX_HEADER_LIST_SIZE: See Section 4.2.6.2. | |||
| Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The | Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The | |||
| IDs of settings defined in [RFC7540] have been reserved for | IDs of settings defined in [RFC7540] have been reserved for | |||
| simplicity. See Section 9.4. | simplicity. See Section 9.4. | |||
| 7.4. HTTP/2 Error Codes | 7.4. HTTP/2 Error Codes | |||
| QUIC has the same concepts of "stream" and "connection" errors that | QUIC has the same concepts of "stream" and "connection" errors that | |||
| HTTP/2 provides. However, because the error code space is shared | HTTP/2 provides. However, because the error code space is shared | |||
| between multiple components, there is no direct portability of HTTP/2 | between multiple components, there is no direct portability of HTTP/2 | |||
| skipping to change at page 30, line 21 ¶ | skipping to change at page 33, line 19 ¶ | |||
| Specification: This document | Specification: This document | |||
| 9.2. Registration of QUIC Version Hint Alt-Svc Parameter | 9.2. Registration of QUIC Version Hint Alt-Svc Parameter | |||
| This document creates a new registration for version-negotiation | This document creates a new registration for version-negotiation | |||
| hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" | hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" | |||
| registry established in [RFC7838]. | registry established in [RFC7838]. | |||
| Parameter: "quic" | Parameter: "quic" | |||
| Specification: This document, Section 2.1.1 | Specification: This document, Section 2.2.1 | |||
| 9.3. Frame Types | 9.3. Frame Types | |||
| This document establishes a registry for HTTP/QUIC frame type codes. | This document establishes a registry for HTTP/QUIC frame type codes. | |||
| The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The | The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The | |||
| "HTTP/QUIC Frame Type" registry operates under either of the "IETF | "HTTP/QUIC Frame Type" registry operates under either of the "IETF | |||
| Review" or "IESG Approval" policies [RFC8126] for values between 0x00 | Review" or "IESG Approval" policies [RFC8126] for values from 0x00 up | |||
| and 0xef, with values between 0xf0 and 0xff being reserved for | to and including 0xef, with values from 0xf0 up to and including 0xff | |||
| Experimental Use. | being reserved for Experimental Use. | |||
| While this registry is separate from the "HTTP/2 Frame Type" registry | While this registry is separate from the "HTTP/2 Frame Type" registry | |||
| defined in [RFC7540], it is preferable that the assignments parallel | defined in [RFC7540], it is preferable that the assignments parallel | |||
| each other. If an entry is present in only one registry, every | each other. If an entry is present in only one registry, every | |||
| effort SHOULD be made to avoid assigning the corresponding value to | effort SHOULD be made to avoid assigning the corresponding value to | |||
| an unrelated operation. | an unrelated operation. | |||
| New entries in this registry require the following information: | New entries in this registry require the following information: | |||
| Frame Type: A name or label for the frame type. | Frame Type: A name or label for the frame type. | |||
| Code: The 8-bit code assigned to the frame type. | Code: The 8-bit code assigned to the frame type. | |||
| Specification: A reference to a specification that includes a | Specification: A reference to a specification that includes a | |||
| description of the frame layout, its semantics, and flags that the | description of the frame layout and its semantics, including any | |||
| frame type uses, including any parts of the frame that are | parts of the frame that are conditionally present. | |||
| conditionally present based on the value of flags. | ||||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +--------------+------+---------------+ | +--------------+------+---------------+ | |||
| | Frame Type | Code | Specification | | | Frame Type | Code | Specification | | |||
| +--------------+------+---------------+ | +--------------+------+---------------+ | |||
| | DATA | 0x0 | Section 4.2.1 | | | DATA | 0x0 | Section 4.2.2 | | |||
| | | | | | | | | | | |||
| | HEADERS | 0x1 | Section 4.2.2 | | | HEADERS | 0x1 | Section 4.2.3 | | |||
| | | | | | | | | | | |||
| | PRIORITY | 0x2 | Section 4.2.3 | | | PRIORITY | 0x2 | Section 4.2.4 | | |||
| | | | | | | | | | | |||
| | CANCEL_PUSH | 0x3 | Section 4.2.4 | | | CANCEL_PUSH | 0x3 | Section 4.2.5 | | |||
| | | | | | | | | | | |||
| | SETTINGS | 0x4 | Section 4.2.5 | | | SETTINGS | 0x4 | Section 4.2.6 | | |||
| | | | | | | | | | | |||
| | PUSH_PROMISE | 0x5 | Section 4.2.6 | | | PUSH_PROMISE | 0x5 | Section 4.2.7 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x6 | N/A | | | Reserved | 0x6 | N/A | | |||
| | | | | | | | | | | |||
| | GOAWAY | 0x7 | Section 4.2.7 | | | GOAWAY | 0x7 | Section 4.2.8 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x8 | N/A | | | Reserved | 0x8 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x9 | N/A | | | Reserved | 0x9 | N/A | | |||
| | | | | | | | | | | |||
| | MAX_PUSH_ID | 0xD | Section 4.2.8 | | | MAX_PUSH_ID | 0xD | Section 4.2.9 | | |||
| +--------------+------+---------------+ | +--------------+------+---------------+ | |||
| Additionally, each code of the format "0xb + (0x1f * N)" for values | ||||
| of N in the range (0..7) (that is, "0xb", "0x2a", etc., through | ||||
| "0xe4"), the following values should be registered: | ||||
| Frame Type: Reserved - GREASE | ||||
| Specification: Section 4.2.1 | ||||
| 9.4. Settings Parameters | 9.4. Settings Parameters | |||
| This document establishes a registry for HTTP/QUIC settings. The | This document establishes a registry for HTTP/QUIC settings. The | |||
| "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | |||
| Settings" registry operates under the "Expert Review" policy | Settings" registry operates under the "Expert Review" policy | |||
| [RFC8126] for values in the range from 0x0000 to 0xefff, with values | [RFC8126] for values in the range from 0x0000 to 0xefff, with values | |||
| between and 0xf000 and 0xffff being reserved for Experimental Use. | between and 0xf000 and 0xffff being reserved for Experimental Use. | |||
| The designated experts are the same as those for the "HTTP/2 | The designated experts are the same as those for the "HTTP/2 | |||
| Settings" registry defined in [RFC7540]. | Settings" registry defined in [RFC7540]. | |||
| skipping to change at page 32, line 10 ¶ | skipping to change at page 35, line 19 ¶ | |||
| Name: A symbolic name for the setting. Specifying a setting name is | Name: A symbolic name for the setting. Specifying a setting name is | |||
| optional. | optional. | |||
| Code: The 16-bit code assigned to the setting. | Code: The 16-bit code assigned to the setting. | |||
| Specification: An optional reference to a specification that | Specification: An optional reference to a specification that | |||
| describes the use of the setting. | describes the use of the setting. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +-----------------------+------+-----------------+ | +----------------------+------+-----------------+ | |||
| | Setting Name | Code | Specification | | | Setting Name | Code | Specification | | |||
| +-----------------------+------+-----------------+ | +----------------------+------+-----------------+ | |||
| | HEADER_TABLE_SIZE | 0x1 | Section 4.2.5.2 | | | Reserved | 0x2 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x2 | N/A | | | NUM_PLACEHOLDERS | 0x3 | Section 4.2.6.2 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x3 | N/A | | | Reserved | 0x4 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x4 | N/A | | | Reserved | 0x5 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x5 | N/A | | | MAX_HEADER_LIST_SIZE | 0x6 | Section 4.2.6.2 | | |||
| | | | | | +----------------------+------+-----------------+ | |||
| | MAX_HEADER_LIST_SIZE | 0x6 | Section 4.2.5.2 | | ||||
| | | | | | Additionally, each code of the format "0x?a?a" where each "?" is any | |||
| | QPACK_BLOCKED_STREAMS | 0x7 | Section 4.2.5.2 | | four bits (that is, "0x0a0a", "0x0a1a", etc. through "0xfafa"), the | |||
| +-----------------------+------+-----------------+ | following values should be registered: | |||
| Name: Reserved - GREASE | ||||
| Specification: Section 4.2.6.2 | ||||
| 9.5. Error Codes | 9.5. Error Codes | |||
| This document establishes a registry for HTTP/QUIC error codes. The | This document establishes a registry for HTTP/QUIC error codes. The | |||
| "HTTP/QUIC Error Code" registry manages a 16-bit space. The "HTTP/ | "HTTP/QUIC Error Code" registry manages a 16-bit space. The "HTTP/ | |||
| QUIC Error Code" registry operates under the "Expert Review" policy | QUIC Error Code" registry operates under the "Expert Review" policy | |||
| [RFC8126]. | [RFC8126]. | |||
| Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
| of the error code. An expert reviewer is advised to examine new | of the error code. An expert reviewer is advised to examine new | |||
| skipping to change at page 33, line 7 ¶ | skipping to change at page 36, line 20 ¶ | |||
| Code: The 16-bit error code value. | Code: The 16-bit error code value. | |||
| Description: A brief description of the error code semantics, longer | Description: A brief description of the error code semantics, longer | |||
| if no detailed specification is provided. | if no detailed specification is provided. | |||
| Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
| defines the error code. | defines the error code. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +----------------------------+--------+------------+----------------+ | +---------------------------+-------+--------------+----------------+ | |||
| | Name | Code | Descriptio | Specification | | | Name | Code | Description | Specification | | |||
| | | | n | | | +---------------------------+-------+--------------+----------------+ | |||
| +----------------------------+--------+------------+----------------+ | | STOPPING | 0x000 | Reserved by | [QUIC-TRANSPOR | | |||
| | STOPPING | 0x0000 | Reserved | [QUIC-TRANSPOR | | | | 0 | QUIC | T] | | |||
| | | | by QUIC | T] | | | | | | | | |||
| | | | | | | | HTTP_NO_ERROR | 0x000 | No error | Section 6.1 | | |||
| | HTTP_NO_ERROR | 0x0001 | No error | Section 6.1 | | | | 1 | | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_REFUSED | 0x0002 | Client | Section 6.1 | | | HTTP_PUSH_REFUSED | 0x000 | Client | Section 6.1 | | |||
| | | | refused | | | | | 2 | refused | | | |||
| | | | pushed | | | | | | pushed | | | |||
| | | | content | | | | | | content | | | |||
| | | | | | | | | | | | | |||
| | HTTP_INTERNAL_ERROR | 0x0003 | Internal | Section 6.1 | | | HTTP_INTERNAL_ERROR | 0x000 | Internal | Section 6.1 | | |||
| | | | error | | | | | 3 | error | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_ALREADY_IN_CACHE | 0x0004 | Pushed | Section 6.1 | | | HTTP_PUSH_ALREADY_IN_CACH | 0x000 | Pushed | Section 6.1 | | |||
| | | | content | | | | E | 4 | content | | | |||
| | | | already | | | | | | already | | | |||
| | | | cached | | | | | | cached | | | |||
| | | | | | | | | | | | | |||
| | HTTP_REQUEST_CANCELLED | 0x0005 | Data no | Section 6.1 | | | HTTP_REQUEST_CANCELLED | 0x000 | Data no | Section 6.1 | | |||
| | | | longer | | | | | 5 | longer | | | |||
| | | | needed | | | | | | needed | | | |||
| | | | | | | | | | | | | |||
| | HTTP_HPACK_DECOMPRESSION_F | 0x0006 | HPACK | Section 6.1 | | | HTTP_HPACK_DECOMPRESSION_ | 0x000 | HPACK cannot | Section 6.1 | | |||
| | AILED | | cannot | | | | FAILED | 6 | continue | | | |||
| | | | continue | | | | | | | | | |||
| | | | | | | | HTTP_CONNECT_ERROR | 0x000 | TCP reset or | Section 6.1 | | |||
| | HTTP_CONNECT_ERROR | 0x0007 | TCP reset | Section 6.1 | | | | 7 | error on | | | |||
| | | | or error | | | | | | CONNECT | | | |||
| | | | on CONNECT | | | | | | request | | | |||
| | | | request | | | | | | | | | |||
| | | | | | | | HTTP_EXCESSIVE_LOAD | 0x000 | Peer | Section 6.1 | | |||
| | HTTP_EXCESSIVE_LOAD | 0x0008 | Peer | Section 6.1 | | | | 8 | generating | | | |||
| | | | generating | | | | | | excessive | | | |||
| | | | excessive | | | | | | load | | | |||
| | | | load | | | | | | | | | |||
| | | | | | | | HTTP_VERSION_FALLBACK | 0x000 | Retry over | Section 6.1 | | |||
| | HTTP_VERSION_FALLBACK | 0x0009 | Retry over | Section 6.1 | | | | 9 | HTTP/2 | | | |||
| | | | HTTP/2 | | | | | | | | | |||
| | | | | | | | HTTP_WRONG_STREAM | 0x000 | A frame was | Section 6.1 | | |||
| | HTTP_WRONG_STREAM | 0x000A | A frame | Section 6.1 | | | | A | sent on the | | | |||
| | | | was sent | | | | | | wrong stream | | | |||
| | | | on the | | | | | | | | | |||
| | | | wrong | | | | HTTP_PUSH_LIMIT_EXCEEDED | 0x000 | Maximum Push | Section 6.1 | | |||
| | | | stream | | | | | B | ID exceeded | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_LIMIT_EXCEEDED | 0x000B | Maximum | Section 6.1 | | | HTTP_DUPLICATE_PUSH | 0x000 | Push ID was | Section 6.1 | | |||
| | | | Push ID | | | | | C | fulfilled | | | |||
| | | | exceeded | | | | | | multiple | | | |||
| | | | | | | | | | times | | | |||
| | HTTP_DUPLICATE_PUSH | 0x000C | Push ID | Section 6.1 | | | | | | | | |||
| | | | was | | | | HTTP_UNKNOWN_STREAM_TYPE | 0x000 | Unknown unid | Section 6.1 | | |||
| | | | fulfilled | | | | | D | irectional | | | |||
| | | | multiple | | | | | | stream type | | | |||
| | | | times | | | | | | | | | |||
| | | | | | | | HTTP_WRONG_STREAM_COUNT | 0x000 | Too many uni | Section 6.1 | | |||
| | HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 6.1 | | | | E | directional | | | |||
| | | | frame | | | | | | streams | | | |||
| | | | formatting | | | | | | | | | |||
| | | | or use | | | | HTTP_CLOSED_CRITICAL_STRE | 0x000 | Critical | Section 6.1 | | |||
| +----------------------------+--------+------------+----------------+ | | AM | F | stream was | | | |||
| | | | closed | | | ||||
| | | | | | | ||||
| | HTTP_WRONG_STREAM_DIRECTI | 0x001 | Unidirection | Section 6.1 | | ||||
| | ON | 0 | al stream in | | | ||||
| | | | wrong | | | ||||
| | | | direction | | | ||||
| | | | | | | ||||
| | HTTP_MALFORMED_FRAME | 0x01X | Error in | Section 6.1 | | ||||
| | | X | frame | | | ||||
| | | | formatting | | | ||||
| | | | or use | | | ||||
| +---------------------------+-------+--------------+----------------+ | ||||
| 9.6. Stream Types | ||||
| This document establishes a registry for HTTP/QUIC unidirectional | ||||
| stream types. The "HTTP/QUIC Stream Type" registry manages an 8-bit | ||||
| space. The "HTTP/QUIC Stream Type" registry operates under either of | ||||
| the "IETF Review" or "IESG Approval" policies [RFC8126] for values | ||||
| from 0x00 up to and including 0xef, with values from 0xf0 up to and | ||||
| including 0xff being reserved for Experimental Use. | ||||
| New entries in this registry require the following information: | ||||
| Stream Type: A name or label for the stream type. | ||||
| Code: The 8-bit code assigned to the stream type. | ||||
| Specification: A reference to a specification that includes a | ||||
| description of the stream type, including the layout semantics of | ||||
| its payload. | ||||
| Sender: Which endpoint on a connection may initiate a stream of this | ||||
| type. Values are "Client", "Server", or "Both". | ||||
| The entries in the following table are registered by this document. | ||||
| +----------------+------+---------------+--------+ | ||||
| | Stream Type | Code | Specification | Sender | | ||||
| +----------------+------+---------------+--------+ | ||||
| | Control Stream | 0x43 | Section 3.3.1 | Both | | ||||
| | | | | | | ||||
| | Push Stream | 0x50 | Section 3.3.2 | Server | | ||||
| +----------------+------+---------------+--------+ | ||||
| 10. References | 10. References | |||
| 10.1. Normative References | 10.1. Normative References | |||
| [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | |||
| Header Compression for HTTP over QUIC", draft-ietf-quic- | Header Compression for HTTP over QUIC", draft-ietf-quic- | |||
| qpack-00 (work in progress), May 2018. | qpack-01 (work in progress), June 2018. | |||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", draft-ietf-quic- | Multiplexed and Secure Transport", draft-ietf-quic- | |||
| transport-11 (work in progress), May 2018. | transport-12 (work in progress), June 2018. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 36, line 5 ¶ | skipping to change at page 40, line 18 ¶ | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| 10.3. URIs | 10.3. URIs | |||
| [1] https://mailarchive.ietf.org/arch/search/?email_list=quic | [1] https://mailarchive.ietf.org/arch/search/?email_list=quic | |||
| [2] https://github.com/quicwg | [2] https://github.com/quicwg | |||
| [3] https://github.com/quicwg/base-drafts/labels/-http | [3] https://github.com/quicwg/base-drafts/labels/-http | |||
| Appendix A. Contributors | Appendix A. Change Log | |||
| The original authors of this specification were Robbie Shade and Mike | *RFC Editor's Note:* Please remove this section prior to | |||
| Warres. | publication of a final version of this document. | |||
| A substantial portion of Mike's contribution was supported by | A.1. Since draft-ietf-quic-http-12 | |||
| Microsoft during his employment there. | ||||
| Appendix B. Change Log | o TLS SNI extension isn't mandatory if an alternative method is used | |||
| (#1459, #1462, #1466) | ||||
| *RFC Editor's Note:* Please remove this section prior to | o Removed flags from HTTP/QUIC frames (#1388, #1398) | |||
| publication of a final version of this document. | ||||
| B.1. Since draft-ietf-quic-http-11 | o Reserved frame types and settings for use in preserving | |||
| extensibility (#1333, #1446) | ||||
| o Added general error code (#1391, #1397) | ||||
| o Unidirectional streams carry a type byte and are extensible | ||||
| (#910,#1359) | ||||
| o Priority mechanism now uses explicit placeholders to enable | ||||
| persistent structure in the tree (#441,#1421,#1422) | ||||
| A.2. Since draft-ietf-quic-http-11 | ||||
| o Moved QPACK table updates and acknowledgments to dedicated streams | o Moved QPACK table updates and acknowledgments to dedicated streams | |||
| (#1121, #1122, #1238) | (#1121, #1122, #1238) | |||
| B.2. Since draft-ietf-quic-http-10 | A.3. Since draft-ietf-quic-http-10 | |||
| o Settings need to be remembered when attempting and accepting 0-RTT | o Settings need to be remembered when attempting and accepting 0-RTT | |||
| (#1157, #1207) | (#1157, #1207) | |||
| B.3. Since draft-ietf-quic-http-09 | A.4. Since draft-ietf-quic-http-09 | |||
| o Selected QCRAM for header compression (#228, #1117) | o Selected QCRAM for header compression (#228, #1117) | |||
| o The server_name TLS extension is now mandatory (#296, #495) | o The server_name TLS extension is now mandatory (#296, #495) | |||
| o Specified handling of unsupported versions in Alt-Svc (#1093, | o Specified handling of unsupported versions in Alt-Svc (#1093, | |||
| #1097) | #1097) | |||
| B.4. Since draft-ietf-quic-http-08 | A.5. Since draft-ietf-quic-http-08 | |||
| o Clarified connection coalescing rules (#940, #1024) | o Clarified connection coalescing rules (#940, #1024) | |||
| B.5. Since draft-ietf-quic-http-07 | A.6. Since draft-ietf-quic-http-07 | |||
| o Changes for integer encodings in QUIC (#595,#905) | o Changes for integer encodings in QUIC (#595,#905) | |||
| o Use unidirectional streams as appropriate (#515, #240, #281, #886) | o Use unidirectional streams as appropriate (#515, #240, #281, #886) | |||
| o Improvement to the description of GOAWAY (#604, #898) | o Improvement to the description of GOAWAY (#604, #898) | |||
| o Improve description of server push usage (#947, #950, #957) | o Improve description of server push usage (#947, #950, #957) | |||
| B.6. Since draft-ietf-quic-http-06 | A.7. Since draft-ietf-quic-http-06 | |||
| o Track changes in QUIC error code usage (#485) | o Track changes in QUIC error code usage (#485) | |||
| B.7. Since draft-ietf-quic-http-05 | A.8. Since draft-ietf-quic-http-05 | |||
| o Made push ID sequential, add MAX_PUSH_ID, remove | o Made push ID sequential, add MAX_PUSH_ID, remove | |||
| SETTINGS_ENABLE_PUSH (#709) | SETTINGS_ENABLE_PUSH (#709) | |||
| o Guidance about keep-alive and QUIC PINGs (#729) | o Guidance about keep-alive and QUIC PINGs (#729) | |||
| o Expanded text on GOAWAY and cancellation (#757) | o Expanded text on GOAWAY and cancellation (#757) | |||
| B.8. Since draft-ietf-quic-http-04 | A.9. Since draft-ietf-quic-http-04 | |||
| o Cite RFC 5234 (#404) | o Cite RFC 5234 (#404) | |||
| o Return to a single stream per request (#245,#557) | o Return to a single stream per request (#245,#557) | |||
| o Use separate frame type and settings registries from HTTP/2 (#81) | o Use separate frame type and settings registries from HTTP/2 (#81) | |||
| o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| o Restored GOAWAY (#696) | o Restored GOAWAY (#696) | |||
| skipping to change at page 37, line 29 ¶ | skipping to change at page 42, line 4 ¶ | |||
| o Cite RFC 5234 (#404) | o Cite RFC 5234 (#404) | |||
| o Return to a single stream per request (#245,#557) | o Return to a single stream per request (#245,#557) | |||
| o Use separate frame type and settings registries from HTTP/2 (#81) | o Use separate frame type and settings registries from HTTP/2 (#81) | |||
| o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| o Restored GOAWAY (#696) | o Restored GOAWAY (#696) | |||
| o Identify server push using Push ID rather than a stream ID | o Identify server push using Push ID rather than a stream ID | |||
| (#702,#281) | (#702,#281) | |||
| o DATA frames cannot be empty (#700) | o DATA frames cannot be empty (#700) | |||
| B.9. Since draft-ietf-quic-http-03 | A.10. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.10. Since draft-ietf-quic-http-02 | A.11. Since draft-ietf-quic-http-02 | |||
| o Track changes in transport draft | o Track changes in transport draft | |||
| B.11. Since draft-ietf-quic-http-01 | A.12. Since draft-ietf-quic-http-01 | |||
| o SETTINGS changes (#181): | o SETTINGS changes (#181): | |||
| * SETTINGS can be sent only once at the start of a connection; no | * SETTINGS can be sent only once at the start of a connection; no | |||
| changes thereafter | changes thereafter | |||
| * SETTINGS_ACK removed | * SETTINGS_ACK removed | |||
| * Settings can only occur in the SETTINGS frame a single time | * Settings can only occur in the SETTINGS frame a single time | |||
| * Boolean format updated | * Boolean format updated | |||
| o Alt-Svc parameter changed from "v" to "quic"; format updated | o Alt-Svc parameter changed from "v" to "quic"; format updated | |||
| (#229) | (#229) | |||
| o Closing the connection control stream or any message control | o Closing the connection control stream or any message control | |||
| stream is a fatal error (#176) | stream is a fatal error (#176) | |||
| o HPACK Sequence counter can wrap (#173) | o HPACK Sequence counter can wrap (#173) | |||
| o 0-RTT guidance added | o 0-RTT guidance added | |||
| o Guide to differences from HTTP/2 and porting HTTP/2 extensions | o Guide to differences from HTTP/2 and porting HTTP/2 extensions | |||
| added (#127,#242) | added (#127,#242) | |||
| B.12. Since draft-ietf-quic-http-00 | A.13. Since draft-ietf-quic-http-00 | |||
| o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | o Changed "HTTP/2-over-QUIC" to "HTTP/QUIC" throughout (#11,#29) | |||
| o Changed from using HTTP/2 framing within Stream 3 to new framing | o Changed from using HTTP/2 framing within Stream 3 to new framing | |||
| format and two-stream-per-request model (#71,#72,#73) | format and two-stream-per-request model (#71,#72,#73) | |||
| o Adopted SETTINGS format from draft-bishop-httpbis-extended- | o Adopted SETTINGS format from draft-bishop-httpbis-extended- | |||
| settings-01 | settings-01 | |||
| o Reworked SETTINGS_ACK to account for indeterminate inter-stream | o Reworked SETTINGS_ACK to account for indeterminate inter-stream | |||
| order (#75) | order (#75) | |||
| o Described CONNECT pseudo-method (#95) | o Described CONNECT pseudo-method (#95) | |||
| o Updated ALPN token and Alt-Svc guidance (#13,#87) | o Updated ALPN token and Alt-Svc guidance (#13,#87) | |||
| o Application-layer-defined error codes (#19,#74) | o Application-layer-defined error codes (#19,#74) | |||
| B.13. Since draft-shade-quic-http2-mapping-00 | A.14. Since draft-shade-quic-http2-mapping-00 | |||
| o Adopted as base for draft-ietf-quic-http | o Adopted as base for draft-ietf-quic-http | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| Acknowledgements | ||||
| The original authors of this specification were Robbie Shade and Mike | ||||
| Warres. | ||||
| A substantial portion of Mike's contribution was supported by | ||||
| Microsoft during his employment there. | ||||
| Author's Address | Author's Address | |||
| Mike Bishop (editor) | Mike Bishop (editor) | |||
| Akamai | Akamai | |||
| Email: mbishop@evequefou.be | Email: mbishop@evequefou.be | |||
| End of changes. 143 change blocks. | ||||
| 425 lines changed or deleted | 639 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/ | ||||