前言:
此刻咱们对“下载进度99和0没什么区别”都比较关注,咱们都需要知道一些“下载进度99和0没什么区别”的相关资讯。那么小编也在网络上网罗了一些对于“下载进度99和0没什么区别””的相关知识,希望同学们能喜欢,兄弟们一起来学习一下吧!背景知识
Windows 更新的工作原理
Windows 服务器更新服务
验证场景
客户端配置
服务端配置
验证过程
实验环境准备
复现步骤
分析过程解决方案参考哎,这是个 Windows 的bug
因为业务需要,需要验证 Windows 的更新系统在某个场景下是否正常工作。开始的时候一切如预期,结果后半段卡住了。不敢轻易怀疑是 Windows 的问题,毕竟 Windows 是服务亿万用户的,尤其是更新系统,用于 x86、x64、arm 等各个平台 Windows 系统的更新。只能从自己身上找原因:哪里的问题呢?是不是场景非官方支持?是不是测试环境搭建的有问题?是不是...
虽然现在回过头来看这个问题很清楚,但当时掉坑里的时候,爬出来还真是费了点儿劲。下面介绍一下到底怎么回事儿。
背景知识
这一部分只是简要介绍 Windows 更新原理及过程,详细内容可以参考系列文章《Windows Update 技术详解系列》。
Windows 更新的工作原理1
Windows 更新服务(Windows Update) 是微软提供的一个工具,专门用于为 Windows 操作系统软件和基于 Windows 的硬件提供更新程序。更新程序可以解决已知的问题并帮助修补已知的安全漏洞。当使用该服务时,Windows Update 将扫描计算机获取适用于当前计算机的软件和硬件的更新程序。
Windows 更新过程分为四个阶段完成:
扫描:计算机上的更新代理 Windows Update Agent(WUA) 通过http通信连接到更新服务器,检查更新服务器上是否有适合当前设备的更新,若有,得到更新包下载url;
下载:确定了适用于当前设备的更新后,下载服务(根据配置决定采用哪个下载程序)开始下载更新;
安装:下载的更新文件交由安装代理(CBS或安装程序)安装;
提交:安装更新后,根据需要重启设备以使更新生效;
本文讨论内容主要发生在 Windows 更新过程的下载阶段。
Windows 服务器更新服务2
Windows 服务器更新服务(简称WSUS)作为企业组织内计算机 Windows 操作系统或者其他WSUS服务器的更新源。默认情况下WSUS服务器从 Windows Update(微软更新服务器) 获取更新,包含更新包文件以及它的描述信息。
验证场景客户端配置
企业网络环境复杂多样,一种可能的网络配置是企业内部计算机通过代理服务器访问网络,同时要求企业用户在使用代理服务器的时候进行身份认证。这是客户端的网络环境。
服务端配置
Windows 有很多种更新包,仅每月都会发布的累积更新包大小约为几百MB,并且随着时间的推移增加。如果将WSUS作为开放服务,将所有的更新包文件放到同一台WSUS服务器并不是一个好的选择:随着更新包数量的增多,随着连接WSUS服务器的 Windows 更新客户端增多,WSUS 很大可能出现反应迟钝、负载过大、服务不可用现象。
CDN 作为缓解服务端流量的一种有效方式,大多数服务器都可以利用CDN的支持进行部署,WSUS也不例外(详细实现方案见后续文章)。Windows 更新客户端请求更新包文件的url地址后,会被重定向到CDN,由CDN提供更新包文件的下载服务。
整个场景的网络拓扑如下图所示:
企业内网用户计算机经由HTTP代理服务进行系统更新,代理服务器对用户身份认证通过后,继续请求更新服务器(Update Server)。在内网用户计算机获得适用于该设备的更新包信息后,请求下载更新包文件。该更新包文件最终由CDN提供下载服务。
验证过程实验环境准备搭建代理服务器(squid http proxy),要求用户名和密码进行代理连接认证,配置为采用最基本的basic认证即可搭建 WSUS 更新服务器,配置更新包文件url重定向到CDN准备Windows 系统,版本信息:21H2 enterprise版本(操作系统内部版本19044.1202)Windows 配置
组策略配置以设置 Windows 更新源为 WSUS: a.计算机配置 / 管理模板 / Windows 组件 / 传递优化 / 下载模式, 选择“启用”,选择“简单(99)” b.计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 允许来自Intranet Microsoft更新服务位置的签名更新, 选择“启用” c.计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 不要连接任何Windows更新Internet位置,选择“启用” d.计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 配置自动更新,选择 "启用" e.计算机配置 / 管理模板 / Windows 组件 / Windows 更新 / 指定Intranet Microsoft更新服务位置,填入 update server 地址;选择"当使用系统代理进行检测时,允许将用户代理用作回退"
设置 Windows 更新使用代理服务: 设置 / 网络和Internet / 代理,在"手动设置代理"条目下填入代理服务器地址和端口,保存
设置代理服务器认证信息: 控制面板 / 用户帐户 / 凭据管理器 / 添加普通凭据,输入代理服务器的用户名和密码
准备抓包软件: Wireshark复现步骤
以上环境准备完毕后,进行以下操作:
将适用于21H2的更新包导入到WSUS及CDN;对更新包进行审批;Windows 系统中利用wireshark进行抓包;点击 "设置" 中的 "Windows更新"。
一段时间后,在更新面板处显示“正在下载进度为 0”。但等待较长时间后,仍无法下载更新。 最终会提示下载失败。
分析过程
通过wireshark抓包分析,过程如下:
如图所示,更新包下载agent为 Microsoft-Delivery-Optimization(ms_do)
更新包下载过程抓包如图所示
对以上抓包内容进行分析,可以得到以下描述过程,
Microsoft-Delivery-Optimization(ms_do)首次请求下载更新地址后,未携带代理服务器的认证信息,在收到407(需要认证代理)的的返回报文后,再次请求下载更新地址后,携带认证信息。此后收到了来自 update server的 302 重定向报文。此后,ms_do不再携带认证信息进行新的地址请求。 对于更新包的下载止步于此!最终,下载超时后,提示下载失败。
解决方案
这个问题在和微软的同学多次交流后,他们承认了这是 Windows 的一个bug,并说不会在这个版本的 Windows 中修复了,会在后面的版本中修复...
如果 Windows 一直没有修复,针对这个问题有什么解决方案呢?一个简单的解决方案是将代理服务器对用户的认证要求去掉,这虽然能够解决问题,但存在风险;进一步的方案是在代理服务器上添加"白名单",针对 Windows 更新包文件的请求不再验证用户身份,直接放行,其他网络访问要求认证。除了这两个,还有个更复杂一些的方案,这个放到后面再聊。 ^_^
参考How Windows Update works ()Windows Server Update Services (WSUS) ()
标签: #下载进度99和0没什么区别