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 |
紧急程度受 TailForbidden CoS 影响 |
字体 (rel=preload) | TailForbidden (1024), Unblocked (16) |
PRIORITY_HIGH, -10 fetchpriority=high: PRIORITY_HIGHEST, -20 fetchpriority=low: PRIORITY_LOW, 10 |
2 fetchpriority=high: 1 fetchpriority=low: 4 |
false |
|
图像 | (0) |
PRIORITY_LOW, 10 fetchpriority=high: PRIORITY_HIGH, -10 fetchpriority=low: PRIORITY_LOWEST, 20 |
5 fetchpriority=high: 3 fetchpriority=low: 6 |
true |
|
图像 (rel=preload) | (0) |
PRIORITY_LOW, 10 fetchpriority=high: PRIORITY_HIGH, -10 fetchpriority=low: PRIORITY_LOWEST, 20 |
4 fetchpriority=high: 3 fetchpriority=low: 5 |
true |
|
即将渲染的图像 | (0) |
PRIORITY_HIGH, -10 |
3 |
true |
参见:image_layout_network_priority 和 bug 1915817 |
获取 | (0) |
PRIORITY_NORMAL, 0 fetchpriority=high: PRIORITY_HIGH, -10 fetchpriority=low: PRIORITY_LOW, 10 |
4 fetchpriority=high: 3 fetchpriority=low: 5 |
false |
|
跟踪器(脚本) | Tail (256), Unblocked (16) |
PRIORITY_NORMAL, 0 |
3 |
false |
请求被延迟,即由一个常数乘以挂起请求的数量延迟。 |