Firefox 网络调度和优先级¶
请注意,本文档是初稿,可能会进一步完善和更新。 适用于 Fx 132+
调度¶
Firefox 使用多种技术来协调网络请求调度。
DOM 预加载扫描器(推测加载器)¶
- 在后台线程上运行,扫描 HTML 中的资源 URL 以进行预加载。 
- 将发现的资源添加到推测加载队列。 
DOM 解析器(非推测)¶
- 在构建 DOM 树时发出元素请求。 
服务类别¶
- 根据上下文或请求目标对请求进行分类。参见 nsIClassOfService.idl 
- 类别(例如 Leader、Normal、Follower、Speculative 等) 可以影响网络和缓存行为。 
- 可能会延迟某些请求的调度(例如,分类为 - ClassOfService::Tail的跟踪器)。
- 还定义了 请求的基本紧急程度 
优先级¶
由于 HTTP/1.1 没有优先级系统(顺序请求),Firefox 使用 supportsPriority 和 classOfService 来排序请求。HTTP/2 和 HTTP/3 利用到每个主机的单个多路复用连接,因此由于带宽限制,请求优先级变得至关重要。优先级使用**可扩展优先级方案**表示,其中包括
- **紧急程度**:范围从 - 0(最高优先级)到- 7(最低优先级)。紧急程度数值较低的资源在紧急程度数值较高的资源之前交付。例如,所有紧急程度为- 2的资源都在紧急程度为- 3的资源开始传输之前传输。
- **增量**:一个布尔值,指示是否应在此资源和相同紧急程度的其他资源之间分配带宽。增量标志确定相同紧急程度的资源是按顺序发送( - i不存在)还是增量发送(- i)。
这些优先级是根据以下因素计算的
- 资源类型及其在文档或视口中的位置。 
- 分配的 服务类别 
- 使用 SupportsPriority 接口。 
- 应用优先级提示(例如, - fetchpriority="high")调整,通过- SupportsPriority实现
- 后台标签的优先级将降低。 
资源调度和优先级表¶
| 资源类型 | 服务类别 | supportsPriority | 紧急程度 | 增量 | 备注 | 
|---|---|---|---|---|---|
| HTML,根文档 | UrgentStart (64) | PRIORITY_HIGHEST, -20 | 0 | true | |
| CSS ( <head>,渲染阻塞) | Leader (1) | PRIORITY_NORMAL, 0 | 2 | false | |
| CSS (rel=preload) | Leader (1) | PRIORITY_HIGHEST, -20 | 0 | false | |
| CSS (Body) | Leader (1) | PRIORITY_NORMAL, 0 | 2 | false | |
| JavaScript(阻塞) | Leader (1) | PRIORITY_NORMAL, 0 | 2 | false | |
| JavaScript (rel=preload) | Unblocked (16) | PRIORITY_HIGHEST, -20 | 1 | false | |
| JavaScript(异步) | TailAllowed (512), Unblocked (16) | PRIORITY_NORMAL, 0 | 3 | false | |
| JavaScript(延迟) | Unblocked (16) | PRIORITY_NORMAL, 0 | 3 | false | |
| 字体 @font-face | TailForbidden (1024) | PRIORITY_HIGH, -10 | 3 | false | 紧急程度受 TailForbiddenCoS 影响 | 
| 字体 (rel=preload) | TailForbidden (1024), Unblocked (16) | PRIORITY_HIGH, -10fetchpriority=high: PRIORITY_HIGHEST, -20fetchpriority=low: PRIORITY_LOW, 10 | 2fetchpriority=high: 1fetchpriority=low: 4 | false | |
| 图像 | (0) | PRIORITY_LOW, 10fetchpriority=high: PRIORITY_HIGH, -10fetchpriority=low: PRIORITY_LOWEST, 20 | 5fetchpriority=high: 3fetchpriority=low: 6 | true | |
| 图像 (rel=preload) | (0) | PRIORITY_LOW, 10fetchpriority=high: PRIORITY_HIGH, -10fetchpriority=low: PRIORITY_LOWEST, 20 | 4fetchpriority=high: 3fetchpriority=low: 5 | true | |
| 即将渲染的图像 | (0) | PRIORITY_HIGH, -10 | 3 | true | 参见:image_layout_network_priority 和 bug 1915817 | 
| 获取 | (0) | PRIORITY_NORMAL, 0fetchpriority=high: PRIORITY_HIGH, -10fetchpriority=low: PRIORITY_LOW, 10 | 4fetchpriority=high: 3fetchpriority=low: 5 | false | |
| 跟踪器(脚本) | Tail (256), Unblocked (16) | PRIORITY_NORMAL, 0 | 3 | false | 请求被延迟,即由一个常数乘以挂起请求的数量延迟。 |