| < draft-ietf-httpbis-priority-06.txt | draft-ietf-httpbis-priority-07.txt > | |||
|---|---|---|---|---|
| HTTP K. Oku | HTTP K. Oku | |||
| Internet-Draft Fastly | Internet-Draft Fastly | |||
| Intended status: Standards Track L. Pardue | Intended status: Standards Track L. Pardue | |||
| Expires: 4 April 2022 Cloudflare | Expires: 28 April 2022 Cloudflare | |||
| 1 October 2021 | 25 October 2021 | |||
| Extensible Prioritization Scheme for HTTP | Extensible Prioritization Scheme for HTTP | |||
| draft-ietf-httpbis-priority-06 | draft-ietf-httpbis-priority-07 | |||
| Abstract | Abstract | |||
| This document describes a scheme for prioritizing HTTP responses. | This document describes a scheme that allows an HTTP client to | |||
| This scheme expresses the priority of each HTTP response using | communicate its preferences for how the upstream server prioritizes | |||
| absolute values, rather than as a relative relationship between a | responses to its requests, and also allows a server to hint to a | |||
| group of HTTP responses. | downstream intermediary how its responses should be prioritized when | |||
| they are forwarded. This document defines the Priority header field | ||||
| This document defines the Priority header field for communicating the | for communicating the initial priority in an HTTP version-independent | |||
| initial priority in an HTTP version-independent manner, as well as | manner, as well as HTTP/2 and HTTP/3 frames for reprioritizing | |||
| HTTP/2 and HTTP/3 frames for reprioritizing the responses. These | responses. These share a common format structure that is designed to | |||
| share a common format structure that is designed to provide future | provide future extensibility. | |||
| extensibility. | ||||
| Note to Readers | Note to Readers | |||
| _RFC EDITOR: please remove this section before publication_ | _RFC EDITOR: please remove this section before publication_ | |||
| Discussion of this draft takes place on the HTTP working group | Discussion of this draft takes place on the HTTP working group | |||
| mailing list (ietf-http-wg@w3.org), which is archived at | mailing list (ietf-http-wg@w3.org), which is archived at | |||
| https://lists.w3.org/Archives/Public/ietf-http-wg/ | https://lists.w3.org/Archives/Public/ietf-http-wg/ | |||
| (https://lists.w3.org/Archives/Public/ietf-http-wg/). | (https://lists.w3.org/Archives/Public/ietf-http-wg/). | |||
| skipping to change at page 2, line 10 ¶ | skipping to change at page 2, line 10 ¶ | |||
| 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 4 April 2022. | This Internet-Draft will expire on 28 April 2022. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
| extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
| as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
| provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 | 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 | |||
| 2. Motivation for Replacing RFC 7540 Priorities . . . . . . . . 4 | 2. Motivation for Replacing RFC 7540 Priorities . . . . . . . . 5 | |||
| 2.1. Disabling RFC 7540 Priorities . . . . . . . . . . . . . . 6 | 2.1. Disabling RFC 7540 Priorities . . . . . . . . . . . . . . 6 | |||
| 2.1.1. Advice when Using Extensible Priorities as the | 2.1.1. Advice when Using Extensible Priorities as the | |||
| Alternative . . . . . . . . . . . . . . . . . . . . . 7 | Alternative . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3. Applicability of the Extensible Priority Scheme . . . . . . . 7 | 3. Applicability of the Extensible Priority Scheme . . . . . . . 7 | |||
| 4. Priority Parameters . . . . . . . . . . . . . . . . . . . . . 7 | 4. Priority Parameters . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.1. Urgency . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 4.1. Urgency . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.2. Incremental . . . . . . . . . . . . . . . . . . . . . . . 8 | 4.2. Incremental . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.3. Defining New Parameters . . . . . . . . . . . . . . . . . 9 | 4.3. Defining New Parameters . . . . . . . . . . . . . . . . . 10 | |||
| 4.3.1. Registration . . . . . . . . . . . . . . . . . . . . 9 | 4.3.1. Registration . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5. The Priority HTTP Header Field . . . . . . . . . . . . . . . 10 | 5. The Priority HTTP Header Field . . . . . . . . . . . . . . . 11 | |||
| 6. Reprioritization . . . . . . . . . . . . . . . . . . . . . . 11 | 6. Reprioritization . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 7. The PRIORITY_UPDATE Frame . . . . . . . . . . . . . . . . . . 11 | 7. The PRIORITY_UPDATE Frame . . . . . . . . . . . . . . . . . . 12 | |||
| 7.1. HTTP/2 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 12 | 7.1. HTTP/2 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 13 | |||
| 7.2. HTTP/3 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 13 | 7.2. HTTP/3 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 14 | |||
| 8. Merging Client- and Server-Driven Parameters . . . . . . . . 14 | 8. Merging Client- and Server-Driven Parameters . . . . . . . . 15 | |||
| 9. Client Scheduling . . . . . . . . . . . . . . . . . . . . . . 15 | 9. Client Scheduling . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 10. Server Scheduling . . . . . . . . . . . . . . . . . . . . . . 15 | 10. Server Scheduling . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 10.1. Intermediaries with Multiple Backend Connections . . . . 17 | 10.1. Intermediaries with Multiple Backend Connections . . . . 18 | |||
| 11. Scheduling and the CONNECT Method . . . . . . . . . . . . . . 17 | 11. Scheduling and the CONNECT Method . . . . . . . . . . . . . . 19 | |||
| 12. Retransmission Scheduling . . . . . . . . . . . . . . . . . . 18 | 12. Retransmission Scheduling . . . . . . . . . . . . . . . . . . 19 | |||
| 13. Fairness . . . . . . . . . . . . . . . . . . . . . . . . . . 18 | 13. Fairness . . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 13.1. Coalescing Intermediaries . . . . . . . . . . . . . . . 18 | 13.1. Coalescing Intermediaries . . . . . . . . . . . . . . . 20 | |||
| 13.2. HTTP/1.x Back Ends . . . . . . . . . . . . . . . . . . . 19 | 13.2. HTTP/1.x Back Ends . . . . . . . . . . . . . . . . . . . 21 | |||
| 13.3. Intentional Introduction of Unfairness . . . . . . . . . 19 | 13.3. Intentional Introduction of Unfairness . . . . . . . . . 21 | |||
| 14. Why use an End-to-End Header Field? . . . . . . . . . . . . . 20 | 14. Why use an End-to-End Header Field? . . . . . . . . . . . . . 21 | |||
| 15. Security Considerations . . . . . . . . . . . . . . . . . . . 20 | 15. Security Considerations . . . . . . . . . . . . . . . . . . . 22 | |||
| 16. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | 16. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 17.1. Normative References . . . . . . . . . . . . . . . . . . 22 | 17.1. Normative References . . . . . . . . . . . . . . . . . . 23 | |||
| 17.2. Informative References . . . . . . . . . . . . . . . . . 23 | 17.2. Informative References . . . . . . . . . . . . . . . . . 24 | |||
| Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 24 | Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 25 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 24 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 25 | |||
| B.1. Since draft-ietf-httpbis-priority-05 . . . . . . . . . . 24 | B.1. Since draft-ietf-httpbis-priority-06 . . . . . . . . . . 25 | |||
| B.2. Since draft-ietf-httpbis-priority-04 . . . . . . . . . . 25 | B.2. Since draft-ietf-httpbis-priority-05 . . . . . . . . . . 26 | |||
| B.3. Since draft-ietf-httpbis-priority-03 . . . . . . . . . . 25 | B.3. Since draft-ietf-httpbis-priority-04 . . . . . . . . . . 26 | |||
| B.4. Since draft-ietf-httpbis-priority-02 . . . . . . . . . . 25 | B.4. Since draft-ietf-httpbis-priority-03 . . . . . . . . . . 26 | |||
| B.5. Since draft-ietf-httpbis-priority-01 . . . . . . . . . . 25 | B.5. Since draft-ietf-httpbis-priority-02 . . . . . . . . . . 26 | |||
| B.6. Since draft-ietf-httpbis-priority-00 . . . . . . . . . . 25 | B.6. Since draft-ietf-httpbis-priority-01 . . . . . . . . . . 26 | |||
| B.7. Since draft-kazuho-httpbis-priority-04 . . . . . . . . . 26 | B.7. Since draft-ietf-httpbis-priority-00 . . . . . . . . . . 27 | |||
| B.8. Since draft-kazuho-httpbis-priority-03 . . . . . . . . . 26 | B.8. Since draft-kazuho-httpbis-priority-04 . . . . . . . . . 27 | |||
| B.9. Since draft-kazuho-httpbis-priority-02 . . . . . . . . . 26 | B.9. Since draft-kazuho-httpbis-priority-03 . . . . . . . . . 27 | |||
| B.10. Since draft-kazuho-httpbis-priority-01 . . . . . . . . . 26 | B.10. Since draft-kazuho-httpbis-priority-02 . . . . . . . . . 27 | |||
| B.11. Since draft-kazuho-httpbis-priority-00 . . . . . . . . . 26 | B.11. Since draft-kazuho-httpbis-priority-01 . . . . . . . . . 27 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 27 | B.12. Since draft-kazuho-httpbis-priority-00 . . . . . . . . . 28 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 28 | ||||
| 1. Introduction | 1. Introduction | |||
| It is common for an HTTP [HTTP] resource representation to have | It is common for representations of an HTTP [HTTP] resource to have | |||
| relationships to one or more other resources. Clients will often | relationships to one or more other resources. Clients will often | |||
| discover these relationships while processing a retrieved | discover these relationships while processing a retrieved | |||
| representation, leading to further retrieval requests. Meanwhile, | representation, which may lead to further retrieval requests. | |||
| the nature of the relationship determines whether the client is | Meanwhile, the nature of the relationship determines whether the | |||
| blocked from continuing to process locally available resources. For | client is blocked from continuing to process locally available | |||
| example, visual rendering of an HTML document could be blocked by the | resources. An example of this is visual rendering of an HTML | |||
| retrieval of a CSS file that the document refers to. In contrast, | document, which could be blocked by the retrieval of a CSS file that | |||
| inline images do not block rendering and get drawn incrementally as | the document refers to. In contrast, inline images do not block | |||
| the chunks of the images arrive. | rendering and get drawn incrementally as the chunks of the images | |||
| arrive. | ||||
| To provide meaningful presentation of a document at the earliest | HTTP/2 [HTTP2] and HTTP/3 [HTTP3] support multiplexing of requests | |||
| and responses in a single connection. An important feature of any | ||||
| implementation of a protocol that provides multiplexing is the | ||||
| ability to prioritize the sending of information. For example, to | ||||
| provide meaningful presentation of an HTML document at the earliest | ||||
| moment, it is important for an HTTP server to prioritize the HTTP | moment, it is important for an HTTP server to prioritize the HTTP | |||
| responses, or the chunks of those HTTP responses, that it sends. | responses, or the chunks of those HTTP responses, that it sends to a | |||
| client. | ||||
| A server that operates in ignorance of how clients issue requests and | ||||
| consume responses can cause suboptimal client application | ||||
| performance. Priority signals allow clients to communicate their | ||||
| view of request priority. Servers have their own needs that are | ||||
| independent from client needs, so they often combine priority signals | ||||
| with other available information in order to inform scheduling of | ||||
| response data. | ||||
| RFC 7540 [RFC7540] stream priority allowed a client to send a series | RFC 7540 [RFC7540] stream priority allowed a client to send a series | |||
| of priority signals that communicate to the server a "priority tree"; | of priority signals that communicate to the server a "priority tree"; | |||
| the structure of this tree represents the client's preferred relative | the structure of this tree represents the client's preferred relative | |||
| ordering and weighted distribution of the bandwidth among HTTP | ordering and weighted distribution of the bandwidth among HTTP | |||
| responses. Servers could use these priority signals as input into | responses. Servers could use these priority signals as input into | |||
| prioritization decision making. | prioritization decision making. | |||
| The design and implementation of RFC 7540 stream priority was | The design and implementation of RFC 7540 stream priority was | |||
| observed to have shortcomings, explained in Section 2. HTTP/2 | observed to have shortcomings, explained in Section 2. HTTP/2 | |||
| [HTTP2] has consequently deprecated the use of these stream priority | [HTTP2] has consequently deprecated the use of these stream priority | |||
| signals. | signals. | |||
| This document describes an extensible scheme for prioritizing HTTP | This document describes an extensible scheme for prioritizing HTTP | |||
| responses that uses absolute values. Section 4 defines priority | responses that uses absolute values. Section 4 defines priority | |||
| parameters, which are a standardized and extensible format of | parameters, which are a standardized and extensible format of | |||
| priority information. Section 5 defines the Priority HTTP header | priority information. Section 5 defines the Priority HTTP header | |||
| field that can be used by both client and server to exchange | field, a protocol-version-independent and end-to-end priority signal. | |||
| parameters in order to specify the precedence of HTTP responses in a | Clients can use this header to signal priority to servers in order to | |||
| protocol-version-independent and end-to-end manner. Section 7.1 and | specify the precedence of HTTP responses. Similarly, servers behind | |||
| Section 7.2 define version-specific frames that carry parameters for | an intermediary can use it to signal priority to the intermediary. | |||
| reprioritization. This prioritization scheme and its signals can act | Section 7.1 and Section 7.2 define version-specific frames that carry | |||
| parameters, which clients can use for reprioritization. | ||||
| Header field and frame priority signals are input to a server's | ||||
| response prioritization process. They are only a suggestion and do | ||||
| not guarantee any particular processing or transmission order for one | ||||
| response relative to any other response. Section 10 and Section 12 | ||||
| provide consideration and guidance about how servers might act upon | ||||
| signals. | ||||
| The prioritization scheme and priority signals defined herein can act | ||||
| as a substitute for RFC 7540 stream priority. | as a substitute for RFC 7540 stream priority. | |||
| 1.1. Notational Conventions | 1.1. Notational Conventions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
| The terms sf-integer and sf-boolean are imported from | The terms Dictionary, sf-boolean, sf-dictionary, and sf-integer are | |||
| [STRUCTURED-FIELDS]. | imported from [STRUCTURED-FIELDS]. | |||
| Example HTTP requests and responses use the HTTP/2-style formatting | Example HTTP requests and responses use the HTTP/2-style formatting | |||
| from [HTTP2]. | from [HTTP2]. | |||
| This document uses the variable-length integer encoding from [QUIC]. | This document uses the variable-length integer encoding from [QUIC]. | |||
| The term control stream is used to describe the HTTP/2 stream with | The term control stream is used to describe the HTTP/2 stream with | |||
| identifier 0x0, and HTTP/3 control stream; see Section 6.2.1 of | identifier 0x0, and HTTP/3 control stream; see Section 6.2.1 of | |||
| [HTTP3]. | [HTTP3]. | |||
| The term HTTP/2 priority signal is used to describe the priority | The term HTTP/2 priority signal is used to describe the priority | |||
| information sent from clients to servers in HTTP/2 frames; see | information sent from clients to servers in HTTP/2 frames; see | |||
| Section 5.3.2 of [HTTP2]. | Section 5.3.2 of [HTTP2]. | |||
| 2. Motivation for Replacing RFC 7540 Priorities | 2. Motivation for Replacing RFC 7540 Priorities | |||
| An important feature of any implementation of a protocol that | ||||
| provides multiplexing is the ability to prioritize the sending of | ||||
| information. Prioritization is a difficult problem, so it will | ||||
| always be suboptimal, particularly if one endpoint operates in | ||||
| ignorance of the needs of its peer. Priority signalling allows | ||||
| endpoints to communicate their own view of priority, which can be | ||||
| combined with information the peer has to inform scheduling. | ||||
| RFC 7540 stream priority (see Section 5.3 of [RFC7540]) is a complex | RFC 7540 stream priority (see Section 5.3 of [RFC7540]) is a complex | |||
| system where clients signal stream dependencies and weights to | system where clients signal stream dependencies and weights to | |||
| describe an unbalanced tree. It suffered from limited deployment and | describe an unbalanced tree. It suffered from limited deployment and | |||
| interoperability and was deprecated in a revision of HTTP/2 [HTTP2]. | interoperability and was deprecated in a revision of HTTP/2 [HTTP2]. | |||
| However, in order to maintain wire compatibility, HTTP/2 priority | However, in order to maintain wire compatibility, HTTP/2 priority | |||
| signals are still mandatory to handle (see Section 5.3.2 of [HTTP2]). | signals are still mandatory to handle (see Section 5.3.2 of [HTTP2]). | |||
| Clients can build RFC 7540 trees with rich flexibility but experience | Clients can build RFC 7540 trees with rich flexibility but experience | |||
| has shown this is rarely exercised. Instead they tend to choose a | has shown this is rarely exercised. Instead they tend to choose a | |||
| single model optimized for a single use case and experiment within | single model optimized for a single use case and experiment within | |||
| the model constraints, or do nothing at all. Furthermore, many | the model constraints, or do nothing at all. Furthermore, many | |||
| clients build their prioritization tree in a unique way, which makes | clients build their prioritization tree in a unique way, which makes | |||
| it difficult for servers to understand their intent and act or | it difficult for servers to understand their intent and act or | |||
| intervene accordingly. | intervene accordingly. | |||
| Many RFC 7540 server implementations do not act on HTTP/2 priority | Many RFC 7540 server implementations do not act on HTTP/2 priority | |||
| signals. Some instead favor custom server-driven schemes based on | signals. Some instead favor custom server-driven schemes based on | |||
| heuristics or other hints, such as resource content type or request | heuristics or other hints, such as resource content type or request | |||
| generation order. For example, a server, with knowledge of the | generation order. For example, a server, with knowledge of an HTML | |||
| document structure, might want to prioritize the delivery of images | document structure, might want to prioritize the delivery of images | |||
| that are critical to user experience above other images, but below | that are critical to user experience above other images, but below | |||
| the CSS files. Since client trees vary, it is impossible for the | the CSS files. Since client trees vary, it is impossible for the | |||
| server to determine how such images should be prioritized against | server to determine how such images should be prioritized against | |||
| other responses. | other responses. | |||
| RFC 7540 allows intermediaries to coalesce multiple client trees into | RFC 7540 allows intermediaries to coalesce multiple client trees into | |||
| a single tree that is used for a single upstream HTTP/2 connection. | a single tree that is used for a single upstream HTTP/2 connection. | |||
| However, most intermediaries do not support this. Additionally, RFC | However, most intermediaries do not support this. Additionally, RFC | |||
| 7540 does not define a method that can be used by a server to express | 7540 does not define a method that can be used by a server to express | |||
| skipping to change at page 6, line 30 ¶ | skipping to change at page 7, line 5 ¶ | |||
| independent research have shown that simpler schemes can reach at | independent research have shown that simpler schemes can reach at | |||
| least equivalent performance characteristics compared to the more | least equivalent performance characteristics compared to the more | |||
| complex RFC 7540 setups seen in practice, at least for the web use | complex RFC 7540 setups seen in practice, at least for the web use | |||
| case. | case. | |||
| 2.1. Disabling RFC 7540 Priorities | 2.1. Disabling RFC 7540 Priorities | |||
| The problems and insights set out above provided the motivation for | The problems and insights set out above provided the motivation for | |||
| deprecating RFC 7540 stream priority (see Section 5.3 of [RFC7540]). | deprecating RFC 7540 stream priority (see Section 5.3 of [RFC7540]). | |||
| The SETTINGS_NO_RFC7540_PRIORITIES setting is defined by this | The SETTINGS_NO_RFC7540_PRIORITIES HTTP/2 setting is defined by this | |||
| document in order to allow endpoints to explicitly opt out of using | document in order to allow endpoints to explicitly opt out of using | |||
| HTTP/2 priority signals (see Section 5.3.2 of [HTTP2]). Endpoints | HTTP/2 priority signals (see Section 5.3.2 of [HTTP2]). Endpoints | |||
| are encouraged to use alternative priority signals (for example, | are encouraged to use alternative priority signals (for example, | |||
| Section 5 or Section 7.1) but there is no requirement to use a | Section 5 or Section 7.1) but there is no requirement to use a | |||
| specific signal type. | specific signal type. | |||
| The value of SETTINGS_NO_RFC7540_PRIORITIES MUST be 0 or 1. Any | The value of SETTINGS_NO_RFC7540_PRIORITIES MUST be 0 or 1. Any | |||
| value other than 0 or 1 MUST be treated as a connection error (see | value other than 0 or 1 MUST be treated as a connection error (see | |||
| Section 5.4.1 of [HTTP2]) of type PROTOCOL_ERROR. | Section 5.4.1 of [HTTP2]) of type PROTOCOL_ERROR. The initial value | |||
| is 0. | ||||
| Endpoints MUST send this SETTINGS parameter as part of the first | Endpoints MUST send this SETTINGS parameter as part of the first | |||
| SETTINGS frame. A sender MUST NOT change the | SETTINGS frame. A sender MUST NOT change the | |||
| SETTINGS_NO_RFC7540_PRIORITIES parameter value after the first | SETTINGS_NO_RFC7540_PRIORITIES parameter value after the first | |||
| SETTINGS frame. Detection of a change by a receiver MUST be treated | SETTINGS frame. Detection of a change by a receiver MUST be treated | |||
| as a connection error of type PROTOCOL_ERROR. | as a connection error of type PROTOCOL_ERROR. | |||
| The SETTINGS frame precedes any HTTP/2 priority signal sent from a | The SETTINGS frame precedes any HTTP/2 priority signal sent from a | |||
| client, so a server can determine if it needs to allocate any | client, so a server can determine if it needs to allocate any | |||
| resource to signal handling before they arrive. A server that | resource to signal handling before they arrive. A server that | |||
| skipping to change at page 7, line 38 ¶ | skipping to change at page 8, line 14 ¶ | |||
| 4. Priority Parameters | 4. Priority Parameters | |||
| The priority information is a sequence of key-value pairs, providing | The priority information is a sequence of key-value pairs, providing | |||
| room for future extensions. Each key-value pair represents a | room for future extensions. Each key-value pair represents a | |||
| priority parameter. | priority parameter. | |||
| The Priority HTTP header field (Section 5) is an end-to-end way to | The Priority HTTP header field (Section 5) is an end-to-end way to | |||
| transmit this set of parameters when a request or a response is | transmit this set of parameters when a request or a response is | |||
| issued. In order to reprioritize a request, HTTP-version-specific | issued. In order to reprioritize a request, HTTP-version-specific | |||
| frames (Section 7.1 and Section 7.2) are used by clients to transmit | PRIORITY_UPDATE frames (Section 7.1 and Section 7.2) are used by | |||
| the same information on a single hop. If intermediaries want to | clients to transmit the same information on a single hop. If | |||
| specify prioritization on a multiplexed HTTP connection, they SHOULD | intermediaries want to specify prioritization on a multiplexed HTTP | |||
| use a PRIORITY_UPDATE frame and SHOULD NOT change the Priority header | connection, they SHOULD use a PRIORITY_UPDATE frame and SHOULD NOT | |||
| field. | change the Priority header field. | |||
| In both cases, the set of priority parameters is encoded as a | In both cases, the set of priority parameters is encoded as a | |||
| Structured Fields Dictionary (see Section 3.2 of | Structured Fields Dictionary (see Section 3.2 of | |||
| [STRUCTURED-FIELDS]). | [STRUCTURED-FIELDS]). | |||
| This document defines the urgency(u) and incremental(i) parameters. | This document defines the urgency(u) and incremental(i) parameters. | |||
| When receiving an HTTP request that does not carry these priority | When receiving an HTTP request that does not carry these priority | |||
| parameters, a server SHOULD act as if their default values were | parameters, a server SHOULD act as if their default values were | |||
| specified. Note that handling of omitted parameters is different | specified. Note that handling of omitted parameters is different | |||
| when processing an HTTP response; see Section 8. | when processing an HTTP response; see Section 8. | |||
| Unknown parameters, parameters with out-of-range values or values of | Receivers parse the Dictionary as defined in Section 4.2 of | |||
| [STRUCTURED-FIELDS]. Where the Dictionary is successfully parsed, | ||||
| this document places the additional requirement that unknown priority | ||||
| parameters, parameters with out-of-range values, or values of | ||||
| unexpected types MUST be ignored. | unexpected types MUST be ignored. | |||
| 4.1. Urgency | 4.1. Urgency | |||
| The urgency parameter (u) takes an integer between 0 and 7, in | The urgency parameter (u) takes an integer between 0 and 7, in | |||
| descending order of priority. This range provides sufficient | descending order of priority. | |||
| granularity for prioritizing responses for ordinary web browsing, at | ||||
| minimal complexity. | ||||
| The value is encoded as an sf-integer. The default value is 3. | The value is encoded as an sf-integer. The default value is 3. | |||
| This parameter indicates the sender's recommendation, based on the | Endpoints use this parameter to communicate their view of the | |||
| expectation that the server would transmit HTTP responses in the | precedence of HTTP responses. The chosen value of urgency can be | |||
| order of their urgency values if possible. The smaller the value, | based on the expectation that servers might use this information to | |||
| the higher the precedence. | transmit HTTP responses in the order of their urgency. The smaller | |||
| the value, the higher the precedence. | ||||
| The following example shows a request for a CSS file with the urgency | The following example shows a request for a CSS file with the urgency | |||
| set to 0: | set to 0: | |||
| :method = GET | :method = GET | |||
| :scheme = https | :scheme = https | |||
| :authority = example.net | :authority = example.net | |||
| :path = /style.css | :path = /style.css | |||
| priority = u=0 | priority = u=0 | |||
| skipping to change at page 8, line 43 ¶ | skipping to change at page 9, line 23 ¶ | |||
| to the main resource. This convention allows servers to refine the | to the main resource. This convention allows servers to refine the | |||
| urgency using knowledge specific to the web-site (see Section 8). | urgency using knowledge specific to the web-site (see Section 8). | |||
| The lowest urgency level (7) is reserved for background tasks such as | The lowest urgency level (7) is reserved for background tasks such as | |||
| delivery of software updates. This urgency level SHOULD NOT be used | delivery of software updates. This urgency level SHOULD NOT be used | |||
| for fetching responses that have impact on user interaction. | for fetching responses that have impact on user interaction. | |||
| 4.2. Incremental | 4.2. Incremental | |||
| The incremental parameter (i) takes an sf-boolean as the value that | The incremental parameter (i) takes an sf-boolean as the value that | |||
| indicates if an HTTP response can be processed incrementally, i.e. | indicates if an HTTP response can be processed incrementally, i.e., | |||
| provide some meaningful output as chunks of the response arrive. | provide some meaningful output as chunks of the response arrive. | |||
| The default value of the incremental parameter is false (0). | The default value of the incremental parameter is false (0). | |||
| A server might distribute the bandwidth of a connection between | If a client makes concurrent requests with the incremental parameter | |||
| incremental responses that share the same urgency, hoping that | set to false, there is no benefit serving responses with the same | |||
| providing those responses in parallel would be more helpful to the | urgency concurrently because the client is not going to process those | |||
| client than delivering the responses one by one. | responses incrementally. Serving non-incremental responses with the | |||
| same urgency one by one, in the order in which those requests were | ||||
| generated is considered to be the best strategy. | ||||
| If a client makes concurrent requests with the incremental parameter | If a client makes concurrent requests with the incremental parameter | |||
| set to false, there is no benefit serving responses in parallel | set to true, serving requests with the same urgency concurrently | |||
| because the client is not going to process those responses | might be beneficial. Doing this distributes the connection | |||
| incrementally. Serving non-incremental responses one by one, in the | bandwidth, meaning that responses take longer to complete. | |||
| order in which those requests were generated is considered to be the | Incremental delivery is most useful where multiple partial responses | |||
| best strategy. | might provide some value to clients ahead of a complete response | |||
| being available. | ||||
| The following example shows a request for a JPEG file with the | The following example shows a request for a JPEG file with the | |||
| urgency parameter set to 5 and the incremental parameter set to true. | urgency parameter set to 5 and the incremental parameter set to true. | |||
| :method = GET | :method = GET | |||
| :scheme = https | :scheme = https | |||
| :authority = example.net | :authority = example.net | |||
| :path = /image.jpg | :path = /image.jpg | |||
| priority = u=5, i | priority = u=5, i | |||
| 4.3. Defining New Parameters | 4.3. Defining New Parameters | |||
| When attempting to define new parameters, care must be taken so that | When attempting to define new parameters, care must be taken so that | |||
| they do not adversely interfere with prioritization performed by | they do not adversely interfere with prioritization performed by | |||
| existing endpoints or intermediaries that do not understand the newly | existing endpoints or intermediaries that do not understand the newly | |||
| defined parameter. Since unknown parameters are ignored, new | defined parameter. Since unknown parameters are ignored, new | |||
| parameters should not change the interpretation of or modify the | parameters should not change the interpretation of, or modify, the | |||
| predefined parameters in a way that is not backwards compatible or | urgency (see Section 4.1) or incremental (see Section 4.2) parameters | |||
| fallback safe. | in a way that is not backwards compatible or fallback safe. | |||
| For example, if there is a need to provide more granularity than | For example, if there is a need to provide more granularity than | |||
| eight urgency levels, it would be possible to subdivide the range | eight urgency levels, it would be possible to subdivide the range | |||
| using an additional parameter. Implementations that do not recognize | using an additional parameter. Implementations that do not recognize | |||
| the parameter can safely continue to use the less granular eight | the parameter can safely continue to use the less granular eight | |||
| levels. | levels. | |||
| Alternatively, the urgency can be augmented. For example, a | Alternatively, the urgency can be augmented. For example, a | |||
| graphical user agent could send a visible parameter to indicate if | graphical user agent could send a visible parameter to indicate if | |||
| the resource being requested is within the viewport. | the resource being requested is within the viewport. | |||
| Generic parameters are preferred over vendor-specific, application- | Generic parameters are preferred over vendor-specific, application- | |||
| specific or deployment-specific values. If a generic value cannot be | specific or deployment-specific values. If a generic value cannot be | |||
| agreed upon in the community, the parameter's name should be | agreed upon in the community, the parameter's name should be | |||
| correspondingly specific (e.g., with a prefix that identifies the | correspondingly specific (e.g., with a prefix that identifies the | |||
| vendor, application or deployment). | vendor, application or deployment). | |||
| 4.3.1. Registration | 4.3.1. Registration | |||
| New Priority parameters can be defined by registering them in the | New Priority parameters can be defined by registering them in the | |||
| HTTP Priority Parameters Registry. | HTTP Priority Parameters Registry. The registry governs the keys | |||
| (short textual strings) used in Structured Fields Dictionary (see | ||||
| Registration requests are reviewed and approved by a Designated | Section 3.2 of [STRUCTURED-FIELDS]). Since each HTTP request can | |||
| Expert, as per Section 4.5 of [RFC8126]. A specification document is | have associated priority signals, there is value in having short key | |||
| appreciated, but not required. | lengths, especially single-character strings. In order to encourage | |||
| extension while avoiding unintended conflict among attractive key | ||||
| values, the HTTP Priority Parameters Registry operates two | ||||
| registration policies depending on key length. | ||||
| The Expert(s) should consider the following factors when evaluating | * Registration requests for parameters with a key length of one use | |||
| requests: | the Specification Required policy, as per Section 4.6 of | |||
| [RFC8126]. | ||||
| * Community feedback | * Registration requests for parameters with a key length greater | |||
| than one use the Expert Review policy, as per Section 4.5 of | ||||
| [RFC8126]. A specification document is appreciated, but not | ||||
| required. | ||||
| * If the parameters are sufficiently well-defined and adhere to the | When reviewing registration requests, the designated expert(s) can | |||
| guidance provided in Section 4.3. | consider the additional guidance provided in Section 4.3 but cannot | |||
| use it as a basis for rejection. | ||||
| Registration requests should use the following template: | Registration requests should use the following template: | |||
| * Name: [a name for the Priority Parameter that matches key] | Name: [a name for the Priority Parameter that matches key] | |||
| * Description: [a description of the parameter semantics and value] | Description: [a description of the parameter semantics and value] | |||
| * Reference: [to a specification defining this parameter] | Reference: [to a specification defining this parameter] | |||
| See the registry at https://iana.org/assignments/http-priority | See the registry at https://iana.org/assignments/http-priority | |||
| (https://iana.org/assignments/http-priority) for details on where to | (https://iana.org/assignments/http-priority) for details on where to | |||
| send registration requests. | send registration requests. | |||
| 5. The Priority HTTP Header Field | 5. The Priority HTTP Header Field | |||
| The Priority HTTP header field can appear in requests and responses. | The Priority HTTP header field carries priority parameters Section 4. | |||
| A client uses it to specify the priority of the response. A server | It can appear in requests and responses. It is an end-to-end signal | |||
| uses it to inform the client that the priority was overwritten. An | of the request priority from the client or the response priority from | |||
| intermediary can use the Priority information from client requests | the server. Section 8 describes how intermediaries can combine the | |||
| and server responses to correct or amend the precedence to suit it | priority information from client requests and server responses to | |||
| (see Section 8). | correct or amend the precedence. Clients cannot interpret the | |||
| appearance or omission of a Priority response header as | ||||
| acknowledgement that any prioritization has occurred. Guidance for | ||||
| how endpoints can act on Priority header values is given in | ||||
| Section 10 and Section 9. | ||||
| The Priority header field is an end-to-end signal of the request | Priority is a Dictionary (Section 3.2 of [STRUCTURED-FIELDS]): | |||
| priority from the client or the response priority from the server. | ||||
| Priority = sf-dictionary | ||||
| As is the ordinary case for HTTP caching [CACHING], a response with a | As is the ordinary case for HTTP caching [CACHING], a response with a | |||
| Priority header field might be cached and re-used for subsequent | Priority header field might be cached and re-used for subsequent | |||
| requests. When an origin server generates the Priority response | requests. When an origin server generates the Priority response | |||
| header field based on properties of an HTTP request it receives, the | header field based on properties of an HTTP request it receives, the | |||
| server is expected to control the cacheability or the applicability | server is expected to control the cacheability or the applicability | |||
| of the cached response, by using header fields that control the | of the cached response, by using header fields that control the | |||
| caching behavior (e.g., Cache-Control, Vary). | caching behavior (e.g., Cache-Control, Vary). | |||
| An endpoint that fails to parse the Priority header field SHOULD use | ||||
| default parameter values. | ||||
| 6. Reprioritization | 6. Reprioritization | |||
| After a client sends a request, it may be beneficial to change the | After a client sends a request, it may be beneficial to change the | |||
| priority of the response. As an example, a web browser might issue a | priority of the response. As an example, a web browser might issue a | |||
| prefetch request for a JavaScript file with the urgency parameter of | prefetch request for a JavaScript file with the urgency parameter of | |||
| the Priority request header field set to u=7 (background). Then, | the Priority request header field set to u=7 (background). Then, | |||
| when the user navigates to a page which references the new JavaScript | when the user navigates to a page which references the new JavaScript | |||
| file, while the prefetch is in progress, the browser would send a | file, while the prefetch is in progress, the browser would send a | |||
| reprioritization signal with the priority field value set to u=0. | reprioritization signal with the priority field value set to u=0. | |||
| The PRIORITY_UPDATE frame (Section 7) can be used for such | The PRIORITY_UPDATE frame (Section 7) can be used for such | |||
| skipping to change at page 12, line 50 ¶ | skipping to change at page 13, line 50 ¶ | |||
| fields: | fields: | |||
| Reserved: A reserved 1-bit field. The semantics of this bit are | Reserved: A reserved 1-bit field. The semantics of this bit are | |||
| undefined, and the bit MUST remain unset (0x0) when sending and | undefined, and the bit MUST remain unset (0x0) when sending and | |||
| MUST be ignored when receiving. | MUST be ignored when receiving. | |||
| Prioritized Stream ID: A 31-bit stream identifier for the stream | Prioritized Stream ID: A 31-bit stream identifier for the stream | |||
| that is the target of the priority update. | that is the target of the priority update. | |||
| Priority Field Value: The priority update value in ASCII text, | Priority Field Value: The priority update value in ASCII text, | |||
| encoded using Structured Fields. | encoded using Structured Fields. This is the same representation | |||
| as the Priority header field value. | ||||
| When the PRIORITY_UPDATE frame applies to a request stream, clients | When the PRIORITY_UPDATE frame applies to a request stream, clients | |||
| SHOULD provide a Prioritized Stream ID that refers to a stream in the | SHOULD provide a Prioritized Stream ID that refers to a stream in the | |||
| "open", "half-closed (local)", or "idle" state. Servers can discard | "open", "half-closed (local)", or "idle" state. Servers can discard | |||
| frames where the Prioritized Stream ID refers to a stream in the | frames where the Prioritized Stream ID refers to a stream in the | |||
| "half-closed (local)" or "closed" state. The number of streams which | "half-closed (local)" or "closed" state. The number of streams which | |||
| have been prioritized but remain in the "idle" state plus the number | have been prioritized but remain in the "idle" state plus the number | |||
| of active streams (those in the "open" or either "half-closed" state; | of active streams (those in the "open" or either "half-closed" state; | |||
| see Section 5.1.2 of [HTTP2]) MUST NOT exceed the value of the | see Section 5.1.2 of [HTTP2]) MUST NOT exceed the value of the | |||
| SETTINGS_MAX_CONCURRENT_STREAMS parameter. Servers that receive such | SETTINGS_MAX_CONCURRENT_STREAMS parameter. Servers that receive such | |||
| skipping to change at page 14, line 20 ¶ | skipping to change at page 15, line 20 ¶ | |||
| } | } | |||
| Figure 2: HTTP/3 PRIORITY_UPDATE Frame | Figure 2: HTTP/3 PRIORITY_UPDATE Frame | |||
| The PRIORITY_UPDATE frame payload has the following fields: | The PRIORITY_UPDATE frame payload has the following fields: | |||
| Prioritized Element ID: The stream ID or push ID that is the target | Prioritized Element ID: The stream ID or push ID that is the target | |||
| of the priority update. | of the priority update. | |||
| Priority Field Value: The priority update value in ASCII text, | Priority Field Value: The priority update value in ASCII text, | |||
| encoded using Structured Fields. | encoded using Structured Fields. This is the same representation | |||
| as the Priority header field value. | ||||
| The request-stream variant of PRIORITY_UPDATE (type=0xF0700) MUST | The request-stream variant of PRIORITY_UPDATE (type=0xF0700) MUST | |||
| reference a request stream. If a server receives a PRIORITY_UPDATE | reference a request stream. If a server receives a PRIORITY_UPDATE | |||
| (type=0xF0700) for a Stream ID that is not a request stream, this | (type=0xF0700) for a Stream ID that is not a request stream, this | |||
| MUST be treated as a connection error of type H3_ID_ERROR. The | MUST be treated as a connection error of type H3_ID_ERROR. The | |||
| Stream ID MUST be within the client-initiated bidirectional stream | Stream ID MUST be within the client-initiated bidirectional stream | |||
| limit. If a server receives a PRIORITY_UPDATE (type=0xF0700) with a | limit. If a server receives a PRIORITY_UPDATE (type=0xF0700) with a | |||
| Stream ID that is beyond the stream limits, this SHOULD be treated as | Stream ID that is beyond the stream limits, this SHOULD be treated as | |||
| a connection error of type H3_ID_ERROR. | a connection error of type H3_ID_ERROR. Generating an error is not | |||
| mandatory because HTTP/3 implementations might have practical | ||||
| barriers to determining the active stream concurrency limit that is | ||||
| applied by the QUIC layer. | ||||
| The push-stream variant PRIORITY_UPDATE (type=0xF0701) MUST reference | The push-stream variant PRIORITY_UPDATE (type=0xF0701) MUST reference | |||
| a promised push stream. If a server receives a PRIORITY_UPDATE | a promised push stream. If a server receives a PRIORITY_UPDATE | |||
| (type=0xF0701) with a Push ID that is greater than the maximum Push | (type=0xF0701) with a Push ID that is greater than the maximum Push | |||
| ID or which has not yet been promised, this MUST be treated as a | ID or which has not yet been promised, this MUST be treated as a | |||
| connection error of type H3_ID_ERROR. | connection error of type H3_ID_ERROR. | |||
| PRIORITY_UPDATE frames of either type are only sent by clients. If a | PRIORITY_UPDATE frames of either type are only sent by clients. If a | |||
| client receives a PRIORITY_UPDATE frame, this MUST be treated as a | client receives a PRIORITY_UPDATE frame, this MUST be treated as a | |||
| connection error of type H3_FRAME_UNEXPECTED. | connection error of type H3_FRAME_UNEXPECTED. | |||
| skipping to change at page 16, line 20 ¶ | skipping to change at page 17, line 28 ¶ | |||
| perfect scheduler and this document only provides some basic | perfect scheduler and this document only provides some basic | |||
| recommendations for implementations. | recommendations for implementations. | |||
| Clients cannot depend on particular treatment based on priority | Clients cannot depend on particular treatment based on priority | |||
| signals. Servers can use other information to prioritize responses. | signals. Servers can use other information to prioritize responses. | |||
| It is RECOMMENDED that, when possible, servers respect the urgency | It is RECOMMENDED that, when possible, servers respect the urgency | |||
| parameter (Section 4.1), sending higher urgency responses before | parameter (Section 4.1), sending higher urgency responses before | |||
| lower urgency responses. | lower urgency responses. | |||
| It is RECOMMENDED that, when possible, servers respect the | ||||
| incremental parameter (Section 4.2). Non-incremental responses of | ||||
| the same urgency SHOULD be served one-by-one based on the Stream ID, | ||||
| which corresponds to the order in which clients make requests. Doing | ||||
| so ensures that clients can use request ordering to influence | ||||
| response order. Incremental responses of the same urgency SHOULD be | ||||
| served in round-robin manner. | ||||
| The incremental parameter indicates how a client processes response | The incremental parameter indicates how a client processes response | |||
| bytes as they arrive. Non-incremental resources are only used when | bytes as they arrive. It is RECOMMENDED that, when possible, servers | |||
| all of the response payload has been received. Incremental resources | respect the incremental parameter (Section 4.2). Non-incremental | |||
| are used as parts, or chunks, of the response payload are received. | resources can only be used when all of the response payload has been | |||
| Therefore, the timing of response data reception at the client, such | received. Therefore, non-incremental responses of the same urgency | |||
| as the time to early bytes or the time to receive the entire payload, | SHOULD be served in their entirety, one-by-one, based on the stream | |||
| plays an important role in perceived performance. Timings depend on | ID, which corresponds to the order in which clients make requests. | |||
| resource size but this scheme provides no explicit guidance about how | Doing so ensures that clients can use request ordering to influence | |||
| a server should use size as an input to prioritization. Instead, the | response order. | |||
| following examples demonstrate how a server that strictly abides the | ||||
| scheduling guidance based on urgency and request generation order | Incremental responses of the same urgency SHOULD be served by sharing | |||
| could find that early requests prevent serving of later requests. | bandwidth amongst them. Incremental resources are used as parts, or | |||
| chunks, of the response payload are received. A client might benefit | ||||
| more from receiving a portion of all these resources rather than the | ||||
| entirety of a single resource. How large a portion of the resource | ||||
| is needed to be useful in improving performance varies. Some | ||||
| resource types place critical elements early, others can use | ||||
| information progressively. This scheme provides no explicit mandate | ||||
| about how a server should use size, type or any other input to decide | ||||
| how to prioritize. | ||||
| There can be scenarios where a server will need to schedule multiple | ||||
| incremental and non-incremental responses at the same urgency level. | ||||
| Strictly abiding the scheduling guidance based on urgency and request | ||||
| generation order might lead to sub-optimal results at the client, as | ||||
| early non-incremental responses might prevent serving of incremental | ||||
| responses issued later. The following are examples of such | ||||
| challenges. | ||||
| 1. At the same urgency level, a non-incremental request for a large | 1. At the same urgency level, a non-incremental request for a large | |||
| resource followed by an incremental request for a small resource. | resource followed by an incremental request for a small resource. | |||
| 2. At the same urgency level, an incremental request of | 2. At the same urgency level, an incremental request of | |||
| indeterminate length followed by a non-incremental large | indeterminate length followed by a non-incremental large | |||
| resource. | resource. | |||
| It is RECOMMENDED that servers avoid such starvation where possible. | It is RECOMMENDED that servers avoid such starvation where possible. | |||
| The method to do so is an implementation decision. For example, a | The method to do so is an implementation decision. For example, a | |||
| skipping to change at page 17, line 21 ¶ | skipping to change at page 18, line 36 ¶ | |||
| on the best way to apply these. A server that is too simple could | on the best way to apply these. A server that is too simple could | |||
| easily push at too high a priority and block client requests, or push | easily push at too high a priority and block client requests, or push | |||
| at too low a priority and delay the response, negating intended goals | at too low a priority and delay the response, negating intended goals | |||
| of server push. | of server push. | |||
| Priority signals are a factor for server push scheduling. The | Priority signals are a factor for server push scheduling. The | |||
| concept of parameter value defaults applies slightly differently | concept of parameter value defaults applies slightly differently | |||
| because there is no explicit client-signalled initial priority. A | because there is no explicit client-signalled initial priority. A | |||
| server can apply priority signals provided in an origin response; see | server can apply priority signals provided in an origin response; see | |||
| the merging guidance given in Section 8. In the absence of origin | the merging guidance given in Section 8. In the absence of origin | |||
| signals, applying default parameter values could be suboptimal. How | signals, applying default parameter values could be suboptimal. By | |||
| ever a server decides to schedule a pushed response, it can signal | whatever means a server decides to schedule a pushed response, it can | |||
| the intended priority to the client by including the Priority field | signal the intended priority to the client by including the Priority | |||
| in a PUSH_PROMISE or HEADERS frame. | field in a PUSH_PROMISE or HEADERS frame. | |||
| 10.1. Intermediaries with Multiple Backend Connections | 10.1. Intermediaries with Multiple Backend Connections | |||
| An intermediary serving an HTTP connection might split requests over | An intermediary serving an HTTP connection might split requests over | |||
| multiple backend connections. When it applies prioritization rules | multiple backend connections. When it applies prioritization rules | |||
| strictly, low priority requests cannot make progress while requests | strictly, low priority requests cannot make progress while requests | |||
| with higher priorities are inflight. This blocking can propagate to | with higher priorities are inflight. This blocking can propagate to | |||
| backend connections, which the peer might interpret as a connection | backend connections, which the peer might interpret as a connection | |||
| stall. Endpoints often implement protections against stalls, such as | stall. Endpoints often implement protections against stalls, such as | |||
| abruptly closing connections after a certain time period. To reduce | abruptly closing connections after a certain time period. To reduce | |||
| skipping to change at page 18, line 30 ¶ | skipping to change at page 19, line 43 ¶ | |||
| when scheduling both new data and retransmission data might better | when scheduling both new data and retransmission data might better | |||
| match the expectations of the application. However, there are no | match the expectations of the application. However, there are no | |||
| requirements on how a transport chooses to schedule based on this | requirements on how a transport chooses to schedule based on this | |||
| information because the decision depends on several factors and | information because the decision depends on several factors and | |||
| trade-offs. It could prioritize new data for a higher urgency stream | trade-offs. It could prioritize new data for a higher urgency stream | |||
| over retransmission data for a lower priority stream, or it could | over retransmission data for a lower priority stream, or it could | |||
| prioritize retransmission data over new data irrespective of | prioritize retransmission data over new data irrespective of | |||
| urgencies. | urgencies. | |||
| Section 6.2.4 of [QUIC-RECOVERY], also highlights consideration of | Section 6.2.4 of [QUIC-RECOVERY], also highlights consideration of | |||
| application priorities when sending probe packets after PTO timer | application priorities when sending probe packets after Probe Timeout | |||
| expiration. An QUIC implementation supporting application-indicated | timer expiration. A QUIC implementation supporting application- | |||
| priorities might use the relative priority of streams when choosing | indicated priorities might use the relative priority of streams when | |||
| probe data. | choosing probe data. | |||
| 13. Fairness | 13. Fairness | |||
| As a general guideline, a server SHOULD NOT use priority information | As a general guideline, a server SHOULD NOT use priority information | |||
| for making schedule decisions across multiple connections, unless it | for making scheduling decisions across multiple connections, unless | |||
| knows that those connections originate from the same client. Due to | it knows that those connections originate from the same client. Due | |||
| this, priority information conveyed over a non-coalesced HTTP | to this, priority information conveyed over a non-coalesced HTTP | |||
| connection (e.g., HTTP/1.1) might go unused. | connection (e.g., HTTP/1.1) might go unused. | |||
| The remainder of this section discusses scenarios where unfairness is | The remainder of this section discusses scenarios where unfairness is | |||
| problematic and presents possible mitigations, or where unfairness is | problematic and presents possible mitigations, or where unfairness is | |||
| desirable. | desirable. | |||
| 13.1. Coalescing Intermediaries | 13.1. Coalescing Intermediaries | |||
| When an intermediary coalesces HTTP requests coming from multiple | When an intermediary coalesces HTTP requests coming from multiple | |||
| clients into one HTTP/2 or HTTP/3 connection going to the backend | clients into one HTTP/2 or HTTP/3 connection going to the backend | |||
| skipping to change at page 19, line 17 ¶ | skipping to change at page 20, line 36 ¶ | |||
| an example, a resource-constrained server might defer the | an example, a resource-constrained server might defer the | |||
| transmission of software update files that would have the background | transmission of software update files that would have the background | |||
| urgency being associated. However, in the worst case, the asymmetry | urgency being associated. However, in the worst case, the asymmetry | |||
| between the precedence declared by multiple clients might cause | between the precedence declared by multiple clients might cause | |||
| responses going to one user agent to be delayed totally after those | responses going to one user agent to be delayed totally after those | |||
| going to another. | going to another. | |||
| In order to mitigate this fairness problem, a server could use | In order to mitigate this fairness problem, a server could use | |||
| knowledge about the intermediary as another signal in its | knowledge about the intermediary as another signal in its | |||
| prioritization decisions. For instance, if a server knows the | prioritization decisions. For instance, if a server knows the | |||
| intermediary is coalescing requests, then it could serve the | intermediary is coalescing requests, then it could avoid serving the | |||
| responses in round-robin manner. This can work if the constrained | responses in their entirety and instead distribute bandwidth (for | |||
| example, in a round-robin manner). This can work if the constrained | ||||
| resource is network capacity between the intermediary and the user | resource is network capacity between the intermediary and the user | |||
| agent, as the intermediary buffers responses and forwards the chunks | agent, as the intermediary buffers responses and forwards the chunks | |||
| based on the prioritization scheme it implements. | based on the prioritization scheme it implements. | |||
| A server can determine if a request came from an intermediary through | A server can determine if a request came from an intermediary through | |||
| configuration, or by consulting if that request contains one of the | configuration, or by consulting if that request contains one of the | |||
| following header fields: | following header fields: | |||
| * Forwarded [FORWARDED], X-Forwarded-For | * Forwarded [FORWARDED], X-Forwarded-For | |||
| * Via (see Section 7.6.3 of [HTTP]) | * Via (see Section 7.6.3 of [HTTP]) | |||
| 13.2. HTTP/1.x Back Ends | 13.2. HTTP/1.x Back Ends | |||
| It is common for CDN infrastructure to support different HTTP | It is common for CDN infrastructure to support different HTTP | |||
| versions on the front end and back end. For instance, the client- | versions on the front end and back end. For instance, the client- | |||
| facing edge might support HTTP/2 and HTTP/3 while communication to | facing edge might support HTTP/2 and HTTP/3 while communication to | |||
| back end servers is done using HTTP/1.1. Unlike with connection | back end servers is done using HTTP/1.1. Unlike with connection | |||
| coalescing, the CDN will "de-mux" requests into discrete connections | coalescing, the CDN will "de-mux" requests into discrete connections | |||
| to the back end. As HTTP/1.1 and older do not provide a way to | to the back end. HTTP/1.1 and older do not support response | |||
| concurrently transmit multiple responses, there is no immediate | multiplexing in a single connection, so there is not a fairness | |||
| fairness issue in protocol. However, back end servers MAY still use | problem. However, back end servers MAY still use client headers for | |||
| client headers for request scheduling. Back end servers SHOULD only | request scheduling. Back end servers SHOULD only schedule based on | |||
| schedule based on client priority information where that information | client priority information where that information can be scoped to | |||
| can be scoped to individual end clients. Authentication and other | individual end clients. Authentication and other session information | |||
| session information might provide this linkability. | might provide this linkability. | |||
| 13.3. Intentional Introduction of Unfairness | 13.3. Intentional Introduction of Unfairness | |||
| It is sometimes beneficial to deprioritize the transmission of one | It is sometimes beneficial to deprioritize the transmission of one | |||
| connection over others, knowing that doing so introduces a certain | connection over others, knowing that doing so introduces a certain | |||
| amount of unfairness between the connections and therefore between | amount of unfairness between the connections and therefore between | |||
| the requests served on those connections. | the requests served on those connections. | |||
| For example, a server might use a scavenging congestion controller on | For example, a server might use a scavenging congestion controller on | |||
| connections that only convey background priority responses such as | connections that only convey background priority responses such as | |||
| skipping to change at page 20, line 37 ¶ | skipping to change at page 22, line 11 ¶ | |||
| value of the cached header field when serving the cached response, | value of the cached header field when serving the cached response, | |||
| only because the header field is defined as end-to-end rather than | only because the header field is defined as end-to-end rather than | |||
| hop-by-hop. | hop-by-hop. | |||
| It should also be noted that the use of a header field carrying a | It should also be noted that the use of a header field carrying a | |||
| textual value makes the prioritization scheme extensible; see the | textual value makes the prioritization scheme extensible; see the | |||
| discussion below. | discussion below. | |||
| 15. Security Considerations | 15. Security Considerations | |||
| [CVE-2019-9513] aka "Resource Loop", is a DoS attack based on | [RFC7540] stream prioritization relies on dependencies. | |||
| manipulation of the RFC 7540 priority tree. Extensible priorities | Considerations are presented to implementations, describing how | |||
| does not use stream dependencies, which mitigates this vulnerability. | limiting state or work commitments can avoid some types of problems. | |||
| In addition, [CVE-2019-9513] aka "Resource Loop", is an example of a | ||||
| Section 5.3.4 of [RFC7540] describes a scenario where closure of | DoS attack that abuses stream dependencies. Extensible priorities | |||
| streams in the priority tree could cause suboptimal prioritization. | does not use dependencies, which avoids these issues. | |||
| To avoid this, [RFC7540] states that "an endpoint SHOULD retain | ||||
| stream prioritization state for a period after streams become | ||||
| closed". Retaining state for streams no longer counted towards | ||||
| stream concurrency consumes server resources. Furthermore, [RFC7540] | ||||
| identifies that reprioritization of a closed stream could affect | ||||
| dependents; it recommends updating the priority tree if sufficient | ||||
| state is stored, which will also consume server resources. To limit | ||||
| this commitment, it is stated that "The amount of prioritization | ||||
| state that is retained MAY be limited" and "If a limit is applied, | ||||
| endpoints SHOULD maintain state for at least as many streams as | ||||
| allowed by their setting for SETTINGS_MAX_CONCURRENT_STREAMS.". | ||||
| Extensible priorities does not use stream dependencies, which | ||||
| minimizes most of the resource concerns related to this scenario. | ||||
| Section 5.3.4 of [RFC7540] also presents considerations about the | Section 7 describes considerations for server buffering of | |||
| state required to store priority information about streams in an | PRIORITY_UPDATE frames. | |||
| "idle" state. This state can be limited by adopting the guidance | ||||
| about concurrency limits described above. Extensible priorities is | ||||
| subject to a similar consideration because PRIORITY_UPDATE frames may | ||||
| arrive before the request that they reference. A server is required | ||||
| to store the information in order to apply the most up-to-date signal | ||||
| to the request. However, HTTP/3 implementations might have practical | ||||
| barriers to determining reasonable stream concurrency limits | ||||
| depending on the information that is available to them from the QUIC | ||||
| transport layer. | ||||
| 16. IANA Considerations | Section 10 presents examples where servers that prioritize responses | |||
| in a certain way might be starved of the ability to transmit payload. | ||||
| This specification registers the following entry in the Permanent | The security considerations from [STRUCTURED-FIELDS] apply to | |||
| Message Header Field Names registry established by [RFC3864]: | processing of priority parameters defined in Section 4. | |||
| Header field name: Priority | 16. IANA Considerations | |||
| Applicable protocol: http | This specification registers the following entry in the the Hypertext | |||
| Transfer Protocol (HTTP) Field Name Registry established by [HTTP]: | ||||
| Status: standard | Field name: Priority | |||
| Author/change controller: IETF | Status: permanent | |||
| Specification document(s): This document | Specification document(s): This document | |||
| Related information: n/a | ||||
| This specification registers the following entry in the HTTP/2 | This specification registers the following entry in the HTTP/2 | |||
| Settings registry established by [HTTP2]: | Settings registry established by [RFC7540]: | |||
| Name: SETTINGS_NO_RFC7540_PRIORITIES | Name: SETTINGS_NO_RFC7540_PRIORITIES | |||
| Code: 0x9 | Code: 0x9 | |||
| Initial value: 0 | Initial value: 0 | |||
| Specification: This document | Specification: This document | |||
| This specification registers the following entry in the HTTP/2 Frame | This specification registers the following entry in the HTTP/2 Frame | |||
| Type registry established by [HTTP2]: | Type registry established by [RFC7540]: | |||
| Frame Type: PRIORITY_UPDATE | Frame Type: PRIORITY_UPDATE | |||
| Code: 0x10 | Code: 0x10 | |||
| Specification: This document | Specification: This document | |||
| This specification registers the following entries in the HTTP/3 | This specification registers the following entries in the HTTP/3 | |||
| Frame Type registry established by [HTTP3]: | Frame Type registry established by [HTTP3]: | |||
| Frame Type: PRIORITY_UPDATE | Frame Type: PRIORITY_UPDATE | |||
| skipping to change at page 24, line 5 ¶ | skipping to change at page 25, line 5 ¶ | |||
| Priorities", Work in Progress, Internet-Draft, draft- | Priorities", Work in Progress, Internet-Draft, draft- | |||
| lassey-priority-setting-00, 25 July 2019, | lassey-priority-setting-00, 25 July 2019, | |||
| <https://datatracker.ietf.org/doc/html/draft-lassey- | <https://datatracker.ietf.org/doc/html/draft-lassey- | |||
| priority-setting-00>. | priority-setting-00>. | |||
| [QUIC-RECOVERY] | [QUIC-RECOVERY] | |||
| Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | |||
| and Congestion Control", RFC 9002, DOI 10.17487/RFC9002, | and Congestion Control", RFC 9002, DOI 10.17487/RFC9002, | |||
| May 2021, <https://www.rfc-editor.org/rfc/rfc9002>. | May 2021, <https://www.rfc-editor.org/rfc/rfc9002>. | |||
| [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | ||||
| Procedures for Message Header Fields", BCP 90, RFC 3864, | ||||
| DOI 10.17487/RFC3864, September 2004, | ||||
| <https://www.rfc-editor.org/rfc/rfc3864>. | ||||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
| <https://www.rfc-editor.org/rfc/rfc7540>. | <https://www.rfc-editor.org/rfc/rfc7540>. | |||
| [RFC8081] Lilley, C., "The "font" Top-Level Media Type", RFC 8081, | [RFC8081] Lilley, C., "The "font" Top-Level Media Type", RFC 8081, | |||
| DOI 10.17487/RFC8081, February 2017, | DOI 10.17487/RFC8081, February 2017, | |||
| <https://www.rfc-editor.org/rfc/rfc8081>. | <https://www.rfc-editor.org/rfc/rfc8081>. | |||
| Appendix A. Acknowledgements | Appendix A. Acknowledgements | |||
| Roy Fielding presented the idea of using a header field for | Roy Fielding presented the idea of using a header field for | |||
| representing priorities in http://tools.ietf.org/agenda/83/slides/ | representing priorities in http://tools.ietf.org/agenda/83/slides/ | |||
| slides-83-httpbis-5.pdf (http://tools.ietf.org/agenda/83/slides/ | slides-83-httpbis-5.pdf (http://tools.ietf.org/agenda/83/slides/ | |||
| slides-83-httpbis-5.pdf). In https://github.com/pmeenan/http3- | slides-83-httpbis-5.pdf). In https://github.com/pmeenan/http3- | |||
| prioritization-proposal (https://github.com/pmeenan/http3- | prioritization-proposal (https://github.com/pmeenan/http3- | |||
| prioritization-proposal), Patrick Meenan advocates for representing | prioritization-proposal), Patrick Meenan advocated for representing | |||
| the priorities using a tuple of urgency and concurrency. The ability | the priorities using a tuple of urgency and concurrency. The ability | |||
| to disable HTTP/2 prioritization is inspired by | to disable HTTP/2 prioritization is inspired by | |||
| [I-D.lassey-priority-setting], authored by Brad Lassey and Lucas | [I-D.lassey-priority-setting], authored by Brad Lassey and Lucas | |||
| Pardue, with modifications based on feedback that was not | Pardue, with modifications based on feedback that was not | |||
| incorporated into an update to that document. | incorporated into an update to that document. | |||
| The motivation for defining an alternative to HTTP/2 priorities is | The motivation for defining an alternative to HTTP/2 priorities is | |||
| drawn from discussion within the broad HTTP community. Special | drawn from discussion within the broad HTTP community. Special | |||
| thanks to Roberto Peon, Martin Thomson and Netflix for text that was | thanks to Roberto Peon, Martin Thomson and Netflix for text that was | |||
| incorporated explicitly in this document. | incorporated explicitly in this document. | |||
| In addition to the people above, this document owes a lot to the | In addition to the people above, this document owes a lot to the | |||
| extensive discussion in the HTTP priority design team, consisting of | extensive discussion in the HTTP priority design team, consisting of | |||
| Alan Frindell, Andrew Galloni, Craig Taylor, Ian Swett, Kazuho Oku, | Alan Frindell, Andrew Galloni, Craig Taylor, Ian Swett, Kazuho Oku, | |||
| Lucas Pardue, Matthew Cox, Mike Bishop, Roberto Peon, Robin Marx, Roy | Lucas Pardue, Matthew Cox, Mike Bishop, Roberto Peon, Robin Marx, Roy | |||
| Fielding. | Fielding. | |||
| Yang Chi contributed the section on retransmission scheduling. | ||||
| Appendix B. Change Log | Appendix B. Change Log | |||
| B.1. Since draft-ietf-httpbis-priority-05 | B.1. Since draft-ietf-httpbis-priority-06 | |||
| * Focus on editorial changes | ||||
| * Clarify rules about Sf-Dictionary handling in headers | ||||
| * Split policy for parameter IANA registry into two sections based | ||||
| on key length | ||||
| B.2. Since draft-ietf-httpbis-priority-05 | ||||
| * Renamed SETTINGS_DEPRECATE_RFC7540_PRIORITIES to | * Renamed SETTINGS_DEPRECATE_RFC7540_PRIORITIES to | |||
| SETTINGS_NO_RFC7540_PRIORITIES | SETTINGS_NO_RFC7540_PRIORITIES | |||
| * Clarify that senders of the HTTP/2 setting can use any alternative | * Clarify that senders of the HTTP/2 setting can use any alternative | |||
| (#1679, #1705) | (#1679, #1705) | |||
| B.2. Since draft-ietf-httpbis-priority-04 | B.3. Since draft-ietf-httpbis-priority-04 | |||
| * Renamed SETTINGS_DEPRECATE_HTTP2_PRIORITIES to | * Renamed SETTINGS_DEPRECATE_HTTP2_PRIORITIES to | |||
| SETTINGS_DEPRECATE_RFC7540_PRIORITIES (#1601) | SETTINGS_DEPRECATE_RFC7540_PRIORITIES (#1601) | |||
| * Reoriented text towards RFC7540bis (#1561, #1601) | * Reoriented text towards RFC7540bis (#1561, #1601) | |||
| * Clarify intermediary behavior (#1562) | * Clarify intermediary behavior (#1562) | |||
| B.3. Since draft-ietf-httpbis-priority-03 | B.4. Since draft-ietf-httpbis-priority-03 | |||
| * Add statement about what this scheme applies to. Clarify | * Add statement about what this scheme applies to. Clarify | |||
| extensions can use it but must define how themselves (#1550, | extensions can use it but must define how themselves (#1550, | |||
| #1559) | #1559) | |||
| * Describe scheduling considerations for the CONNECT method (#1495, | * Describe scheduling considerations for the CONNECT method (#1495, | |||
| #1544) | #1544) | |||
| * Describe scheduling considerations for retransmitted data (#1429, | * Describe scheduling considerations for retransmitted data (#1429, | |||
| #1504) | #1504) | |||
| * Suggest intermediaries might avoid strict prioritization (#1562) | * Suggest intermediaries might avoid strict prioritization (#1562) | |||
| B.4. Since draft-ietf-httpbis-priority-02 | B.5. Since draft-ietf-httpbis-priority-02 | |||
| * Describe considerations for server push prioritization (#1056, | * Describe considerations for server push prioritization (#1056, | |||
| #1345) | #1345) | |||
| * Define HTTP/2 PRIORITY_UPDATE ID limits in HTTP/2 terms (#1261, | * Define HTTP/2 PRIORITY_UPDATE ID limits in HTTP/2 terms (#1261, | |||
| #1344) | #1344) | |||
| * Add a Parameters registry (#1371) | * Add a Parameters registry (#1371) | |||
| B.5. Since draft-ietf-httpbis-priority-01 | B.6. Since draft-ietf-httpbis-priority-01 | |||
| * PRIORITY_UPDATE frame changes (#1096, #1079, #1167, #1262, #1267, | * PRIORITY_UPDATE frame changes (#1096, #1079, #1167, #1262, #1267, | |||
| #1271) | #1271) | |||
| * Add section to describe server scheduling considerations (#1215, | * Add section to describe server scheduling considerations (#1215, | |||
| #1232, #1266) | #1232, #1266) | |||
| * Remove specific instructions related to intermediary fairness | * Remove specific instructions related to intermediary fairness | |||
| (#1022, #1264) | (#1022, #1264) | |||
| B.6. Since draft-ietf-httpbis-priority-00 | B.7. Since draft-ietf-httpbis-priority-00 | |||
| * Move text around (#1217, #1218) | * Move text around (#1217, #1218) | |||
| * Editorial change to the default urgency. The value is 3, which | * Editorial change to the default urgency. The value is 3, which | |||
| was always the intent of previous changes. | was always the intent of previous changes. | |||
| B.7. Since draft-kazuho-httpbis-priority-04 | B.8. Since draft-kazuho-httpbis-priority-04 | |||
| * Minimize semantics of Urgency levels (#1023, #1026) | * Minimize semantics of Urgency levels (#1023, #1026) | |||
| * Reduce guidance about how intermediary implements merging priority | * Reduce guidance about how intermediary implements merging priority | |||
| signals (#1026) | signals (#1026) | |||
| * Remove mention of CDN-Loop (#1062) | * Remove mention of CDN-Loop (#1062) | |||
| * Editorial changes | * Editorial changes | |||
| * Make changes due to WG adoption | * Make changes due to WG adoption | |||
| * Removed outdated Consideration (#118) | * Removed outdated Consideration (#118) | |||
| B.8. Since draft-kazuho-httpbis-priority-03 | B.9. Since draft-kazuho-httpbis-priority-03 | |||
| * Changed numbering from [-1,6] to [0,7] (#78) | * Changed numbering from [-1,6] to [0,7] (#78) | |||
| * Replaced priority scheme negotiation with HTTP/2 priority | * Replaced priority scheme negotiation with HTTP/2 priority | |||
| deprecation (#100) | deprecation (#100) | |||
| * Shorten parameter names (#108) | * Shorten parameter names (#108) | |||
| * Expand on considerations (#105, #107, #109, #110, #111, #113) | * Expand on considerations (#105, #107, #109, #110, #111, #113) | |||
| B.9. Since draft-kazuho-httpbis-priority-02 | B.10. Since draft-kazuho-httpbis-priority-02 | |||
| * Consolidation of the problem statement (#61, #73) | * Consolidation of the problem statement (#61, #73) | |||
| * Define SETTINGS_PRIORITIES for negotiation (#58, #69) | * Define SETTINGS_PRIORITIES for negotiation (#58, #69) | |||
| * Define PRIORITY_UPDATE frame for HTTP/2 and HTTP/3 (#51) | * Define PRIORITY_UPDATE frame for HTTP/2 and HTTP/3 (#51) | |||
| * Explain fairness issue and mitigations (#56) | * Explain fairness issue and mitigations (#56) | |||
| B.10. Since draft-kazuho-httpbis-priority-01 | B.11. Since draft-kazuho-httpbis-priority-01 | |||
| * Explain how reprioritization might be supported. | * Explain how reprioritization might be supported. | |||
| B.11. Since draft-kazuho-httpbis-priority-00 | B.12. Since draft-kazuho-httpbis-priority-00 | |||
| * Expand urgency levels from 3 to 8. | * Expand urgency levels from 3 to 8. | |||
| Authors' Addresses | Authors' Addresses | |||
| Kazuho Oku | Kazuho Oku | |||
| Fastly | Fastly | |||
| Email: kazuhooku@gmail.com | Email: kazuhooku@gmail.com | |||
| End of changes. 71 change blocks. | ||||
| 233 lines changed or deleted | 263 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||