2. 替换 RFC 7540 流优先级的动机 (Motivation for Replacing RFC 7540 Stream Priorities)
RFC 7540 流优先级 (stream priority, 见 [RFC7540] 的 Section 5.3) 是一个复杂系统, 其中客户端通过信号表示流依赖关系和权重, 以描述一棵不平衡树. 它的部署和互操作性有限, 并且已经在 HTTP/2 [HTTP/2] 的修订版中被弃用. 为了保持线上兼容性 (见 [HTTP/2] 的 Section 5.3.2), HTTP/2 保留了这些协议元素, 这意味着即使存在替代信令, 例如本文档描述的方案, 它们仍可能被使用.
许多 RFC 7540 服务器实现不会依据 HTTP/2 priority signals 采取行动.
优先级处理可以使用服务器掌握的资源信息或请求生成顺序信息. 例如, 了解 HTML 文档结构的服务器可能希望优先交付对用户体验至关重要的图片, 而不是其他图片. 在 RFC 7540 中, 服务器很难解释客户端用于优先级处理的信号, 因为相同条件可能导致不同客户端产生差异很大的信令. 本文档描述的信令更简单且约束更强, 需要的解释更少, 允许的差异也更少.
RFC 7540 未定义服务器可用于向中介提供优先级信号的方法.
RFC 7540 流优先级是相对于同一时间共享同一连接的其他请求来表达的. 对于在不了解其他请求如何共享连接的情况下生成请求的应用, 或者对于像 HTTP/3 [HTTP/3] 这样不在各 stream 之间提供强顺序保证的协议, 这样的设计很难融入其中.
独立研究 [MARX] 的实验表明, 至少对于 Web 用例, 与实践中看到的更复杂 RFC 7540 设置相比, 更简单的方案至少可以达到等效的性能特征.
2.1. 禁用 RFC 7540 流优先级 (Disabling RFC 7540 Stream Priorities)
上文列出的问题和认识构成了 RFC 7540 流优先级 (见 [HTTP/2] 的 Section 5.3) 替代方案的动机.
本文档定义 SETTINGS_NO_RFC7540_PRIORITIES HTTP/2 setting, 以允许端点省略或忽略 HTTP/2 priority signals (见 [HTTP/2] 的 Section 5.3.2), 如下所述. SETTINGS_NO_RFC7540_PRIORITIES 的值 MUST 为 0 或 1. 除 0 或 1 之外的任何值 MUST 被视为类型为 PROTOCOL_ERROR 的连接错误 (见 [HTTP/2] 的 Section 5.4.1). 初始值为 0.
如果端点使用 SETTINGS_NO_RFC7540_PRIORITIES, 它们 MUST 在第一个 SETTINGS frame 中发送它. 发送方 MUST NOT 在第一个 SETTINGS frame 之后更改 SETTINGS_NO_RFC7540_PRIORITIES 值. 检测到变更的接收方 MAY 将其视为类型为 PROTOCOL_ERROR 的连接错误.
客户端可以发送值为 1 的 SETTINGS_NO_RFC7540_PRIORITIES, 表示它们不使用 HTTP/2 priority signals. SETTINGS frame 先于客户端发送的任何 HTTP/2 priority signal, 因此服务器可以在信号到达前确定是否需要为信号处理分配资源. 收到值为 1 的 SETTINGS_NO_RFC7540_PRIORITIES 的服务器 MUST 忽略 HTTP/2 priority signals.
服务器可以发送值为 1 的 SETTINGS_NO_RFC7540_PRIORITIES, 表示它们将忽略客户端发送的 HTTP/2 priority signals.
鼓励发送 SETTINGS_NO_RFC7540_PRIORITIES 的端点使用替代优先级信号 (例如, 见 Section 5 或 Section 7.1), 但不要求使用某种特定信号类型.
2.1.1. 使用可扩展优先级作为替代方案时的建议 (Advice when Using Extensible Priorities as the Alternative)
在收到服务器的 SETTINGS frame 之前, 客户端不知道服务器是否会忽略 HTTP/2 priority signals. 因此, 在客户端收到来自服务器的 SETTINGS frame 之前, 客户端 SHOULD 同时发送 HTTP/2 priority signals 和本优先级方案的信号 (见 Sections 5 和 7.1).
一旦客户端收到第一个包含值为 1 的 SETTINGS_NO_RFC7540_PRIORITIES 参数的 SETTINGS frame, 它 SHOULD 停止发送 HTTP/2 priority signals. 这可避免发送已知会被忽略的冗余信号.
类似地, 如果客户端收到值为 0 的 SETTINGS_NO_RFC7540_PRIORITIES, 或者该 settings parameter 缺失, 它 SHOULD 停止发送 PRIORITY_UPDATE frames (Section 7.1), 因为这些 frame 很可能会被忽略. 但是, 客户端 MAY 继续发送 Priority header field (Section 5), 因为它是端到端信号, 可能对客户端直接连接的服务器后方的节点有用.