窥探Windows UUP 正向差分更新机制的高效性
Windows Update(Windows 更新)是微软 Windows 操作系统的重要组成部分。它致力于向用户提供关键的安全补丁、错误修复、新功能和性能改进等更新。通过定期提供补丁和更新,Windows Update 确保用户的系统始终保持最新和安全。
随着用户基数的不断增长,高效的更新机制对于确保系统的安全性、稳定性和用户体验变得至关重要。特别是在网络环境不够理想的地区,网络对下载更新的影响可能导致漫长的等待时间、带宽资源的浪费以及用户满意度的降低。
优化的更新过程可以减少下载时间、节省带宽资源,并提供更快的更新安装速度,从而提高用户的满意度和工作效率。
概述
从宏观的角度来看,Windows 更新机制经历了多次变化,涵盖了更新的类型、发布周期、发布策略、更新包格式、更新包下载技术等方面。这些变化影响了更新包的制作、发布和传输等环节,对用户而言,也意味着获取、下载和安装更新包的方式发生了变化。在这一系列变化中,一个持续存在的问题是如何在不影响系统安全性和稳定性的前提下,尽可能减少用户下载更新包的数量,从而节省带宽资源。
在此背景下,Windows 10 更新经历了一个大变化和三个小的变化:
-
这里的大变化是指Windows 更新由全量更新转变为增量更新。全量更新是指每月累积更新都将从该版本Windows发布(如Windows 10, version 1607)到当前月份的所有组件和文件的变化放到同一个更新包中,使得更新包大小从第一个月的100-200MB到6-8个月后稳定在1-1.2GB。由于全量更新的更新包太大,后来Windows开始应用增量更新技术,从制作更新包到下载更新包的各阶段中,支持用户仅下载差异化部分的内容。
-
三个小的变化涉及快速更新(express update)、正向/逆向差分(forward and reverse differential update)和仅正向差分(uup forward differential update)的技术。
本文将比较三个小变化的特点,特别关注 UUP 正向差分在减小 Windows 更新包大小方面的显著作用。
Express 更新
Express 更新是一种文件格式,也是一种文件更新服务,允许用户使用最小的下载量快速获取文件更新,而无需下载整个软件包。其核心思路就是将当前月份的累积更新与之前各个月的累积更新的增量差异打包到一起,用户获取更新时,只传输适用于用户状态的那部分更新内容。
随着时间的推移,服务端累积更新文件体积会越来越大,但每个用户只会请求适合自己的那一部分增量更新,传输字节数却变小了。
详细的说明,可以参考《Windows Update 技术详解系列:快速分发技术Express Update》1。
Windows 10 正向/逆向差分机制
自 Windows 10 1809 版本开始,Windows 引入了正向/逆向差分机制。这一工作原理简要来说可以通过以下两个公式来说明:
V
N
+
Δ
N
−
>
0
=
V
0
V
0
+
Δ
0
−
>
R
=
V
R
V_N + \Delta_{N->0} = V_0\\ V_0 + \Delta_{0->R} = V_R
VN+ΔN−>0=V0V0+Δ0−>R=VR
其中,
V
N
V_N
VN代表计算机当前的状态,
V
0
V_0
V0代表计算机回到RTM状态,
V
R
V_R
VR 代表计算机更新至最新状态。
计算机在安装 RTM 版本后的首个累积更新时,通过应用正向差分文件
Δ
0
−
>
1
\Delta_{0->1}
Δ0−>1将基础版本文件(RTM)更新至目标版本
V
1
V_1
V1。此时,累积更新中同时包含的逆向差分文件
Δ
1
−
>
0
\Delta_{1->0}
Δ1−>0会被保存到用户本地计算机。
在之后进行累积更新时,系统首先利用已保存的逆向差分文件 Δ 1 − > 0 \Delta_{1->0} Δ1−>0将当前的 V 1 V_1 V1状态回退到RTM。然后,累积更新中包含的正向差分文件 Δ 0 − > x \Delta_{0->x} Δ0−>x将被应用到RTM这个中间状态,从而使系统更新至 V x V_x Vx。同时,将累积更新中包含的逆向差分文件 Δ x − > 0 \Delta_{x->0} Δx−>0保存至本地,供下一次累积更新时使用。
简言之,在正向/逆向差分机制中,每次累积更新都会先应用上一次累积更新中的逆向差分文件内容,将系统回退到一个中间状态 (RTM),然后再应用本次的正向差分文件内容。同时,本次累积更新中的逆向差分文件会被保存到本地。
通过检查文件系统,我们可以看到两个独立的正向/逆向更新文件:
以 5B 更新包为例,f 文件夹下的文件会将系统中对应的文件更新至最新状态;而 r 文件夹下的文件则负责将更新后的状态回退到 RTM 状态。
与 express 更新相比,这种更新机制在用户下载量上相差不大,但对于微软以及独立管理分发 express 更新的企业来说,可以大幅降低存储累积更新的空间需求。
(更多内容参考《Windows Update 技术详解系列:基于正向/逆向二进制差分的 Windows 累积更新》2)
Windows UUP 正向差分机制
在 Windows 10 的正向/逆向差分更新中,采用了 RTM 作为更新过程的中间过渡状态,因而无法避免向用户提供两个方向的差异文件。相较之下,Windows 11 的累积更新包在文件大小上缩减了近 40%,这意味着终端用户可以以更少的下载量获取累积更新。那么,这一改进究竟是如何实现的呢?
双向delta的探索
在探讨这个问题之前,我们先思考一个更深层次的问题:是否可以将两个方向的差异文件合并为一个可以双向使用的文件呢?为了解释正向/逆向差分机制的工作过程,我们可以参考文本更新过程3。
在处于中间过渡状态的基础文件上应用正向差分内容后,得到目标文件。将操作在目标文件上反向重复一遍,又可以得到中间过渡状态。
尽管正向差分和逆向差分在功能上看似对称,但从内容上来看,它们在很大程度上是不重叠的。将正向差分和逆向差分的内容组合成一个支持双向差分的文件,并不能明显减小文件大小。相比之下,采用两个不同的文件更具实用性。
单一正向差分
为了达成减小 Windows 11 更新所需网络下载量的主要目标,微软采取的策略是仅提供正向差分内容,同时在用户端生成逆向差分内容。这种做法仍然遵循正向/逆向差分的方式,但将服务端的任务分担到了客户端,同时也显著降低了用户的下载量。
与同时发布正向/逆向差分内容的方式不同,此方法只发布包含正向差分的文件,这些差分内容是当前月份内容相对于上一个状态(通常是上月安装完毕的累积更新状态)的差异,而非与 RTM 版本的差异。
解决连续月份更新问题
该图片4展示了两次累积更新的过程:分别是从 RTM 到安装第一个月累积更新 (M1 CU),以及从安装第一个月累积更新 (M1 CU) 后到安装第二个月累积更新的过程。
在第一次更新中,M1 CU 更新包仅包含从 RTM 到 M1 月份的差异文件(例如将 File1 等文件更新为 v2 版本),而不是整个更新包。终端用户只需下载并安装这些差异文件,即可完成更新。
同样地,对于第二次更新,M2 CU 更新包仅包含从安装完 M1 CU 后的状态到 M2 月份的差异文件,而不是整个更新包。这样一来,再次减少了终端用户下载和安装更新所需的时间和数据量,从而提高了更新效率。
在每次安装累积更新的过程中,应用正向差分的步骤都会被记录,逆向差分内容都会被生成。采用单一正向差分的方式,打破了 Windows 10 正向/逆向差分更新将 RTM 作为更新过程中过渡状态的限制。这里生成的逆向差分主要用于保证如果安装更新过程中遇到问题,可以将系统恢复至可用状态。
根据统计结果90%的用户属于连续更新的用户,即会安装每个月的累积更新;而剩下的用户中就会出现非连续月份更新的问题。
解决非连续月份更新的问题
非连续月份更新问题是指用户计算机由于某种原因错过了几个月的累积更新,这时候UUP 正向差分更新要如何处理呢?
尽管相关文档强调 Windows 连续安装各月的更新可以减少更新包下载数量,并且 UUP 的更新包仅记录相邻月份之间的正向差异,但这并不意味着用户在非连续月份安装累积更新时会将缺失的几个月的更新顺序安装一次。
在这种情况下,express 更新的思想仍然发挥作用。服务端将直接获取用户当前状态和最新状态之间的差异进行更新。然而,UUP中使用的 express 更新与 Windows 10 中应用的 express 更新有所不同。二进制指令粒度的差异化内容以及更高效的压缩算法,使得UUP express更新极大降低服务端的存储空间。对应的更新包中文件格式也有较大的变化,《UUP, Windows 11 更新机制的未来》5中进行了说明。
因此,可以说 UUP 的更新包大小减少方案是在对正向/逆向差分机制和 express 更新进行改良和结合的基础上实现的,最终实现了 40% 的更新包大小缩减。