| draft-ietf-quic-http-13.txt | draft-ietf-quic-http-14.txt | |||
|---|---|---|---|---|
| QUIC M. Bishop, Ed. | QUIC M. Bishop, Ed. | |||
| Internet-Draft Akamai | Internet-Draft Akamai | |||
| Intended status: Standards Track June 28, 2018 | Intended status: Standards Track August 15, 2018 | |||
| Expires: December 30, 2018 | Expires: February 16, 2019 | |||
| Hypertext Transfer Protocol (HTTP) over QUIC | Hypertext Transfer Protocol (HTTP) over QUIC | |||
| draft-ietf-quic-http-13 | draft-ietf-quic-http-14 | |||
| 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 December 30, 2018. | This Internet-Draft will expire on February 16, 2019. | |||
| 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 32 ¶ | skipping to change at page 2, line 32 ¶ | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 | 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 | |||
| 2. Connection Setup and Management . . . . . . . . . . . . . . . 4 | 2. Connection Setup and Management . . . . . . . . . . . . . . . 4 | |||
| 2.1. Draft Version Identification . . . . . . . . . . . . . . 4 | 2.1. Draft Version Identification . . . . . . . . . . . . . . 4 | |||
| 2.2. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 5 | 2.2. Discovering an HTTP/QUIC Endpoint . . . . . . . . . . . . 5 | |||
| 2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 5 | 2.2.1. QUIC Version Hints . . . . . . . . . . . . . . . . . 5 | |||
| 2.3. Connection Establishment . . . . . . . . . . . . . . . . 6 | 2.3. Connection Establishment . . . . . . . . . . . . . . . . 6 | |||
| 2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 | 2.4. Connection Reuse . . . . . . . . . . . . . . . . . . . . 6 | |||
| 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | 3. Stream Mapping and Usage . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 7 | 3.1. HTTP Message Exchanges . . . . . . . . . . . . . . . . . 7 | |||
| 3.1.1. Header Compression . . . . . . . . . . . . . . . . . 9 | 3.1.1. Header Formatting and Compression . . . . . . . . . . 9 | |||
| 3.1.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 | 3.1.2. The CONNECT Method . . . . . . . . . . . . . . . . . 9 | |||
| 3.1.3. Request Cancellation . . . . . . . . . . . . . . . . 10 | 3.1.3. Request Cancellation . . . . . . . . . . . . . . . . 10 | |||
| 3.2. Request Prioritization . . . . . . . . . . . . . . . . . 10 | 3.2. Request Prioritization . . . . . . . . . . . . . . . . . 11 | |||
| 3.2.1. Placeholders . . . . . . . . . . . . . . . . . . . . 11 | 3.2.1. Placeholders . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.2.2. Priority Tree Maintenance . . . . . . . . . . . . . . 11 | 3.2.2. Priority Tree Maintenance . . . . . . . . . . . . . . 12 | |||
| 3.3. Unidirectional Streams . . . . . . . . . . . . . . . . . 12 | 3.3. Unidirectional Streams . . . . . . . . . . . . . . . . . 13 | |||
| 3.3.1. Control Streams . . . . . . . . . . . . . . . . . . . 13 | 3.3.1. Reserved Stream Types . . . . . . . . . . . . . . . . 13 | |||
| 3.3.2. Server Push . . . . . . . . . . . . . . . . . . . . . 13 | 3.3.2. Control Streams . . . . . . . . . . . . . . . . . . . 14 | |||
| 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 14 | 3.3.3. Server Push . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 15 | 4. HTTP Framing Layer . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 15 | 4.1. Frame Layout . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.1. Reserved Frame Types . . . . . . . . . . . . . . . . 15 | 4.2. Frame Definitions . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.2. DATA . . . . . . . . . . . . . . . . . . . . . . . . 15 | 4.2.1. Reserved Frame Types . . . . . . . . . . . . . . . . 16 | |||
| 4.2.3. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 16 | 4.2.2. DATA . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.4. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 16 | 4.2.3. HEADERS . . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.2.5. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 18 | 4.2.4. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.2.6. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 19 | 4.2.5. CANCEL_PUSH . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.2.7. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 21 | 4.2.6. SETTINGS . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.2.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 23 | 4.2.7. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . 23 | |||
| 4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 25 | 4.2.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 4.2.9. MAX_PUSH_ID . . . . . . . . . . . . . . . . . . . . . 26 | ||||
| 5. Connection Management . . . . . . . . . . . . . . . . . . . . 26 | 5. Connection Management . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 26 | 6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 26 | 6.1. HTTP/QUIC Error Codes . . . . . . . . . . . . . . . . . . 27 | |||
| 7. Considerations for Transitioning from HTTP/2 . . . . . . . . 28 | 7. Extensions to HTTP/QUIC . . . . . . . . . . . . . . . . . . . 29 | |||
| 7.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 8. Considerations for Transitioning from HTTP/2 . . . . . . . . 30 | |||
| 7.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 28 | 8.1. Streams . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 30 | 8.2. HTTP Frame Types . . . . . . . . . . . . . . . . . . . . 30 | |||
| 7.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 31 | 8.3. HTTP/2 SETTINGS Parameters . . . . . . . . . . . . . . . 32 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 32 | 8.4. HTTP/2 Error Codes . . . . . . . . . . . . . . . . . . . 33 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 32 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 34 | |||
| 9.1. Registration of HTTP/QUIC Identification String . . . . . 32 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 9.2. Registration of QUIC Version Hint Alt-Svc Parameter . . . 33 | 10.1. Registration of HTTP/QUIC Identification String . . . . 34 | |||
| 9.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . . 33 | 10.2. Registration of QUIC Version Hint Alt-Svc Parameter . . 35 | |||
| 9.4. Settings Parameters . . . . . . . . . . . . . . . . . . . 34 | 10.3. Frame Types . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 9.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 35 | 10.4. Settings Parameters . . . . . . . . . . . . . . . . . . 36 | |||
| 9.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 38 | 10.5. Error Codes . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 | 10.6. Stream Types . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 38 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 39 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 41 | |||
| 10.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | 11.2. Informative References . . . . . . . . . . . . . . . . . 42 | |||
| Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 40 | 11.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| A.1. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 40 | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 42 | |||
| A.2. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 40 | A.1. Since draft-ietf-quic-http-13 . . . . . . . . . . . . . . 42 | |||
| A.3. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 40 | A.2. Since draft-ietf-quic-http-12 . . . . . . . . . . . . . . 42 | |||
| A.4. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 41 | A.3. Since draft-ietf-quic-http-11 . . . . . . . . . . . . . . 43 | |||
| A.5. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 41 | A.4. Since draft-ietf-quic-http-10 . . . . . . . . . . . . . . 43 | |||
| A.6. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 41 | A.5. Since draft-ietf-quic-http-09 . . . . . . . . . . . . . . 43 | |||
| A.7. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 41 | A.6. Since draft-ietf-quic-http-08 . . . . . . . . . . . . . . 43 | |||
| A.8. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 41 | A.7. Since draft-ietf-quic-http-07 . . . . . . . . . . . . . . 43 | |||
| A.9. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 41 | A.8. Since draft-ietf-quic-http-06 . . . . . . . . . . . . . . 44 | |||
| A.10. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 42 | A.9. Since draft-ietf-quic-http-05 . . . . . . . . . . . . . . 44 | |||
| A.11. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 42 | A.10. Since draft-ietf-quic-http-04 . . . . . . . . . . . . . . 44 | |||
| A.12. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 42 | A.11. Since draft-ietf-quic-http-03 . . . . . . . . . . . . . . 44 | |||
| A.13. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 42 | A.12. Since draft-ietf-quic-http-02 . . . . . . . . . . . . . . 44 | |||
| A.14. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 43 | A.13. Since draft-ietf-quic-http-01 . . . . . . . . . . . . . . 44 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 43 | A.14. Since draft-ietf-quic-http-00 . . . . . . . . . . . . . . 45 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 43 | A.15. Since draft-shade-quic-http2-mapping-00 . . . . . . . . . 45 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 45 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 46 | ||||
| 1. Introduction | 1. Introduction | |||
| The QUIC transport protocol has several features that are desirable | The QUIC transport protocol has several features that are desirable | |||
| in a transport for HTTP, such as stream multiplexing, per-stream flow | in a transport for HTTP, such as stream multiplexing, per-stream flow | |||
| control, and low-latency connection establishment. This document | control, and low-latency connection establishment. This document | |||
| describes a mapping of HTTP semantics over QUIC, drawing heavily on | describes a mapping of HTTP semantics over QUIC, drawing heavily on | |||
| the existing TCP mapping, HTTP/2. Specifically, this document | the existing TCP mapping, HTTP/2. Specifically, this document | |||
| identifies HTTP/2 features that are subsumed by QUIC, and describes | identifies HTTP/2 features that are subsumed by QUIC, and describes | |||
| how the other features can be implemented atop QUIC. | how the other features can be implemented atop QUIC. | |||
| skipping to change at page 6, line 37 ¶ | skipping to change at page 6, line 41 ¶ | |||
| During connection establishment, HTTP/QUIC support is indicated by | During connection establishment, HTTP/QUIC support is indicated by | |||
| selecting the ALPN token "hq" in the TLS handshake. Support for | selecting the ALPN token "hq" in the TLS handshake. Support for | |||
| other application-layer protocols MAY be offered in the same | other application-layer protocols MAY be offered in the same | |||
| handshake. | handshake. | |||
| While connection-level options pertaining to the core QUIC protocol | While connection-level options pertaining to the core QUIC protocol | |||
| are set in the initial crypto handshake, HTTP/QUIC-specific settings | are set in the initial crypto handshake, HTTP/QUIC-specific settings | |||
| are conveyed in the SETTINGS frame. After the QUIC connection is | are conveyed in the SETTINGS frame. After the QUIC connection is | |||
| established, a SETTINGS frame (Section 4.2.6) MUST be sent by each | established, a SETTINGS frame (Section 4.2.6) MUST be sent by each | |||
| endpoint as the initial frame of their respective HTTP control stream | endpoint as the initial frame of their respective HTTP control stream | |||
| (see Section 3.3.1). The server MUST NOT send data on any other | (see Section 3.3.2). The server MUST NOT send data on any other | |||
| stream until the client's SETTINGS frame has been received. | stream until the client's SETTINGS frame has been received. | |||
| 2.4. Connection Reuse | 2.4. Connection Reuse | |||
| Once a connection exists to a server endpoint, this connection MAY be | Once a connection exists to a server endpoint, this connection MAY be | |||
| reused for requests with multiple different URI authority components. | reused for requests with multiple different URI authority components. | |||
| The client MAY send any requests for which the client considers the | The client MAY send any requests for which the client considers the | |||
| server authoritative. | server authoritative. | |||
| An authoritative HTTP/QUIC endpoint is typically discovered because | An authoritative HTTP/QUIC endpoint is typically discovered because | |||
| skipping to change at page 8, line 23 ¶ | skipping to change at page 8, line 25 ¶ | |||
| In addition, prior to sending the message header block indicated | In addition, prior to sending the message header block indicated | |||
| above, a response may contain zero or more header blocks containing | above, a response may contain zero or more header blocks containing | |||
| the message headers of informational (1xx) HTTP responses (see | the message headers of informational (1xx) HTTP responses (see | |||
| [RFC7230], Section 3.2 and [RFC7231], Section 6.2). | [RFC7230], Section 3.2 and [RFC7231], Section 6.2). | |||
| PUSH_PROMISE frames (see Section 4.2.7) MAY be interleaved with the | PUSH_PROMISE frames (see Section 4.2.7) MAY be interleaved with the | |||
| frames of a response message indicating a pushed resource related to | frames of a response message indicating a pushed resource related to | |||
| the response. These PUSH_PROMISE frames are not part of the | the response. These PUSH_PROMISE frames are not part of the | |||
| response, but carry the headers of a separate HTTP request message. | response, but carry the headers of a separate HTTP request message. | |||
| See Section 3.3.2 for more details. | See Section 3.3.3 for more details. | |||
| The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] | |||
| MUST NOT be used. | MUST NOT be used. | |||
| Trailing header fields are carried in an additional header block | Trailing header fields are carried in an additional header block | |||
| following the body. Senders MUST send only one header block in the | following the body. Senders MUST send only one header block in the | |||
| trailers section; receivers MUST discard any subsequent header | trailers section; receivers MUST discard any subsequent header | |||
| blocks. | blocks. | |||
| An HTTP request/response exchange fully consumes a QUIC stream. | An HTTP request/response exchange fully consumes a bidirectional QUIC | |||
| After sending a request, a client closes the stream for sending; | stream. After sending a request, a client closes the stream for | |||
| after sending a response, the server closes the stream for sending | sending; after sending a response, the server closes the stream for | |||
| and the QUIC stream is fully closed. | sending and the QUIC stream is fully closed. | |||
| A server can send a complete response prior to the client sending an | A server can send a complete response prior to the client sending an | |||
| entire request if the response does not depend on any portion of the | entire request if the response does not depend on any portion of the | |||
| request that has not been sent and received. When this is true, a | request that has not been sent and received. When this is true, a | |||
| server MAY request that the client abort transmission of a request | server MAY request that the client abort transmission of a request | |||
| without error by triggering a QUIC STOP_SENDING with error code | without error by triggering a QUIC STOP_SENDING with error code | |||
| HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing | HTTP_EARLY_RESPONSE, sending a complete response, and cleanly closing | |||
| its streams. Clients MUST NOT discard complete responses as a result | its streams. Clients MUST NOT discard complete responses as a result | |||
| of having their request terminated abruptly, though clients can | of having their request terminated abruptly, though clients can | |||
| always discard responses at their discretion for other reasons. | always discard responses at their discretion for other reasons. | |||
| Servers MUST NOT abort a response in progress as a result of | ||||
| receiving a solicited RST_STREAM. | ||||
| 3.1.1. Header Compression | Changes to the state of a request stream, including receiving a | |||
| RST_STREAM with any error code, do not affect the state of the | ||||
| server's response. Servers do not abort a response in progress | ||||
| solely due to a state change on the request stream. However, if the | ||||
| request stream terminates without containing a usable HTTP request, | ||||
| the server SHOULD abort its response with the error code | ||||
| HTTP_INCOMPLETE_REQUEST. | ||||
| 3.1.1. Header Formatting and Compression | ||||
| HTTP header fields carry information as a series of key-value pairs. | ||||
| For a listing of registered HTTP headers, see the "Message Header | ||||
| Field" registry maintained at https://www.iana.org/assignments/ | ||||
| message-headers [4]. | ||||
| Just as in previous versions of HTTP, header field names are strings | ||||
| of ASCII characters that are compared in a case-insensitive fashion. | ||||
| Properties of HTTP header names and values are discussed in more | ||||
| detail in Section 3.2 of [RFC7230], though the wire rendering in | ||||
| HTTP/QUIC differs. As in HTTP/2, header field names MUST be | ||||
| converted to lowercase prior to their encoding. A request or | ||||
| response containing uppercase header field names MUST be treated as | ||||
| malformed. | ||||
| As in HTTP/2, HTTP/QUIC uses special pseudo-header fields beginning | ||||
| with ':' character (ASCII 0x3a) to convey the target URI, the method | ||||
| of the request, and the status code for the response. These pseudo- | ||||
| header fields are defined in Section 8.1.2.3 and 8.1.2.4 of | ||||
| [RFC7540]. Pseudo-header fields are not HTTP header fields. | ||||
| Endpoints MUST NOT generate pseudo-header fields other than those | ||||
| defined in [RFC7540]. The restrictions on the use of pseudo-header | ||||
| fields in Section 8.1.2.1 of [RFC7540] also apply to HTTP/QUIC. | ||||
| HTTP/QUIC uses QPACK header compression as described in [QPACK], a | HTTP/QUIC uses QPACK header compression as described in [QPACK], a | |||
| variation of HPACK which allows the flexibility to avoid header- | variation of HPACK which allows the flexibility to avoid header- | |||
| compression-induced head-of-line blocking. See that document for | compression-induced head-of-line blocking. See that document for | |||
| additional details. | additional details. | |||
| 3.1.2. The CONNECT Method | 3.1.2. The CONNECT Method | |||
| The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily | The pseudo-method CONNECT ([RFC7231], Section 4.3.6) is primarily | |||
| used with HTTP proxies to establish a TLS session with an origin | used with HTTP proxies to establish a TLS session with an origin | |||
| skipping to change at page 10, line 11 ¶ | skipping to change at page 10, line 39 ¶ | |||
| A TCP connection error is signaled with RST_STREAM. A proxy treats | A TCP connection error is signaled with RST_STREAM. A proxy treats | |||
| any error in the TCP connection, which includes receiving a TCP | any error in the TCP connection, which includes receiving a TCP | |||
| segment with the RST bit set, as a stream error of type | segment with the RST bit set, as a stream error of type | |||
| HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send | HTTP_CONNECT_ERROR (Section 6.1). Correspondingly, a proxy MUST send | |||
| a TCP segment with the RST bit set if it detects an error with the | a TCP segment with the RST bit set if it detects an error with the | |||
| stream or the QUIC connection. | stream or the QUIC connection. | |||
| 3.1.3. Request Cancellation | 3.1.3. Request Cancellation | |||
| Either client or server can cancel requests by closing the stream | Either client or server can cancel requests by aborting the stream | |||
| (QUIC RST_STREAM or STOP_SENDING frames, as appropriate) with an | (QUIC RST_STREAM or STOP_SENDING frames, as appropriate) with an | |||
| error type of HTTP_REQUEST_CANCELLED (Section 6.1). When the client | error code of HTTP_REQUEST_CANCELLED (Section 6.1). When the client | |||
| cancels a request or response, it indicates that the response is no | cancels a response, it indicates that this response is no longer of | |||
| longer of interest. | interest. Clients SHOULD cancel requests by aborting both directions | |||
| of a stream. | ||||
| When the server cancels either direction of the request stream using | When the server cancels its response stream using | |||
| HTTP_REQUEST_CANCELLED, it indicates that no application processing | HTTP_REQUEST_CANCELLED, it indicates that no application processing | |||
| was performed. The client can treat requests cancelled by the server | was performed. The client can treat requests cancelled by the server | |||
| as though they had never been sent at all, thereby allowing them to | 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 | be retried later on a new connection. Servers MUST NOT use the | |||
| HTTP_REQUEST_CANCELLED status for requests which were partially or | HTTP_REQUEST_CANCELLED status for requests which were partially or | |||
| fully processed. | fully processed. | |||
| Note: In this context, "processed" means that some data from the | Note: In this context, "processed" means that some data from the | |||
| stream was passed to some higher layer of software that might have | stream was passed to some higher layer of software that might have | |||
| taken some action as a result. | taken some action as a result. | |||
| skipping to change at page 12, line 46 ¶ | skipping to change at page 13, line 31 ¶ | |||
| structure of data that follows this header is determined by the | structure of data that follows this header is determined by the | |||
| stream type. | stream type. | |||
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |Stream Type (8)| | |Stream Type (8)| | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| Figure 2: Unidirectional Stream Header | Figure 2: Unidirectional Stream Header | |||
| Two stream types are defined in this document: control streams | Some stream types are reserved (Section 3.3.1). Two stream types are | |||
| (Section 3.3.1) and push streams (Section 3.3.2). Other stream types | defined in this document: control streams (Section 3.3.2) and push | |||
| can be defined by extensions to HTTP/QUIC. | streams (Section 3.3.3). Other stream types can be defined by | |||
| extensions to HTTP/QUIC. | ||||
| If the stream header indicates a stream type which is not supported | If the stream header indicates a stream type which is not supported | |||
| by the recipient, this SHOULD be treated as a stream error of type | by the recipient, the remainder of the stream cannot be consumed as | |||
| HTTP_UNKNOWN_STREAM_TYPE. The semantics of the remainder of the | the semantics are unknown. Recipients of unknown stream types MAY | |||
| stream are unknown. Implementations SHOULD NOT send stream types the | trigger a QUIC STOP_SENDING frame with an error code of | |||
| peer is not already known to support, since a stream error can be | HTTP_UNKNOWN_STREAM_TYPE, but MUST NOT consider such streams to be an | |||
| promoted to a connection error at the peer's discretion (see | error of any kind. | |||
| Section 6). | ||||
| 3.3.1. Control Streams | Implementations MAY send stream types before knowing whether the peer | |||
| supports them. However, stream types which could modify the state or | ||||
| semantics of existing protocol components, including QPACK or other | ||||
| extensions, MUST NOT be sent until the peer is known to support them. | ||||
| 3.3.1. Reserved Stream Types | ||||
| Stream types of the format "0x1f * N" are reserved to exercise the | ||||
| requirement that unknown types be ignored. These streams have no | ||||
| semantic meaning, and can be sent when application-layer padding is | ||||
| desired. They MAY also be sent on connections where no request data | ||||
| is currently being transferred. Endpoints MUST NOT consider these | ||||
| streams to have any meaning upon receipt. | ||||
| The payload and length of the stream are selected in any manner the | ||||
| implementation chooses. | ||||
| 3.3.2. Control Streams | ||||
| The control stream is indicated by a stream type of "0x43" (ASCII | The control stream is indicated by a stream type of "0x43" (ASCII | |||
| 'C'). Data on this stream consists of HTTP frames, as defined in | 'C'). Data on this stream consists of HTTP/QUIC frames, as defined | |||
| Section 4.2. | in 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. Only one control stream per peer is permitted; receipt of a | stream. Only one control stream per peer is permitted; receipt of a | |||
| second stream which claims to be a control stream MUST be treated as | second stream which claims to be a control stream MUST be treated as | |||
| a connection error of type HTTP_WRONG_STREAM_COUNT. If the control | a connection error of type HTTP_WRONG_STREAM_COUNT. If the control | |||
| stream is closed at any point, this MUST be treated as a connection | stream is closed at any point, this MUST be treated as a connection | |||
| error of type HTTP_CLOSED_CRITICAL_STREAM. | 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.3.2. Server Push | 3.3.3. Server Push | |||
| HTTP/QUIC server push is similar to what is described in [RFC7540], | HTTP/QUIC server push is similar to what is described in HTTP/2 | |||
| but uses different mechanisms. During connection establishment, the | [RFC7540], but uses different mechanisms. | |||
| 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 | The PUSH_PROMISE frame (Section 4.2.7) is sent on the client- | |||
| MAX_PUSH_ID frame. Only servers can push; if a server receives a | initiated bidirectional stream that carried the request that | |||
| client-initiated push stream, this MUST be treated as a stream error | generated the push. This allows the server push to be associated | |||
| of type HTTP_WRONG_STREAM_DIRECTION. | with a request. Ordering of a PUSH_PROMISE in relation to certain | |||
| parts of the response is important (see Section 8.2.1 of [RFC7540]). | ||||
| The PUSH_PROMISE frame does not reference a stream; it contains a | ||||
| Push ID that uniquely identifies a server push. This allows a server | ||||
| to fulfill promises in the order that best suits its needs. The same | ||||
| Push ID can be used in multiple PUSH_PROMISE frames (see | ||||
| Section 4.2.7). When a server later fulfills a promise, the server | ||||
| push response is conveyed on a push stream. | ||||
| 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'), | |||
| followed by the Push ID of the promise that it fulfills, encoded as a | followed by the Push ID of the promise that it fulfills, encoded as a | |||
| variable-length integer. | variable-length integer. The remaining data on this stream consists | |||
| of HTTP/QUIC frames, as defined in Section 4.2, and carries the | ||||
| response side of an HTTP message exchange as described in | ||||
| Section 3.1. The request headers of the exchange are carried by a | ||||
| PUSH_PROMISE frame (see Section 4.2.7) on the request stream which | ||||
| generated the push. Promised requests MUST conform to the | ||||
| requirements in Section 8.2 of [RFC7540]. | ||||
| Only servers can push; if a server receives a client-initiated push | ||||
| stream, this MUST be treated as a stream error of type | ||||
| HTTP_WRONG_STREAM_DIRECTION. | ||||
| 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 Type (8)| Push ID (i) ... | |Stream Type (8)| Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: Push Stream Header | Figure 3: Push Stream Header | |||
| Unlike HTTP/2, the PUSH_PROMISE does not reference a stream; it | Server push is only enabled on a connection when a client sends a | |||
| contains a Push ID. The Push ID uniquely identifies a server push. | MAX_PUSH_ID frame (see Section 4.2.9). A server cannot use server | |||
| This allows a server to fulfill promises in the order that best suits | push until it receives a MAX_PUSH_ID frame. A client sends | |||
| its needs. When a server later fulfills a promise, the server push | additional MAX_PUSH_ID frames to control the number of pushes that a | |||
| response is conveyed on a push stream. | server can promise. A server SHOULD use Push IDs sequentially, | |||
| starting at 0. A client MUST treat receipt of a push stream with a | ||||
| A server SHOULD use Push IDs sequentially, starting at 0. A client | Push ID that is greater than the maximum Push ID as a connection | |||
| uses the MAX_PUSH_ID frame (Section 4.2.9) to limit the number of | error of type HTTP_PUSH_LIMIT_EXCEEDED. | |||
| pushes that a server can promise. A client MUST treat receipt of a | ||||
| push stream with a Push ID that is greater than the maximum Push ID | ||||
| as a connection error of type HTTP_PUSH_LIMIT_EXCEEDED. | ||||
| The remaining data on this stream consists of HTTP frames, as defined | ||||
| in Section 4.2, and carries the response side of an HTTP message | ||||
| exchange as described in Section 3.1. The request headers of the | ||||
| exchange are carried by a PUSH_PROMISE frame (see Section 4.2.7) on | ||||
| the request stream which generated the push. Promised requests MUST | ||||
| conform to the requirements in Section 8.2 of [RFC7540]. | ||||
| The PUSH_PROMISE frame is sent on the client-initiated bidirectional | Each Push ID MUST only be used once in a push stream header. If a | |||
| stream that carried the request that generated the push. This allows | push stream header includes a Push ID that was used in another push | |||
| the server push to be associated with a request. Ordering of a | stream header, the client MUST treat this as a connection error of | |||
| PUSH_PROMISE in relation to certain parts of the response is | type HTTP_DUPLICATE_PUSH. | |||
| important (see Section 8.2.1 of [RFC7540]). | ||||
| If a promised server push is not needed by the client, the client | If a promised server push is not needed by the client, the client | |||
| SHOULD send a CANCEL_PUSH frame; if the push stream is already open, | SHOULD send a CANCEL_PUSH frame. If the push stream is already open, | |||
| a QUIC STOP_SENDING frame with an appropriate error code can be used | a QUIC STOP_SENDING frame with an appropriate error code can be used | |||
| instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | instead (e.g., HTTP_PUSH_REFUSED, HTTP_PUSH_ALREADY_IN_CACHE; see | |||
| Section 6). This asks the server not to transfer the data and | Section 6). This asks the server not to transfer the data and | |||
| indicates that it will be discarded upon receipt. | indicates that it will be discarded upon receipt. | |||
| Push streams always begin with a header containing the Push ID. Each | ||||
| Push ID MUST only be used once in a push stream header. If a push | ||||
| stream header includes a Push ID that was used in another push stream | ||||
| header, the client MUST treat this as a connection error of type | ||||
| HTTP_DUPLICATE_PUSH. The same Push ID can be used in multiple | ||||
| PUSH_PROMISE frames (see Section 4.2.7). | ||||
| After the header, a push stream contains a response (Section 3.1), | ||||
| with response headers, a response body (if any) carried by DATA | ||||
| frames, then trailers (if any) carried by HEADERS frames. | ||||
| 4. HTTP Framing Layer | 4. HTTP Framing Layer | |||
| Frames are used on the control stream, request streams, and push | Frames are used on the control stream, request streams, and push | |||
| streams. This section describes HTTP framing in QUIC and highlights | streams. This section describes HTTP framing in QUIC and highlights | |||
| some differences from HTTP/2 framing. For more detail on differences | some differences from HTTP/2 framing. For more detail on differences | |||
| from HTTP/2, see Section 7.2. | from HTTP/2, see Section 8.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 21, line 37 ¶ | skipping to change at page 22, line 37 ¶ | |||
| can be any value the implementation selects. | can be any value the implementation selects. | |||
| Additional settings MAY be defined by extensions to HTTP/QUIC. | Additional settings MAY be defined by extensions to HTTP/QUIC. | |||
| 4.2.6.3. Initial SETTINGS Values | 4.2.6.3. Initial SETTINGS Values | |||
| When a 0-RTT QUIC connection is being used, the client's initial | When a 0-RTT QUIC connection is being used, the client's initial | |||
| requests will be sent before the arrival of the server's SETTINGS | requests will be sent before the arrival of the server's SETTINGS | |||
| frame. Clients MUST store the settings the server provided in the | frame. Clients MUST store the settings the server provided in the | |||
| session being resumed and MUST comply with stored settings until the | session being resumed and MUST comply with stored settings until the | |||
| server's current settings are received. | server's current settings are received. Remembered settings apply to | |||
| the new connection until the server's SETTINGS frame is received. | ||||
| Servers MAY continue processing data from clients which exceed its | A server can remember the settings that it advertised, or store an | |||
| current configuration during the initial flight. In this case, the | integrity-protected copy of the values in the ticket and recover the | |||
| client MUST apply the new settings immediately upon receipt. | information when accepting 0-RTT data. A server uses the HTTP/QUIC | |||
| settings values in determining whether to accept 0-RTT data. | ||||
| 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 | ||||
| SETTINGS frame MUST NOT reduce any limits or alter any values that | ||||
| might be violated by the client with its 0-RTT data. | ||||
| 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.7. PUSH_PROMISE | 4.2.7. PUSH_PROMISE | |||
| The PUSH_PROMISE frame (type=0x05) is used to carry a request header | The PUSH_PROMISE frame (type=0x05) is used to carry a request header | |||
| set from server to client, as in HTTP/2. | set from server to client, as in HTTP/2. | |||
| skipping to change at page 22, line 18 ¶ | skipping to change at page 23, line 23 ¶ | |||
| | Push ID (i) ... | | Push ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Header Block (*) ... | | Header Block (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 10: PUSH_PROMISE frame payload | Figure 10: PUSH_PROMISE frame payload | |||
| The payload consists of: | The payload consists of: | |||
| Push ID: A variable-length integer that identifies the server push | Push ID: A variable-length integer that identifies the server push | |||
| request. A push ID is used in push stream header (Section 3.3.2), | request. A push ID is used in push stream header (Section 3.3.3), | |||
| CANCEL_PUSH frames (Section 4.2.5), and PRIORITY frames | CANCEL_PUSH frames (Section 4.2.5), and PRIORITY frames | |||
| (Section 4.2.4). | (Section 4.2.4). | |||
| Header Block: QPACK-compressed request headers for the promised | Header Block: QPACK-compressed request headers for the promised | |||
| response. See [QPACK] for more details. | response. See [QPACK] for more details. | |||
| A server MUST NOT use a Push ID that is larger than the client has | A server MUST NOT use a Push ID that is larger than the client has | |||
| provided in a MAX_PUSH_ID frame (Section 4.2.9). A client MUST treat | provided in a MAX_PUSH_ID frame (Section 4.2.9). A client MUST treat | |||
| receipt of a PUSH_PROMISE that contains a larger Push ID than the | receipt of a PUSH_PROMISE that contains a larger Push ID than the | |||
| client has advertised as a connection error of type | client has advertised as a connection error of type | |||
| skipping to change at page 24, line 26 ¶ | skipping to change at page 25, line 29 ¶ | |||
| Servers SHOULD send a GOAWAY frame when the closing of a connection | Servers SHOULD send a GOAWAY frame when the closing of a connection | |||
| is known in advance, even if the advance notice is small, so that the | is known in advance, even if the advance notice is small, so that the | |||
| remote peer can know whether a stream has been partially processed or | remote peer can know whether a stream has been partially processed or | |||
| not. For example, if an HTTP client sends a POST at the same time | not. For example, if an HTTP client sends a POST at the same time | |||
| that a server closes a QUIC connection, the client cannot know if the | that a server closes a QUIC connection, the client cannot know if the | |||
| server started to process that POST request if the server does not | server started to process that POST request if the server does not | |||
| send a GOAWAY frame to indicate what streams it might have acted on. | send a GOAWAY frame to indicate what streams it might have acted on. | |||
| For unexpected closures caused by error conditions, a QUIC | For unexpected closures caused by error conditions, a QUIC | |||
| CONNECTION_CLOSE or APPLICATION_CLOSE frame MUST be used. However, a | APPLICATION_CLOSE frame MUST be used. However, a GOAWAY MAY be sent | |||
| GOAWAY MAY be sent first to provide additional detail to clients and | first to provide additional detail to clients and to allow the client | |||
| to allow the client to retry requests. Including the GOAWAY frame in | to retry requests. Including the GOAWAY frame in the same packet as | |||
| the same packet as the QUIC CONNECTION_CLOSE or APPLICATION_CLOSE | the QUIC APPLICATION_CLOSE frame improves the chances of the frame | |||
| frame improves the chances of the frame being received by clients. | being received by clients. | |||
| If a connection terminates without a GOAWAY frame, the last Stream ID | If a connection terminates without a GOAWAY frame, the last Stream ID | |||
| is effectively the highest possible Stream ID (as determined by | is effectively the highest possible Stream ID (as determined by | |||
| QUIC's MAX_STREAM_ID). | QUIC's MAX_STREAM_ID). | |||
| An endpoint MAY send multiple GOAWAY frames if circumstances change. | An endpoint MAY send multiple GOAWAY frames if circumstances change. | |||
| For instance, an endpoint that sends GOAWAY without an error code | For instance, an endpoint that sends GOAWAY without an error code | |||
| during graceful shutdown could subsequently encounter an error | during graceful shutdown could subsequently encounter an error | |||
| condition. The last stream identifier from the last GOAWAY frame | condition. The last stream identifier from the last GOAWAY frame | |||
| received indicates which streams could have been acted upon. A | received indicates which streams could have been acted upon. A | |||
| skipping to change at page 26, line 40 ¶ | skipping to change at page 27, line 45 ¶ | |||
| streams or the entire connection when an error is encountered. These | streams or the entire connection when an error is encountered. These | |||
| are referred to as "stream errors" or "connection errors" and are | are referred to as "stream errors" or "connection errors" and are | |||
| described in more detail in [QUIC-TRANSPORT]. | described in more detail in [QUIC-TRANSPORT]. | |||
| This section describes HTTP/QUIC-specific error codes which can be | This section describes HTTP/QUIC-specific error codes which can be | |||
| used to express the cause of a connection or stream error. | used to express the cause of a connection or stream error. | |||
| 6.1. HTTP/QUIC Error Codes | 6.1. HTTP/QUIC Error Codes | |||
| The following error codes are defined for use in QUIC RST_STREAM, | The following error codes are defined for use in QUIC RST_STREAM, | |||
| STOP_SENDING, and CONNECTION_CLOSE frames when using HTTP/QUIC. | STOP_SENDING, and APPLICATION_CLOSE frames when using HTTP/QUIC. | |||
| STOPPING (0x00): This value is reserved by the transport to be used | STOPPING (0x00): This value is reserved by the transport to be used | |||
| in response to QUIC STOP_SENDING frames. | in response to QUIC STOP_SENDING frames. | |||
| HTTP_NO_ERROR (0x01): No error. This is used when the connection or | HTTP_NO_ERROR (0x01): No error. This is used when the connection or | |||
| stream needs to be closed, but there is no error to signal. | stream needs to be closed, but there is no error to signal. | |||
| HTTP_PUSH_REFUSED (0x02): The server has attempted to push content | HTTP_PUSH_REFUSED (0x02): The server has attempted to push content | |||
| which the client will not accept on this connection. | which the client will not accept on this connection. | |||
| HTTP_INTERNAL_ERROR (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_QPACK_DECOMPRESSION_FAILED (0x06): QPACK failed to decompress a | HTTP_INCOMPLETE_REQUEST (0x06): The client's stream terminated | |||
| frame and cannot continue. | without containing a fully-formed request. | |||
| 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 27, line 47 ¶ | skipping to change at page 28, line 50 ¶ | |||
| 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. | |||
| HTTP_CLOSED_CRITICAL_STREAM (0x0F): A stream required by the | HTTP_CLOSED_CRITICAL_STREAM (0x0F): A stream required by the | |||
| connection was closed or reset. | connection was closed or reset. | |||
| HTTP_WRONG_STREAM_DIRECTION (0x0010): A unidirectional stream type | HTTP_WRONG_STREAM_DIRECTION (0x0010): A unidirectional stream type | |||
| was used by a peer which is not permitted to do so. | was used by a peer which is not permitted to do so. | |||
| HTTP_EARLY_RESPONSE (0x0011): The remainder of the client's request | ||||
| is not needed to produce a response. For use in STOP_SENDING | ||||
| only. | ||||
| 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 octet of the error code. | The frame type is included as the last octet of the error code. | |||
| For example, an error in a MAX_PUSH_ID frame would be indicated | For example, an error in a MAX_PUSH_ID frame would be indicated | |||
| with the code (0x10D). | with the code (0x10D). | |||
| 7. Considerations for Transitioning from HTTP/2 | 7. Extensions to HTTP/QUIC | |||
| HTTP/QUIC permits extension of the protocol. Within the limitations | ||||
| described in this section, protocol extensions can be used to provide | ||||
| additional services or alter any aspect of the protocol. Extensions | ||||
| are effective only within the scope of a single HTTP/QUIC connection. | ||||
| This applies to the protocol elements defined in this document. This | ||||
| does not affect the existing options for extending HTTP, such as | ||||
| defining new methods, status codes, or header fields. | ||||
| Extensions are permitted to use new frame types (Section 4.2), new | ||||
| settings (Section 4.2.6.2), new error codes (Section 6), or new | ||||
| unidirectional stream types (Section 3.3). Registries are | ||||
| established for managing these extension points: frame types | ||||
| (Section 10.3), settings (Section 10.4), error codes (Section 10.5), | ||||
| and stream types (Section 10.6). | ||||
| Implementations MUST ignore unknown or unsupported values in all | ||||
| extensible protocol elements. Implementations MUST discard frames | ||||
| and unidirectional streams that have unknown or unsupported types. | ||||
| This means that any of these extension points can be safely used by | ||||
| extensions without prior arrangement or negotiation. | ||||
| Extensions that could change the semantics of existing protocol | ||||
| components MUST be negotiated before being used. For example, an | ||||
| extension that changes the layout of the HEADERS frame cannot be used | ||||
| until the peer has given a positive signal that this is acceptable. | ||||
| In this case, it could also be necessary to coordinate when the | ||||
| revised layout comes into effect. | ||||
| This document doesn't mandate a specific method for negotiating the | ||||
| use of an extension but notes that a setting (Section 4.2.6.2) could | ||||
| be used for that purpose. If both peers set a value that indicates | ||||
| willingness to use the extension, then the extension can be used. If | ||||
| a setting is used for extension negotiation, the default value MUST | ||||
| be defined in such a fashion that the extension is disabled if the | ||||
| setting is omitted. | ||||
| 8. Considerations for Transitioning from HTTP/2 | ||||
| HTTP/QUIC is strongly informed by HTTP/2, and bears many | HTTP/QUIC is strongly informed by HTTP/2, and bears many | |||
| similarities. This section describes the approach taken to design | similarities. This section describes the approach taken to design | |||
| HTTP/QUIC, points out important differences from HTTP/2, and | HTTP/QUIC, points out important differences from HTTP/2, and | |||
| describes how to map HTTP/2 extensions into HTTP/QUIC. | describes how to map HTTP/2 extensions into HTTP/QUIC. | |||
| HTTP/QUIC begins from the premise that HTTP/2 code reuse is a useful | HTTP/QUIC begins from the premise that HTTP/2 code reuse is a useful | |||
| feature, but not a hard requirement. HTTP/QUIC departs from HTTP/2 | feature, but not a hard requirement. HTTP/QUIC departs from HTTP/2 | |||
| primarily where necessary to accommodate the differences in behavior | primarily where necessary to accommodate the differences in behavior | |||
| between QUIC and TCP (lack of ordering, support for streams). We | between QUIC and TCP (lack of ordering, support for streams). We | |||
| intend to avoid gratuitous changes which make it difficult or | intend to avoid gratuitous changes which make it difficult or | |||
| impossible to build extensions with the same semantics applicable to | impossible to build extensions with the same semantics applicable to | |||
| both protocols at once. | both protocols at once. | |||
| These departures are noted in this section. | These departures are noted in this section. | |||
| 7.1. Streams | 8.1. Streams | |||
| HTTP/QUIC permits use of a larger number of streams (2^62-1) than | HTTP/QUIC 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. | |||
| 7.2. HTTP Frame Types | 8.2. HTTP Frame Types | |||
| Many framing concepts from HTTP/2 can be elided away on QUIC, because | Many framing concepts from HTTP/2 can be elided away on QUIC, because | |||
| the transport deals with them. Because frames are already on a | the transport deals with them. Because frames are already on a | |||
| stream, they can omit the stream number. Because frames do not block | stream, they can omit the stream number. Because frames do not block | |||
| multiplexing (QUIC's multiplexing occurs below this layer), the | multiplexing (QUIC's multiplexing occurs below this layer), the | |||
| support for variable-maximum-length packets can be removed. Because | support for variable-maximum-length packets can be removed. Because | |||
| stream termination is handled by QUIC, an END_STREAM flag is not | stream termination is handled by QUIC, an END_STREAM flag is not | |||
| required. 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. | |||
| skipping to change at page 30, line 18 ¶ | skipping to change at page 32, line 14 ¶ | |||
| PRIORITY (0x2): As described above, the PRIORITY frame is sent on | PRIORITY (0x2): As described above, the PRIORITY frame is sent on | |||
| the control stream and can reference either a Stream ID or a Push | the control stream and can reference either a Stream ID or a Push | |||
| ID. See Section 4.2.4. | ID. See Section 4.2.4. | |||
| RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC | RST_STREAM (0x3): RST_STREAM frames do not exist, since QUIC | |||
| provides stream lifecycle management. The same code point is used | provides stream lifecycle management. The same code point is used | |||
| for the CANCEL_PUSH frame (Section 4.2.5). | for the CANCEL_PUSH frame (Section 4.2.5). | |||
| SETTINGS (0x4): SETTINGS frames are sent only at the beginning of | SETTINGS (0x4): SETTINGS frames are sent only at the beginning of | |||
| the connection. See Section 4.2.6 and Section 7.3. | the connection. See Section 4.2.6 and Section 8.3. | |||
| PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; | PUSH_PROMISE (0x5): The PUSH_PROMISE does not reference a stream; | |||
| instead the push stream references the PUSH_PROMISE frame using a | instead the push stream references the PUSH_PROMISE frame using a | |||
| Push ID. See Section 4.2.7. | Push ID. See Section 4.2.7. | |||
| PING (0x6): PING frames do not exist, since QUIC provides equivalent | PING (0x6): PING frames do not exist, since QUIC provides equivalent | |||
| functionality. | functionality. | |||
| GOAWAY (0x7): GOAWAY is sent only from server to client and does not | GOAWAY (0x7): GOAWAY is sent only from server to client and does not | |||
| contain an error code. See Section 4.2.8. | contain an error code. See Section 4.2.8. | |||
| skipping to change at page 30, line 40 ¶ | skipping to change at page 32, line 36 ¶ | |||
| WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | WINDOW_UPDATE (0x8): WINDOW_UPDATE frames do not exist, since QUIC | |||
| provides flow control. | provides flow control. | |||
| CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | CONTINUATION (0x9): CONTINUATION frames do not exist; instead, | |||
| larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and | larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted, and | |||
| HEADERS frames can be used in series. | HEADERS frames can be used in series. | |||
| Frame types defined by extensions to HTTP/2 need to be separately | Frame types defined by extensions to HTTP/2 need to be separately | |||
| registered for HTTP/QUIC if still applicable. The IDs of frames | registered for HTTP/QUIC if still applicable. The IDs of frames | |||
| defined in [RFC7540] have been reserved for simplicity. See | defined in [RFC7540] have been reserved for simplicity. See | |||
| Section 9.3. | Section 10.3. | |||
| 7.3. HTTP/2 SETTINGS Parameters | 8.3. HTTP/2 SETTINGS Parameters | |||
| An important difference from HTTP/2 is that settings are sent once, | An important difference from HTTP/2 is that settings are sent once, | |||
| at the beginning of the connection, and thereafter cannot change. | at the beginning of the connection, and thereafter cannot change. | |||
| This eliminates many corner cases around synchronization of changes. | This eliminates many corner cases around synchronization of changes. | |||
| Some transport-level options that HTTP/2 specifies via the SETTINGS | Some transport-level options that HTTP/2 specifies via the SETTINGS | |||
| frame are superseded by QUIC transport parameters in HTTP/QUIC. The | frame are superseded by QUIC transport parameters in HTTP/QUIC. The | |||
| HTTP-level options that are retained in HTTP/QUIC have the same value | HTTP-level options that are retained in HTTP/QUIC have the same value | |||
| as in HTTP/2. | as in HTTP/2. | |||
| skipping to change at page 31, line 28 ¶ | skipping to change at page 33, line 24 ¶ | |||
| initial transport handshake. Specifying | initial transport handshake. Specifying | |||
| SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. | SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame is an error. | |||
| SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/ | SETTINGS_MAX_FRAME_SIZE: This setting has no equivalent in HTTP/ | |||
| QUIC. Specifying it in the SETTINGS frame is an error. | QUIC. Specifying it in the SETTINGS frame is an error. | |||
| SETTINGS_MAX_HEADER_LIST_SIZE: See Section 4.2.6.2. | SETTINGS_MAX_HEADER_LIST_SIZE: See Section 4.2.6.2. | |||
| Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The | Settings need to be defined separately for HTTP/2 and HTTP/QUIC. The | |||
| IDs of settings defined in [RFC7540] have been reserved for | IDs of settings defined in [RFC7540] have been reserved for | |||
| simplicity. See Section 9.4. | simplicity. See Section 10.4. | |||
| 7.4. HTTP/2 Error Codes | 8.4. HTTP/2 Error Codes | |||
| QUIC has the same concepts of "stream" and "connection" errors that | QUIC has the same concepts of "stream" and "connection" errors that | |||
| HTTP/2 provides. However, because the error code space is shared | HTTP/2 provides. However, because the error code space is shared | |||
| between multiple components, there is no direct portability of HTTP/2 | between multiple components, there is no direct portability of HTTP/2 | |||
| error codes. | error codes. | |||
| The HTTP/2 error codes defined in Section 7 of [RFC7540] map to the | The HTTP/2 error codes defined in Section 7 of [RFC7540] map to the | |||
| HTTP over QUIC error codes as follows: | HTTP over QUIC error codes as follows: | |||
| NO_ERROR (0x0): HTTP_NO_ERROR in Section 6.1. | NO_ERROR (0x0): HTTP_NO_ERROR in Section 6.1. | |||
| skipping to change at page 32, line 18 ¶ | skipping to change at page 34, line 14 ¶ | |||
| 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_QPACK_DECOMPRESSION_FAILED in [QPACK]. | |||
| Section 6.1. | ||||
| CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 6.1. | CONNECT_ERROR (0xa): HTTP_CONNECT_ERROR in Section 6.1. | |||
| ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 6.1. | ENHANCE_YOUR_CALM (0xb): HTTP_EXCESSIVE_LOAD in Section 6.1. | |||
| INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to | INADEQUATE_SECURITY (0xc): Not applicable, since QUIC is assumed to | |||
| provide sufficient security on all connections. | provide sufficient security on all connections. | |||
| HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 6.1. | HTTP_1_1_REQUIRED (0xd): HTTP_VERSION_FALLBACK in Section 6.1. | |||
| Error codes need to be defined for HTTP/2 and HTTP/QUIC separately. | Error codes need to be defined for HTTP/2 and HTTP/QUIC separately. | |||
| See Section 9.5. | See Section 10.5. | |||
| 8. Security Considerations | 9. Security Considerations | |||
| The security considerations of HTTP over QUIC should be comparable to | The security considerations of HTTP over QUIC should be comparable to | |||
| those of HTTP/2 with TLS. | those of HTTP/2 with TLS. Note that where HTTP/2 employs PADDING | |||
| frames to make a connection more resistant to traffic analysis, HTTP/ | ||||
| QUIC can rely on QUIC's own PADDING frames or employ the reserved | ||||
| frame and stream types discussed in Section 4.2.1 and Section 3.3.1. | ||||
| 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 incautious implementer. A SETTINGS | |||
| frame parser MUST ensure that the length of the frame exactly matches | frame parser MUST ensure that the length of the frame exactly matches | |||
| the length of the settings it contains. | the length of the settings it contains. | |||
| 9. IANA Considerations | 10. IANA Considerations | |||
| 9.1. Registration of HTTP/QUIC Identification String | 10.1. Registration of HTTP/QUIC Identification String | |||
| This document creates a new registration for the identification of | This document creates a new registration for the identification of | |||
| HTTP/QUIC in the "Application Layer Protocol Negotiation (ALPN) | HTTP/QUIC in the "Application Layer Protocol Negotiation (ALPN) | |||
| Protocol IDs" registry established in [RFC7301]. | Protocol IDs" registry established in [RFC7301]. | |||
| The "hq" string identifies HTTP/QUIC: | The "hq" string identifies HTTP/QUIC: | |||
| Protocol: HTTP over QUIC | Protocol: HTTP over QUIC | |||
| Identification Sequence: 0x68 0x71 ("hq") | Identification Sequence: 0x68 0x71 ("hq") | |||
| Specification: This document | Specification: This document | |||
| 9.2. Registration of QUIC Version Hint Alt-Svc Parameter | 10.2. Registration of QUIC Version Hint Alt-Svc Parameter | |||
| This document creates a new registration for version-negotiation | This document creates a new registration for version-negotiation | |||
| hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" | hints in the "Hypertext Transfer Protocol (HTTP) Alt-Svc Parameter" | |||
| registry established in [RFC7838]. | registry established in [RFC7838]. | |||
| Parameter: "quic" | Parameter: "quic" | |||
| Specification: This document, Section 2.2.1 | Specification: This document, Section 2.2.1 | |||
| 9.3. Frame Types | 10.3. Frame Types | |||
| This document establishes a registry for HTTP/QUIC frame type codes. | This document establishes a registry for HTTP/QUIC frame type codes. | |||
| The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The | The "HTTP/QUIC Frame Type" registry manages an 8-bit space. The | |||
| "HTTP/QUIC Frame Type" registry operates under either of the "IETF | "HTTP/QUIC Frame Type" registry operates under either of the "IETF | |||
| Review" or "IESG Approval" policies [RFC8126] for values from 0x00 up | Review" or "IESG Approval" policies [RFC8126] for values from 0x00 up | |||
| to and including 0xef, with values from 0xf0 up to and including 0xff | to and including 0xef, with values from 0xf0 up to and including 0xff | |||
| being reserved for Experimental Use. | being reserved for Experimental Use. | |||
| While this registry is separate from the "HTTP/2 Frame Type" registry | While this registry is separate from the "HTTP/2 Frame Type" registry | |||
| defined in [RFC7540], it is preferable that the assignments parallel | defined in [RFC7540], it is preferable that the assignments parallel | |||
| skipping to change at page 34, line 32 ¶ | skipping to change at page 36, line 32 ¶ | |||
| | GOAWAY | 0x7 | Section 4.2.8 | | | GOAWAY | 0x7 | Section 4.2.8 | | |||
| | | | | | | | | | | |||
| | Reserved | 0x8 | N/A | | | Reserved | 0x8 | N/A | | |||
| | | | | | | | | | | |||
| | Reserved | 0x9 | N/A | | | Reserved | 0x9 | N/A | | |||
| | | | | | | | | | | |||
| | MAX_PUSH_ID | 0xD | Section 4.2.9 | | | MAX_PUSH_ID | 0xD | Section 4.2.9 | | |||
| +--------------+------+---------------+ | +--------------+------+---------------+ | |||
| Additionally, each code of the format "0xb + (0x1f * N)" for values | Additionally, each code of the format "0xb + (0x1f * N)" for values | |||
| of N in the range (0..7) (that is, "0xb", "0x2a", etc., through | of N in the range (0..7) (that is, "0xb", "0x2a", "0x49", "0x68", | |||
| "0xe4"), the following values should be registered: | "0x87", "0xa6", "0xc5", and "0xe4"), the following values should be | |||
| registered: | ||||
| Frame Type: Reserved - GREASE | Frame Type: Reserved - GREASE | |||
| Specification: Section 4.2.1 | Specification: Section 4.2.1 | |||
| 9.4. Settings Parameters | 10.4. Settings Parameters | |||
| This document establishes a registry for HTTP/QUIC settings. The | This document establishes a registry for HTTP/QUIC settings. The | |||
| "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | "HTTP/QUIC Settings" registry manages a 16-bit space. The "HTTP/QUIC | |||
| Settings" registry operates under the "Expert Review" policy | Settings" registry operates under the "Expert Review" policy | |||
| [RFC8126] for values in the range from 0x0000 to 0xefff, with values | [RFC8126] for values in the range from 0x0000 to 0xefff, with values | |||
| between and 0xf000 and 0xffff being reserved for Experimental Use. | between and 0xf000 and 0xffff being reserved for Experimental Use. | |||
| The designated experts are the same as those for the "HTTP/2 | The designated experts are the same as those for the "HTTP/2 | |||
| Settings" registry defined in [RFC7540]. | Settings" registry defined in [RFC7540]. | |||
| While this registry is separate from the "HTTP/2 Settings" registry | While this registry is separate from the "HTTP/2 Settings" registry | |||
| skipping to change at page 35, line 41 ¶ | skipping to change at page 37, line 41 ¶ | |||
| +----------------------+------+-----------------+ | +----------------------+------+-----------------+ | |||
| Additionally, each code of the format "0x?a?a" where each "?" is any | Additionally, each code of the format "0x?a?a" where each "?" is any | |||
| four bits (that is, "0x0a0a", "0x0a1a", etc. through "0xfafa"), the | four bits (that is, "0x0a0a", "0x0a1a", etc. through "0xfafa"), the | |||
| following values should be registered: | following values should be registered: | |||
| Name: Reserved - GREASE | Name: Reserved - GREASE | |||
| Specification: Section 4.2.6.2 | Specification: Section 4.2.6.2 | |||
| 9.5. Error Codes | 10.5. Error Codes | |||
| This document establishes a registry for HTTP/QUIC error codes. The | This document establishes a registry for HTTP/QUIC error codes. The | |||
| "HTTP/QUIC Error Code" registry manages a 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 | |||
| registrations for possible duplication with existing error codes. | registrations for possible duplication with existing error codes. | |||
| Use of existing registrations is to be encouraged, but not mandated. | Use of existing registrations is to be encouraged, but not mandated. | |||
| skipping to change at page 36, line 20 ¶ | skipping to change at page 38, line 20 ¶ | |||
| Code: The 16-bit error code value. | Code: The 16-bit error code value. | |||
| Description: A brief description of the error code semantics, longer | Description: A brief description of the error code semantics, longer | |||
| if no detailed specification is provided. | if no detailed specification is provided. | |||
| Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
| defines the error code. | defines the error code. | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +---------------------------+-------+--------------+----------------+ | +-------------------------+-------+---------------+-----------------+ | |||
| | Name | Code | Description | Specification | | | Name | Code | Description | Specification | | |||
| +---------------------------+-------+--------------+----------------+ | +-------------------------+-------+---------------+-----------------+ | |||
| | STOPPING | 0x000 | Reserved by | [QUIC-TRANSPOR | | | STOPPING | 0x000 | Reserved by | [QUIC-TRANSPORT | | |||
| | | 0 | QUIC | T] | | | | 0 | QUIC | ] | | |||
| | | | | | | | | | | | | |||
| | HTTP_NO_ERROR | 0x000 | No error | Section 6.1 | | | HTTP_NO_ERROR | 0x000 | No error | Section 6.1 | | |||
| | | 1 | | | | | | 1 | | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_REFUSED | 0x000 | Client | Section 6.1 | | | HTTP_PUSH_REFUSED | 0x000 | Client | Section 6.1 | | |||
| | | 2 | refused | | | | | 2 | refused | | | |||
| | | | pushed | | | | | | pushed | | | |||
| | | | content | | | | | | content | | | |||
| | | | | | | | | | | | | |||
| | HTTP_INTERNAL_ERROR | 0x000 | Internal | Section 6.1 | | | HTTP_INTERNAL_ERROR | 0x000 | Internal | Section 6.1 | | |||
| | | 3 | error | | | | | 3 | error | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_ALREADY_IN_CACH | 0x000 | Pushed | Section 6.1 | | | HTTP_PUSH_ALREADY_IN_CA | 0x000 | Pushed | Section 6.1 | | |||
| | E | 4 | content | | | | CHE | 4 | content | | | |||
| | | | already | | | | | | already | | | |||
| | | | cached | | | | | | cached | | | |||
| | | | | | | | | | | | | |||
| | HTTP_REQUEST_CANCELLED | 0x000 | Data no | Section 6.1 | | | HTTP_REQUEST_CANCELLED | 0x000 | Data no | Section 6.1 | | |||
| | | 5 | longer | | | | | 5 | longer needed | | | |||
| | | | needed | | | | | | | | | |||
| | | | | | | | HTTP_INCOMPLETE_REQUEST | 0x000 | Stream | Section 6.1 | | |||
| | HTTP_HPACK_DECOMPRESSION_ | 0x000 | HPACK cannot | Section 6.1 | | | | 6 | terminated | | | |||
| | FAILED | 6 | continue | | | | | | early | | | |||
| | | | | | | | | | | | | |||
| | HTTP_CONNECT_ERROR | 0x000 | TCP reset or | Section 6.1 | | | HTTP_CONNECT_ERROR | 0x000 | TCP reset or | Section 6.1 | | |||
| | | 7 | error on | | | | | 7 | error on | | | |||
| | | | CONNECT | | | | | | CONNECT | | | |||
| | | | request | | | | | | request | | | |||
| | | | | | | | | | | | | |||
| | HTTP_EXCESSIVE_LOAD | 0x000 | Peer | Section 6.1 | | | HTTP_EXCESSIVE_LOAD | 0x000 | Peer | Section 6.1 | | |||
| | | 8 | generating | | | | | 8 | generating | | | |||
| | | | excessive | | | | | | excessive | | | |||
| | | | load | | | | | | load | | | |||
| | | | | | | | | | | | | |||
| | HTTP_VERSION_FALLBACK | 0x000 | Retry over | Section 6.1 | | | HTTP_VERSION_FALLBACK | 0x000 | Retry over | Section 6.1 | | |||
| | | 9 | HTTP/2 | | | | | 9 | HTTP/2 | | | |||
| | | | | | | | | | | | | |||
| | HTTP_WRONG_STREAM | 0x000 | A frame was | Section 6.1 | | | HTTP_WRONG_STREAM | 0x000 | A frame was | Section 6.1 | | |||
| | | A | sent on the | | | | | A | sent on the | | | |||
| | | | wrong stream | | | | | | wrong stream | | | |||
| | | | | | | | | | | | | |||
| | HTTP_PUSH_LIMIT_EXCEEDED | 0x000 | Maximum Push | Section 6.1 | | | HTTP_PUSH_LIMIT_EXCEEDE | 0x000 | Maximum Push | Section 6.1 | | |||
| | | B | ID exceeded | | | | D | B | ID exceeded | | | |||
| | | | | | | | | | | | | |||
| | HTTP_DUPLICATE_PUSH | 0x000 | Push ID was | Section 6.1 | | | HTTP_DUPLICATE_PUSH | 0x000 | Push ID was | Section 6.1 | | |||
| | | C | fulfilled | | | | | C | fulfilled | | | |||
| | | | multiple | | | | | | multiple | | | |||
| | | | times | | | | | | times | | | |||
| | | | | | | | | | | | | |||
| | HTTP_UNKNOWN_STREAM_TYPE | 0x000 | Unknown unid | Section 6.1 | | | HTTP_UNKNOWN_STREAM_TYP | 0x000 | Unknown unidi | Section 6.1 | | |||
| | | D | irectional | | | | E | D | rectional | | | |||
| | | | stream type | | | | | | stream type | | | |||
| | | | | | | | | | | | | |||
| | HTTP_WRONG_STREAM_COUNT | 0x000 | Too many uni | Section 6.1 | | | HTTP_WRONG_STREAM_COUNT | 0x000 | Too many unid | Section 6.1 | | |||
| | | E | directional | | | | | E | irectional | | | |||
| | | | streams | | | | | | streams | | | |||
| | | | | | | | | | | | | |||
| | HTTP_CLOSED_CRITICAL_STRE | 0x000 | Critical | Section 6.1 | | | HTTP_CLOSED_CRITICAL_ST | 0x000 | Critical | Section 6.1 | | |||
| | AM | F | stream was | | | | REAM | F | stream was | | | |||
| | | | closed | | | | | | closed | | | |||
| | | | | | | | | | | | | |||
| | HTTP_WRONG_STREAM_DIRECTI | 0x001 | Unidirection | Section 6.1 | | | HTTP_WRONG_STREAM_DIREC | 0x001 | Unidirectiona | Section 6.1 | | |||
| | ON | 0 | al stream in | | | | TION | 0 | l stream in | | | |||
| | | | wrong | | | | | | wrong | | | |||
| | | | direction | | | | | | direction | | | |||
| | | | | | | | | | | | | |||
| | HTTP_MALFORMED_FRAME | 0x01X | Error in | Section 6.1 | | | HTTP_EARLY_RESPONSE | 0x001 | Remainder of | Section 6.1 | | |||
| | | X | frame | | | | | 1 | request not | | | |||
| | | | formatting | | | | | | needed | | | |||
| | | | or use | | | | | | | | | |||
| +---------------------------+-------+--------------+----------------+ | | HTTP_MALFORMED_FRAME | 0x01X | Error in | Section 6.1 | | |||
| | | X | frame | | | ||||
| | | | formatting or | | | ||||
| | | | use | | | ||||
| +-------------------------+-------+---------------+-----------------+ | ||||
| 9.6. Stream Types | 10.6. Stream Types | |||
| This document establishes a registry for HTTP/QUIC unidirectional | This document establishes a registry for HTTP/QUIC unidirectional | |||
| stream types. The "HTTP/QUIC Stream Type" registry manages an 8-bit | stream types. The "HTTP/QUIC Stream Type" registry manages an 8-bit | |||
| space. The "HTTP/QUIC Stream Type" registry operates under either of | space. The "HTTP/QUIC Stream Type" registry operates under either of | |||
| the "IETF Review" or "IESG Approval" policies [RFC8126] for values | the "IETF Review" or "IESG Approval" policies [RFC8126] for values | |||
| from 0x00 up to and including 0xef, with values from 0xf0 up to and | from 0x00 up to and including 0xef, with values from 0xf0 up to and | |||
| including 0xff being reserved for Experimental Use. | including 0xff being reserved for Experimental Use. | |||
| New entries in this registry require the following information: | New entries in this registry require the following information: | |||
| skipping to change at page 38, line 32 ¶ | skipping to change at page 40, line 32 ¶ | |||
| its payload. | its payload. | |||
| Sender: Which endpoint on a connection may initiate a stream of this | Sender: Which endpoint on a connection may initiate a stream of this | |||
| type. Values are "Client", "Server", or "Both". | type. Values are "Client", "Server", or "Both". | |||
| The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
| +----------------+------+---------------+--------+ | +----------------+------+---------------+--------+ | |||
| | Stream Type | Code | Specification | Sender | | | Stream Type | Code | Specification | Sender | | |||
| +----------------+------+---------------+--------+ | +----------------+------+---------------+--------+ | |||
| | Control Stream | 0x43 | Section 3.3.1 | Both | | | Control Stream | 0x43 | Section 3.3.2 | Both | | |||
| | | | | | | | | | | | | |||
| | Push Stream | 0x50 | Section 3.3.2 | Server | | | Push Stream | 0x50 | Section 3.3.3 | Server | | |||
| +----------------+------+---------------+--------+ | +----------------+------+---------------+--------+ | |||
| 10. References | Additionally, for each code of the format "0x1f * N" for values of N | |||
| in the range (0..8) (that is, "0x00", "0x1f", "0x3e", "0x5d", "0x7c", | ||||
| "0x9b", "0xba", "0xd9", "0xf8"), the following values should be | ||||
| registered: | ||||
| 10.1. Normative References | Stream Type: Reserved - GREASE | |||
| Specification: Section 3.3.1 | ||||
| Sender: Both | ||||
| 11. References | ||||
| 11.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-01 (work in progress), June 2018. | qpack-02 (work in progress), August 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-12 (work in progress), June 2018. | transport-13 (work in progress), August 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 39, line 43 ¶ | skipping to change at page 42, line 9 ¶ | |||
| <https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
| [RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| April 2016, <https://www.rfc-editor.org/info/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 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>. | |||
| 10.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>. | |||
| [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>. | |||
| 10.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 | |||
| [3] https://github.com/quicwg/base-drafts/labels/-http | [3] https://github.com/quicwg/base-drafts/labels/-http | |||
| [4] https://www.iana.org/assignments/message-headers | ||||
| Appendix A. Change Log | Appendix A. 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. | |||
| A.1. Since draft-ietf-quic-http-12 | A.1. Since draft-ietf-quic-http-13 | |||
| o Reserved some frame types for grease (#1333, #1446) | ||||
| o Unknown unidirectional stream types are tolerated, not errors; | ||||
| some reserved for grease (#1490, #1525) | ||||
| o Require settings to be remembered for 0-RTT, prohibit reductions | ||||
| (#1541, #1641) | ||||
| o Specify behavior for truncated requests (#1596, #1643) | ||||
| A.2. 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/QUIC frames (#1388, #1398) | o Removed flags from HTTP/QUIC 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) | |||
| A.2. Since draft-ietf-quic-http-11 | A.3. 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) | |||
| A.3. Since draft-ietf-quic-http-10 | A.4. 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) | |||
| A.4. Since draft-ietf-quic-http-09 | A.5. 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) | |||
| A.5. Since draft-ietf-quic-http-08 | A.6. Since draft-ietf-quic-http-08 | |||
| o Clarified connection coalescing rules (#940, #1024) | o Clarified connection coalescing rules (#940, #1024) | |||
| A.6. Since draft-ietf-quic-http-07 | A.7. 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) | |||
| A.7. Since draft-ietf-quic-http-06 | A.8. Since draft-ietf-quic-http-06 | |||
| o Track changes in QUIC error code usage (#485) | o Track changes in QUIC error code usage (#485) | |||
| A.8. Since draft-ietf-quic-http-05 | A.9. 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) | |||
| A.9. Since draft-ietf-quic-http-04 | A.10. 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 42, line 4 ¶ | skipping to change at page 44, line 29 ¶ | |||
| 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) | |||
| A.10. Since draft-ietf-quic-http-03 | A.11. Since draft-ietf-quic-http-03 | |||
| None. | None. | |||
| A.11. Since draft-ietf-quic-http-02 | A.12. Since draft-ietf-quic-http-02 | |||
| o Track changes in transport draft | o Track changes in transport draft | |||
| A.12. Since draft-ietf-quic-http-01 | A.13. 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) | |||
| A.13. Since draft-ietf-quic-http-00 | A.14. 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) | |||
| A.14. Since draft-shade-quic-http2-mapping-00 | A.15. 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. 82 change blocks. | ||||
| 268 lines changed or deleted | 392 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/ | ||||