| draft-ietf-quic-http-17.txt | draft-ietf-quic-http-18.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track December 18, 2018 | Intended status: Standards Track January 23, 2019 | |||
| Expires: June 21, 2019 | Expires: July 27, 2019 | |||
| Hypertext Transfer Protocol Version 3 (HTTP/3) | Hypertext Transfer Protocol Version 3 (HTTP/3) | |||
| draft-ietf-quic-http-17 | draft-ietf-quic-http-18 | |||
| 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 HTTP/3. | how HTTP/2 extensions can be ported to HTTP/3. | |||
| 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 June 21, 2019. | This Internet-Draft will expire on July 27, 2019. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2019 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 | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| 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 | |||
| skipping to change at page 2, line 34 ¶ | skipping to change at page 2, line 34 ¶ | |||
| 2. Connection Setup and Management . . . . . . . . . . . . . . . 5 | 2. Connection Setup and Management . . . . . . . . . . . . . . . 5 | |||
| 2.1. Draft Version Identification . . . . . . . . . . . . . . 5 | 2.1. Draft Version Identification . . . . . . . . . . . . . . 5 | |||
| 2.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 5 | 2.2. Discovering an HTTP/3 Endpoint . . . . . . . . . . . . . 5 | |||
| 2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 6 | 2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 6 | |||
| 2.3. Connection Establishment . . . . . . . . . . . . . . . . 6 | 2.3. Connection Establishment . . . . . . . . . . . . . . . . 6 | |||
| 2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 7 | 2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 8 | 3.1. Bidirectional Streams . . . . . . . . . . . . . . . . . . 8 | |||
| 3.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 8 | 3.2. Unidirectional Streams . . . . . . . . . . . . . . . . . 8 | |||
| 3.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 9 | 3.2.1. Control Streams . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 9 | 3.2.2. Push Streams . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 10 | 3.2.3. Reserved Stream Types . . . . . . . . . . . . . . . . 10 | |||
| 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 10 | 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 10 | 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 11 | 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 11 | 4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 12 | 4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 12 | 4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 14 | 4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 15 | 4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 18 | 4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 18 | 4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 19 | 4.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.2.9. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 20 | 4.2.9. DUPLICATE_PUSH . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.2.10. Reserved Frame Types . . . . . . . . . . . . . . . . 21 | 4.2.10. Reserved Frame Types . . . . . . . . . . . . . . . . 21 | |||
| 5. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 21 | 5. HTTP Request Lifecycle . . . . . . . . . . . . . . . . . . . 21 | |||
| 5.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 21 | 5.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 21 | |||
| 5.1.1. Header Formatting and Compression . . . . . . . . . . 22 | 5.1.1. Header Formatting and Compression . . . . . . . . . . 22 | |||
| 5.1.2. Request Cancellation . . . . . . . . . . . . . . . . 23 | 5.1.2. Request Cancellation and Rejection . . . . . . . . . 23 | |||
| 5.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 24 | 5.2. The CONNECT Method . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.3. Request Prioritization . . . . . . . . . . . . . . . . . 25 | 5.3. Prioritization . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 5.3.1. Placeholders . . . . . . . . . . . . . . . . . . . . 26 | 5.3.1. Placeholders . . . . . . . . . . . . . . . . . . . . 26 | |||
| 5.3.2. Priority Tree Maintenance . . . . . . . . . . . . . . 26 | 5.3.2. Priority Tree Maintenance . . . . . . . . . . . . . . 26 | |||
| 5.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 27 | 5.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6. Connection Closure . . . . . . . . . . . . . . . . . . . . . 28 | 6. Connection Closure . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 6.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 28 | 6.1. Idle Connections . . . . . . . . . . . . . . . . . . . . 28 | |||
| 6.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 29 | 6.2. Connection Shutdown . . . . . . . . . . . . . . . . . . . 29 | |||
| 6.3. Immediate Application Closure . . . . . . . . . . . . . . 30 | 6.3. Immediate Application Closure . . . . . . . . . . . . . . 30 | |||
| 6.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 30 | 6.4. Transport Closure . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 31 | 7. Extensions to HTTP/3 . . . . . . . . . . . . . . . . . . . . 31 | |||
| 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 31 | 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| skipping to change at page 3, line 33 ¶ | skipping to change at page 3, line 33 ¶ | |||
| 10.4. Settings Parameters . . . . . . . . . . . . . . . . . . 36 | 10.4. Settings Parameters . . . . . . . . . . . . . . . . . . 36 | |||
| 10.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 37 | 10.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 10.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 39 | 10.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 40 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 11.1. Normative References . . . . . . . . . . . . . . . . . . 40 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 40 | |||
| 11.2. Informative References . . . . . . . . . . . . . . . . . 41 | 11.2. Informative References . . . . . . . . . . . . . . . . . 41 | |||
| 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 42 | 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| Appendix A. Considerations for Transitioning from HTTP/2 . . . . 42 | Appendix A. Considerations for Transitioning from HTTP/2 . . . . 42 | |||
| A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 42 | A.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 42 | A.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 42 | |||
| A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 44 | A.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 45 | |||
| A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 45 | A.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 45 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 46 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 47 | |||
| B.1. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 46 | B.1. Since draft-ietf-quic-http-17 . . . . . . . . . . . . . . 47 | |||
| B.2. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 47 | B.2. Since draft-ietf-quic-http-16 . . . . . . . . . . . . . . 47 | |||
| B.3. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 47 | B.3. Since draft-ietf-quic-http-15 . . . . . . . . . . . . . . 47 | |||
| B.4. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 47 | B.4. Since draft-ietf-quic-http-14 . . . . . . . . . . . . . . 47 | |||
| B.5. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 48 | B.5. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 48 | |||
| B.6. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 48 | B.6. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 48 | |||
| B.7. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 48 | B.7. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 48 | |||
| B.8. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 48 | B.8. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 48 | |||
| B.9. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 48 | B.9. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 49 | |||
| B.10. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 48 | B.10. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 49 | |||
| B.11. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 49 | B.11. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 49 | |||
| B.12. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 49 | B.12. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 49 | |||
| B.13. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 49 | B.13. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 49 | |||
| B.14. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 49 | B.14. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 49 | |||
| B.15. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 49 | B.15. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 50 | |||
| B.16. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 49 | B.16. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 50 | |||
| B.17. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 50 | B.17. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 50 | |||
| B.18. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 50 | B.18. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 50 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 50 | B.19. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 51 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 51 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 51 | |||
| 1. Introduction | 1. Introduction | |||
| HTTP semantics are used for a broad range of services on the | HTTP semantics are used for a broad range of services on the | |||
| Internet. These semantics have commonly been used with two different | Internet. These semantics have commonly been used with two different | |||
| TCP mappings, HTTP/1.1 and HTTP/2. HTTP/2 introduced a framing and | TCP mappings, HTTP/1.1 and HTTP/2. HTTP/2 introduced a framing and | |||
| multiplexing layer to improve latency without modifying the transport | multiplexing layer to improve latency without modifying the transport | |||
| layer. However, TCP's lack of visibility into parallel requests in | layer. However, TCP's lack of visibility into parallel requests in | |||
| both mappings limited the possible performance gains. | both mappings limited the possible performance gains. | |||
| The QUIC transport protocol incorporates stream multiplexing and per- | The QUIC transport protocol incorporates stream multiplexing and per- | |||
| stream flow control, similar to that provided by the HTTP/2 framing | stream flow control, similar to that provided by the HTTP/2 framing | |||
| layer. By providing reliability at the stream level and congestion | layer. By providing reliability at the stream level and congestion | |||
| control across the entire connection, it has the capability to | control across the entire connection, it has the capability to | |||
| improve the performance of HTTP compared to a TCP mapping. QUIC also | improve the performance of HTTP compared to a TCP mapping. QUIC also | |||
| incorporates TLS 1.3 at the transport layer, offering comparable | incorporates TLS 1.3 at the transport layer, offering comparable | |||
| security to running TLS over TCP, but with improved connection setup | security to running TLS over TCP, but with improved connection setup | |||
| latency. | latency (unless TCP Fast Open [RFC7413]} is used). | |||
| This document describes a mapping of HTTP semantics over the QUIC | This document defines a mapping of HTTP semantics over the QUIC | |||
| transport protocol, drawing heavily on design of HTTP/2. This | transport protocol, drawing heavily on the design of HTTP/2. This | |||
| document identifies HTTP/2 features that are subsumed by QUIC, and | document identifies HTTP/2 features that are subsumed by QUIC, and | |||
| describes how the other features can be implemented atop QUIC. | describes how the other features can be implemented atop QUIC. | |||
| QUIC is described in [QUIC-TRANSPORT]. For a full description of | QUIC is described in [QUIC-TRANSPORT]. For a full description of | |||
| HTTP/2, see [RFC7540]. | HTTP/2, see [RFC7540]. | |||
| 1.1. Notational Conventions | 1.1. Notational Conventions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| skipping to change at page 5, line 39 ¶ | skipping to change at page 5, line 39 ¶ | |||
| that any label MUST conform to the "token" syntax defined in | that any label MUST conform to the "token" syntax defined in | |||
| Section 3.2.6 of [RFC7230]. Experimenters are encouraged to | Section 3.2.6 of [RFC7230]. Experimenters are encouraged to | |||
| coordinate their experiments on the quic@ietf.org mailing list. | coordinate their experiments on the quic@ietf.org mailing list. | |||
| 2.2. Discovering an HTTP/3 Endpoint | 2.2. Discovering an HTTP/3 Endpoint | |||
| An HTTP origin advertises the availability of an equivalent HTTP/3 | An HTTP origin advertises the availability of an equivalent HTTP/3 | |||
| endpoint via the Alt-Svc HTTP response header field or the HTTP/2 | endpoint via the Alt-Svc HTTP response header field or the HTTP/2 | |||
| ALTSVC frame ([ALTSVC]), using the ALPN token defined in Section 2.3. | ALTSVC frame ([ALTSVC]), 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 response that HTTP/3 | |||
| response that HTTP/3 was available on UDP port 50781 at the same | was available on UDP port 50781 at the same hostname by including the | |||
| hostname by including the following header field in any response: | following header field: | |||
| Alt-Svc: h3=":50781" | Alt-Svc: h3=":50781" | |||
| On receipt of an Alt-Svc record indicating HTTP/3 support, a client | On receipt of an Alt-Svc record indicating HTTP/3 support, a client | |||
| MAY attempt to establish a QUIC connection to the indicated host and | MAY attempt to establish a QUIC connection to the indicated host and | |||
| port and, if successful, send HTTP requests using the mapping | port and, if successful, send HTTP requests using the mapping | |||
| described in this document. | 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 | |||
| skipping to change at page 7, line 7 ¶ | skipping to change at page 7, line 7 ¶ | |||
| 2.3. Connection Establishment | 2.3. Connection Establishment | |||
| HTTP/3 relies on QUIC as the underlying transport. The QUIC version | HTTP/3 relies on QUIC as the underlying transport. The QUIC version | |||
| being used MUST use TLS version 1.3 or greater as its handshake | being used MUST use TLS version 1.3 or greater as its handshake | |||
| protocol. HTTP/3 clients MUST indicate the target domain name during | protocol. HTTP/3 clients MUST indicate the target domain name during | |||
| the TLS handshake. This may be done using the Server Name Indication | the TLS handshake. This may be done using the Server Name Indication | |||
| (SNI) [RFC6066] extension to TLS or using some other mechanism. | (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/3 support is indicated by | During connection establishment, HTTP/3 support is indicated by | |||
| selecting the ALPN token "hq" in the TLS handshake. Support for | selecting the ALPN token "h3" 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/3-specific settings are | are set in the initial crypto handshake, HTTP/3-specific settings are | |||
| conveyed in the SETTINGS frame. After the QUIC connection is | conveyed in the SETTINGS frame. After the QUIC connection is | |||
| established, a SETTINGS frame (Section 4.2.5) MUST be sent by each | established, a SETTINGS frame (Section 4.2.5) 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 | |||
| (see Section 3.2.1). | (see Section 3.2.1). | |||
| skipping to change at page 7, line 50 ¶ | skipping to change at page 7, line 50 ¶ | |||
| to the management of HTTP/3 connections. | to the management of HTTP/3 connections. | |||
| 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. The transport | this framing is invisible to the HTTP framing layer. The transport | |||
| layer buffers and orders received QUIC STREAM frames, exposing the | layer buffers and orders received QUIC STREAM frames, exposing the | |||
| data contained within as a reliable byte stream to the application. | data contained within as a reliable byte stream to the application. | |||
| Although QUIC permits out-of-order delivery within a stream HTTP/3 | ||||
| does not make use of this feature. | ||||
| QUIC streams can be either unidirectional, carrying data only from | QUIC streams can be either unidirectional, carrying data only from | |||
| initiator to receiver, or bidirectional. Streams can be initiated by | initiator to receiver, or bidirectional. Streams can be initiated by | |||
| either the client or the server. For more detail on QUIC streams, | either the client or the server. For more detail on QUIC streams, | |||
| see Section 2 of [QUIC-TRANSPORT]. | see Section 2 of [QUIC-TRANSPORT]. | |||
| 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. HTTP does not need to do any separate | most of the stream management. HTTP does not need to do any separate | |||
| multiplexing when using QUIC - data sent over a QUIC stream always | multiplexing when using QUIC - data sent over a QUIC stream always | |||
| maps to a particular HTTP transaction or connection context. | maps to a particular HTTP transaction or connection context. | |||
| skipping to change at page 9, line 25 ¶ | skipping to change at page 9, line 25 ¶ | |||
| the semantics are unknown. Recipients of unknown stream types MAY | the semantics are unknown. Recipients of unknown stream types MAY | |||
| trigger a QUIC STOP_SENDING frame with an error code of | trigger a QUIC STOP_SENDING frame with an error code of | |||
| HTTP_UNKNOWN_STREAM_TYPE, but MUST NOT consider such streams to be an | HTTP_UNKNOWN_STREAM_TYPE, but MUST NOT consider such streams to be an | |||
| error of any kind. | error of any kind. | |||
| Implementations MAY send stream types before knowing whether the peer | Implementations MAY send stream types before knowing whether the peer | |||
| supports them. However, stream types which could modify the state or | supports them. However, stream types which could modify the state or | |||
| semantics of existing protocol components, including QPACK or other | semantics of existing protocol components, including QPACK or other | |||
| extensions, MUST NOT be sent until the peer is known to support them. | extensions, MUST NOT be sent until the peer is known to support them. | |||
| A sender can close or reset a unidirectional stream unless otherwise | ||||
| specified. A receiver MUST tolerate unidirectional streams being | ||||
| closed or reset prior to the reception of the unidirectional stream | ||||
| header. | ||||
| 3.2.1. Control Streams | 3.2.1. Control Streams | |||
| A control stream is indicated by a stream type of "0x43" (ASCII 'C'). | A control stream is indicated by a stream type of "0x43" (ASCII 'C'). | |||
| Data on this stream consists of HTTP/3 frames, as defined in | Data on this stream consists of HTTP/3 frames, as defined in | |||
| Section 4.2. | Section 4.2. | |||
| Each side MUST initiate a single control stream at the beginning of | 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 | the connection and send its SETTINGS frame as the first frame on this | |||
| stream. If the first frame of the control stream is any other frame | stream. If the first frame of the control stream is any other frame | |||
| type, this MUST be treated as a connection error of type | type, this MUST be treated as a connection error of type | |||
| HTTP_MISSING_SETTINGS. Only one control stream per peer is | HTTP_MISSING_SETTINGS. Only one control stream per peer is | |||
| permitted; receipt of a second stream which claims to be a control | permitted; receipt of a second stream which claims to be a control | |||
| stream MUST be treated as a connection error of type | stream MUST be treated as a connection error of type | |||
| HTTP_WRONG_STREAM_COUNT. If the control stream is closed at any | HTTP_WRONG_STREAM_COUNT. The sender MUST NOT close the control | |||
| point, this MUST be treated as a connection error of type | stream. If the control stream is closed at any point, this MUST be | |||
| HTTP_CLOSED_CRITICAL_STREAM. | treated as a connection error of type HTTP_CLOSED_CRITICAL_STREAM. | |||
| A pair of unidirectional streams is used rather than a single | A pair of unidirectional streams is used rather than a single | |||
| bidirectional stream. This allows either peer to send data as soon | bidirectional stream. This allows either peer to send data as soon | |||
| they are able. Depending on whether 0-RTT is enabled on the | they are able. Depending on whether 0-RTT is enabled on the | |||
| connection, either client or server might be able to send stream data | connection, either client or server might be able to send stream data | |||
| first after the cryptographic handshake completes. | first after the cryptographic handshake completes. | |||
| 3.2.2. Push Streams | 3.2.2. Push Streams | |||
| A push stream is indicated by a stream type of "0x50" (ASCII 'P'), | A push stream is indicated by a stream type of "0x50" (ASCII 'P'), | |||
| skipping to change at page 10, line 38 ¶ | skipping to change at page 10, line 44 ¶ | |||
| semantic meaning, and can be sent when application-layer padding is | semantic meaning, and can be sent when application-layer padding is | |||
| desired. They MAY also be sent on connections where no request data | desired. They MAY also be sent on connections where no request data | |||
| is currently being transferred. Endpoints MUST NOT consider these | is currently being transferred. Endpoints MUST NOT consider these | |||
| streams to have any meaning upon receipt. | streams to have any meaning upon receipt. | |||
| The payload and length of the stream are selected in any manner the | The payload and length of the stream are selected in any manner the | |||
| implementation chooses. | implementation chooses. | |||
| 4. HTTP Framing Layer | 4. HTTP Framing Layer | |||
| Frames are used on control streams, request streams, and push | As discussed above, frames are carried on QUIC streams and used on | |||
| streams. This section describes HTTP framing in QUIC. For a | control streams, request streams, and push streams. This section | |||
| comparison with HTTP/2 frames, see Appendix A.2. | describes HTTP framing in QUIC. For a comparison with HTTP/2 frames, | |||
| see Appendix A.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) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 11, line 25 ¶ | skipping to change at page 11, line 29 ¶ | |||
| 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 Type field. | Frame Payload. This length does not include the Type field. | |||
| Type: An 8-bit type for the frame. | Type: An 8-bit type for the frame. | |||
| 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. | |||
| Each frame's payload MUST contain exactly the identified fields. A | Each frame's payload MUST contain exactly the fields identified in | |||
| frame that contains additional bytes after the identified fields or a | its description. A frame payload that contains additional bytes | |||
| frame that terminates before the end of the identified fields MUST be | after the identified fields or a frame payload that terminates before | |||
| treated as a connection error of type HTTP_MALFORMED_FRAME. | the end of the identified fields MUST be treated as a connection | |||
| error of type HTTP_MALFORMED_FRAME. | ||||
| 4.2. Frame Definitions | 4.2. Frame Definitions | |||
| 4.2.1. DATA | 4.2.1. DATA | |||
| DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
| bytes associated with an HTTP request or response payload. | bytes associated with an HTTP request or response payload. | |||
| 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 | |||
| skipping to change at page 12, line 23 ¶ | skipping to change at page 12, line 31 ¶ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: HEADERS frame payload | Figure 5: 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.3. PRIORITY | |||
| The PRIORITY (type=0x02) frame specifies the client-advised priority | The PRIORITY (type=0x02) frame specifies the client-advised priority | |||
| of a stream. | of a request, server push or placeholder. | |||
| When opening a new request stream, a PRIORITY frame MAY be sent as | A PRIORITY frame identifies an element to prioritize, and an element | |||
| the first frame of the stream creating a dependency on an existing | upon which it depends. A Prioritized ID or Dependency ID identifies | |||
| a client-initiated request using the corresponding stream ID, a | ||||
| server push using a Push ID (see Section 4.2.6), or a placeholder | ||||
| using a Placeholder ID (see Section 5.3.1). | ||||
| When a client initiates a request, a PRIORITY frame MAY be sent as | ||||
| the first frame of the stream, creating a dependency on an existing | ||||
| element. In order to ensure that prioritization is processed in a | element. In order to ensure that prioritization is processed in a | |||
| consistent order, any subsequent PRIORITY frames MUST be sent on the | consistent order, any subsequent PRIORITY frames for that request | |||
| control stream. A PRIORITY frame received after other frames on a | MUST be sent on the control stream. A PRIORITY frame received after | |||
| request stream MUST be treated as a stream error of type | other frames on a request stream MUST be treated as a stream error of | |||
| HTTP_UNEXPECTED_FRAME. | type HTTP_UNEXPECTED_FRAME. | |||
| If, by the time a new request stream is opened, its priority | If, by the time a new request stream is opened, its priority | |||
| information has already been received via the control stream, the | information has already been received via the control stream, the | |||
| PRIORITY frame sent on the request stream MUST be ignored. | PRIORITY frame sent on the request stream MUST be ignored. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |PT |DT | Empty | [Prioritized Element ID (i)] ... | |PT |DT | Empty | [Prioritized Element ID (i)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Element Dependency ID (i)] ... | | [Element Dependency ID (i)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Weight (8) | | | Weight (8) | | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| Figure 6: PRIORITY frame payload | Figure 6: PRIORITY frame payload | |||
| The PRIORITY frame payload has the following fields: | The PRIORITY frame payload has the following fields: | |||
| Prioritized Type: A two-bit field indicating the type of element | PT (Prioritized Element Type): A two-bit field indicating the type | |||
| being prioritized. When sent on a request stream, this MUST be | of element being prioritized (see Table 1). When sent on a | |||
| set to "11". When sent on the control stream, this MUST NOT be | request stream, this MUST be set to "11". When sent on the | |||
| set to "11". | control stream, this MUST NOT be set to "11". | |||
| Dependency Type: A two-bit field indicating the type of element | DT (Element Dependency Type): A two-bit field indicating the type of | |||
| being depended on. | element being depended on (see Table 2). | |||
| Empty: A four-bit field which MUST be zero when sent and MUST be | Empty: A four-bit field which MUST be zero when sent and MUST be | |||
| ignored on receipt. | ignored on receipt. | |||
| Prioritized Element ID: A variable-length integer that identifies | Prioritized Element ID: A variable-length integer that identifies | |||
| the element being prioritized. Depending on the value of | the element being prioritized. Depending on the value of | |||
| Prioritized Type, this contains the Stream ID of a request stream, | Prioritized Type, this contains the Stream ID of a request stream, | |||
| the Push ID of a promised resource, a Placeholder ID of a | the Push ID of a promised resource, a Placeholder ID of a | |||
| placeholder, or is absent. | placeholder, or is absent. | |||
| skipping to change at page 13, line 30 ¶ | skipping to change at page 13, line 47 ¶ | |||
| element on which a dependency is being expressed. Depending on | element on which a dependency is being expressed. Depending on | |||
| the value of Dependency Type, this contains the Stream ID of a | the value of Dependency Type, this contains the Stream ID of a | |||
| request stream, the Push ID of a promised resource, the | request stream, the Push ID of a promised resource, the | |||
| Placeholder ID of a placeholder, or is absent. For details of | Placeholder ID of a placeholder, or is absent. For details of | |||
| dependencies, see Section 5.3 and [RFC7540], Section 5.3. | dependencies, see Section 5.3 and [RFC7540], Section 5.3. | |||
| Weight: An unsigned 8-bit integer representing a priority weight for | Weight: An unsigned 8-bit integer representing a priority weight for | |||
| the prioritized element (see [RFC7540], Section 5.3). Add one to | the prioritized element (see [RFC7540], Section 5.3). Add one to | |||
| the value to obtain a weight between 1 and 256. | the value to obtain a weight between 1 and 256. | |||
| A PRIORITY frame identifies an element to prioritize, and an element | The values for the Prioritized Element Type (Table 1) and Element | |||
| upon which it depends. A Prioritized ID or Dependency ID identifies | Dependency Type (Table 2) imply the interpretation of the associated | |||
| a client-initiated request using the corresponding stream ID, a | Element ID fields. | |||
| server push using a Push ID (see Section 4.2.6), or a placeholder | ||||
| using a Placeholder ID (see Section 5.3.1). | ||||
| The values for the Prioritized Element Type and Element Dependency | +---------+------------------+---------------------------------+ | |||
| Type imply the interpretation of the associated Element ID fields. | | PT Bits | Type Description | Prioritized Element ID Contents | | |||
| +---------+------------------+---------------------------------+ | ||||
| | 00 | Request stream | Stream ID | | ||||
| | | | | | ||||
| | 01 | Push stream | Push ID | | ||||
| | | | | | ||||
| | 10 | Placeholder | Placeholder ID | | ||||
| | | | | | ||||
| | 11 | Current stream | Absent | | ||||
| +---------+------------------+---------------------------------+ | ||||
| +-----------+------------------+---------------------------------+ | Table 1: Prioritized Element Types | |||
| | Type Bits | Type Description | Prioritized Element ID Contents | | ||||
| +-----------+------------------+---------------------------------+ | ||||
| | 00 | Request stream | Stream ID | | ||||
| | | | | | ||||
| | 01 | Push stream | Push ID | | ||||
| | | | | | ||||
| | 10 | Placeholder | Placeholder ID | | ||||
| | | | | | ||||
| | 11 | Current stream | Absent | | ||||
| +-----------+------------------+---------------------------------+ | ||||
| +-----------+------------------+--------------------------------+ | ||||
| | Type Bits | Type Description | Element Dependency ID Contents | | ||||
| +-----------+------------------+--------------------------------+ | ||||
| | 00 | Request stream | Stream ID | | ||||
| | | | | | ||||
| | 01 | Push stream | Push ID | | ||||
| | | | | | ||||
| | 10 | Placeholder | Placeholder ID | | ||||
| | | | | | ||||
| | 11 | Root of the tree | Absent | | ||||
| +-----------+------------------+--------------------------------+ | ||||
| Note that the root of the tree cannot be referenced using a Stream ID | +---------+------------------+--------------------------------+ | |||
| of 0, as in [RFC7540]; QUIC stream 0 carries a valid HTTP request. | | DT Bits | Type Description | Element Dependency ID Contents | | |||
| The root of the tree cannot be reprioritized. A PRIORITY frame sent | +---------+------------------+--------------------------------+ | |||
| on a request stream with the Prioritized Element Type set to any | | 00 | Request stream | Stream ID | | |||
| value other than "11" or which expresses a dependency on a request | | | | | | |||
| with a greater Stream ID than the current stream MUST be treated as a | | 01 | Push stream | Push ID | | |||
| stream error of type HTTP_MALFORMED_FRAME. Likewise, a PRIORITY | | | | | | |||
| frame sent on a control stream with the Prioritized Element Type set | | 10 | Placeholder | Placeholder ID | | |||
| to "11" MUST be treated as a connection error of type | | | | | | |||
| | 11 | Root of the tree | Absent | | ||||
| +---------+------------------+--------------------------------+ | ||||
| Table 2: Element Dependency Types | ||||
| Note that unlike in [RFC7540], the root of the tree cannot be | ||||
| referenced using a Stream ID of 0, as in QUIC stream 0 carries a | ||||
| valid HTTP request. The root of the tree cannot be reprioritized. A | ||||
| PRIORITY frame sent on a request stream with the Prioritized Element | ||||
| Type set to any value other than "11" or which expresses a dependency | ||||
| on a request with a greater Stream ID than the current stream MUST be | ||||
| treated as a stream error of type HTTP_MALFORMED_FRAME. Likewise, a | ||||
| PRIORITY frame sent on a control stream with the Prioritized Element | ||||
| Type set to "11" MUST be treated as a connection error of type | ||||
| HTTP_MALFORMED_FRAME. | HTTP_MALFORMED_FRAME. | |||
| When a PRIORITY frame claims to reference a request, the associated | When a PRIORITY frame claims to reference a request, the associated | |||
| ID MUST identify a client-initiated bidirectional stream. A server | ID MUST identify a client-initiated bidirectional stream. A server | |||
| MUST treat receipt of PRIORITY frame with a Stream ID of any other | MUST treat receipt of a PRIORITY frame identifying a stream of any | |||
| type as a connection error of type HTTP_MALFORMED_FRAME. | other type as a connection error of type HTTP_MALFORMED_FRAME. | |||
| A PRIORITY frame that references a non-existent Push ID or a | A PRIORITY frame that references a non-existent Push ID, a | |||
| Placeholder ID greater than the server's limit MUST be treated as an | Placeholder ID greater than the server's limit, or a Stream ID the | |||
| HTTP_MALFORMED_FRAME error. | client is not yet permitted to open MUST be treated as an | |||
| HTTP_LIMIT_EXCEEDED error. | ||||
| A PRIORITY frame received on any stream other than a request or | A PRIORITY frame received on any stream other than a request or | |||
| control stream MUST be treated as a connection error of type | control stream MUST be treated as a connection error of type | |||
| HTTP_WRONG_STREAM. | HTTP_WRONG_STREAM. | |||
| PRIORITY frames received by a client MUST be treated as a stream | PRIORITY frames received by a client MUST be treated as a stream | |||
| error of type HTTP_UNEXPECTED_FRAME. | error of type HTTP_UNEXPECTED_FRAME. | |||
| 4.2.4. CANCEL_PUSH | 4.2.4. CANCEL_PUSH | |||
| The CANCEL_PUSH frame (type=0x3) is used to request cancellation of a | The CANCEL_PUSH frame (type=0x3) is used to request cancellation of a | |||
| server push prior to the push stream being created. The CANCEL_PUSH | server push prior to the push stream being received. The CANCEL_PUSH | |||
| frame identifies a server push by Push ID (see Section 4.2.6), | frame identifies a server push by Push ID (see Section 4.2.6), | |||
| encoded as a variable-length integer. | encoded as 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 push stream. If the push stream has been opened | to avoid opening a push stream. If the push stream has been opened | |||
| by the server, the server SHOULD send a QUIC RESET_STREAM frame on | by the server, the server SHOULD send a QUIC RESET_STREAM frame on | |||
| that stream and cease transmission of the response. | that stream and cease transmission of the response. | |||
| A server can send this frame to indicate that it will not be | A server can send the CANCEL_PUSH frame to indicate that it will not | |||
| fulfilling a promise prior to creation of a push stream. Once the | be fulfilling a promise prior to creation of a push stream. Once the | |||
| push stream has been created, sending CANCEL_PUSH has no effect on | push stream has been created, sending CANCEL_PUSH has no effect on | |||
| the state of the push stream. A QUIC RESET_STREAM frame SHOULD be | the state of the push stream. A QUIC RESET_STREAM frame SHOULD be | |||
| used instead to abort transmission of the server push response. | used instead to abort 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. Receiving 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. | |||
| 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 7: CANCEL_PUSH frame payload | Figure 7: CANCEL_PUSH frame payload | |||
| The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | The CANCEL_PUSH frame carries a Push ID encoded as a variable-length | |||
| integer. The Push ID identifies the server push that is being | integer. The Push ID identifies the server push that is being | |||
| cancelled (see Section 4.2.6). | cancelled (see Section 4.2.6). | |||
| If the client receives a CANCEL_PUSH frame, that frame might identify | If the client receives a CANCEL_PUSH frame, that frame might identify | |||
| a Push ID that has not yet been mentioned by a PUSH_PROMISE frame. | a Push ID that has not yet been mentioned by a PUSH_PROMISE frame. | |||
| An endpoint MUST treat a CANCEL_PUSH frame which does not contain | ||||
| exactly one properly-formatted variable-length integer as a | ||||
| connection error of type HTTP_MALFORMED_FRAME. | ||||
| 4.2.5. SETTINGS | 4.2.5. SETTINGS | |||
| The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x4) conveys configuration parameters that | |||
| affect how endpoints communicate, such as preferences and constraints | affect how endpoints communicate, such as preferences and constraints | |||
| on peer behavior. Individually, a SETTINGS parameter can also be | on peer behavior. Individually, a SETTINGS parameter can also be | |||
| referred to as a "setting"; the identifier and value of each setting | referred to as a "setting"; the identifier and value of each setting | |||
| parameter can be referred to as a "setting identifier" and a "setting | parameter can be referred to as a "setting identifier" and a "setting | |||
| value". | value". | |||
| SETTINGS frames always apply to a connection, never a single stream. | ||||
| A SETTINGS frame MUST be sent as the first frame of each control | ||||
| stream (see Section 3.2.1) by each peer, and MUST NOT be sent | ||||
| subsequently or on any other stream. If an endpoint receives a | ||||
| SETTINGS frame on a different stream, the endpoint MUST respond with | ||||
| a connection error of type HTTP_WRONG_STREAM. If an endpoint | ||||
| receives a second SETTINGS frame, the endpoint MUST respond with a | ||||
| connection error of type HTTP_UNEXPECTED_FRAME. | ||||
| 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 - each | However, a negotiation can be implied by the use of SETTINGS - each | |||
| peer uses SETTINGS to advertise a set of supported values. The | peer uses SETTINGS to advertise a set of supported values. The | |||
| definition of the setting would describe how each peer combines the | definition of the setting would describe how each peer combines the | |||
| two sets to conclude which choice will be used. SETTINGS does not | two sets to conclude which choice will be used. SETTINGS does not | |||
| provide a mechanism to identify when the choice takes effect. | provide a mechanism to identify when the choice takes effect. | |||
| 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 a very large | peer. For example, a client might be willing to consume a very large | |||
| response header, while servers are more cautious about request size. | response header, 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 in the SETTINGS frame. A | |||
| presence of the same parameter more than once as a connection error | receiver MAY treat the presence of the same parameter more than once | |||
| of type HTTP_MALFORMED_FRAME. | as a connection error of type HTTP_MALFORMED_FRAME. | |||
| 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 value | each consisting of an unsigned 16-bit setting identifier and a value | |||
| which uses the QUIC variable-length integer encoding. | which uses the QUIC variable-length integer encoding. | |||
| 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) | Value (i) ... | | Identifier (16) | Value (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: SETTINGS parameter format | Figure 8: SETTINGS parameter format | |||
| Each value MUST be compared against the remaining length of the | ||||
| SETTINGS frame. A variable-length integer value which cannot fit | ||||
| within the remaining length of the SETTINGS frame MUST cause the | ||||
| SETTINGS frame to be considered malformed 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 | |||
| identifier it does not understand. | identifier it does not understand. | |||
| SETTINGS frames always apply to a connection, never a single stream. | ||||
| A SETTINGS frame MUST be sent as the first frame of each control | ||||
| stream (see Section 3.2.1) by each peer, and MUST NOT be sent | ||||
| subsequently or on any other stream. If an endpoint receives a | ||||
| SETTINGS frame on a different stream, the endpoint MUST respond with | ||||
| a connection error of type HTTP_WRONG_STREAM. If an endpoint | ||||
| receives a second SETTINGS frame, the endpoint MUST respond with a | ||||
| connection error of type HTTP_UNEXPECTED_FRAME. | ||||
| The SETTINGS frame affects connection state. A badly formed or | ||||
| incomplete SETTINGS frame MUST be treated as a connection error | ||||
| (Section 8) of type HTTP_MALFORMED_FRAME. | ||||
| 4.2.5.1. Defined SETTINGS Parameters | 4.2.5.1. Defined SETTINGS Parameters | |||
| The following settings are defined in HTTP/3: | The following settings are defined in HTTP/3: | |||
| SETTINGS_MAX_HEADER_LIST_SIZE (0x6): The default value is unlimited. | SETTINGS_MAX_HEADER_LIST_SIZE (0x6): The default value is unlimited. | |||
| See Section 5.1.1 for usage. | See Section 5.1.1 for usage. | |||
| SETTINGS_NUM_PLACEHOLDERS (0x8): The default value is 0. However, | SETTINGS_NUM_PLACEHOLDERS (0x8): The default value is 0. However, | |||
| this value SHOULD be set to a non-zero value by servers. See | this value SHOULD be set to a non-zero value by servers. See | |||
| Section 5.3.1 for usage. | Section 5.3.1 for usage. | |||
| skipping to change at page 18, line 8 ¶ | skipping to change at page 18, line 8 ¶ | |||
| settings values in determining whether to accept 0-RTT data. | settings values in determining whether to accept 0-RTT data. | |||
| A server MAY accept 0-RTT and subsequently provide different settings | A server MAY accept 0-RTT and subsequently provide different settings | |||
| in its SETTINGS frame. If 0-RTT data is accepted by the server, its | in its SETTINGS frame. If 0-RTT data is accepted by the server, its | |||
| SETTINGS frame MUST NOT reduce any limits or alter any values that | SETTINGS frame MUST NOT reduce any limits or alter any values that | |||
| might be violated by the client with its 0-RTT data. | might be violated by the client with its 0-RTT data. | |||
| 4.2.6. PUSH_PROMISE | 4.2.6. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x05) is used to carry a promised | The PUSH_PROMISE frame (type=0x05) is used to carry a promised | |||
| request header set from server to client, as in HTTP/2. | request header set from server to client on a request stream, as in | |||
| HTTP/2. | ||||
| 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 9: PUSH_PROMISE frame payload | Figure 9: PUSH_PROMISE frame payload | |||
| skipping to change at page 18, line 37 ¶ | skipping to change at page 18, line 38 ¶ | |||
| Header Block: QPACK-compressed request header fields for the | Header Block: QPACK-compressed request header fields for the | |||
| promised response. See [QPACK] for more details. | promised 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) and MUST NOT use the | provided in a MAX_PUSH_ID frame (Section 4.2.8) and MUST NOT use the | |||
| same Push ID in multiple PUSH_PROMISE frames. A client MUST treat | same Push ID in multiple PUSH_PROMISE frames. 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 or a Push ID which has already been promised as | client has advertised or a Push ID which has already been promised as | |||
| a connection error of type HTTP_MALFORMED_FRAME. | a connection error of type HTTP_MALFORMED_FRAME. | |||
| If a PUSH_PROMISE frame is received on either control stream, the | ||||
| recipient MUST respond with a connection error (Section 8) of type | ||||
| HTTP_WRONG_STREAM. | ||||
| See Section 5.4 for a description of the overall server push | See Section 5.4 for a description of the overall server push | |||
| mechanism. | mechanism. | |||
| 4.2.7. GOAWAY | 4.2.7. GOAWAY | |||
| The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | |||
| a connection by a server. GOAWAY allows a server to stop accepting | a connection by a server. GOAWAY allows a server to stop accepting | |||
| new requests while still finishing processing of previously received | new requests while still finishing processing of previously received | |||
| requests. This enables administrative actions, like server | requests. This enables administrative actions, like server | |||
| maintenance. GOAWAY by itself does not close a connection. | maintenance. GOAWAY by itself does not close a connection. | |||
| 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 10: GOAWAY frame payload | Figure 10: GOAWAY frame payload | |||
| The GOAWAY frame carries a QUIC Stream ID for a client-initiated | The GOAWAY frame is always sent on the control stream. It carries a | |||
| bidirectional stream encoded as a variable-length integer. A client | QUIC Stream ID for a client-initiated bidirectional stream encoded as | |||
| MUST treat receipt of a GOAWAY frame containing a Stream ID of any | a variable-length integer. A client MUST treat receipt of a GOAWAY | |||
| other type as a connection error of type HTTP_MALFORMED_FRAME. | frame containing a Stream ID of any other type as a connection error | |||
| of type HTTP_WRONG_STREAM. | ||||
| 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 on any stream as a connection error (Section 8) of | a GOAWAY frame on any stream as a connection error (Section 8) of | |||
| type HTTP_UNEXPECTED_FRAME. | type HTTP_UNEXPECTED_FRAME. | |||
| The GOAWAY frame applies to the connection, not a specific stream. A | The GOAWAY frame applies to the connection, not a specific stream. A | |||
| client MUST treat a GOAWAY frame on a stream other than the control | client MUST treat a GOAWAY frame on a stream other than the control | |||
| stream as a connection error (Section 8) of type | stream as a connection error (Section 8) of type | |||
| HTTP_UNEXPECTED_FRAME. | HTTP_UNEXPECTED_FRAME. | |||
| skipping to change at page 19, line 39 ¶ | skipping to change at page 19, line 40 ¶ | |||
| 4.2.8. MAX_PUSH_ID | 4.2.8. 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 the control stream. Receipt | |||
| a MAX_PUSH_ID frame on any other stream MUST be treated as a | of a MAX_PUSH_ID frame on any other stream MUST be treated as a | |||
| connection error of type HTTP_WRONG_STREAM. | connection error of type HTTP_WRONG_STREAM. | |||
| 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_UNEXPECTED_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 MAX_PUSH_ID frames as the | increase the maximum Push ID by sending MAX_PUSH_ID frames as the | |||
| server fulfills or cancels server pushes. | server fulfills or cancels server pushes. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 20, line 20 ¶ | skipping to change at page 20, line 20 ¶ | |||
| Figure 11: MAX_PUSH_ID frame payload | Figure 11: MAX_PUSH_ID frame payload | |||
| The MAX_PUSH_ID frame carries a single variable-length integer that | The MAX_PUSH_ID frame carries a single variable-length integer that | |||
| identifies the maximum value for a Push ID that the server can use | identifies the maximum value for a Push ID that the server can use | |||
| (see Section 4.2.6). A MAX_PUSH_ID frame cannot reduce the maximum | (see Section 4.2.6). A MAX_PUSH_ID frame cannot reduce the maximum | |||
| Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | Push ID; receipt of a MAX_PUSH_ID that contains a smaller value than | |||
| previously received MUST be treated as a connection error of type | previously received MUST be treated as a connection error of type | |||
| HTTP_MALFORMED_FRAME. | HTTP_MALFORMED_FRAME. | |||
| A server MUST treat a MAX_PUSH_ID frame payload that does not contain | ||||
| a single variable-length integer as a connection error of type | ||||
| HTTP_MALFORMED_FRAME. | ||||
| 4.2.9. DUPLICATE_PUSH | 4.2.9. DUPLICATE_PUSH | |||
| The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate | The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate | |||
| that an existing pushed resource is related to multiple client | that an existing pushed resource is related to multiple client | |||
| requests. | requests. | |||
| The DUPLICATE_PUSH frame is always sent on a request stream. Receipt | The DUPLICATE_PUSH frame is always sent on a request stream. Receipt | |||
| of a DUPLICATE_PUSH frame on any other stream MUST be treated as a | of a DUPLICATE_PUSH frame on any other stream MUST be treated as a | |||
| connection error of type HTTP_WRONG_STREAM. | connection error of type HTTP_WRONG_STREAM. | |||
| skipping to change at page 20, line 48 ¶ | skipping to change at page 20, line 44 ¶ | |||
| 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 12: DUPLICATE_PUSH frame payload | Figure 12: DUPLICATE_PUSH frame payload | |||
| The DUPLICATE_PUSH frame carries a single variable-length integer | The DUPLICATE_PUSH frame carries a single variable-length integer | |||
| that identifies the Push ID of a resource that the server has | that identifies the Push ID of a resource that the server has | |||
| previously promised (see Section 4.2.6). A server MUST treat a | previously promised (see Section 4.2.6). | |||
| DUPLICATE_PUSH frame payload that does not contain a single variable- | ||||
| length integer as a connection error of type HTTP_MALFORMED_FRAME. | ||||
| This frame allows the server to use the same server push in response | This frame allows the server to use the same server push in response | |||
| to multiple concurrent requests. Referencing the same server push | to multiple concurrent requests. Referencing the same server push | |||
| ensures that a promise can be made in relation to every response in | ensures that a promise can be made in relation to every response in | |||
| which server push might be needed without duplicating request headers | which server push might be needed without duplicating request headers | |||
| or pushed responses. | or pushed responses. | |||
| 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 | |||
| skipping to change at page 21, line 36 ¶ | skipping to change at page 21, line 30 ¶ | |||
| consider these frames to have any meaning upon receipt. | consider these frames to have any meaning upon receipt. | |||
| The payload and length of the frames are selected in any manner the | The payload and length of the frames are selected in any manner the | |||
| implementation chooses. | implementation chooses. | |||
| 5. HTTP Request Lifecycle | 5. HTTP Request Lifecycle | |||
| 5.1. HTTP Message Exchanges | 5.1. 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 client MUST send only a single request on a given | |||
| the request. | stream. A server sends one or more HTTP responses on the same stream | |||
| as the request, as detailed below. | ||||
| An HTTP message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
| 1. the message header (see [RFC7230], Section 3.2), sent as a single | 1. the message header (see [RFC7230], Section 3.2), sent as a single | |||
| HEADERS frame (see Section 4.2.2), | HEADERS frame (see Section 4.2.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.1), | |||
| 3. optionally, one HEADERS frame containing the trailer-part, if | 3. optionally, one HEADERS frame containing the trailer-part, if | |||
| skipping to change at page 23, line 37 ¶ | skipping to change at page 23, line 31 ¶ | |||
| An HTTP/3 implementation MAY impose a limit on the maximum size of | An HTTP/3 implementation MAY impose a limit on the maximum size of | |||
| the header it will accept on an individual HTTP message; encountering | the header it will accept on an individual HTTP message; encountering | |||
| a larger message header SHOULD be treated as a stream error of type | a larger message header SHOULD be treated as a stream error of type | |||
| "HTTP_EXCESSIVE_LOAD". If an implementation wishes to advise its | "HTTP_EXCESSIVE_LOAD". If an implementation wishes to advise its | |||
| peer of this limit, it can be conveyed as a number of bytes in the | peer of this limit, it can be conveyed as a number of bytes in the | |||
| "SETTINGS_MAX_HEADER_LIST_SIZE" parameter. The size of a header list | "SETTINGS_MAX_HEADER_LIST_SIZE" parameter. The size of a header list | |||
| is calculated based on the uncompressed size of header fields, | is calculated based on the uncompressed size of header fields, | |||
| including the length of the name and value in bytes plus an overhead | including the length of the name and value in bytes plus an overhead | |||
| of 32 bytes for each header field. | of 32 bytes for each header field. | |||
| 5.1.2. Request Cancellation | 5.1.2. Request Cancellation and Rejection | |||
| Either client or server can cancel requests by aborting the stream | ||||
| (QUIC RESET_STREAM and/or STOP_SENDING frames, as appropriate) with | ||||
| an error code of HTTP_REQUEST_CANCELLED (Section 8.1). When the | ||||
| client cancels a response, it indicates that this response is no | ||||
| longer of interest. Implementations SHOULD cancel requests by | ||||
| aborting both directions of a stream. | ||||
| When the server aborts its response stream using | Clients can cancel requests by aborting the stream (QUIC RESET_STREAM | |||
| HTTP_REQUEST_CANCELLED, it indicates that no application processing | and/or STOP_SENDING frames, as appropriate) with an error code of | |||
| was performed. The client can treat requests cancelled by the server | HTTP_REQUEST_CANCELLED (Section 8.1). When the client cancels a | |||
| as though they had never been sent at all, thereby allowing them to | response, it indicates that this response is no longer of interest. | |||
| be retried later on a new connection. Servers MUST NOT use the | Implementations SHOULD cancel requests by aborting both directions of | |||
| HTTP_REQUEST_CANCELLED status for requests which were partially or | a stream. | |||
| fully processed. | ||||
| Note: In this context, "processed" means that some data from the | When the server rejects a request without performing any application | |||
| stream was passed to some higher layer of software that might have | processing, it SHOULD abort its response stream with the error code | |||
| taken some action as a result. | HTTP_REQUEST_REJECTED. In this context, "processed" means that some | |||
| data from the stream was passed to some higher layer of software that | ||||
| might have taken some action as a result. The client can treat | ||||
| requests rejected by the server as though they had never been sent at | ||||
| all, thereby allowing them to be retried later on a new connection. | ||||
| Servers MUST NOT use the HTTP_REQUEST_REJECTED error code for | ||||
| requests which were partially or fully processed. When a client | ||||
| sends a STOP_SENDING with HTTP_REQUEST_CANCELLED, a server MAY | ||||
| indicate the error code HTTP_REQUEST_REJECTED in the corresponding | ||||
| RESET_STREAM if no processing was performed. Clients MUST NOT reset | ||||
| streams with the HTTP_REQUEST_REJECTED error code except in response | ||||
| to a QUIC STOP_SENDING frame. | ||||
| 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). | |||
| 5.2. The CONNECT Method | 5.2. The CONNECT Method | |||
| skipping to change at page 25, line 14 ¶ | skipping to change at page 25, line 12 ¶ | |||
| so clients SHOULD NOT close a stream for sending while they still | so clients SHOULD NOT close a stream for sending while they still | |||
| expect to receive data from the target of the CONNECT. | expect to receive data from the target of the CONNECT. | |||
| A TCP connection error is signaled with QUIC RESET_STREAM frame. A | A TCP connection error is signaled with QUIC RESET_STREAM frame. A | |||
| proxy treats any error in the TCP connection, which includes | proxy treats any error in the TCP connection, which includes | |||
| receiving a TCP segment with the RST bit set, as a stream error of | receiving a TCP segment with the RST bit set, as a stream error of | |||
| type HTTP_CONNECT_ERROR (Section 8.1). Correspondingly, a proxy MUST | type HTTP_CONNECT_ERROR (Section 8.1). Correspondingly, a proxy MUST | |||
| send a TCP segment with the RST bit set if it detects an error with | send a TCP segment with the RST bit set if it detects an error with | |||
| the stream or the QUIC connection. | the stream or the QUIC connection. | |||
| 5.3. Request Prioritization | 5.3. Prioritization | |||
| HTTP/3 uses a priority scheme similar to that described in [RFC7540], | HTTP/3 uses a priority scheme similar to that described in [RFC7540], | |||
| Section 5.3. In this priority scheme, a given stream can be | Section 5.3. In this priority scheme, a given element can be | |||
| designated as dependent upon another request, which expresses the | designated as dependent upon another element. This information is | |||
| preference that the latter stream (the "parent" request) be allocated | expressed in the PRIORITY frame Section 4.2.3 which identifies the | |||
| resources before the former stream (the "dependent" request). Taken | element and the dependency. The elements that can be prioritized | |||
| together, the dependencies across all requests in a connection form a | are: | |||
| dependency tree. | ||||
| When a client request is first sent, its parent and weight are | ||||
| determined by the PRIORITY frame (see Section 4.2.3) which begins the | ||||
| stream, if present. Otherwise, the element is dependent on the root | ||||
| of the priority tree. Placeholders are also dependent on the root of | ||||
| the priority tree when first allocated. Pushed streams are initially | ||||
| dependent on the client request on which the PUSH_PROMISE frame was | ||||
| sent. In all cases, elements are assigned an initial weight of 16 | ||||
| unless an PRIORITY frame begins the stream. | ||||
| The structure of the dependency tree changes as PRIORITY frames on | ||||
| the control stream modify the dependency links between requests. The | ||||
| PRIORITY frame Section 4.2.3 identifies a prioritized element. The | ||||
| elements which can be prioritized are: | ||||
| o Requests, identified by the ID of the request stream | o Requests, identified by the ID of the request stream | |||
| o Pushes, identified by the Push ID of the promised resource | o Pushes, identified by the Push ID of the promised resource | |||
| (Section 4.2.6) | (Section 4.2.6) | |||
| o Placeholders, identified by a Placeholder ID | o Placeholders, identified by a Placeholder ID | |||
| An element can depend on another element or on the root of the tree. | Taken together, the dependencies across all prioritized elements in a | |||
| A reference to an element which is no longer in the tree is treated | connection form a dependency tree. An element can depend on another | |||
| as a reference to the root of the tree. | 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. The structure of the dependency tree changes as PRIORITY | ||||
| frames modify the dependency links between prioritized elements. | ||||
| Due to reordering between streams, an element can also be prioritized | Due to reordering between streams, an element can also be prioritized | |||
| which is not yet in the tree. Such elements are added to the tree | which is not yet in the tree. Such elements are added to the tree | |||
| with the requested priority. | with the requested priority. | |||
| When a prioritized element is first created, it has a default initial | ||||
| weight of 16 and a default dependency. Requests and placeholders are | ||||
| dependent on the root of the priority tree; pushes are dependent on | ||||
| the client request on which the PUSH_PROMISE frame was sent. | ||||
| Requests may override the default intial values by including a | ||||
| PRIORTIY frame (see Section 4.2.3) at the beginning of the stream. | ||||
| These priorities can be updated by sending a PRIORITY frame on the | ||||
| control stream. | ||||
| 5.3.1. Placeholders | 5.3.1. Placeholders | |||
| In HTTP/2, certain implementations used closed or unused streams as | In HTTP/2, certain implementations used closed or unused streams as | |||
| placeholders in describing the relative priority of requests. This | placeholders in describing the relative priority of requests. This | |||
| created confusion as servers could not reliably identify which | created confusion as servers could not reliably identify which | |||
| elements of the priority tree could be discarded safely. Clients | elements of the priority tree could be discarded safely. Clients | |||
| could potentially reference closed streams long after the server had | could potentially reference closed streams long after the server had | |||
| discarded state, leading to disparate views of the prioritization the | discarded state, leading to disparate views of the prioritization the | |||
| client had attempted to express. | client had attempted to express. | |||
| In HTTP/3, a number of placeholders are explicitly permitted by the | In HTTP/3, a number of placeholders are explicitly permitted by the | |||
| server using the "SETTINGS_NUM_PLACEHOLDERS" setting. Because the | server using the "SETTINGS_NUM_PLACEHOLDERS" setting. Because the | |||
| server commits to maintaining these IDs in the tree, clients can use | server commits to maintaining these placeholders in the | |||
| them with confidence that the server will not have discarded the | prioritization tree, clients can use them with confidence that the | |||
| state. Clients MUST NOT send the "SETTINGS_NUM_PLACEHOLDERS" | server will not have discarded the state. Clients MUST NOT send the | |||
| setting; receipt of this setting by a server MUST be treated as a | "SETTINGS_NUM_PLACEHOLDERS" setting; receipt of this setting by a | |||
| connection error of type "HTTP_WRONG_SETTING_DIRECTION". | server MUST be treated as a connection error of type | |||
| "HTTP_WRONG_SETTING_DIRECTION". | ||||
| Placeholders are identified by an ID between zero and one less than | Placeholders are identified by an ID between zero and one less than | |||
| the number of placeholders the server has permitted. | the number of placeholders the server has permitted. | |||
| Like streams, placeholders have priority information associated with | Like streams, placeholders have priority information associated with | |||
| them. | them. | |||
| 5.3.2. Priority Tree Maintenance | 5.3.2. Priority Tree Maintenance | |||
| Servers can aggressively prune inactive regions from the priority | Because placeholders will be used to "root" any persistent structure | |||
| tree, because placeholders will be used to "root" any persistent | of the tree which the client cares about retaining, servers can | |||
| structure of the tree which the client cares about retaining. For | aggressively prune inactive regions from the priority tree. For | |||
| prioritization purposes, a node in the tree is considered "inactive" | prioritization purposes, a node in the tree is considered "inactive" | |||
| when the corresponding stream has been closed for at least two round- | when the corresponding stream has been closed for at least two round- | |||
| trip times (using any reasonable estimate available on the server). | trip times (using any reasonable estimate available on the server). | |||
| This delay helps mitigate race conditions where the server has pruned | This delay helps mitigate race conditions where the server has pruned | |||
| a node the client believed was still active and used as a Stream | a node the client believed was still active and used as a Stream | |||
| Dependency. | Dependency. | |||
| Specifically, the server MAY at any time: | Specifically, the server MAY at any time: | |||
| o Identify and discard branches of the tree containing only inactive | o Identify and discard branches of the tree containing only inactive | |||
| skipping to change at page 27, line 45 ¶ | skipping to change at page 27, line 45 ¶ | |||
| frames (see Section 4.2.9), then included with the push stream which | frames (see Section 4.2.9), then included with the push stream which | |||
| ultimately fulfills those promises. | ultimately fulfills those promises. | |||
| Server push is only enabled on a connection when a client sends a | Server push is only enabled on a connection when a client sends a | |||
| MAX_PUSH_ID frame (see Section 4.2.8). A server cannot use server | MAX_PUSH_ID frame (see Section 4.2.8). A server cannot use server | |||
| push until it receives a MAX_PUSH_ID frame. A client sends | push until it receives a MAX_PUSH_ID frame. A client sends | |||
| additional MAX_PUSH_ID frames to control the number of pushes that a | additional MAX_PUSH_ID frames to control the number of pushes that a | |||
| server can promise. A server SHOULD use Push IDs sequentially, | server can promise. A server SHOULD use Push IDs sequentially, | |||
| starting at 0. A client MUST treat receipt of a push stream with a | starting at 0. A client MUST treat receipt of a push stream with a | |||
| Push ID that is greater than the maximum Push ID as a connection | Push ID that is greater than the maximum Push ID as a connection | |||
| error of type HTTP_PUSH_LIMIT_EXCEEDED. | error of type HTTP_LIMIT_EXCEEDED. | |||
| The header of the request message is carried by a PUSH_PROMISE frame | The header of the request message is carried by a PUSH_PROMISE frame | |||
| (see Section 4.2.6) on the request stream which generated the push. | (see Section 4.2.6) on the request stream which generated the push. | |||
| This allows the server push to be associated with a client request. | This allows the server push to be associated with a client request. | |||
| Ordering of a PUSH_PROMISE in relation to certain parts of the | Ordering of a PUSH_PROMISE in relation to certain parts of the | |||
| response is important (see Section 8.2.1 of [RFC7540]). Promised | response is important (see Section 8.2.1 of [RFC7540]). Promised | |||
| requests MUST conform to the requirements in Section 8.2 of | requests MUST conform to the requirements in Section 8.2 of | |||
| [RFC7540]. | [RFC7540]. | |||
| The same server push can be associated with additional client | The same server push can be associated with additional client | |||
| skipping to change at page 28, line 50 ¶ | skipping to change at page 28, line 50 ¶ | |||
| 6.1. Idle Connections | 6.1. Idle Connections | |||
| Each QUIC endpoint declares an idle timeout during the handshake. If | Each QUIC endpoint declares an idle timeout during the handshake. If | |||
| the connection remains idle (no packets received) for longer than | the connection remains idle (no packets received) for longer than | |||
| this duration, the peer will assume that the connection has been | this duration, the peer will assume that the connection has been | |||
| closed. HTTP/3 implementations will need to open a new connection | closed. HTTP/3 implementations will need to open a new connection | |||
| for new requests if the existing connection has been idle for longer | for new requests if the existing connection has been idle for longer | |||
| than the server's advertised idle timeout, and SHOULD do so if | than the server's advertised idle timeout, and SHOULD do so if | |||
| approaching the idle timeout. | approaching the idle timeout. | |||
| HTTP clients are expected to use QUIC PING frames to keep connections | HTTP clients are expected to request that the transport keep | |||
| open while there are responses outstanding for requests or server | connections open while there are responses outstanding for requests | |||
| pushes. If the client is not expecting a response from the server, | or server pushes, as described in Section 19.2 of [QUIC-TRANSPORT]. | |||
| allowing an idle connection to time out is preferred over expending | If the client is not expecting a response from the server, allowing | |||
| effort maintaining a connection that might not be needed. A gateway | an idle connection to time out is preferred over expending effort | |||
| MAY use PING to maintain connections in anticipation of need rather | maintaining a connection that might not be needed. A gateway MAY | |||
| than incur the latency cost of connection establishment to servers. | maintain connections in anticipation of need rather than incur the | |||
| Servers SHOULD NOT use PING frames to keep a connection open. | latency cost of connection establishment to servers. Servers SHOULD | |||
| NOT actively keep connections open. | ||||
| 6.2. Connection Shutdown | 6.2. Connection Shutdown | |||
| Even when a connection is not idle, either endpoint can decide to | Even when a connection is not idle, either endpoint can decide to | |||
| stop using the connection and let the connection close gracefully. | stop using the connection and let the connection close gracefully. | |||
| Since clients drive request generation, clients perform a connection | Since clients drive request generation, clients perform a connection | |||
| shutdown by not sending additional requests on the connection; | shutdown by not sending additional requests on the connection; | |||
| responses and pushed responses associated to previous requests will | responses and pushed responses associated to previous requests will | |||
| continue to completion. Servers perform the same function by | continue to completion. Servers perform the same function by | |||
| communicating with clients. | communicating with clients. | |||
| Servers initiate the shutdown of a connection by sending a GOAWAY | Servers initiate the shutdown of a connection by sending a GOAWAY | |||
| frame (Section 4.2.7). The GOAWAY frame indicates that client- | frame (Section 4.2.7). The GOAWAY frame indicates that client- | |||
| initiated requests on lower stream IDs were or might be processed in | initiated requests on lower stream IDs were or might be processed in | |||
| this connection, while requests on the indicated stream ID and | this connection, while requests on the indicated stream ID and | |||
| greater were not accepted. This enables client and server to agree | greater were rejected. This enables client and server to agree on | |||
| on which requests were accepted prior to the connection shutdown. | which requests were accepted prior to the connection shutdown. This | |||
| This identifier MAY be lower than the stream limit identified by a | identifier MAY be lower than the stream limit identified by a QUIC | |||
| QUIC MAX_STREAM_ID frame, and MAY be zero if no requests were | MAX_STREAM_ID frame, and MAY be zero if no requests were processed. | |||
| processed. Servers SHOULD NOT increase the QUIC MAX_STREAM_ID limit | Servers SHOULD NOT increase the QUIC MAX_STREAM_ID limit after | |||
| after sending a GOAWAY frame. | sending a GOAWAY frame. | |||
| Once sent, the server MUST cancel requests sent on streams with an | Once GOAWAY is sent, the server MUST reject requests sent on streams | |||
| identifier higher than the indicated last Stream ID. Clients MUST | with an identifier greater than or equal to the indicated last Stream | |||
| NOT send new requests on the connection after receiving GOAWAY, | ID. Clients MUST NOT send new requests on the connection after | |||
| although requests might already be in transit. A new connection can | receiving GOAWAY, although requests might already be in transit. A | |||
| be established for new requests. | new connection can be 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 Stream ID greater | |||
| than indicated in the GOAWAY frame, those requests are considered | than or equal to that indicated in the GOAWAY frame, those requests | |||
| cancelled (Section 5.1.2). Clients SHOULD reset any streams above | are considered rejected (Section 5.1.2). Clients SHOULD cancel any | |||
| this ID with the error code HTTP_REQUEST_CANCELLED. Servers MAY also | requests on streams above this ID. Servers MAY also reject requests | |||
| cancel requests on streams below the indicated ID if these requests | on streams below the indicated ID if these requests were not | |||
| were not processed. | processed. | |||
| Requests on Stream IDs less than the Stream ID in the GOAWAY frame | Requests on Stream IDs less than the Stream ID in the GOAWAY frame | |||
| might have been processed; their status cannot be known until they | might have been processed; their status cannot be known until they | |||
| are completed successfully, reset individually, or the connection | are completed successfully, reset individually, or the connection | |||
| terminates. | terminates. | |||
| Servers SHOULD send a GOAWAY frame when the closing of a connection | Servers SHOULD send a GOAWAY frame when the closing of a connection | |||
| is known in advance, even if the advance notice is small, so that the | is known in advance, even if the advance notice is small, so that the | |||
| remote peer can know whether a stream has been partially processed or | remote peer can know whether a request has been partially processed | |||
| not. For example, if an HTTP client sends a POST at the same time | or not. For example, if an HTTP client sends a POST at the same time | |||
| that a server closes a QUIC connection, the client cannot know if the | that a server closes a QUIC connection, the client cannot know if the | |||
| server started to process that POST request if the server does not | server started to process that POST request if the server does not | |||
| send a GOAWAY frame to indicate what streams it might have acted on. | send a GOAWAY frame to indicate what streams it might have acted on. | |||
| A client that is unable to retry requests loses all requests that are | A client that is unable to retry requests loses all requests that are | |||
| in flight when the server closes the connection. A server MAY send | in flight when the server closes the connection. A server MAY send | |||
| multiple GOAWAY frames indicating different stream IDs, but MUST NOT | multiple GOAWAY frames indicating different stream IDs, but MUST NOT | |||
| increase the value they send in the last Stream ID, since clients | increase the value they send in the last Stream ID, since clients | |||
| might already have retried unprocessed requests on another | might already have retried unprocessed requests on another | |||
| connection. A server that is attempting to gracefully shut down a | connection. A server that is attempting to gracefully shut down a | |||
| skipping to change at page 32, line 49 ¶ | skipping to change at page 32, line 49 ¶ | |||
| 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/3. The peer should retry over HTTP/1.1. | served over HTTP/3. The peer should retry over HTTP/1.1. | |||
| HTTP_WRONG_STREAM (0x0A): A frame was received on a stream where it | HTTP_WRONG_STREAM (0x0A): A frame was received on a stream where it | |||
| is not permitted. | is not permitted. | |||
| HTTP_PUSH_LIMIT_EXCEEDED (0x0B): A Push ID greater than the current | HTTP_LIMIT_EXCEEDED (0x0B): A Stream ID, Push ID, or Placeholder ID | |||
| maximum Push ID was referenced. | greater than the current maximum for that identifier 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 | HTTP_UNKNOWN_STREAM_TYPE (0x0D): A unidirectional stream header | |||
| contained an unknown stream type. | contained an unknown stream type. | |||
| HTTP_WRONG_STREAM_COUNT (0x0E): A unidirectional stream type was | HTTP_WRONG_STREAM_COUNT (0x0E): A unidirectional stream type was | |||
| used more times than is permitted by that type. | used more times than is permitted by that type. | |||
| skipping to change at page 33, line 30 ¶ | skipping to change at page 33, line 30 ¶ | |||
| HTTP_EARLY_RESPONSE (0x0011): The remainder of the client's request | HTTP_EARLY_RESPONSE (0x0011): The remainder of the client's request | |||
| is not needed to produce a response. For use in STOP_SENDING | is not needed to produce a response. For use in STOP_SENDING | |||
| only. | only. | |||
| HTTP_MISSING_SETTINGS (0x0012): No SETTINGS frame was received at | HTTP_MISSING_SETTINGS (0x0012): No SETTINGS frame was received at | |||
| the beginning of the control stream. | the beginning of the control stream. | |||
| HTTP_UNEXPECTED_FRAME (0x0013): A frame was received which was not | HTTP_UNEXPECTED_FRAME (0x0013): A frame was received which was not | |||
| permitted in the current state. | permitted in the current state. | |||
| HTTP_REQUEST_REJECTED (0x0014): A server rejected a request without | ||||
| performing any application processing. | ||||
| HTTP_GENERAL_PROTOCOL_ERROR (0x00FF): Peer violated protocol | HTTP_GENERAL_PROTOCOL_ERROR (0x00FF): Peer violated protocol | |||
| requirements in a way which doesn't match a more specific error | requirements in a way which doesn't match a more specific error | |||
| code, or endpoint declines to use the more specific error code. | 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 byte of the error code. | The frame type is included as the last byte 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). | |||
| 9. Security Considerations | 9. Security Considerations | |||
| skipping to change at page 38, line 34 ¶ | skipping to change at page 38, line 34 ¶ | |||
| | | | excessive | | | | | | excessive | | | |||
| | | | load | | | | | | load | | | |||
| | | | | | | | | | | | | |||
| | HTTP_VERSION_FALLBACK | 0x0009 | Retry over | Section 8.1 | | | HTTP_VERSION_FALLBACK | 0x0009 | Retry over | Section 8.1 | | |||
| | | | HTTP/1.1 | | | | | | HTTP/1.1 | | | |||
| | | | | | | | | | | | | |||
| | HTTP_WRONG_STREAM | 0x000A | A frame was | Section 8.1 | | | HTTP_WRONG_STREAM | 0x000A | A frame was | Section 8.1 | | |||
| | | | sent on the | | | | | | sent on the | | | |||
| | | | wrong stream | | | | | | wrong stream | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_LIMIT_EXCEEDED | 0x000B | Maximum Push | Section 8.1 | | | HTTP_LIMIT_EXCEEDED | 0x000B | An identifier | Section 8.1 | | |||
| | | | ID exceeded | | | | | | limit was | | | |||
| | | | exceeded | | | ||||
| | | | | | | | | | | | | |||
| | HTTP_DUPLICATE_PUSH | 0x000C | Push ID was | Section 8.1 | | | HTTP_DUPLICATE_PUSH | 0x000C | Push ID was | Section 8.1 | | |||
| | | | fulfilled | | | | | | fulfilled | | | |||
| | | | multiple | | | | | | multiple | | | |||
| | | | times | | | | | | times | | | |||
| | | | | | | | | | | | | |||
| | HTTP_UNKNOWN_STREAM_TYPE | 0x000D | Unknown unidi | Section 8.1 | | | HTTP_UNKNOWN_STREAM_TYPE | 0x000D | Unknown unidi | Section 8.1 | | |||
| | | | rectional | | | | | | rectional | | | |||
| | | | stream type | | | | | | stream type | | | |||
| | | | | | | | | | | | | |||
| skipping to change at page 39, line 24 ¶ | skipping to change at page 39, line 25 ¶ | |||
| | | | | | | | | | | | | |||
| | HTTP_MISSING_SETTINGS | 0x0012 | No SETTINGS | Section 8.1 | | | HTTP_MISSING_SETTINGS | 0x0012 | No SETTINGS | Section 8.1 | | |||
| | | | frame | | | | | | frame | | | |||
| | | | received | | | | | | received | | | |||
| | | | | | | | | | | | | |||
| | HTTP_UNEXPECTED_FRAME | 0x0013 | Frame not | Section 8.1 | | | HTTP_UNEXPECTED_FRAME | 0x0013 | Frame not | Section 8.1 | | |||
| | | | permitted in | | | | | | permitted in | | | |||
| | | | the current | | | | | | the current | | | |||
| | | | state | | | | | | state | | | |||
| | | | | | | | | | | | | |||
| | HTTP_REQUEST_REJECTED | 0x0014 | Request not | Section 8.1 | | ||||
| | | | processed | | | ||||
| | | | | | | ||||
| | HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 8.1 | | | HTTP_MALFORMED_FRAME | 0x01XX | Error in | Section 8.1 | | |||
| | | | frame | | | | | | frame | | | |||
| | | | formatting | | | | | | formatting | | | |||
| +---------------------------+--------+---------------+--------------+ | +---------------------------+--------+---------------+--------------+ | |||
| 10.6. Stream Types | 10.6. Stream Types | |||
| This document establishes a registry for HTTP/3 unidirectional stream | This document establishes a registry for HTTP/3 unidirectional stream | |||
| types. The "HTTP/3 Stream Type" registry manages an 8-bit space. | types. The "HTTP/3 Stream Type" registry manages an 8-bit space. | |||
| The "HTTP/3 Stream Type" registry operates under either of the "IETF | The "HTTP/3 Stream Type" registry operates under either of the "IETF | |||
| skipping to change at page 40, line 34 ¶ | skipping to change at page 40, line 39 ¶ | |||
| 11. References | 11. References | |||
| 11.1. Normative References | 11.1. Normative References | |||
| [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| April 2016, <https://www.rfc-editor.org/info/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| [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-05 (work in progress), December 2018. | qpack-06 (work in progress), January 2019. | |||
| [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-16 (work in progress), December 2018. | transport-17 (work in progress), January 2019. | |||
| [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 41, line 45 ¶ | skipping to change at page 41, line 50 ¶ | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| 11.2. Informative References | 11.2. Informative References | |||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | ||||
| Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7413>. | ||||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
| Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| 11.3. URIs | 11.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 | |||
| skipping to change at page 42, line 42 ¶ | skipping to change at page 42, line 47 ¶ | |||
| A.1. Streams | A.1. Streams | |||
| HTTP/3 permits use of a larger number of streams (2^62-1) than | HTTP/3 permits use of a larger number of streams (2^62-1) than | |||
| HTTP/2. The considerations about exhaustion of stream identifier | HTTP/2. The considerations about exhaustion of stream identifier | |||
| space apply, though the space is significantly larger such that it is | space apply, though the space is significantly larger such that it is | |||
| likely that other limits in QUIC are reached first, such as the limit | likely that other limits in QUIC are reached first, such as the limit | |||
| on the connection flow control window. | on the connection flow control window. | |||
| A.2. HTTP Frame Types | A.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 on QUIC, because the | |||
| the transport deals with them. Because frames are already on a | transport deals with them. Because frames are already on a stream, | |||
| stream, they can omit the stream number. Because frames do not block | 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. This permits the removal of the Flags field from the | required. This permits the removal of the Flags field from the | |||
| generic frame layout. | 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/3. | As a result, several HTTP/2 frame types are not required in HTTP/3. | |||
| Where an HTTP/2-defined frame is no longer used, the frame ID has | 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 | been reserved in order to maximize portability between HTTP/2 and | |||
| HTTP/3 implementations. However, even equivalent frames between the | HTTP/3 implementations. However, even equivalent frames between the | |||
| two mappings are not identical. | two mappings are not identical. | |||
| Many of the differences arise from the fact that HTTP/2 provides an | Many of the differences arise from the fact that HTTP/2 provides an | |||
| absolute ordering between frames across all streams, while QUIC | absolute ordering between frames across all streams, while QUIC | |||
| provides this guarantee on each stream only. As a result, if a frame | provides this guarantee on each stream only. As a result, if a frame | |||
| skipping to change at page 46, line 21 ¶ | skipping to change at page 46, line 29 ¶ | |||
| SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of | SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of | |||
| SETTINGS is defined. | SETTINGS is defined. | |||
| STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream | STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream | |||
| management. Would provoke a QUIC_STREAM_DATA_AFTER_TERMINATION | management. Would provoke a QUIC_STREAM_DATA_AFTER_TERMINATION | |||
| from the QUIC layer. | from the QUIC layer. | |||
| FRAME_SIZE_ERROR (0x6): HTTP_MALFORMED_FRAME error codes defined in | FRAME_SIZE_ERROR (0x6): HTTP_MALFORMED_FRAME error codes defined in | |||
| Section 8.1. | Section 8.1. | |||
| REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream | REFUSED_STREAM (0x7): HTTP_REQUEST_REJECTED (in Section 8.1) is used | |||
| management. Would provoke a STREAM_ID_ERROR from the QUIC layer. | to indicate that a request was not processed. Otherwise, not | |||
| applicable because QUIC handles stream management. A | ||||
| STREAM_ID_ERROR at the QUIC layer is used for streams that are | ||||
| improperly opened. | ||||
| CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 8.1. | CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 8.1. | |||
| COMPRESSION_ERROR (0x9): Multiple error codes are defined in | COMPRESSION_ERROR (0x9): Multiple error codes are defined in | |||
| [QPACK]. | [QPACK]. | |||
| CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 8.1. | CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 8.1. | |||
| ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 8.1. | ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 8.1. | |||
| skipping to change at page 46, line 46 ¶ | skipping to change at page 47, line 10 ¶ | |||
| HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 8.1. | HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 8.1. | |||
| Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | |||
| Section 10.5. | Section 10.5. | |||
| Appendix B. Change Log | Appendix B. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| B.1. Since draft-ietf-quic-http-16 | B.1. Since draft-ietf-quic-http-17 | |||
| o HTTP_REQUEST_REJECTED is used to indicate a request can be retried | ||||
| (#2106, #2325) | ||||
| o Changed error code for GOAWAY on the wrong stream (#2231, #2343) | ||||
| B.2. Since draft-ietf-quic-http-16 | ||||
| o Rename "HTTP/QUIC" to "HTTP/3" (#1973) | o Rename "HTTP/QUIC" to "HTTP/3" (#1973) | |||
| o Changes to PRIORITY frame (#1865, #2075) | o Changes to PRIORITY frame (#1865, #2075) | |||
| * Permitted as first frame of request streams | * Permitted as first frame of request streams | |||
| * Remove exclusive reprioritization | * Remove exclusive reprioritization | |||
| * Changes to Prioritized Element Type bits | * Changes to Prioritized Element Type bits | |||
| o Define DUPLICATE_PUSH frame to refer to another PUSH_PROMISE | o Define DUPLICATE_PUSH frame to refer to another PUSH_PROMISE | |||
| (#2072) | (#2072) | |||
| o Set defaults for settings, allow request before receiving SETTINGS | o Set defaults for settings, allow request before receiving SETTINGS | |||
| (#1809, #1846, #2038) | (#1809, #1846, #2038) | |||
| o Clarify message processing rules for streams that aren't closed | o Clarify message processing rules for streams that aren't closed | |||
| (#1972, #2003) | (#1972, #2003) | |||
| o Removed reservation of error code 0 and moved HTTP_NO_ERROR to | o Removed reservation of error code 0 and moved HTTP_NO_ERROR to | |||
| this value (#1922) | this value (#1922) | |||
| o Removed prohibition of zero-length DATA frames (#2098) | o Removed prohibition of zero-length DATA frames (#2098) | |||
| B.2. Since draft-ietf-quic-http-15 | B.3. Since draft-ietf-quic-http-15 | |||
| Substantial editorial reorganization; no technical changes. | Substantial editorial reorganization; no technical changes. | |||
| B.3. Since draft-ietf-quic-http-14 | B.4. Since draft-ietf-quic-http-14 | |||
| o Recommend sensible values for QUIC transport parameters | o Recommend sensible values for QUIC transport parameters | |||
| (#1720,#1806) | (#1720,#1806) | |||
| o Define error for missing SETTINGS frame (#1697,#1808) | o Define error for missing SETTINGS frame (#1697,#1808) | |||
| o Setting values are variable-length integers (#1556,#1807) and do | o Setting values are variable-length integers (#1556,#1807) and do | |||
| not have separate maximum values (#1820) | not have separate maximum values (#1820) | |||
| o Expanded discussion of connection closure (#1599,#1717,#1712) | o Expanded discussion of connection closure (#1599,#1717,#1712) | |||
| o HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | o HTTP_VERSION_FALLBACK falls back to HTTP/1.1 (#1677,#1685) | |||
| B.4. Since draft-ietf-quic-http-13 | B.5. Since draft-ietf-quic-http-13 | |||
| o Reserved some frame types for grease (#1333, #1446) | o Reserved some frame types for grease (#1333, #1446) | |||
| o Unknown unidirectional stream types are tolerated, not errors; | o Unknown unidirectional stream types are tolerated, not errors; | |||
| some reserved for grease (#1490, #1525) | some reserved for grease (#1490, #1525) | |||
| o Require settings to be remembered for 0-RTT, prohibit reductions | o Require settings to be remembered for 0-RTT, prohibit reductions | |||
| (#1541, #1641) | (#1541, #1641) | |||
| o Specify behavior for truncated requests (#1596, #1643) | o Specify behavior for truncated requests (#1596, #1643) | |||
| B.5. Since draft-ietf-quic-http-12 | B.6. Since draft-ietf-quic-http-12 | |||
| o TLS SNI extension isn't mandatory if an alternative method is used | o TLS SNI extension isn't mandatory if an alternative method is used | |||
| (#1459, #1462, #1466) | (#1459, #1462, #1466) | |||
| o Removed flags from HTTP/3 frames (#1388, #1398) | o Removed flags from HTTP/3 frames (#1388, #1398) | |||
| o Reserved frame types and settings for use in preserving | o Reserved frame types and settings for use in preserving | |||
| extensibility (#1333, #1446) | extensibility (#1333, #1446) | |||
| o Added general error code (#1391, #1397) | o Added general error code (#1391, #1397) | |||
| o Unidirectional streams carry a type byte and are extensible | o Unidirectional streams carry a type byte and are extensible | |||
| (#910,#1359) | (#910,#1359) | |||
| o Priority mechanism now uses explicit placeholders to enable | o Priority mechanism now uses explicit placeholders to enable | |||
| persistent structure in the tree (#441,#1421,#1422) | persistent structure in the tree (#441,#1421,#1422) | |||
| B.6. Since draft-ietf-quic-http-11 | B.7. 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.7. Since draft-ietf-quic-http-10 | B.8. 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.8. Since draft-ietf-quic-http-09 | B.9. 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.9. Since draft-ietf-quic-http-08 | B.10. Since draft-ietf-quic-http-08 | |||
| o Clarified connection coalescing rules (#940, #1024) | o Clarified connection coalescing rules (#940, #1024) | |||
| B.10. Since draft-ietf-quic-http-07 | B.11. 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.11. Since draft-ietf-quic-http-06 | B.12. 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.12. Since draft-ietf-quic-http-05 | B.13. 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.13. Since draft-ietf-quic-http-04 | B.14. 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 49, line 30 ¶ | skipping to change at page 50, 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.14. Since draft-ietf-quic-http-03 | B.15. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.15. Since draft-ietf-quic-http-02 | B.16. Since draft-ietf-quic-http-02 | |||
| o Track changes in transport draft | o Track changes in transport draft | |||
| B.16. Since draft-ietf-quic-http-01 | B.17. 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.17. Since draft-ietf-quic-http-00 | B.18. 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.18. Since draft-shade-quic-http2-mapping-00 | B.19. 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 | Acknowledgements | |||
| The original authors of this specification were Robbie Shade and Mike | The original authors of this specification were Robbie Shade and Mike | |||
| Warres. | Warres. | |||
| End of changes. 95 change blocks. | ||||
| 262 lines changed or deleted | 292 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/ | ||||