draft-ietf-httpbis-priority-03.txt | draft-ietf-httpbis-priority-04.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: 15 July 2021 Cloudflare | Expires: 13 January 2022 Cloudflare | |||
11 January 2021 | 12 July 2021 | |||
Extensible Prioritization Scheme for HTTP | Extensible Prioritization Scheme for HTTP | |||
draft-ietf-httpbis-priority-03 | draft-ietf-httpbis-priority-04 | |||
Abstract | Abstract | |||
This document describes a scheme for prioritizing HTTP responses. | This document describes a scheme for prioritizing HTTP responses. | |||
This scheme expresses the priority of each HTTP response using | This scheme expresses the priority of each HTTP response using | |||
absolute values, rather than as a relative relationship between a | absolute values, rather than as a relative relationship between a | |||
group of HTTP responses. | group of HTTP responses. | |||
This document defines the Priority header field for communicating the | This document defines the Priority header field for communicating the | |||
initial priority in an HTTP version-independent manner, as well as | initial priority in an HTTP version-independent manner, as well as | |||
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 15 July 2021. | This Internet-Draft will expire on 13 January 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 HTTP/2 Priorities . . . . . . . . . 4 | 2. Motivation for Replacing HTTP/2 Priorities . . . . . . . . . 4 | |||
2.1. Disabling HTTP/2 Priorities . . . . . . . . . . . . . . . 5 | 2.1. Disabling HTTP/2 Priorities . . . . . . . . . . . . . . . 6 | |||
3. Priority Parameters . . . . . . . . . . . . . . . . . . . . . 6 | 3. Applicability of the Extensible Priority Scheme . . . . . . . 6 | |||
3.1. Urgency . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 4. Priority Parameters . . . . . . . . . . . . . . . . . . . . . 7 | |||
3.2. Incremental . . . . . . . . . . . . . . . . . . . . . . . 8 | 4.1. Urgency . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
3.3. Defining New Parameters . . . . . . . . . . . . . . . . . 8 | 4.2. Incremental . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
3.3.1. Registration . . . . . . . . . . . . . . . . . . . . 9 | 4.3. Defining New Parameters . . . . . . . . . . . . . . . . . 9 | |||
4. The Priority HTTP Header Field . . . . . . . . . . . . . . . 9 | 4.3.1. Registration . . . . . . . . . . . . . . . . . . . . 9 | |||
5. Reprioritization . . . . . . . . . . . . . . . . . . . . . . 10 | 5. The Priority HTTP Header Field . . . . . . . . . . . . . . . 10 | |||
6. The PRIORITY_UPDATE Frame . . . . . . . . . . . . . . . . . . 10 | 6. Reprioritization . . . . . . . . . . . . . . . . . . . . . . 10 | |||
6.1. HTTP/2 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 11 | 7. The PRIORITY_UPDATE Frame . . . . . . . . . . . . . . . . . . 11 | |||
6.2. HTTP/3 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 12 | 7.1. HTTP/2 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 11 | |||
7. Merging Client- and Server-Driven Parameters . . . . . . . . 13 | 7.2. HTTP/3 PRIORITY_UPDATE Frame . . . . . . . . . . . . . . 13 | |||
8. Client Scheduling . . . . . . . . . . . . . . . . . . . . . . 14 | 8. Merging Client- and Server-Driven Parameters . . . . . . . . 14 | |||
9. Server Scheduling . . . . . . . . . . . . . . . . . . . . . . 14 | 9. Client Scheduling . . . . . . . . . . . . . . . . . . . . . . 15 | |||
10. Fairness . . . . . . . . . . . . . . . . . . . . . . . . . . 16 | 10. Server Scheduling . . . . . . . . . . . . . . . . . . . . . . 15 | |||
10.1. Coalescing Intermediaries . . . . . . . . . . . . . . . 16 | 10.1. Intermediaries with Multiple Backend Connections . . . . 17 | |||
10.2. HTTP/1.x Back Ends . . . . . . . . . . . . . . . . . . . 17 | 11. Scheduling and the CONNECT Method . . . . . . . . . . . . . . 17 | |||
10.3. Intentional Introduction of Unfairness . . . . . . . . . 17 | 12. Retransmission Scheduling . . . . . . . . . . . . . . . . . . 17 | |||
11. Why use an End-to-End Header Field? . . . . . . . . . . . . . 17 | 13. Fairness . . . . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
12. Security Considerations . . . . . . . . . . . . . . . . . . . 18 | 13.1. Coalescing Intermediaries . . . . . . . . . . . . . . . 18 | |||
13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 19 | 13.2. HTTP/1.x Back Ends . . . . . . . . . . . . . . . . . . . 19 | |||
14. References . . . . . . . . . . . . . . . . . . . . . . . . . 20 | 13.3. Intentional Introduction of Unfairness . . . . . . . . . 19 | |||
14.1. Normative References . . . . . . . . . . . . . . . . . . 20 | ||||
14.2. Informative References . . . . . . . . . . . . . . . . . 21 | 14. Why use an End-to-End Header Field? . . . . . . . . . . . . . 19 | |||
Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 21 | 15. Security Considerations . . . . . . . . . . . . . . . . . . . 20 | |||
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 22 | 16. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | |||
B.1. Since draft-ietf-httpbis-priority-01 . . . . . . . . . . 22 | 17. References . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
B.2. Since draft-ietf-httpbis-priority-01 . . . . . . . . . . 22 | 17.1. Normative References . . . . . . . . . . . . . . . . . . 22 | |||
B.3. Since draft-ietf-httpbis-priority-00 . . . . . . . . . . 22 | 17.2. Informative References . . . . . . . . . . . . . . . . . 22 | |||
B.4. Since draft-kazuho-httpbis-priority-04 . . . . . . . . . 22 | Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 23 | |||
B.5. Since draft-kazuho-httpbis-priority-03 . . . . . . . . . 23 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 24 | |||
B.6. Since draft-kazuho-httpbis-priority-02 . . . . . . . . . 23 | B.1. Since draft-ietf-httpbis-priority-03 . . . . . . . . . . 24 | |||
B.7. Since draft-kazuho-httpbis-priority-01 . . . . . . . . . 23 | B.2. Since draft-ietf-httpbis-priority-02 . . . . . . . . . . 24 | |||
B.8. Since draft-kazuho-httpbis-priority-00 . . . . . . . . . 23 | B.3. Since draft-ietf-httpbis-priority-01 . . . . . . . . . . 24 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 23 | B.4. Since draft-ietf-httpbis-priority-00 . . . . . . . . . . 25 | |||
B.5. Since draft-kazuho-httpbis-priority-04 . . . . . . . . . 25 | ||||
B.6. Since draft-kazuho-httpbis-priority-03 . . . . . . . . . 25 | ||||
B.7. Since draft-kazuho-httpbis-priority-02 . . . . . . . . . 25 | ||||
B.8. Since draft-kazuho-httpbis-priority-01 . . . . . . . . . 25 | ||||
B.9. Since draft-kazuho-httpbis-priority-00 . . . . . . . . . 26 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 26 | ||||
1. Introduction | 1. Introduction | |||
It is common for an HTTP ([RFC7230]) resource representation to have | It is common for an HTTP ([RFC7230]) resource representation 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, leading to further retrieval requests. Meanwhile, | |||
the nature of the relationship determines whether the client is | the nature of the relationship determines whether the client is | |||
blocked from continuing to process locally available resources. For | blocked from continuing to process locally available resources. For | |||
example, visual rendering of an HTML document could be blocked by the | example, visual rendering of an HTML document could be blocked by the | |||
retrieval of a CSS file that the document refers to. In contrast, | retrieval of a CSS file that the document refers to. In contrast, | |||
inline images do not block rendering and get drawn incrementally as | inline images do not block rendering and get drawn incrementally as | |||
the chunks of the images arrive. | the chunks of the images arrive. | |||
To provide meaningful presentation of a document at the earliest | To provide meaningful presentation of a 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. | |||
HTTP/2 ([RFC7540]) provides such a prioritization scheme. A client | HTTP/2 ([HTTP2]) provides such a prioritization scheme. A client | |||
sends a series of PRIORITY frames to communicate to the server a | sends a series of PRIORITY frames to communicate to the server a | |||
"priority tree"; this represents the client's preferred ordering and | "priority tree"; this represents the client's preferred ordering and | |||
weighted distribution of the bandwidth among the HTTP responses. | weighted distribution of the bandwidth among the HTTP responses. | |||
However, the design and implementation of this scheme has been | However, the design and implementation of this scheme has been | |||
observed to have shortcomings, explained in Section 2. | observed to have shortcomings, explained in Section 2. | |||
This document defines the Priority HTTP header field that can be used | This document defines the Priority HTTP header field that can be used | |||
by both client and server to specify the precedence of HTTP responses | by both client and server to specify the precedence of HTTP responses | |||
in a standardized, extensible, protocol-version-independent, end-to- | in a standardized, extensible, protocol-version-independent, end-to- | |||
end format. Along with the protocol-version-specific frame for | end format. Along with the protocol-version-specific frame for | |||
skipping to change at page 4, line 15 ¶ | skipping to change at page 4, line 22 ¶ | |||
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-token and sf-boolean are imported from | The terms sf-token and sf-boolean are imported from | |||
[STRUCTURED-FIELDS]. | [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 [RFC7540]. | from [HTTP2]. | |||
This document uses the variable-length integer encoding from | This document uses the variable-length integer encoding from [QUIC]. | |||
[I-D.ietf-quic-transport]. | ||||
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 [I-D.ietf-quic-http], | identifier 0x0, and HTTP/3 control stream; see [HTTP3], | |||
Section 6.2.1. | Section 6.2.1. | |||
2. Motivation for Replacing HTTP/2 Priorities | 2. Motivation for Replacing HTTP/2 Priorities | |||
An important feature of any implementation of a protocol that | An important feature of any implementation of a protocol that | |||
provides multiplexing is the ability to prioritize the sending of | provides multiplexing is the ability to prioritize the sending of | |||
information. This was an important realization in the design of | information. This was an important realization in the design of | |||
HTTP/2. Prioritization is a difficult problem, so it will always be | HTTP/2. Prioritization is a difficult problem, so it will always be | |||
suboptimal, particularly if one endpoint operates in ignorance of the | suboptimal, particularly if one endpoint operates in ignorance of the | |||
needs of its peer. | needs of its peer. | |||
HTTP/2 introduced a complex prioritization signaling scheme that used | HTTP/2 introduced a complex prioritization scheme that uses a | |||
a combination of dependencies and weights, formed into an unbalanced | combination of stream dependencies and weights to describe an | |||
tree. This scheme has suffered from poor deployment and | unbalanced tree. This scheme has suffered from poor deployment and | |||
interoperability. | interoperability. | |||
The rich flexibility of client-driven HTTP/2 prioritization tree | Clients build an HTTP/2 prioritization tree through a series of | |||
building is rarely exercised. Experience has shown that clients tend | individual stream relationships, which are transferred to the server | |||
to choose a single model optimized for a web use case and experiment | using HTTP/2 priority signals in either of three forms. First, a | |||
within the model constraints, or do nothing at all. Furthermore, | HEADERS frame with the PRIORITY flag set is an explicit signal that | |||
many clients build their prioritization tree in a unique way, which | includes an Exclusive flag, Stream Dependency field, and Weight | |||
makes it difficult for servers to understand their intent and act or | field. Second, a HEADERS frame with no PRIORITY flag is an implicit | |||
intervene accordingly. | signal to use the default priority. Third, the PRIORITY frame, which | |||
is always explicit since it always contains an Exclusive flag, Stream | ||||
Dependency field, and Weight field. | ||||
The rich flexibility of tree building is rarely exercised. | ||||
Experience has shown that clients tend to choose a single model | ||||
optimized for a web use case and experiment within the model | ||||
constraints, or do nothing at all. Furthermore, many clients build | ||||
their prioritization tree in a unique way, which makes it difficult | ||||
for servers to understand their intent and act or intervene | ||||
accordingly. | ||||
Many HTTP/2 server implementations do not include support for the | Many HTTP/2 server implementations do not include support for the | |||
priority scheme. Some instead favor custom server-driven schemes | priority scheme. Some instead favor custom server-driven schemes | |||
based on heuristics or other hints, such as resource content type or | based on heuristics or other hints, such as resource content type or | |||
request generation order. For example, a server, with knowledge of | request generation order. For example, a server, with knowledge of | |||
the document structure, might want to prioritize the delivery of | the document structure, might want to prioritize the delivery of | |||
images that are critical to user experience above other images, but | images that are critical to user experience above other images, but | |||
below the CSS files. Since client trees vary, it is impossible for | below the CSS files. Since client trees vary, it is impossible for | |||
the server to determine how such images should be prioritized against | the server to determine how such images should be prioritized against | |||
other responses. | other responses. | |||
skipping to change at page 5, line 32 ¶ | skipping to change at page 5, line 40 ¶ | |||
HTTP/2 describes denial-of-service considerations for | HTTP/2 describes denial-of-service considerations for | |||
implementations. On 2019-08-13 Netflix issued an advisory notice | implementations. On 2019-08-13 Netflix issued an advisory notice | |||
about the discovery of several resource exhaustion vectors affecting | about the discovery of several resource exhaustion vectors affecting | |||
multiple HTTP/2 implementations. One attack, [CVE-2019-9513] aka | multiple HTTP/2 implementations. One attack, [CVE-2019-9513] aka | |||
"Resource Loop", is based on manipulation of the priority tree. | "Resource Loop", is based on manipulation of the priority tree. | |||
The HTTP/2 scheme depends on in-order delivery of signals, leading to | The HTTP/2 scheme depends on in-order delivery of signals, leading to | |||
challenges in porting the scheme to protocols that do not provide | challenges in porting the scheme to protocols that do not provide | |||
global ordering. For example, the scheme cannot be used in HTTP/3 | global ordering. For example, the scheme cannot be used in HTTP/3 | |||
[I-D.ietf-quic-http] without changing the signal and its processing. | [HTTP3] without changing the signal and its processing. | |||
Considering the problems with deployment and adaptability to HTTP/3, | Considering the problems with deployment and adaptability to HTTP/3, | |||
retaining the HTTP/2 priority scheme increases the complexity of the | retaining the HTTP/2 priority scheme increases the complexity of the | |||
entire system without any evidence that the value it provides offsets | entire system without any evidence that the value it provides offsets | |||
that complexity. In fact, multiple experiments from independent | that complexity. In fact, multiple experiments from independent | |||
research have shown that simpler schemes can reach at least | research have shown that simpler schemes can reach at least | |||
equivalent performance characteristics compared to the more complex | equivalent performance characteristics compared to the more complex | |||
HTTP/2 setups seen in practice, at least for the web use case. | HTTP/2 setups seen in practice, at least for the web use case. | |||
2.1. Disabling HTTP/2 Priorities | 2.1. Disabling HTTP/2 Priorities | |||
The problems and insights set out above are motivation for allowing | The problems and insights set out above are motivation for allowing | |||
endpoints to opt out of using the HTTP/2 priority scheme, in favor of | endpoints to opt out of using the HTTP/2 priority scheme, in favor of | |||
using an alternative such as the scheme defined in this | using an alternative such as the scheme defined in this | |||
specification. The SETTINGS_DEPRECATE_HTTP2_PRIORITIES setting | specification. The SETTINGS_DEPRECATE_HTTP2_PRIORITIES setting | |||
described below enables endpoints to understand their peer's | described below enables endpoints to understand their peer's | |||
intention. The value of the parameter MUST be 0 or 1. Any value | intention. The value of the parameter MUST be 0 or 1. Any value | |||
other than 0 or 1 MUST be treated as a connection error (see | other than 0 or 1 MUST be treated as a connection error (see [HTTP2], | |||
[RFC7540], Section 5.4.1) of type PROTOCOL_ERROR. | Section 5.4.1) of type PROTOCOL_ERROR. | |||
Endpoints MUST send this SETTINGS parameter as part of the first | Endpoints MUST send this SETTINGS parameter as part of the first | |||
SETTINGS frame. When the peer receives the first SETTINGS frame, it | SETTINGS frame. A sender MUST NOT change the | |||
learns the sender has deprecated the HTTP/2 priority scheme if it | SETTINGS_DEPRECATE_HTTP2_PRIORITIES parameter value after the first | |||
receives the SETTINGS_DEPRECATE_HTTP2_PRIORITIES parameter with the | SETTINGS frame. Detection of a change by a receiver MUST be treated | |||
value of 1. | as a connection error of type PROTOCOL_ERROR. | |||
A sender MUST NOT change the SETTINGS_DEPRECATE_HTTP2_PRIORITIES | ||||
parameter value after the first SETTINGS frame. Detection of a | ||||
change by a receiver MUST be treated as a connection error of type | ||||
PROTOCOL_ERROR. | ||||
Until the client receives the SETTINGS frame from the server, the | Until the client receives the SETTINGS frame from the server, the | |||
client SHOULD send both the priority signal defined in the HTTP/2 | client SHOULD send the signals of the HTTP/2 priority scheme (see | |||
priority scheme and also that of this prioritization scheme. Once | Section 2) and the signals of this prioritization scheme (see | |||
the client learns that the HTTP/2 priority scheme is deprecated, it | Section 5 and Section 7.1). When the client receives the first | |||
SHOULD stop sending the HTTP/2 priority signals. If the client | SETTINGS frame that contains the SETTINGS_DEPRECATE_HTTP2_PRIORITIES | |||
learns that the HTTP/2 priority scheme is not deprecated, it SHOULD | parameter with value of 1, it SHOULD stop sending the HTTP/2 priority | |||
stop sending PRIORITY_UPDATE frames (Section 6.1), but MAY continue | signals. If the value was 0 or if the settings parameter was absent, | |||
sending the Priority header field (Section 4), as it is an end-to-end | it SHOULD stop sending PRIORITY_UPDATE frames (Section 7.1), but MAY | |||
signal that might be useful to nodes behind the server that the | continue sending the Priority header field (Section 5), as it is an | |||
client is directly connected to. | end-to-end signal that might be useful to nodes behind the server | |||
that the client is directly connected to. | ||||
The SETTINGS frame precedes any priority signal sent from a client in | The SETTINGS frame precedes any priority signal sent from a client in | |||
HTTP/2, so a server can determine if it should respect the HTTP/2 | HTTP/2, so a server can determine if it should respect the HTTP/2 | |||
scheme before building state. A server that receives | scheme before building state. A server that receives | |||
SETTINGS_DEPRECATE_HTTP2_PRIORITIES MUST ignore HTTP/2 priority | SETTINGS_DEPRECATE_HTTP2_PRIORITIES with value of 1 MUST ignore | |||
signals. | HTTP/2 priority signals. | |||
Where both endpoints disable HTTP/2 priorities, the client is | Where both endpoints disable HTTP/2 priorities, the client is | |||
expected to send this scheme's priority signal. Handling of omitted | expected to send this scheme's priority signal. Handling of omitted | |||
signals is described in Section 3. | signals is described in Section 4. | |||
3. Priority Parameters | 3. Applicability of the Extensible Priority Scheme | |||
The priority scheme defined by this document considers only the | ||||
prioritization of HTTP messages and tunnels, see Section 9, | ||||
Section 10, and Section 11. | ||||
Where HTTP extensions change stream behavior or define new data | ||||
carriage mechanisms, they MAY also define how this priority scheme | ||||
can be applied. | ||||
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 4) 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 6.1 and Section 6.2) are used by clients to transmit | frames (Section 7.1 and Section 7.2) are used by clients to transmit | |||
the same information on a single hop. If intermediaries want to | the same information on a single hop. If intermediaries want to | |||
specify prioritization on a multiplexed HTTP connection, they SHOULD | specify prioritization on a multiplexed HTTP connection, they SHOULD | |||
use a PRIORITY_UPDATE frame and SHOULD NOT change the Priority header | use a PRIORITY_UPDATE frame and SHOULD NOT change the Priority header | |||
field. | 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 ([STRUCTURED-FIELDS]). | Structured Fields Dictionary ([STRUCTURED-FIELDS]). | |||
This document defines the urgency("u") and incremental("i") | This document defines the urgency("u") and incremental("i") | |||
parameters. When receiving an HTTP request that does not carry these | parameters. When receiving an HTTP request that does not carry these | |||
priority parameters, a server SHOULD act as if their default values | priority parameters, a server SHOULD act as if their default values | |||
were specified. Note that handling of omitted parameters is | were specified. Note that handling of omitted parameters is | |||
different when processing an HTTP response; see Section 7. | different when processing an HTTP response; see Section 8. | |||
Unknown parameters, parameters with out-of-range values or values of | Unknown parameters, parameters with out-of-range values or values of | |||
unexpected types MUST be ignored. | unexpected types MUST be ignored. | |||
3.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. This range provides sufficient | |||
granularity for prioritizing responses for ordinary web browsing, at | granularity for prioritizing responses for ordinary web browsing, at | |||
minimal complexity. | 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 | This parameter indicates the sender's recommendation, based on the | |||
expectation that the server would transmit HTTP responses in the | expectation that the server would transmit HTTP responses in the | |||
skipping to change at page 7, line 43 ¶ | skipping to change at page 8, line 14 ¶ | |||
: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 | |||
A client that fetches a document that likely consists of multiple | A client that fetches a document that likely consists of multiple | |||
HTTP resources (e.g., HTML) SHOULD assign the default urgency level | HTTP resources (e.g., HTML) SHOULD assign the default urgency level | |||
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 7). | 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. | |||
3.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 | A server might distribute the bandwidth of a connection between | |||
incremental responses that share the same urgency, hoping that | incremental responses that share the same urgency, hoping that | |||
providing those responses in parallel would be more helpful to the | providing those responses in parallel would be more helpful to the | |||
skipping to change at page 8, line 35 ¶ | skipping to change at page 9, line 5 ¶ | |||
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 | urgency parameter set to "5" and the incremental parameter set to | |||
"true". | "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 | |||
3.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 | predefined parameters in a way that is not backwards compatible or | |||
fallback safe. | 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 | |||
skipping to change at page 9, line 15 ¶ | skipping to change at page 9, line 31 ¶ | |||
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). | |||
3.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. | |||
Registration requests are reviewed and approved by a Designated | Registration requests are reviewed and approved by a Designated | |||
Expert, as per [RFC8126], Section 4.5. A specification document is | Expert, as per [RFC8126], Section 4.5. A specification document is | |||
appreciated, but not required. | appreciated, but not required. | |||
The Expert(s) should consider the following factors when evaluating | The Expert(s) should consider the following factors when evaluating | |||
requests: | requests: | |||
* Community feedback | * Community feedback | |||
* If the parameters are sufficiently well-defined and adhere to the | * If the parameters are sufficiently well-defined and adhere to the | |||
guidance provided in Section 3.3. | guidance provided in Section 4.3. | |||
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. | |||
4. 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 can appear in requests and responses. | |||
A client uses it to specify the priority of the response. A server | A client uses it to specify the priority of the response. A server | |||
uses it to inform the client that the priority was overwritten. An | uses it to inform the client that the priority was overwritten. An | |||
intermediary can use the Priority information from client requests | intermediary can use the Priority information from client requests | |||
and server responses to correct or amend the precedence to suit it | and server responses to correct or amend the precedence to suit it | |||
(see Section 7). | (see Section 8). | |||
The Priority header field is an end-to-end signal of the request | The Priority header field is an end-to-end signal of the request | |||
priority from the client or the response priority from the server. | priority from the client or the response priority from the server. | |||
As is the ordinary case for HTTP caching ([RFC7234]), a response with | As is the ordinary case for HTTP caching ([RFC7234]), a response with | |||
a Priority header field might be cached and re-used for subsequent | a 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 | An endpoint that fails to parse the Priority header field SHOULD use | |||
default parameter values. | default parameter values. | |||
5. 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 6) can be used for such | The PRIORITY_UPDATE frame (Section 7) can be used for such | |||
reprioritization. | reprioritization. | |||
6. The PRIORITY_UPDATE Frame | 7. The PRIORITY_UPDATE Frame | |||
This document specifies a new PRIORITY_UPDATE frame for HTTP/2 | This document specifies a new PRIORITY_UPDATE frame for HTTP/2 | |||
([RFC7540]) and HTTP/3 ([I-D.ietf-quic-http]). It carries priority | ([HTTP2]) and HTTP/3 ([HTTP3]). It carries priority parameters and | |||
parameters and references the target of the prioritization based on a | references the target of the prioritization based on a version- | |||
version-specific identifier. In HTTP/2, this identifier is the | specific identifier. In HTTP/2, this identifier is the Stream ID; in | |||
Stream ID; in HTTP/3, the identifier is either the Stream ID or Push | HTTP/3, the identifier is either the Stream ID or Push ID. Unlike | |||
ID. Unlike the Priority header field, the PRIORITY_UPDATE frame is a | the Priority header field, the PRIORITY_UPDATE frame is a hop-by-hop | |||
hop-by-hop signal. | signal. | |||
PRIORITY_UPDATE frames are sent by clients on the control stream, | PRIORITY_UPDATE frames are sent by clients on the control stream, | |||
allowing them to be sent independent from the stream that carries the | allowing them to be sent independent from the stream that carries the | |||
response. This means they can be used to reprioritize a response or | response. This means they can be used to reprioritize a response or | |||
a push stream; or signal the initial priority of a response instead | a push stream; or signal the initial priority of a response instead | |||
of the Priority header field. | of the Priority header field. | |||
A PRIORITY_UPDATE frame communicates a complete set of all parameters | A PRIORITY_UPDATE frame communicates a complete set of all parameters | |||
in the Priority Field Value field. Omitting a parameter is a signal | in the Priority Field Value field. Omitting a parameter is a signal | |||
to use the parameter's default value. Failure to parse the Priority | to use the parameter's default value. Failure to parse the Priority | |||
Field Value MUST be treated as a connection error. In HTTP/2 the | Field Value MUST be treated as a connection error. In HTTP/2 the | |||
error is of type PROTOCOL_ERROR; in HTTP/3 the error is of type | error is of type PROTOCOL_ERROR; in HTTP/3 the error is of type | |||
H3_FRAME_ERROR. | H3_FRAME_ERROR. | |||
A client MAY send a PRIORITY_UPDATE frame before the stream that it | A client MAY send a PRIORITY_UPDATE frame before the stream that it | |||
references is open (except for HTTP/2 push streams; see Section 6.1). | references is open (except for HTTP/2 push streams; see Section 7.1). | |||
Furthermore, HTTP/3 offers no guaranteed ordering across streams, | Furthermore, HTTP/3 offers no guaranteed ordering across streams, | |||
which could cause the frame to be received earlier than intended. | which could cause the frame to be received earlier than intended. | |||
Either case leads to a race condition where a server receives a | Either case leads to a race condition where a server receives a | |||
PRIORITY_UPDATE frame that references a request stream that is yet to | PRIORITY_UPDATE frame that references a request stream that is yet to | |||
be opened. To solve this condition, for the purposes of scheduling, | be opened. To solve this condition, for the purposes of scheduling, | |||
the most recently received PRIORITY_UPDATE frame can be considered as | the most recently received PRIORITY_UPDATE frame can be considered as | |||
the most up-to-date information that overrides any other signal. | the most up-to-date information that overrides any other signal. | |||
Servers SHOULD buffer the most recently received PRIORITY_UPDATE | Servers SHOULD buffer the most recently received PRIORITY_UPDATE | |||
frame and apply it once the referenced stream is opened. Holding | frame and apply it once the referenced stream is opened. Holding | |||
PRIORITY_UPDATE frames for each stream requires server resources, | PRIORITY_UPDATE frames for each stream requires server resources, | |||
which can can be bound by local implementation policy. Although | which can can be bound by local implementation policy. Although | |||
there is no limit to the number of PRIORITY_UPDATES that can be sent, | there is no limit to the number of PRIORITY_UPDATES that can be sent, | |||
storing only the most recently received frame limits resource | storing only the most recently received frame limits resource | |||
commitment. | commitment. | |||
6.1. HTTP/2 PRIORITY_UPDATE Frame | 7.1. HTTP/2 PRIORITY_UPDATE Frame | |||
The HTTP/2 PRIORITY_UPDATE frame (type=0x10) is used by clients to | The HTTP/2 PRIORITY_UPDATE frame (type=0x10) is used by clients to | |||
signal the initial priority of a response, or to reprioritize a | signal the initial priority of a response, or to reprioritize a | |||
response or push stream. It carries the stream ID of the response | response or push stream. It carries the stream ID of the response | |||
and the priority in ASCII text, using the same representation as the | and the priority in ASCII text, using the same representation as the | |||
Priority header field value. | Priority header field value. | |||
The Stream Identifier field ([RFC7540], Section 4.1) in the | The Stream Identifier field ([HTTP2], Section 4.1) in the | |||
PRIORITY_UPDATE frame header MUST be zero (0x0). Receiving a | PRIORITY_UPDATE frame header MUST be zero (0x0). Receiving a | |||
PRIORITY_UPDATE frame with a field of any other value MUST be treated | PRIORITY_UPDATE frame with a field of any other value MUST be treated | |||
as a connection error of type PROTOCOL_ERROR. | as a connection error of type PROTOCOL_ERROR. | |||
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 | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
|R| Prioritized Stream ID (31) | | |R| Prioritized Stream ID (31) | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Priority Field Value (*) ... | | Priority Field Value (*) ... | |||
skipping to change at page 12, line 15 ¶ | skipping to change at page 12, line 39 ¶ | |||
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. | |||
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 [RFC7540]) 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 | |||
a PRIORITY_UPDATE MUST respond with a connection error of type | a PRIORITY_UPDATE MUST respond with a connection error of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
When the PRIORITY_UPDATE frame applies to a push stream, clients | When the PRIORITY_UPDATE frame applies to a push 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 | |||
"reserved (remote)" or "half-closed (local)" state. Servers can | "reserved (remote)" or "half-closed (local)" state. Servers can | |||
discard frames where the Prioritized Stream ID refers to a stream in | discard frames where the Prioritized Stream ID refers to a stream in | |||
the "closed" state. Clients MUST NOT provide a Prioritized Stream ID | the "closed" state. Clients MUST NOT provide a Prioritized Stream ID | |||
that refers to a push stream in the "idle" state. Servers that | that refers to a push stream in the "idle" state. Servers that | |||
receive a PRIORITY_UPDATE for a push stream in the "idle" state MUST | receive a PRIORITY_UPDATE for a push stream in the "idle" state MUST | |||
respond with a connection error of type PROTOCOL_ERROR. | respond with a connection error of type PROTOCOL_ERROR. | |||
If a PRIORITY_UPDATE frame is received with a Prioritized Stream ID | If a PRIORITY_UPDATE frame is received with a Prioritized Stream ID | |||
of 0x0, the recipient MUST respond with a connection error of type | of 0x0, the recipient MUST respond with a connection error of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
If a client receives a PRIORITY_UPDATE frame, it MUST respond with a | If a client receives a PRIORITY_UPDATE frame, it MUST respond with a | |||
connection error of type PROTOCOL_ERROR. | connection error of type PROTOCOL_ERROR. | |||
6.2. HTTP/3 PRIORITY_UPDATE Frame | 7.2. HTTP/3 PRIORITY_UPDATE Frame | |||
The HTTP/3 PRIORITY_UPDATE frame (type=0xF0700 or 0xF0701) is used by | The HTTP/3 PRIORITY_UPDATE frame (type=0xF0700 or 0xF0701) is used by | |||
clients to signal the initial priority of a response, or to | clients to signal the initial priority of a response, or to | |||
reprioritize a response or push stream. It carries the identifier of | reprioritize a response or push stream. It carries the identifier of | |||
the element that is being prioritized, and the updated priority in | the element that is being prioritized, and the updated priority in | |||
ASCII text, using the same representation as that of the Priority | ASCII text, using the same representation as that of the Priority | |||
header field value. PRIORITY_UPDATE with a frame type of 0xF0700 is | header field value. PRIORITY_UPDATE with a frame type of 0xF0700 is | |||
used for request streams, while PRIORITY_UPDATE with a frame type of | used for request streams, while PRIORITY_UPDATE with a frame type of | |||
0xF0701 is used for push streams. | 0xF0701 is used for push streams. | |||
The PRIORITY_UPDATE frame MUST be sent on the client control stream | The PRIORITY_UPDATE frame MUST be sent on the client control stream | |||
([I-D.ietf-quic-http], Section 6.2.1). Receiving a PRIORITY_UPDATE | ([HTTP3], Section 6.2.1). Receiving a PRIORITY_UPDATE frame on a | |||
frame on a stream other than the client control stream MUST be | stream other than the client control stream MUST be treated as a | |||
treated as a connection error of type H3_FRAME_UNEXPECTED. | connection error of type H3_FRAME_UNEXPECTED. | |||
HTTP/3 PRIORITY_UPDATE Frame { | HTTP/3 PRIORITY_UPDATE Frame { | |||
Type (i) = 0xF0700..0xF0701, | Type (i) = 0xF0700..0xF0701, | |||
Length (i), | Length (i), | |||
Prioritized Element ID (i), | Prioritized Element ID (i), | |||
Priority Field Value (..), | Priority Field Value (..), | |||
} | } | |||
Figure 2: HTTP/3 PRIORITY_UPDATE Frame | Figure 2: HTTP/3 PRIORITY_UPDATE Frame | |||
skipping to change at page 13, line 41 ¶ | skipping to change at page 14, line 15 ¶ | |||
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. | |||
7. Merging Client- and Server-Driven Parameters | 8. Merging Client- and Server-Driven Parameters | |||
It is not always the case that the client has the best understanding | It is not always the case that the client has the best understanding | |||
of how the HTTP responses deserve to be prioritized. The server | of how the HTTP responses deserve to be prioritized. The server | |||
might have additional information that can be combined with the | might have additional information that can be combined with the | |||
client's indicated priority in order to improve the prioritization of | client's indicated priority in order to improve the prioritization of | |||
the response. For example, use of an HTML document might depend | the response. For example, use of an HTML document might depend | |||
heavily on one of the inline images; existence of such dependencies | heavily on one of the inline images; existence of such dependencies | |||
is typically best known to the server. Or, a server that receives | is typically best known to the server. Or, a server that receives | |||
requests for a font [RFC8081] and images with the same urgency might | requests for a font [RFC8081] and images with the same urgency might | |||
give higher precedence to the font, so that a visual client can | give higher precedence to the font, so that a visual client can | |||
skipping to change at page 14, line 17 ¶ | skipping to change at page 14, line 40 ¶ | |||
that forwards an HTTP response can use the parameters found in the | that forwards an HTTP response can use the parameters found in the | |||
Priority response header field, in combination with the client | Priority response header field, in combination with the client | |||
Priority request header field, as input to its prioritization | Priority request header field, as input to its prioritization | |||
process. No guidance is provided for merging priorities, this is | process. No guidance is provided for merging priorities, this is | |||
left as an implementation decision. | left as an implementation decision. | |||
Absence of a priority parameter in an HTTP response indicates the | Absence of a priority parameter in an HTTP response indicates the | |||
server's disinterest in changing the client-provided value. This is | server's disinterest in changing the client-provided value. This is | |||
different from the logic being defined for the request header field, | different from the logic being defined for the request header field, | |||
in which omission of a priority parameter implies the use of their | in which omission of a priority parameter implies the use of their | |||
default values (see Section 3). | default values (see Section 4). | |||
As a non-normative example, when the client sends an HTTP request | As a non-normative example, when the client sends an HTTP request | |||
with the urgency parameter set to "5" and the incremental parameter | with the urgency parameter set to "5" and the incremental parameter | |||
set to "true" | set to "true" | |||
:method = GET | :method = GET | |||
:scheme = https | :scheme = https | |||
:authority = example.net | :authority = example.net | |||
:path = /menu.png | :path = /menu.png | |||
priority = u=5, i | priority = u=5, i | |||
skipping to change at page 14, line 41 ¶ | skipping to change at page 15, line 14 ¶ | |||
:status = 200 | :status = 200 | |||
content-type = image/png | content-type = image/png | |||
priority = u=1 | priority = u=1 | |||
the intermediary might alter its understanding of the urgency from | the intermediary might alter its understanding of the urgency from | |||
"5" to "1", because it prefers the server-provided value over the | "5" to "1", because it prefers the server-provided value over the | |||
client's. The incremental value continues to be "true", the value | client's. The incremental value continues to be "true", the value | |||
specified by the client, as the server did not specify the | specified by the client, as the server did not specify the | |||
incremental("i") parameter. | incremental("i") parameter. | |||
8. Client Scheduling | 9. Client Scheduling | |||
A client MAY use priority values to make local processing or | A client MAY use priority values to make local processing or | |||
scheduling choices about the requests it initiates. | scheduling choices about the requests it initiates. | |||
9. Server Scheduling | 10. Server Scheduling | |||
Priority signals are input to a prioritization process. They do not | Priority signals are input to a prioritization process. They do not | |||
guarantee any particular processing or transmission order for one | guarantee any particular processing or transmission order for one | |||
response relative to any other response. An endpoint cannot force a | response relative to any other response. An endpoint cannot force a | |||
peer to process concurrent request in a particular order using | peer to process concurrent request in a particular order using | |||
priority. Expressing priority is therefore only a suggestion. | priority. Expressing priority is therefore only a suggestion. | |||
A server can use priority signals along with other inputs to make | A server can use priority signals along with other inputs to make | |||
scheduling decisions. No guidance is provided about how this can or | scheduling decisions. No guidance is provided about how this can or | |||
should be done. Factors such as implementation choices or deployment | should be done. Factors such as implementation choices or deployment | |||
environment also play a role. Any given connection is likely to have | environment also play a role. Any given connection is likely to have | |||
many dynamic permutations. For these reasons, there is no unilateral | many dynamic permutations. For these reasons, there is no unilateral | |||
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 3.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 | It is RECOMMENDED that, when possible, servers respect the | |||
incremental parameter (Section 3.2). Non-incremental responses of | incremental parameter (Section 4.2). Non-incremental responses of | |||
the same urgency SHOULD be served one-by-one based on the Stream ID, | 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 | which corresponds to the order in which clients make requests. Doing | |||
so ensures that clients can use request ordering to influence | so ensures that clients can use request ordering to influence | |||
response order. Incremental responses of the same urgency SHOULD be | response order. Incremental responses of the same urgency SHOULD be | |||
served in round-robin manner. | 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. Non-incremental resources are only used when | |||
all of the response payload has been received. Incremental resources | all of the response payload has been received. Incremental resources | |||
are used as parts, or chunks, of the response payload are received. | are used as parts, or chunks, of the response payload are received. | |||
skipping to change at page 16, line 20 ¶ | skipping to change at page 16, line 45 ¶ | |||
other active concurrent responses, etc. There is no general guidance | other active concurrent responses, etc. There is no general guidance | |||
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 7. 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. How | |||
ever a server decides to schedule a pushed response, it can signal | ever a server decides to schedule a pushed response, it can signal | |||
the intended priority to the client by including the Priority field | the intended priority to the client by including the Priority field | |||
in a PUSH_PROMISE or HEADERS frame. | in a PUSH_PROMISE or HEADERS frame. | |||
10. Fairness | 10.1. Intermediaries with Multiple Backend Connections | |||
An intermediary serving an HTTP connection might split requests over | ||||
multiple backend connections. When it applies prioritization rules | ||||
strictly, low priority requests cannot make progress while requests | ||||
with higher priorities are inflight. This blocking can propagate to | ||||
backend connections, which the peer might interpret as a connection | ||||
stall. Endpoints often implement protections against stalls, such as | ||||
abruptly closing connections after a certain time period. To reduce | ||||
the possibility of this occurring, intermediaries can avoid strictly | ||||
following prioritization and instead allocate small amounts of | ||||
bandwidth for all the requests that they are forwarding, so that | ||||
every request can make some progress over time. | ||||
Similarly, servers SHOULD allocate some amount of bandwidths to | ||||
streams acting as tunnels. | ||||
11. Scheduling and the CONNECT Method | ||||
When a request stream carries the CONNECT method, the scheduling | ||||
guidance in this document applies to the frames on the stream. A | ||||
client that issues multiple CONNECT requests can set the incremental | ||||
parameter to "true", servers that implement the recommendation in | ||||
Section 10 will schedule these fairly. | ||||
12. Retransmission Scheduling | ||||
Transport protocols such as TCP and QUIC provide reliability by | ||||
detecting packet losses and retransmitting lost information. While | ||||
this document specifies HTTP-layer prioritization, its effectiveness | ||||
can be further enhanced if the transport layer factors priority into | ||||
scheduling both new data and retransmission data. The remainder of | ||||
this section discusses considerations when using QUIC. | ||||
[QUIC], Section 13.3 states "Endpoints SHOULD prioritize | ||||
retransmission of data over sending new data, unless priorities | ||||
specified by the application indicate otherwise". When an HTTP/3 | ||||
application uses the priority scheme defined in this document and the | ||||
QUIC transport implementation supports application indicated stream | ||||
priority, a transport that considers the relative priority of streams | ||||
when scheduling both new data and retransmission data might better | ||||
match the expectations of the application. However, there are no | ||||
requirements on how a transport chooses to schedule based on this | ||||
information because the decision depends on several factors and | ||||
trade-offs. It could prioritize new data for a higher urgency stream | ||||
over retransmission data for a lower priority stream, or it could | ||||
prioritize retransmission data over new data irrespective of | ||||
urgencies. | ||||
[QUIC-RECOVERY], Section 6.2.4 also highlights consideration of | ||||
application priorities when sending probe packets after PTO timer | ||||
expiration. An QUIC implementation supporting application-indicated | ||||
priorities might use the relative priority of streams when choosing | ||||
probe data. | ||||
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 schedule decisions across multiple connections, unless it | |||
knows that those connections originate from the same client. Due to | knows that those connections originate from the same client. Due to | |||
this, priority information conveyed over a non-coalesced HTTP | 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. | |||
10.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 | |||
server, requests that originate from one client might have higher | server, requests that originate from one client might have higher | |||
precedence than those coming from others. | precedence than those coming from others. | |||
It is sometimes beneficial for the server running behind an | It is sometimes beneficial for the server running behind an | |||
intermediary to obey to the value of the Priority header field. As | intermediary to obey to the value of the Priority header field. As | |||
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 | |||
skipping to change at page 17, line 19 ¶ | skipping to change at page 19, line 4 ¶ | |||
responses in round-robin manner. This can work if the constrained | responses in 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, X-Forwarded-For ([RFC7239]) | * Forwarded, X-Forwarded-For ([RFC7239]) | |||
* Via ([RFC7230], Section 5.7.1) | * Via ([RFC7230], Section 5.7.1) | |||
10.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. As HTTP/1.1 and older do not provide a way to | |||
concurrently transmit multiple responses, there is no immediate | concurrently transmit multiple responses, there is no immediate | |||
fairness issue in protocol. However, back end servers MAY still use | fairness issue in protocol. However, back end servers MAY still use | |||
client headers for request scheduling. Back end servers SHOULD only | client headers for request scheduling. Back end servers SHOULD only | |||
schedule based on client priority information where that information | schedule based on client priority information where that information | |||
can be scoped to individual end clients. Authentication and other | can be scoped to individual end clients. Authentication and other | |||
session information might provide this linkability. | session information might provide this linkability. | |||
10.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 | |||
software update images. Doing so improves responsiveness of other | software update images. Doing so improves responsiveness of other | |||
connections at the cost of delaying the delivery of updates. | connections at the cost of delaying the delivery of updates. | |||
11. Why use an End-to-End Header Field? | 14. Why use an End-to-End Header Field? | |||
Contrary to the prioritization scheme of HTTP/2 that uses a hop-by- | Contrary to the prioritization scheme of HTTP/2 that uses a hop-by- | |||
hop frame, the Priority header field is defined as end-to-end. | hop frame, the Priority header field is defined as end-to-end. | |||
The rationale is that the Priority header field transmits how each | The rationale is that the Priority header field transmits how each | |||
response affects the client's processing of those responses, rather | response affects the client's processing of those responses, rather | |||
than how relatively urgent each response is to others. The way a | than how relatively urgent each response is to others. The way a | |||
client processes a response is a property associated to that client | client processes a response is a property associated to that client | |||
generating that request. Not that of an intermediary. Therefore, it | generating that request. Not that of an intermediary. Therefore, it | |||
is an end-to-end property. How these end-to-end properties carried | is an end-to-end property. How these end-to-end properties carried | |||
skipping to change at page 18, line 25 ¶ | skipping to change at page 20, line 16 ¶ | |||
for caching intermediaries. Such intermediaries can cache the value | for caching intermediaries. Such intermediaries can cache the value | |||
of the Priority header field along with the response, and utilize the | of the Priority header field along with the response, and utilize the | |||
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. | |||
12. Security Considerations | 15. Security Considerations | |||
[CVE-2019-9513] aka "Resource Loop", is a DoS attack based on | [CVE-2019-9513] aka "Resource Loop", is a DoS attack based on | |||
manipulation of the HTTP/2 priority tree. Extensible priorities does | manipulation of the HTTP/2 priority tree. Extensible priorities does | |||
not use stream dependencies, which mitigates this vulnerability. | not use stream dependencies, which mitigates this vulnerability. | |||
TBD: depending on the outcome of reprioritization discussions, | TBD: depending on the outcome of reprioritization discussions, | |||
following paragraphs may change or be removed. | following paragraphs may change or be removed. | |||
[RFC7540], Section 5.3.4 describes a scenario where closure of | [HTTP2], Section 5.3.4 describes a scenario where closure of streams | |||
streams in the priority tree could cause suboptimal prioritization. | in the priority tree could cause suboptimal prioritization. To avoid | |||
To avoid this, [RFC7540] states that "an endpoint SHOULD retain | this, [HTTP2] states that "an endpoint SHOULD retain stream | |||
stream prioritization state for a period after streams become | prioritization state for a period after streams become closed". | |||
closed". Retaining state for streams no longer counted towards | Retaining state for streams no longer counted towards stream | |||
stream concurrency consumes server resources. Furthermore, [RFC7540] | concurrency consumes server resources. Furthermore, [HTTP2] | |||
identifies that reprioritization of a closed stream could affect | identifies that reprioritization of a closed stream could affect | |||
dependents; it recommends updating the priority tree if sufficient | dependents; it recommends updating the priority tree if sufficient | |||
state is stored, which will also consume server resources. To limit | state is stored, which will also consume server resources. To limit | |||
this commitment, it is stated that "The amount of prioritization | this commitment, it is stated that "The amount of prioritization | |||
state that is retained MAY be limited" and "If a limit is applied, | state that is retained MAY be limited" and "If a limit is applied, | |||
endpoints SHOULD maintain state for at least as many streams as | endpoints SHOULD maintain state for at least as many streams as | |||
allowed by their setting for SETTINGS_MAX_CONCURRENT_STREAMS.". | allowed by their setting for SETTINGS_MAX_CONCURRENT_STREAMS.". | |||
Extensible priorities does not use stream dependencies, which | Extensible priorities does not use stream dependencies, which | |||
minimizes most of the resource concerns related to this scenario. | minimizes most of the resource concerns related to this scenario. | |||
[RFC7540], Section 5.3.4 also presents considerations about the state | [HTTP2], Section 5.3.4 also presents considerations about the state | |||
required to store priority information about streams in an "idle" | required to store priority information about streams in an "idle" | |||
state. This state can be limited by adopting the guidance about | state. This state can be limited by adopting the guidance about | |||
concurrency limits described above. Extensible priorities is subject | concurrency limits described above. Extensible priorities is subject | |||
to a similar consideration because PRIORITY_UPDATE frames may arrive | to a similar consideration because PRIORITY_UPDATE frames may arrive | |||
before the request that they reference. A server is required to | 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 | store the information in order to apply the most up-to-date signal to | |||
the request. However, HTTP/3 implementations might have practical | the request. However, HTTP/3 implementations might have practical | |||
barriers to determining reasonable stream concurrency limits | barriers to determining reasonable stream concurrency limits | |||
depending on the information that is available to them from the QUIC | depending on the information that is available to them from the QUIC | |||
transport layer. TODO: so what can we suggest? | transport layer. TODO: so what can we suggest? | |||
13. IANA Considerations | 16. IANA Considerations | |||
This specification registers the following entry in the Permanent | This specification registers the following entry in the Permanent | |||
Message Header Field Names registry established by [RFC3864]: | Message Header Field Names registry established by [RFC3864]: | |||
Header field name: Priority | Header field name: Priority | |||
Applicable protocol: http | Applicable protocol: http | |||
Status: standard | Status: standard | |||
Author/change controller: IETF | Author/change controller: IETF | |||
Specification document(s): This document | Specification document(s): This document | |||
Related information: n/a | 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 [RFC7540]: | Settings registry established by [HTTP2]: | |||
Name: SETTINGS_DEPRECATE_HTTP2_PRIORITIES | Name: SETTINGS_DEPRECATE_HTTP2_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 [RFC7540]: | Type registry established by [HTTP2]: | |||
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 [I-D.ietf-quic-http]: | Frame Type registry established by [HTTP3]: | |||
Frame Type: PRIORITY_UPDATE | Frame Type: PRIORITY_UPDATE | |||
Code: 0xF0700 and 0xF0701 | Code: 0xF0700 and 0xF0701 | |||
Specification: This document | Specification: This document | |||
Upon publication, please create the HTTP Priority Parameters registry | Upon publication, please create the HTTP Priority Parameters registry | |||
at https://iana.org/assignments/http-priority | at https://iana.org/assignments/http-priority | |||
(https://iana.org/assignments/http-priority) and populate it with the | (https://iana.org/assignments/http-priority) and populate it with the | |||
types defined in Section 3; see Section 3.3.1 for its associated | types defined in Section 4; see Section 4.3.1 for its associated | |||
procedures. | procedures. | |||
14. References | 17. References | |||
14.1. Normative References | 17.1. Normative References | |||
[I-D.ietf-quic-http] | [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
Bishop, M., "Hypertext Transfer Protocol Version 3 | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
DOI 10.17487/RFC7540, May 2015, | ||||
<https://www.rfc-editor.org/rfc/rfc7540>. | ||||
[HTTP3] Bishop, M., "Hypertext Transfer Protocol Version 3 | ||||
(HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | (HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | |||
quic-http-33, 15 December 2020, <http://www.ietf.org/ | quic-http-34, 2 February 2021, | |||
internet-drafts/draft-ietf-quic-http-33.txt>. | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
http-34>. | ||||
[I-D.ietf-quic-transport] | [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed | Multiplexed and Secure Transport", RFC 9000, | |||
and Secure Transport", Work in Progress, Internet-Draft, | DOI 10.17487/RFC9000, May 2021, | |||
draft-ietf-quic-transport-33, 13 December 2020, | <https://www.rfc-editor.org/rfc/rfc9000>. | |||
<http://www.ietf.org/internet-drafts/draft-ietf-quic- | ||||
transport-33.txt>. | ||||
[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/rfc/rfc2119>. | |||
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7230>. | <https://www.rfc-editor.org/rfc/rfc7230>. | |||
[RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | ||||
Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | ||||
DOI 10.17487/RFC7540, May 2015, | ||||
<https://www.rfc-editor.org/info/rfc7540>. | ||||
[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/rfc/rfc8126>. | |||
[STRUCTURED-FIELDS] | [STRUCTURED-FIELDS] | |||
Nottingham, M. and P. Kamp, "Structured Field Values for | Nottingham, M. and P-H. Kamp, "Structured Field Values for | |||
HTTP", Work in Progress, Internet-Draft, draft-ietf- | HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | |||
httpbis-header-structure-19, 3 June 2020, | <https://www.rfc-editor.org/rfc/rfc8941>. | |||
<http://www.ietf.org/internet-drafts/draft-ietf-httpbis- | ||||
header-structure-19.txt>. | ||||
14.2. Informative References | 17.2. Informative References | |||
[CVE-2019-9513] | [CVE-2019-9513] | |||
Common Vulnerabilities and Exposures, "CVE-2019-9513", 1 | Common Vulnerabilities and Exposures, "CVE-2019-9513", 1 | |||
March 2019, <https://cve.mitre.org/cgi-bin/ | March 2019, <https://cve.mitre.org/cgi-bin/ | |||
cvename.cgi?name=CVE-2019-9513>. | cvename.cgi?name=CVE-2019-9513>. | |||
[I-D.lassey-priority-setting] | [I-D.lassey-priority-setting] | |||
Lassey, B. and L. Pardue, "Declaring Support for HTTP/2 | Lassey, B. and L. Pardue, "Declaring Support for HTTP/2 | |||
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, | |||
<http://www.ietf.org/internet-drafts/draft-lassey- | <https://datatracker.ietf.org/doc/html/draft-lassey- | |||
priority-setting-00.txt>. | priority-setting-00>. | |||
[QUIC-RECOVERY] | ||||
Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | ||||
and Congestion Control", RFC 9002, DOI 10.17487/RFC9002, | ||||
May 2021, <https://www.rfc-editor.org/rfc/rfc9002>. | ||||
[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
Procedures for Message Header Fields", BCP 90, RFC 3864, | Procedures for Message Header Fields", BCP 90, RFC 3864, | |||
DOI 10.17487/RFC3864, September 2004, | DOI 10.17487/RFC3864, September 2004, | |||
<https://www.rfc-editor.org/info/rfc3864>. | <https://www.rfc-editor.org/rfc/rfc3864>. | |||
[RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | |||
RFC 7234, DOI 10.17487/RFC7234, June 2014, | RFC 7234, DOI 10.17487/RFC7234, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7234>. | <https://www.rfc-editor.org/rfc/rfc7234>. | |||
[RFC7239] Petersson, A. and M. Nilsson, "Forwarded HTTP Extension", | [RFC7239] Petersson, A. and M. Nilsson, "Forwarded HTTP Extension", | |||
RFC 7239, DOI 10.17487/RFC7239, June 2014, | RFC 7239, DOI 10.17487/RFC7239, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7239>. | <https://www.rfc-editor.org/rfc/rfc7239>. | |||
[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/info/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 advocates for representing | |||
the priorities using a tuple of urgency and concurrency. The ability | the priorities using a tuple of urgency and concurrency. The ability | |||
skipping to change at page 22, line 22 ¶ | skipping to change at page 24, line 18 ¶ | |||
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. | |||
Appendix B. Change Log | Appendix B. Change Log | |||
B.1. Since draft-ietf-httpbis-priority-01 | B.1. Since draft-ietf-httpbis-priority-03 | |||
* Describe considerations for server push prioritisation (#1056, | * Add statement about what this scheme applies to. Clarify | |||
extensions can use it but must define how themselves (#1550, | ||||
#1559) | ||||
* Describe scheduling considerations for the CONNECT method (#1495, | ||||
#1544) | ||||
* Describe scheduling considerations for retransmitted data (#1429, | ||||
#1504) | ||||
* Suggest intermediaries might avoid strict prioritization (#1562) | ||||
B.2. Since draft-ietf-httpbis-priority-02 | ||||
* 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.2. Since draft-ietf-httpbis-priority-01 | B.3. 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.3. Since draft-ietf-httpbis-priority-00 | B.4. 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.4. Since draft-kazuho-httpbis-priority-04 | B.5. 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.5. Since draft-kazuho-httpbis-priority-03 | B.6. 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.6. Since draft-kazuho-httpbis-priority-02 | B.7. 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.7. Since draft-kazuho-httpbis-priority-01 | B.8. Since draft-kazuho-httpbis-priority-01 | |||
* Explain how reprioritization might be supported. | * Explain how reprioritization might be supported. | |||
B.8. Since draft-kazuho-httpbis-priority-00 | B.9. 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 | |||
Lucas Pardue | Lucas Pardue | |||
Cloudflare | Cloudflare | |||
Email: lucaspardue.24.7@gmail.com | Email: lucaspardue.24.7@gmail.com | |||
End of changes. 86 change blocks. | ||||
176 lines changed or deleted | 266 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/ |