Skip to main content

4. Priority Parameters (优先级参数)

优先级信息是一系列键值对 (Key-Value Pairs),为未来扩展提供了空间。每个键值对代表一个优先级参数 (Priority Parameter)。

Priority HTTP 头字段(第 5 节)是在发出请求或响应时传输这组优先级参数的端到端方式。在发送请求后,客户端可以通过发送第 7.1 节和第 7.2 节中定义的特定于 HTTP 版本的 PRIORITY_UPDATE 帧来更改其对响应优先级的看法(第 6 节)。帧仅在单跳上传输优先级参数。

中介 (Intermediaries) 可以在 PRIORITY_UPDATE 帧或 Priority 头字段中消费和生成优先级信号。仅将 Priority 请求头字段传递给下一跳的中介保留了来自客户端的原始端到端信号;参见第 14 节。中介可以传递 Priority 头字段并额外发送 PRIORITY_UPDATE 帧。这将产生保留原始客户端端到端信号的效果,同时根据第 7 节中的指导指示下一跳使用不同的优先级。替换或添加 Priority 请求头字段的中介会覆盖原始客户端端到端信号,这可能会影响请求的所有后续接收者的优先级排序。

对于 Priority 头字段和 PRIORITY_UPDATE 帧,优先级参数集都编码为 Dictionary(字典)(参见 [STRUCTURED-FIELDS] 的第 3.2 节)。

本文档定义了 urgency (u) 和 incremental (i) 优先级参数。当接收到不携带这些优先级参数的 HTTP 请求时,服务器应该 (SHOULD) 表现得就像指定了它们的默认值一样。

中介可以组合它转发的请求和响应中的信号。请注意,响应中优先级参数的省略与请求中的省略处理方式不同;参见第 8 节。

接收者按照 [STRUCTURED-FIELDS] 第 4.2 节中的描述解析 Dictionary。在成功解析 Dictionary 的情况下,本文档提出了额外的要求:未知的优先级参数、具有超出范围值的优先级参数或意外类型的值必须 (MUST) 被忽略。

4.1. Urgency (紧急度)

urgency (u) 参数值是 Integer(整数)(参见 [STRUCTURED-FIELDS] 的第 3.3.1 节),介于 0 和 7 之间(包括 0 和 7),按优先级降序排列。默认值为 3。

端点使用此参数传达其对 HTTP 响应优先顺序的看法。urgency 的选择值可以基于服务器可能使用此信息按紧急度顺序传输 HTTP 响应的预期。值越小,优先级越高。

以下示例显示了一个 urgency 设置为 0 的 CSS 文件请求:

:method = GET
:scheme = https
:authority = example.net
:path = /style.css
priority = u=0

获取可能由多个 HTTP 资源组成的文档(例如 HTML)的客户端应该 (SHOULD) 为主资源分配默认紧急度级别。此约定允许服务器使用特定于网站的知识来细化紧急度(参见第 8 节)。

最低紧急度级别 (7) 保留用于后台任务,例如软件更新的交付。此紧急度级别不应该 (SHOULD NOT) 用于获取对用户交互有任何影响的响应。

4.2. Incremental (增量)

incremental (i) 参数值是 Boolean(布尔值)(参见 [STRUCTURED-FIELDS] 的第 3.3.6 节)。它指示 HTTP 响应是否可以增量处理,即在响应的块到达时提供一些有意义的输出。

incremental 参数的默认值为 false (0)。

如果客户端发出将 incremental 参数设置为 false 的并发请求,则以相同紧急度并发提供响应没有好处,因为客户端不会增量处理这些响应。以相同紧急度逐个提供非增量响应,按照生成这些请求的顺序,被认为是最佳策略。

如果客户端发出将 incremental 参数设置为 true 的并发请求,则以相同紧急度并发提供请求可能是有益的。这样做会分配连接带宽,意味着响应需要更长时间才能完成。增量交付在多个部分响应可能在完整响应可用之前为客户端提供一些价值的情况下最有用。

以下示例显示了一个 urgency 参数设置为 5 且 incremental 参数设置为 true 的 JPEG 文件请求。

:method = GET
:scheme = https
:authority = example.net
:path = /image.jpg
priority = u=5, i

4.3. Defining New Priority Parameters (定义新的优先级参数)

在尝试定义新的优先级参数时,必须注意不要对现有端点或不理解新定义的优先级参数的中介执行的优先级排序产生不利影响。由于未知的优先级参数会被忽略,新的优先级参数不应以不向后兼容或不安全回退的方式改变 urgency(参见第 4.1 节)或 incremental(参见第 4.2 节)优先级参数的解释或修改它们。

例如,如果需要提供比八个紧急度级别更细的粒度,可以使用额外的优先级参数来细分范围。不识别该参数的实现可以安全地继续使用粒度较低的八个级别。

或者,可以增强紧急度。例如,图形用户代理可以发送 visible 优先级参数以指示所请求的资源是否在视口内。

通用优先级参数优于特定于供应商、特定于应用程序或特定于部署的值。如果社区无法就通用值达成一致,则参数的名称应相应地具体(例如,使用标识供应商、应用程序或部署的前缀)。

4.3.1. Registration (注册)

可以通过在"HTTP Priority"注册表中注册新的优先级参数来定义它们。此注册表管理 Dictionary 中使用的键(短文本字符串)(参见 [STRUCTURED-FIELDS] 的第 3.2 节)。由于每个 HTTP 请求都可以具有关联的优先级信号,因此具有短键长度(尤其是单字符字符串)具有价值。为了鼓励扩展同时避免在有吸引力的键值之间发生意外冲突,"HTTP Priority"注册表根据键长度运行两种注册策略。

  • 键长度为 1 的优先级参数的注册请求使用 Specification Required(需要规范)策略,根据 [RFC8126] 的第 4.6 节。

  • 键长度大于 1 的优先级参数的注册请求使用 Expert Review(专家审查)策略,根据 [RFC8126] 的第 4.5 节。规范文档是受欢迎的,但不是必需的。

在审查注册请求时,指定的专家可以考虑第 4.3 节中提供的额外指导,但不能将其作为拒绝的依据。

注册请求应使用以下模板:

Name(名称):[与参数键匹配的优先级参数名称]

Description(描述):[优先级参数语义和值的描述]

Reference(参考):[定义此优先级参数的规范]

有关发送注册请求的详细信息,请参见 https://www.iana.org/assignments/http-priority 上的注册表。