In August 2018, Microsoft announced a new design for how updates are delivered. How did they manage to get the size of the updates so much smaller while simultaneously reducing memory usage and update negotiation time?
To understand what changed, you first need to understand how things were.
Let’s focus only on changes that apply to a specific major release of Windows. (You can repeat the exercise for each major release.) Let’s call the initial release M0. And suppose there have been five monthly cumulative updates, call then M1, M2, M3, M4, and M5 (the latest version).
There are two general mechanisms that Windows Update uses to update a file: One way is to send an entire replacement file. Another is to send a patch (sometimes called a delta) that updates the file currently on the system to the latest version.
There are obvious trade-offs here. The full file works regardless of what version the customer is upgrading from, whereas the patch works only if the customer has the specific version that the patch was designed to upgrade. On the other hand, the full file is large, whereas the patch is much smaller.
Full file | Patch | |
---|---|---|
Size | Large | Small |
Applicability | Can update any version | Can update only one version |
Suppose that the file F
was updated in M1 and M2, was unchanged in M3, and was updated again in M4 and M5. Here are all the possible full files and patch combinations.
Update | Full file | Patch base | ||||
---|---|---|---|---|---|---|
M0 | M1 | M2 | M3 | M4 | ||
M1 | M1 | M0 to M1 | ||||
M2 | M2 | M0 to M2 | M1 to M2 | |||
M3 | ||||||
M4 | M4 | M0 to M4 | M1 to M4 | M2 to M4 | ||
M5 | M5 | M0 to M5 | M1 to M5 | M2 to M5 | M4 to M5 |
Note that the rows and columns for M3 are empty because there was no change to F
in M3. Updating to M3 is the same as updating to M2.
The simplest kind of update is the Full update. It contains a copy of every component that has changed since the last major release. In our example, this would be the components that changed between M0 and M5. It guarantees that you can get from any version to the latest version, but it’s also very large (around 1GB).
For the file F
, the corresponding Full updates would contain the files from the Full file column.
Update | Full file | Patch base | ||||
---|---|---|---|---|---|---|
M0 | M1 | M2 | M3 | M4 | ||
M1 |
M1
|
M0 to M1 | ||||
M2 |
M2
|
M0 to M2 | M1 to M2 | |||
M3 |
|
|||||
M4 |
M4
|
M0 to M4 | M1 to M4 | M2 to M4 | ||
M5 |
M5
|
M0 to M5 | M1 to M5 | M2 to M5 | M4 to M5 |
The breakdown of files for Full updates is as follows:
Full update | Contents |
---|---|
M1 | M1 |
M2 | M2 |
M3 | M2 |
M4 | M4 |
M5 | M5 |
Note that Full update M3 contains a copy of F
from M2. That way, if somebody currently running M1 needs to update to M3, the Full update will get them the M2 version of the file, which is the correct version for a system that has been updated to M3.
Feature summary of Full updates:
- Full updates can successfully update all customers, even those who installed a hotfix outside of the monthly servicing cycle.¹ Since full copies of modified files are delivered, it doesn’t matter what your starting point is. You always end at the same place.
- Full updates are very large (1GB).
- Full updates require very little negotiation with the server. Every customer downloads the same update.
- Full updates are cache-friendly, because every customer downloads the same update. Therefore, caching features like caching proxies, BranchCache, and peer-to-peer delivery are effective.
- Full updates do not require significant server support. Once the package is negotiated, it is delivered in its entirety.
Next time, we’ll look at the Delta update, which despite its name doesn’t actually contain deltas.
Bonus chatter: If a week of articles about Windows update formats is too tedious, you can read this short version: Windows 10 quality updates explained and the end of delta updates.
¹ By policy, every out-of-cycle hotfix is rolled into the next cumulative update, so installing a cumulative update will never cause a hotfix to be lost.
What I don’t understand is why the whole Windows update process is so painfully slow (especially if you’re running Server 2016, where the monthly updates take several hours to apply – assuming the update even succeeds, which it often doesn’t). I can usually patch my Gentoo box (which compiles everything on-the-fly, and updates every program installed on the system) faster than Windows updates just itself.
I've been wondering this for a while and hope you touch on this in this series:
Let's say MS releases patch 1 for File A, then patch 2 for File A.
If a user applies patch 2, is patch 1 automatically installed since they have the latest version of File A? Or does MS maintain two separate versions (until the next Service Pack or Cumulative Update) allowing the customer to opt out of patch 1 in the...
My understanding is that all patches are cumulative, so each patch includes all earlier patches. (There was a time where piecemeal patches were supported, and it was a nightmare getting all the dependencies right, not to mention exponentially exploding the number of configurations.)
I seem to recall Xbox updates that were significantly larger than 1GB. I think they were 2GB or even 4GB.
Would Xboxes even reuse any Windows Update code? Xboxes are far more locked down than PCs so there are probably easier approaches to take. For example, it is impossible for an Xbox user to follow Raymond’s example and install a hotfix outside of the normal patching cycle.