{"id":103426,"date":"2020-02-10T07:00:00","date_gmt":"2020-02-10T15:00:00","guid":{"rendered":"http:\/\/devblogs.microsoft.com\/oldnewthing\/?p=103426"},"modified":"2020-09-11T15:11:22","modified_gmt":"2020-09-11T22:11:22","slug":"20200210-00","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20200210-00\/?p=103426","title":{"rendered":"Survey of Windows update formats: The Full update"},"content":{"rendered":"<p>In August 2018, Microsoft <a href=\"https:\/\/techcommunity.microsoft.com\/t5\/Windows-IT-Pro-Blog\/What-s-next-for-Windows-10-and-Windows-Server-quality-updates\/ba-p\/229461\"> announced a new design for how updates are delivered<\/a>. How did they manage to get the size of the updates so much smaller while simultaneously reducing memory usage and update negotiation time?<\/p>\n<p>To understand what changed, you first need to understand how things were.<\/p>\n<p>Let&#8217;s focus only on changes that apply to a specific major release of Windows. (You can repeat the exercise for each major release.) Let&#8217;s call the initial release <i>M0<\/i>. And suppose there have been five monthly cumulative updates, call then <i>M1<\/i>, <i>M2<\/i>, <i>M3<\/i>, <i>M4<\/i>, and <i>M5<\/i> (the latest version).<\/p>\n<p>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 <i>delta<\/i>) that updates the file currently on the system to the latest version.<\/p>\n<p>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.<\/p>\n<table class=\"cp3\" style=\"border-collapse: collapse;\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<th>\u00a0<\/th>\n<th>Full file<\/th>\n<th>Patch<\/th>\n<\/tr>\n<tr>\n<th>Size<\/th>\n<td>Large<\/td>\n<td>Small<\/td>\n<\/tr>\n<tr>\n<th>Applicability<\/th>\n<td>Can update any version<\/td>\n<td>Can update only one version<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Suppose that the file <code>F<\/code> 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.<\/p>\n<table class=\"cp3\" style=\"border-collapse: collapse; text-align: center;\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<th rowspan=\"2\">Update<\/th>\n<th style=\"width: 5em;\" rowspan=\"2\">Full file<\/th>\n<th colspan=\"5\">Patch base<\/th>\n<\/tr>\n<tr>\n<th style=\"width: 5em;\">M0<\/th>\n<th style=\"width: 5em;\">M1<\/th>\n<th style=\"width: 5em;\">M2<\/th>\n<th style=\"width: 5em;\">M3<\/th>\n<th style=\"width: 5em;\">M4<\/th>\n<\/tr>\n<tr>\n<th>M1<\/th>\n<td>M1<\/td>\n<td>M0 to M1<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<th>M2<\/th>\n<td>M2<\/td>\n<td>M0 to M2<\/td>\n<td>M1 to M2<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<th>M3<\/th>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<th>M4<\/th>\n<td>M4<\/td>\n<td>M0 to M4<\/td>\n<td>M1 to M4<\/td>\n<td>M2 to M4<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<th>M5<\/th>\n<td>M5<\/td>\n<td>M0 to M5<\/td>\n<td>M1 to M5<\/td>\n<td>M2 to M5<\/td>\n<td>&nbsp;<\/td>\n<td>M4 to M5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Note that the rows and columns for M3 are empty because there was no change to <code>F<\/code> in M3. Updating to M3 is the same as updating to M2.<\/p>\n<p>The simplest kind of update is the <b>Full update<\/b>. 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&#8217;s also very large (around 1<a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20090611-00\/?p=17933\/\">GB<\/a>).<\/p>\n<p>For the file <code>F<\/code>, the corresponding Full updates would contain the files from the <b>Full file<\/b> column.<\/p>\n<table style=\"border-collapse: collapse; text-align: center;\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<th style=\"padding: 3px;\" rowspan=\"2\">Update<\/th>\n<th style=\"padding: 3px; width: 5em;\" rowspan=\"2\">Full file<\/th>\n<th style=\"padding: 3px;\" colspan=\"5\">Patch base<\/th>\n<\/tr>\n<tr>\n<th style=\"padding: 3px; width: 5em;\">M0<\/th>\n<th style=\"padding: 3px; width: 5em;\">M1<\/th>\n<th style=\"padding: 3px; width: 5em;\">M2<\/th>\n<th style=\"padding: 3px; width: 5em;\">M3<\/th>\n<th style=\"padding: 3px; width: 5em;\">M4<\/th>\n<\/tr>\n<tr>\n<th style=\"padding: 0;\">M1<\/th>\n<td style=\"padding: 0;\" valign=\"baseline\">\n<div style=\"border: 1px black; border-style: solid solid none; border-radius: 4px 4px 0 0; padding: 3px; margin: 3px 3px 0 3px; background-color: #ffdddd;\">M1<\/div>\n<\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M0 to M1<\/span><\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 0;\">M2<\/th>\n<td style=\"padding: 0;\" valign=\"baseline\">\n<div style=\"border: 1px black; border-style: none solid; padding: 3px; margin: 0 3px; background-color: #ffdddd;\">M2<\/div>\n<\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M0 to M2<\/span><\/td>\n<td style=\"padding: 0;\" valign=\"baseline\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M1 to M2<\/span><\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 0;\">M3<\/th>\n<td style=\"padding: 0;\" valign=\"baseline\">\n<div style=\"border: 1px black; border-style: none solid; padding: 3px; margin: 0 3px; background-color: #ffdddd;\">\u00a0<\/div>\n<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 0;\">M4<\/th>\n<td style=\"padding: 0;\" valign=\"baseline\">\n<div style=\"border: 1px black; border-style: none solid; padding: 3px; margin: 0 3px; background-color: #ffdddd;\">M4<\/div>\n<\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M0 to M4<\/span><\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M1 to M4<\/span><\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M2 to M4<\/span><\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 0;\">M5<\/th>\n<td style=\"padding: 0;\" valign=\"baseline\">\n<div style=\"border: 1px black; border-style: none solid solid; border-radius: 0 0 4px 4px; padding: 3px; margin: 0 3px 3px 3px; background-color: #ffdddd;\">M5<\/div>\n<\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M0 to M5<\/span><\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M1 to M5<\/span><\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M2 to M5<\/span><\/td>\n<td style=\"padding: 0;\">\u00a0<\/td>\n<td style=\"padding: 0;\" valign=\"baseline\" nowrap=\"nowrap\"><span style=\"padding: 3px; color: #bbb; text-decoration: line-through;\">M4 to M5<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The breakdown of files for Full updates is as follows:<\/p>\n<table style=\"border-collapse: collapse; text-align: center;\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<th>Full update<\/th>\n<th>Contents<\/th>\n<\/tr>\n<tr>\n<th>M1<\/th>\n<td>M1<\/td>\n<\/tr>\n<tr>\n<th>M2<\/th>\n<td>M2<\/td>\n<\/tr>\n<tr>\n<th>M3<\/th>\n<td>M2<\/td>\n<\/tr>\n<tr>\n<th>M4<\/th>\n<td>M4<\/td>\n<\/tr>\n<tr>\n<th>M5<\/th>\n<td>M5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Note that Full update M3 contains a copy of <code>F<\/code> 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.<\/p>\n<p>Feature summary of Full updates:<\/p>\n<ul>\n<li>Full updates can successfully update all customers, even those who installed a hotfix outside of the monthly servicing cycle.\u00b9 Since full copies of modified files are delivered, it doesn&#8217;t matter what your starting point is. You always end at the same place.<\/li>\n<li>Full updates are very large (1<a href=\"https:\/\/blogs.msdn.microsoft.com\/oldnewthing\/20090611-00\/?p=17933\/\">GB<\/a>).<\/li>\n<li>Full updates require very little negotiation with the server. Every customer downloads the same update.<\/li>\n<li>Full updates are cache-friendly, because every customer downloads the same update. Therefore, caching features like caching proxies, <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows-server\/networking\/branchcache\/branchcache\"> BranchCache<\/a>, and <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/deployment\/update\/waas-delivery-optimization\"> peer-to-peer delivery<\/a> are effective.<\/li>\n<li>Full updates do not require significant server support. Once the package is negotiated, it is delivered in its entirety.<\/li>\n<\/ul>\n<p><a title=\"Survey of Windows update formats: The Delta update\" href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20200211-00\/?p=103430\"> Next time, we&#8217;ll look at the <b>Delta update<\/b><\/a>, which despite its name doesn&#8217;t actually contain deltas.<\/p>\n<p><b>Bonus chatter<\/b>: If a week of articles about Windows update formats is too tedious, you can read this short version: <a href=\"https:\/\/techcommunity.microsoft.com\/t5\/Windows-IT-Pro-Blog\/Windows-10-quality-updates-explained-and-the-end-of-delta\/ba-p\/214426\"> Windows 10 quality updates explained and the end of delta updates<\/a>.<\/p>\n<p>\u00b9 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.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>First we need to understand where we started.<\/p>\n","protected":false},"author":1069,"featured_media":111744,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[26],"class_list":["post-103426","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-other"],"acf":[],"blog_post_summary":"<p>First we need to understand where we started.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/103426","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/users\/1069"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/comments?post=103426"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/103426\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media\/111744"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media?parent=103426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=103426"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=103426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}