| draft-ietf-quic-http-11.txt | draft-ietf-quic-http-12.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track April 17, 2018 | Intended status: Standards Track May 22, 2018 | |||
| Expires: October 19, 2018 | Expires: November 23, 2018 | |||
| Hypertext Transfer Protocol (HTTP) over QUIC | Hypertext Transfer Protocol (HTTP) over QUIC | |||
| draft-ietf-quic-http-11 | draft-ietf-quic-http-12 | |||
| Abstract | Abstract | |||
| The QUIC transport protocol has several features that are desirable | The QUIC transport protocol has several features that are desirable | |||
| in a transport for HTTP, such as stream multiplexing, per-stream flow | in a transport for HTTP, such as stream multiplexing, per-stream flow | |||
| control, and low-latency connection establishment. This document | control, and low-latency connection establishment. This document | |||
| describes a mapping of HTTP semantics over QUIC. This document also | describes a mapping of HTTP semantics over QUIC. This document also | |||
| identifies HTTP/2 features that are subsumed by QUIC, and describes | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| how HTTP/2 extensions can be ported to QUIC. | how HTTP/2 extensions can be ported to QUIC. | |||
| skipping to change at page 1, line 45 ¶ | skipping to change at page 1, line 45 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on October 19, 2018. | This Internet-Draft will expire on November 23, 2018. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 39 ¶ | skipping to change at page 2, line 39 ¶ | |||
| 2.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 | 2.3. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 | |||
| 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. Control Streams . . . . . . . . . . . . . . . . . . . . . 8 | 3.1. Control Streams . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 3.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 8 | 3.2. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 8 | |||
| 3.2.1. Header Compression . . . . . . . . . . . . . . . . . 9 | 3.2.1. Header Compression . . . . . . . . . . . . . . . . . 9 | |||
| 3.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 | 3.2.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 | |||
| 3.2.3. Request Cancellation . . . . . . . . . . . . . . . . 10 | 3.2.3. Request Cancellation . . . . . . . . . . . . . . . . 10 | |||
| 3.3. Request Prioritization . . . . . . . . . . . . . . . . . 11 | 3.3. Request Prioritization . . . . . . . . . . . . . . . . . 11 | |||
| 3.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 11 | 3.4. Server Push . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 12 | 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 12 | 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 13 | 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 13 | 4.2.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 16 | 4.2.4. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 17 | 4.2.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 19 | 4.2.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 20 | 4.2.7. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.2.8. HEADER_ACK . . . . . . . . . . . . . . . . . . . . . 22 | 4.2.8. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 23 | 5. Connection Management . . . . . . . . . . . . . . . . . . . . 23 | |||
| 5. Connection Management . . . . . . . . . . . . . . . . . . . . 24 | ||||
| 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24 | 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 25 | 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 24 | |||
| 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 25 | ||||
| 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 26 | 7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 26 | 7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 27 | |||
| 7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 28 | 7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 28 | |||
| 7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 29 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 29 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 30 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30 | 9.1. Registration of HTTP/QUIC Identification String . . . . . 29 | |||
| 9.1. Registration of HTTP/QUIC Identification String . . . . . 30 | 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 30 | |||
| 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 31 | 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 31 | 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 31 | |||
| 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 32 | 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 33 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 35 | 10.1. Normative References . . . . . . . . . . . . . . . . . . 34 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 35 | 10.2. Informative References . . . . . . . . . . . . . . . . . 35 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 36 | 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | ||||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 36 | Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 36 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 37 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 36 | |||
| B.1. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 37 | B.1. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 36 | |||
| B.2. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 37 | B.2. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 36 | |||
| B.3. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 37 | B.3. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 36 | |||
| B.4. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 37 | B.4. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 36 | |||
| B.5. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 37 | B.5. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 36 | |||
| B.6. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 37 | B.6. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 37 | |||
| B.7. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 38 | B.7. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 37 | |||
| B.8. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 38 | B.8. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 37 | |||
| B.9. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 38 | B.9. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 37 | |||
| B.10. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 38 | B.10. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 37 | |||
| B.11. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 39 | B.11. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 37 | |||
| B.12. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 39 | B.12. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 38 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 39 | B.13. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 38 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 38 | ||||
| 1. Introduction | 1. Introduction | |||
| The QUIC transport protocol has several features that are desirable | The QUIC transport protocol has several features that are desirable | |||
| in a transport for HTTP, such as stream multiplexing, per-stream flow | in a transport for HTTP, such as stream multiplexing, per-stream flow | |||
| control, and low-latency connection establishment. This document | control, and low-latency connection establishment. This document | |||
| describes a mapping of HTTP semantics over QUIC, drawing heavily on | describes a mapping of HTTP semantics over QUIC, drawing heavily on | |||
| the existing TCP mapping, HTTP/2. Specifically, this document | the existing TCP mapping, HTTP/2. Specifically, this document | |||
| identifies HTTP/2 features that are subsumed by QUIC, and describes | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| how the other features can be implemented atop QUIC. | how the other features can be implemented atop QUIC. | |||
| skipping to change at page 7, line 23 ¶ | skipping to change at page 7, line 23 ¶ | |||
| no guarantees about order of delivery with regard to bytes on other | no guarantees about order of delivery with regard to bytes on other | |||
| streams. On the wire, data is framed into QUIC STREAM frames, but | streams. On the wire, data is framed into QUIC STREAM frames, but | |||
| this framing is invisible to the HTTP framing layer. A QUIC receiver | this framing is invisible to the HTTP framing layer. A QUIC receiver | |||
| buffers and orders received STREAM frames, exposing the data | buffers and orders received STREAM frames, exposing the data | |||
| contained within as a reliable byte stream to the application. | contained within as a reliable byte stream to the application. | |||
| QUIC reserves the first client-initiated, bidirectional stream | QUIC reserves the first client-initiated, bidirectional stream | |||
| (Stream 0) for cryptographic operations. HTTP over QUIC reserves the | (Stream 0) for cryptographic operations. HTTP over QUIC reserves the | |||
| first unidirectional stream sent by either peer (Streams 2 and 3) for | first unidirectional stream sent by either peer (Streams 2 and 3) for | |||
| sending and receiving HTTP control frames. This pair of | sending and receiving HTTP control frames. This pair of | |||
| unidirectional streams is analogous to HTTP/2's Stream 0. The data | unidirectional streams is analogous to HTTP/2's Stream 0. HTTP over | |||
| sent on these streams is critical to the HTTP connection. If either | QUIC also reserves the second and third unidirectional streams for | |||
| control stream is closed for any reason, this MUST be treated as a | each peer's QPACK encoder and decoder. The client's QPACK encoder | |||
| connection error of type QUIC_CLOSED_CRITICAL_STREAM. | uses stream 6 and decoder uses stream 10. The server's encoder and | |||
| decoder use streams 7 and 11, respectively. The data sent on these | ||||
| streams is critical to the HTTP connection. If any control stream is | ||||
| closed for any reason, this MUST be treated as a connection error of | ||||
| type QUIC_CLOSED_CRITICAL_STREAM. | ||||
| When HTTP headers and data are sent over QUIC, the QUIC layer handles | When HTTP headers and data are sent over QUIC, the QUIC layer handles | |||
| most of the stream management. | most of the stream management. | |||
| An HTTP request/response consumes a single client-initiated, | An HTTP request/response consumes a single client-initiated, | |||
| bidirectional stream. A bidirectional stream ensures that the | bidirectional stream. A bidirectional stream ensures that the | |||
| response can be readily correlated with the request. This means that | response can be readily correlated with the request. This means that | |||
| the client's first request occurs on QUIC stream 4, with subsequent | the client's first request occurs on QUIC stream 4, with subsequent | |||
| requests on stream 8, 12, and so on. | requests on stream 8, 12, and so on. | |||
| skipping to change at page 11, line 29 ¶ | skipping to change at page 11, line 36 ¶ | |||
| (Section 4.2.6). | (Section 4.2.6). | |||
| Only a client can send PRIORITY frames. A server MUST NOT send a | Only a client can send PRIORITY frames. A server MUST NOT send a | |||
| PRIORITY frame. | PRIORITY frame. | |||
| 3.4. Server Push | 3.4. Server Push | |||
| HTTP/QUIC supports server push in a similar manner to [RFC7540], but | HTTP/QUIC supports server push in a similar manner to [RFC7540], but | |||
| uses different mechanisms. During connection establishment, the | uses different mechanisms. During connection establishment, the | |||
| client enables server push by sending a MAX_PUSH_ID frame (see | client enables server push by sending a MAX_PUSH_ID frame (see | |||
| Section 4.2.9). A server cannot use server push until it receives a | Section 4.2.8). A server cannot use server push until it receives a | |||
| MAX_PUSH_ID frame. | MAX_PUSH_ID frame. | |||
| As with server push for HTTP/2, the server initiates a server push by | As with server push for HTTP/2, the server initiates a server push by | |||
| sending a PUSH_PROMISE frame (see Section 4.2.6) that includes | sending a PUSH_PROMISE frame (see Section 4.2.6) that includes | |||
| request headers for the promised request. Promised requests MUST | request headers for the promised request. Promised requests MUST | |||
| conform to the requirements in Section 8.2 of [RFC7540]. | conform to the requirements in Section 8.2 of [RFC7540]. | |||
| The PUSH_PROMISE frame is sent on the client-initiated, bidirectional | The PUSH_PROMISE frame is sent on the client-initiated, bidirectional | |||
| stream that carried the request that generated the push. This allows | stream that carried the request that generated the push. This allows | |||
| the server push to be associated with a request. Ordering of a | the server push to be associated with a request. Ordering of a | |||
| skipping to change at page 11, line 45 ¶ | skipping to change at page 12, line 4 ¶ | |||
| conform to the requirements in Section 8.2 of [RFC7540]. | conform to the requirements in Section 8.2 of [RFC7540]. | |||
| The PUSH_PROMISE frame is sent on the client-initiated, bidirectional | The PUSH_PROMISE frame is sent on the client-initiated, bidirectional | |||
| stream that carried the request that generated the push. This allows | stream that carried the request that generated the push. This allows | |||
| the server push to be associated with a request. Ordering of a | the server push to be associated with a request. Ordering of a | |||
| PUSH_PROMISE in relation to certain parts of the response is | PUSH_PROMISE in relation to certain parts of the response is | |||
| important (see Section 8.2.1 of [RFC7540]). | important (see Section 8.2.1 of [RFC7540]). | |||
| Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it | Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it | |||
| contains a Push ID. The Push ID uniquely identifies a server push. | contains a Push ID. The Push ID uniquely identifies a server push. | |||
| This allows a server to fulfill promises in the order that best suits | This allows a server to fulfill promises in the order that best suits | |||
| its needs. | its needs. | |||
| When a server later fulfills a promise, the server push response is | When a server later fulfills a promise, the server push response is | |||
| conveyed on a push stream. A push stream is a server-initiated, | conveyed on a push stream. A push stream is a server-initiated, | |||
| unidirectional stream. A push stream identifies the Push ID of the | unidirectional stream. A push stream identifies the Push ID of the | |||
| promise that it fulfills, encoded as a variable-length integer. | promise that it fulfills, encoded as a variable-length integer. | |||
| A server SHOULD use Push IDs sequentially, starting at 0. A client | A server SHOULD use Push IDs sequentially, starting at 0. A client | |||
| uses the MAX_PUSH_ID frame (Section 4.2.9) to limit the number of | uses the MAX_PUSH_ID frame (Section 4.2.8) to limit the number of | |||
| pushes that a server can promise. A client MUST treat receipt of a | pushes that a server can promise. A client MUST treat receipt of a | |||
| push stream with a Push ID that is greater than the maximum Push ID | push stream with a Push ID that is greater than the maximum Push ID | |||
| as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED. | as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED. | |||
| If a promised server push is not needed by the client, the client | If a promised server push is not needed by the client, the client | |||
| SHOULD send a CANCEL_PUSH frame; if the push stream is already open, | SHOULD send a CANCEL_PUSH frame; if the push stream is already open, | |||
| a QUIC STOP_SENDING frame with an appropriate error code can be used | a QUIC STOP_SENDING frame with an appropriate error code can be used | |||
| instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | |||
| Section 6). This asks the server not to transfer the data and | Section 6). This asks the server not to transfer the data and | |||
| indicates that it will be discarded upon receipt. | indicates that it will be discarded upon receipt. | |||
| skipping to change at page 14, line 10 ¶ | skipping to change at page 14, line 14 ¶ | |||
| DATA frames MUST contain a non-zero-length payload. If a DATA frame | DATA frames MUST contain a non-zero-length payload. If a DATA frame | |||
| is received with a payload length of zero, the recipient MUST respond | is received with a payload length of zero, the recipient MUST respond | |||
| with a stream error (Section 6) of type HTTP_MALFORMED_FRAME. | with a stream error (Section 6) of type HTTP_MALFORMED_FRAME. | |||
| 4.2.2. HEADERS | 4.2.2. HEADERS | |||
| The HEADERS frame (type=0x1) is used to carry a header block, | The HEADERS frame (type=0x1) is used to carry a header block, | |||
| compressed using QPACK. See [QPACK] for more details. | compressed using QPACK. See [QPACK] for more details. | |||
| The HEADERS frame defines a single flag: | The HEADERS frame defines no flags. | |||
| BLOCKING (0x01): Indicates the stream might need to wait for | ||||
| dependent headers before processing. If 0, the frame can be | ||||
| processed immediately upon receipt. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 4: HEADERS frame payload | Figure 4: HEADERS frame payload | |||
| HEADERS frames can be sent on the Control Stream as well as on | HEADERS frames can only be sent on request / push streams. | |||
| request / push streams. The value of BLOCKING MUST be 0 for HEADERS | ||||
| frames on the Control Stream, since they can only depend on previous | ||||
| HEADERS on the same stream. | ||||
| 4.2.3. PRIORITY | 4.2.3. PRIORITY | |||
| The PRIORITY (type=0x02) frame specifies the sender-advised priority | The PRIORITY (type=0x02) frame specifies the sender-advised priority | |||
| of a stream and is substantially different in format from [RFC7540]. | of a stream and is substantially different in format from [RFC7540]. | |||
| In order to ensure that prioritization is processed in a consistent | In order to ensure that prioritization is processed in a consistent | |||
| order, PRIORITY frames MUST be sent on the control stream. A | order, PRIORITY frames MUST be sent on the control stream. A | |||
| PRIORITY frame sent on any other stream MUST be treated as a | PRIORITY frame sent on any other stream MUST be treated as a | |||
| HTTP_WRONG_STREAM error. | HTTP_WRONG_STREAM error. | |||
| skipping to change at page 18, line 49 ¶ | skipping to change at page 18, line 49 ¶ | |||
| 4.2.5.1. Integer encoding | 4.2.5.1. Integer encoding | |||
| Settings which are integers use the QUIC variable-length integer | Settings which are integers use the QUIC variable-length integer | |||
| encoding. | encoding. | |||
| 4.2.5.2. Defined SETTINGS Parameters | 4.2.5.2. Defined SETTINGS Parameters | |||
| The following settings are defined in HTTP/QUIC: | The following settings are defined in HTTP/QUIC: | |||
| SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of | SETTINGS_HEADER_TABLE_SIZE (0x1): An integer with a maximum value of | |||
| 2^30 - 1. | 2^30 - 1. The default value is 4,096 bytes. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value | SETTINGS_MAX_HEADER_LIST_SIZE (0x6): An integer with a maximum value | |||
| of 2^30 - 1 | of 2^30 - 1. The default value is unlimited. | |||
| SETTINGS_QPACK_BLOCKED_STREAMS (0x7): An integer with a maximum | ||||
| value of 2^16 - 1. The default value is 100. | ||||
| 4.2.5.3. Initial SETTINGS Values | 4.2.5.3. Initial SETTINGS Values | |||
| When a 0-RTT QUIC connection is being used, the client's initial | When a 0-RTT QUIC connection is being used, the client's initial | |||
| requests will be sent before the arrival of the server's SETTINGS | requests will be sent before the arrival of the server's SETTINGS | |||
| frame. Clients MUST store the settings the server provided in the | frame. Clients MUST store the settings the server provided in the | |||
| session being resumed and MUST comply with stored settings until the | session being resumed and MUST comply with stored settings until the | |||
| server's current settings are received. | server's current settings are received. | |||
| Servers MAY continue processing data from clients which exceed its | Servers MAY continue processing data from clients which exceed its | |||
| skipping to change at page 19, line 25 ¶ | skipping to change at page 19, line 28 ¶ | |||
| client MUST apply the new settings immediately upon receipt. | client MUST apply the new settings immediately upon receipt. | |||
| When a 1-RTT QUIC connection is being used, the client MUST NOT send | When a 1-RTT QUIC connection is being used, the client MUST NOT send | |||
| requests prior to receiving and processing the server's SETTINGS | requests prior to receiving and processing the server's SETTINGS | |||
| frame. | frame. | |||
| 4.2.6. PUSH_PROMISE | 4.2.6. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x05) is used to carry a request header | The PUSH_PROMISE frame (type=0x05) is used to carry a request header | |||
| set from server to client, as in HTTP/2. The PUSH_PROMISE frame | set from server to client, as in HTTP/2. The PUSH_PROMISE frame | |||
| defines a single flag: | defines no flags. | |||
| BLOCKING (0x01): Indicates the stream might need to wait for | ||||
| dependent headers before processing. If 0, the frame can be | ||||
| processed immediately upon receipt. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: PUSH_PROMISE frame payload | Figure 8: PUSH_PROMISE frame payload | |||
| skipping to change at page 19, line 52 ¶ | skipping to change at page 19, line 51 ¶ | |||
| Push ID: A variable-length integer that identifies the server push | Push ID: A variable-length integer that identifies the server push | |||
| request. A push ID is used in push stream header (Section 3.4), | request. A push ID is used in push stream header (Section 3.4), | |||
| CANCEL_PUSH frames (Section 4.2.4), and PRIORITY frames | CANCEL_PUSH frames (Section 4.2.4), and PRIORITY frames | |||
| (Section 4.2.3). | (Section 4.2.3). | |||
| Header Block: QPACK-compressed request headers for the promised | Header Block: QPACK-compressed request headers for the promised | |||
| response. See [QPACK] for more details. | response. See [QPACK] for more details. | |||
| A server MUST NOT use a Push ID that is larger than the client has | A server MUST NOT use a Push ID that is larger than the client has | |||
| provided in a MAX_PUSH_ID frame (Section 4.2.9). A client MUST treat | provided in a MAX_PUSH_ID frame (Section 4.2.8). A client MUST treat | |||
| receipt of a PUSH_PROMISE that contains a larger Push ID than the | receipt of a PUSH_PROMISE that contains a larger Push ID than the | |||
| client has advertised as a connection error of type | client has advertised as a connection error of type | |||
| HTTP_MALFORMED_FRAME. | HTTP_MALFORMED_FRAME. | |||
| A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | A server MAY use the same Push ID in multiple PUSH_PROMISE frames. | |||
| This allows the server to use the same server push in response to | This allows the server to use the same server push in response to | |||
| multiple concurrent requests. Referencing the same server push | multiple concurrent requests. Referencing the same server push | |||
| ensures that a PUSH_PROMISE can be made in relation to every response | ensures that a PUSH_PROMISE can be made in relation to every response | |||
| in which server push might be needed without duplicating pushes. | in which server push might be needed without duplicating pushes. | |||
| skipping to change at page 22, line 42 ¶ | skipping to change at page 22, line 42 ¶ | |||
| losing requests. | losing requests. | |||
| Once all requests on streams at or below the identified stream number | Once all requests on streams at or below the identified stream number | |||
| have been completed or cancelled, and all promised server push | have been completed or cancelled, and all promised server push | |||
| responses associated with those requests have been completed or | responses associated with those requests have been completed or | |||
| cancelled, the connection can be closed using an Immediate Close (see | cancelled, the connection can be closed using an Immediate Close (see | |||
| [QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown | [QUIC-TRANSPORT]). An endpoint that completes a graceful shutdown | |||
| SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR | SHOULD use the QUIC APPLICATION_CLOSE frame with the HTTP_NO_ERROR | |||
| code. | code. | |||
| 4.2.8. HEADER_ACK | 4.2.8. MAX_PUSH_ID | |||
| The HEADER_ACK frame (type=0x8) is used by header compression to | ||||
| ensure consistency. The frames are sent from the QPACK decoder to | ||||
| the QPACK encoder; that is, the server sends them to the client to | ||||
| acknowledge processing of the client's header blocks, and the client | ||||
| sends them to the server to acknowledge processing of the server's | ||||
| header blocks. | ||||
| The HEADER_ACK frame is sent on the Control Stream when the QPACK | ||||
| decoder has fully processed a header block. It is used by the peer's | ||||
| QPACK encoder to determine whether subsequent indexed representations | ||||
| that might reference that block are vulnerable to head-of-line | ||||
| blocking, and to prevent eviction races. See [QPACK] for more | ||||
| details on the use of this information. | ||||
| The HEADER_ACK frame indicates the stream on which the header block | ||||
| was processed by encoding the Stream ID as a variable-length integer. | ||||
| The same Stream ID can be identified multiple times, as multiple | ||||
| header-containing blocks can be sent on a single stream in the case | ||||
| of intermediate responses, trailers, pushed requests, etc. as well as | ||||
| on the Control Streams. Since header frames on each stream are | ||||
| received and processed in order, this gives the encoder precise | ||||
| feedback on which header blocks within a stream have been fully | ||||
| processed. | ||||
| 0 1 2 3 4 5 6 7 | ||||
| +---+---+---+---+---+---+---+---+ | ||||
| | Stream ID (i) ... | ||||
| +---+---+---+---+---+---+---+---+ | ||||
| HEADER_ACK frame | ||||
| The HEADER_ACK frame does not define any flags. | ||||
| 4.2.9. MAX_PUSH_ID | ||||
| The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | |||
| number of server pushes that the server can initiate. This sets the | number of server pushes that the server can initiate. This sets the | |||
| maximum value for a Push ID that the server can use in a PUSH_PROMISE | maximum value for a Push ID that the server can use in a PUSH_PROMISE | |||
| frame. Consequently, this also limits the number of push streams | frame. Consequently, this also limits the number of push streams | |||
| that the server can initiate in addition to the limit set by the QUIC | that the server can initiate in addition to the limit set by the QUIC | |||
| MAX_STREAM_ID frame. | MAX_STREAM_ID frame. | |||
| The MAX_PUSH_ID frame is always sent on a control stream. Receipt of | The MAX_PUSH_ID frame is always sent on a control stream. Receipt of | |||
| a MAX_PUSH_ID frame on any other stream MUST be treated as a | a MAX_PUSH_ID frame on any other stream MUST be treated as a | |||
| skipping to change at page 25, line 28 ¶ | skipping to change at page 24, line 40 ¶ | |||
| HTTP_INTERNAL_ERROR (0x03): An internal error has occurred in the | HTTP_INTERNAL_ERROR (0x03): An internal error has occurred in the | |||
| HTTP stack. | HTTP stack. | |||
| HTTP_PUSH_ALREADY_IN_CACHE (0x04): The server has attempted to push | HTTP_PUSH_ALREADY_IN_CACHE (0x04): The server has attempted to push | |||
| content which the client has cached. | content which the client has cached. | |||
| HTTP_REQUEST_CANCELLED (0x05): The client no longer needs the | HTTP_REQUEST_CANCELLED (0x05): The client no longer needs the | |||
| requested data. | requested data. | |||
| HTTP_HPACK_DECOMPRESSION_FAILED (0x06): HPACK failed to decompress a | HTTP_QPACK_DECOMPRESSION_FAILED (0x06): QPACK failed to decompress a | |||
| frame and cannot continue. | frame and cannot continue. | |||
| HTTP_CONNECT_ERROR (0x07): The connection established in response to | HTTP_CONNECT_ERROR (0x07): The connection established in response to | |||
| a CONNECT request was reset or abnormally closed. | a CONNECT request was reset or abnormally closed. | |||
| HTTP_EXCESSIVE_LOAD (0x08): The endpoint detected that its peer is | HTTP_EXCESSIVE_LOAD (0x08): The endpoint detected that its peer is | |||
| exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
| HTTP_VERSION_FALLBACK (0x09): The requested operation cannot be | HTTP_VERSION_FALLBACK (0x09): The requested operation cannot be | |||
| served over HTTP/QUIC. The peer should retry over HTTP/2. | served over HTTP/QUIC. The peer should retry over HTTP/2. | |||
| skipping to change at page 29, line 51 ¶ | skipping to change at page 29, line 12 ¶ | |||
| control. Would provoke a QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA | control. Would provoke a QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA | |||
| from the QUIC layer. | from the QUIC layer. | |||
| SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of | SETTINGS_TIMEOUT (0x4): Not applicable, since no acknowledgement of | |||
| SETTINGS is defined. | SETTINGS is defined. | |||
| STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream | STREAM_CLOSED (0x5): Not applicable, since QUIC handles stream | |||
| management. Would provoke a QUIC_STREAM_DATA_AFTER_TERMINATION | management. Would provoke a QUIC_STREAM_DATA_AFTER_TERMINATION | |||
| from the QUIC layer. | from the QUIC layer. | |||
| FRAME_SIZE_ERROR (0x6) No single mapping. See new error codes | FRAME_SIZE_ERROR (0x6): No single mapping. See new error codes | |||
| defined in Section 6.1. | defined in Section 6.1. | |||
| REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream | REFUSED_STREAM (0x7): Not applicable, since QUIC handles stream | |||
| management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the | management. Would provoke a QUIC_TOO_MANY_OPEN_STREAMS from the | |||
| QUIC layer. | QUIC layer. | |||
| CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 6.1. | CANCEL (0x8): HTTP_REQUEST_CANCELLED in Section 6.1. | |||
| COMPRESSION_ERROR (0x9): HTTP_HPACK_DECOMPRESSION_FAILED in | COMPRESSION_ERROR (0x9): HTTP_HPACK_DECOMPRESSION_FAILED in | |||
| Section 6.1. | Section 6.1. | |||
| skipping to change at page 30, line 29 ¶ | skipping to change at page 29, line 39 ¶ | |||
| provide sufficient security on all connections. | provide sufficient security on all connections. | |||
| HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 6.1. | HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 6.1. | |||
| Error codes need to be defined for HTTP/2 and HTTP/QUIC separately. | Error codes need to be defined for HTTP/2 and HTTP/QUIC separately. | |||
| See Section 9.5. | See Section 9.5. | |||
| 8. Security Considerations | 8. Security Considerations | |||
| The security considerations of HTTP over QUIC should be comparable to | The security considerations of HTTP over QUIC should be comparable to | |||
| those of HTTP/2. | those of HTTP/2 with TLS. | |||
| The modified SETTINGS format contains nested length elements, which | The modified SETTINGS format contains nested length elements, which | |||
| could pose a security risk to an uncautious implementer. A SETTINGS | could pose a security risk to an uncautious implementer. A SETTINGS | |||
| frame parser MUST ensure that the length of the frame exactly matches | frame parser MUST ensure that the length of the frame exactly matches | |||
| the length of the settings it contains. | the length of the settings it contains. | |||
| 9. IANA Considerations | 9. IANA Considerations | |||
| 9.1. Registration of HTTP/QUIC Identification String | 9.1. Registration of HTTP/QUIC Identification String | |||
| skipping to change at page 32, line 24 ¶ | skipping to change at page 31, line 24 ¶ | |||
| | CANCEL_PUSH | 0x3 | Section 4.2.4 | | | CANCEL_PUSH | 0x3 | Section 4.2.4 | | |||
| | | | | | | | | | | |||
| | SETTINGS | 0x4 | Section 4.2.5 | | | SETTINGS | 0x4 | Section 4.2.5 | | |||
| | | | | | | | | | | |||
| | PUSH_PROMISE | 0x5 | Section 4.2.6 | | | PUSH_PROMISE | 0x5 | Section 4.2.6 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x6 | N/A | | | Reserved | 0x6 | N/A | | |||
| | | | | | | | | | | |||
| | GOAWAY | 0x7 | Section 4.2.7 | | | GOAWAY | 0x7 | Section 4.2.7 | | |||
| | | | | | | | | | | |||
| | HEADER_ACK | 0x8 | Section 4.2.8 | | | Reserved | 0x8 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x9 | N/A | | | Reserved | 0x9 | N/A | | |||
| | | | | | | | | | | |||
| | MAX_PUSH_ID | 0xD | Section 4.2.9 | | | MAX_PUSH_ID | 0xD | Section 4.2.8 | | |||
| +--------------+------+---------------+ | +--------------+------+---------------+ | |||
| 9.4. Settings Parameters | 9.4. Settings Parameters | |||
| This document establishes a registry for HTTP/QUIC settings. The | This document establishes a registry for HTTP/QUIC settings. The | |||
| "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | |||
| Settings" registry operates under the "Expert Review" policy | Settings" registry operates under the "Expert Review" policy | |||
| [RFC8126] for values in the range from 0x0000 to 0xefff, with values | [RFC8126] for values in the range from 0x0000 to 0xefff, with values | |||
| between and 0xf000 and 0xffff being reserved for Experimental Use. | between and 0xf000 and 0xffff being reserved for Experimental Use. | |||
| The designated experts are the same as those for the "HTTP/2 | The designated experts are the same as those for the "HTTP/2 | |||
| skipping to change at page 33, line 10 ¶ | skipping to change at page 32, line 10 ¶ | |||
| Name: A symbolic name for the setting. Specifying a setting name is | Name: A symbolic name for the setting. Specifying a setting name is | |||
| optional. | optional. | |||
| Code: The 16-bit code assigned to the setting. | Code: The 16-bit code assigned to the setting. | |||
| Specification: An optional reference to a specification that | Specification: An optional reference to a specification that | |||
| describes the use of the setting. | describes the use of the setting. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +----------------------+------+-----------------+ | +-----------------------+------+-----------------+ | |||
| | Setting Name | Code | Specification | | | Setting Name | Code | Specification | | |||
| +----------------------+------+-----------------+ | +-----------------------+------+-----------------+ | |||
| | HEADER_TABLE_SIZE | 0x1 | Section 4.2.5.2 | | | HEADER_TABLE_SIZE | 0x1 | Section 4.2.5.2 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x2 | N/A | | | Reserved | 0x2 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x3 | N/A | | | Reserved | 0x3 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x4 | N/A | | | Reserved | 0x4 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x5 | N/A | | | Reserved | 0x5 | N/A | | |||
| | | | | | | | | | | |||
| | MAX_HEADER_LIST_SIZE | 0x6 | Section 4.2.5.2 | | | MAX_HEADER_LIST_SIZE | 0x6 | Section 4.2.5.2 | | |||
| +----------------------+------+-----------------+ | | | | | | |||
| | QPACK_BLOCKED_STREAMS | 0x7 | Section 4.2.5.2 | | ||||
| +-----------------------+------+-----------------+ | ||||
| 9.5. Error Codes | 9.5. Error Codes | |||
| This document establishes a registry for HTTP/QUIC error codes. The | This document establishes a registry for HTTP/QUIC error codes. The | |||
| "HTTP/QUIC Error Code" registry manages a 16-bit space. The "HTTP/ | "HTTP/QUIC Error Code" registry manages a 16-bit space. The "HTTP/ | |||
| QUIC Error Code" registry operates under the "Expert Review" policy | QUIC Error Code" registry operates under the "Expert Review" policy | |||
| [RFC8126]. | [RFC8126]. | |||
| Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
| of the error code. An expert reviewer is advised to examine new | of the error code. An expert reviewer is advised to examine new | |||
| skipping to change at page 35, line 27 ¶ | skipping to change at page 34, line 29 ¶ | |||
| | | | formatting | | | | | | formatting | | | |||
| | | | or use | | | | | | or use | | | |||
| +----------------------------+--------+------------+----------------+ | +----------------------------+--------+------------+----------------+ | |||
| 10. References | 10. References | |||
| 10.1. Normative References | 10.1. Normative References | |||
| [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | [QPACK] Krasic, C., Bishop, M., and A. Frindell, Ed., "QPACK: | |||
| Header Compression for HTTP over QUIC", draft-ietf-quic- | Header Compression for HTTP over QUIC", draft-ietf-quic- | |||
| qpack-00 (work in progress), April 2018. | qpack-00 (work in progress), May 2018. | |||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", draft-ietf-quic- | Multiplexed and Secure Transport", draft-ietf-quic- | |||
| transport-11 (work in progress), April 2018. | transport-11 (work in progress), May 2018. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 37, line 13 ¶ | skipping to change at page 36, line 18 ¶ | |||
| Warres. | Warres. | |||
| A substantial portion of Mike's contribution was supported by | A substantial portion of Mike's contribution was supported by | |||
| Microsoft during his employment there. | Microsoft during his employment there. | |||
| 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-10 | B.1. Since draft-ietf-quic-http-11 | |||
| o Moved QPACK table updates and acknowledgments to dedicated streams | ||||
| (#1121, #1122, #1238) | ||||
| B.2. 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.2. Since draft-ietf-quic-http-09 | B.3. 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.3. Since draft-ietf-quic-http-08 | B.4. Since draft-ietf-quic-http-08 | |||
| o Clarified connection coalescing rules (#940, #1024) | o Clarified connection coalescing rules (#940, #1024) | |||
| B.4. Since draft-ietf-quic-http-07 | B.5. 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.5. Since draft-ietf-quic-http-06 | B.6. 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.6. Since draft-ietf-quic-http-05 | B.7. 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.7. Since draft-ietf-quic-http-04 | B.8. Since draft-ietf-quic-http-04 | |||
| o Cite RFC 5234 (#404) | o Cite RFC 5234 (#404) | |||
| o Return to a single stream per request (#245,#557) | o Return to a single stream per request (#245,#557) | |||
| o Use separate frame type and settings registries from HTTP/2 (#81) | o Use separate frame type and settings registries from HTTP/2 (#81) | |||
| o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | o SETTINGS_ENABLE_PUSH instead of SETTINGS_DISABLE_PUSH (#477) | |||
| o Restored GOAWAY (#696) | o Restored GOAWAY (#696) | |||
| o Identify server push using Push ID rather than a stream ID | o Identify server push using Push ID rather than a stream ID | |||
| (#702,#281) | (#702,#281) | |||
| o DATA frames cannot be empty (#700) | o DATA frames cannot be empty (#700) | |||
| B.8. Since draft-ietf-quic-http-03 | B.9. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| B.9. Since draft-ietf-quic-http-02 | B.10. Since draft-ietf-quic-http-02 | |||
| o Track changes in transport draft | o Track changes in transport draft | |||
| B.10. Since draft-ietf-quic-http-01 | B.11. 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) | |||
| skipping to change at page 39, line 4 ¶ | skipping to change at page 38, line 15 ¶ | |||
| 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.11. Since draft-ietf-quic-http-00 | B.12. 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.12. Since draft-shade-quic-http2-mapping-00 | B.13. Since draft-shade-quic-http2-mapping-00 | |||
| o Adopted as base for draft-ietf-quic-http | o Adopted as base for draft-ietf-quic-http | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| Author's Address | Author's Address | |||
| Mike Bishop (editor) | Mike Bishop (editor) | |||
| Akamai | Akamai | |||
| End of changes. 40 change blocks. | ||||
| 134 lines changed or deleted | 102 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/ | ||||