WPAD代表Web Proxy Auto-Discovery Protocol,是客户端通过DHCP或DNS协议探测代理服务器配置脚本url的一种方式。当IE定位脚本并将脚本下载到本地之后,就可以通过该脚本来为不同的url选择相应的代理服务器。目前主流浏览器一般都支持WPAD。本文主要介绍IE中WPAD相应的工作原理以及常见WPAD相关的问题的解决方案。
工作流程
当IE Internet Options连接中配置为自动发现设置时,IE会根据以下方式来探测WPAD.dat文件
- DHCP(252 option)
- DNS A record query
- NetBios
如果DHCP配置了WPAD的地址,IE则使用该地址发送http get请求得到相应的WPAD.dat文件。即使该地址请求失败,IE也不会继续使用DNS探测的结果。
如果DHCP服务器没有提供WPAD信息,DNS探测结果就会被采用。例如用户的计算机名为pc.department.branch.example.com,IE会按照如下url顺序来请求WPAD.dat文件。
- http://WPAD.department.branch.example.com/WPAD.dat
- http://WPAD.branch.example.com/WPAD.dat
- http://WPAD.example.com/WPAD.dat
- http://WPAD.com/WPAD.dat
如果DNS探测仍然失败,IE则通过Netbios来请求WPAD。
当Netbios请求仍然失败的话,IE则会尝试直接发送网络请求。
DHCP WPAD探测逻辑
IE通过调用DhcpRequestParams方法来得到DHCP 252 option。根据MSDN对该方法的描述,该返回结果会在本地缓存起来。
DHCP clients store data obtained from a DHCP server in their local cache. If the DHCP client cache contains all data requested in the RecdParams array of a DhcpRequestParams function call, the client returns data from its cache. If requested data is not available in the client cache, the client processes the DhcpRequestParams function call by submitting a DHCP-INFORM message to the DHCP server。
因此DHCP-INFORM消息只在第一次或者cache被清空的时候被发送。以下是一个DHCP-INFORM消息的示例。
55 10.0.0.101 255.255.255.255 DHCP DHCP:Request, MsgType = INFORM, TransactionID = 0x33276787 56 10.0.0.1 10.0.0.101 DHCP DHCP:Reply, MsgType = ACK, TransactionID = 0x33276787 Frame: Number = 56, Captured Frame Length = 371, MediaType = ETHERNET …… - Dhcp: Reply, MsgType = ACK, TransactionID = 0x33276787 OpCode: Reply, 2(0x02) Hardwaretype: Ethernet HardwareAddressLength: 6 (0x6) …… + MessageType: ACK - Type 53 + ServerIdentifier: 10.0.0.1 - Type 54 + SubnetMask: 255.255.0.0 - Type 1 + DHCPEOptionsVendorSpecificInformation: + DomainName: ctest.local - Type 15 + DomainNameServer: 10.0.0.1 - Type 6 + WPAD: http://consto.ctest.local/WPAD.dat - Type 252 + End:
另外有两点值得注意:
- IE只支持IPv4 DHCP的探测,不支持IPv6 DHCP探测
- IE会尝试通过所有的网络卡来探测DHCP设置。
当IE得到WPAD.dat文件的地址,IE发送http get请求得到WPAD.dat文件,这与通过IE地址栏写入url发送请求一样。一旦WPAD.dat文件返回成功,IE会将该WPAD.dat的地址存进注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\DefaultConnectionSettings中。另外将WPAD.dat文件写进IE缓存目录Temporary Internet Files。当IE再次发送其他网页请求的时候,IE会从注册表中读取WPAD.dat的地址,之后发现缓存中可以找到该地址对应的文件缓存,之后使用该文件来确定相应的代理服务器。
常见问题
在使用IE过程中有以下两种问题比较常见,
1. DHCP服务器上更新了252 option的WPAD.dat地址,但是IE并没有按照新地址的WPAD.dat文件来使用代理服务器。 这种情况多数是由于IE缓存了WPAD.dat的地址在注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\DefaultConnectionSettings。
2. WPAD.dat文件内容被更新,但是IE并没有按照的新WPAD.dat文件来使用代理服务器。 这种情况多数是由于IE缓存了WPAD.dat文件,没有去请求新的WPAD.dat的内容。
解决方案
对于第一个问题,我们可以执行如下步骤来清空不同级别的缓存,
清空DHCP缓存
ipconfig /release
ipconfig /renew
清空DNS缓存
ipconfig /flushDNS
清空注册表WPAD.dat地址缓存
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\DefaultConnectionSettings HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\SavedLegacySettings
清空IE缓存
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8
对于第二个问题,可以从客户端和服务器两个方面去解决,
- 在客户端清空IE缓存。
- 在服务器端为WPAD.dat文件添加cache-control: no-cache http header,这样WPAD.dat文件将不会被IE缓存。即使服务器WPAD.dat内容被频繁更新客户端也会及时得到。不过这样会对性能有一定的影响,毕竟要多发送请求来得到WPAD.dat文件。
调试方法
如果上述解决方案对你遇到的问题不起作用,也可以尝试通过以下方式来查找问题发生的原因,对于这类问题一般的调试方法是通过Process Monitor + Networ Monitor, 通过process monitor来追踪注册表访问情况和本地缓存中wpad文件的访问情况,通过network monitor来抓包查看是否发送了wpad相关请求。
Process Monitor
Network Monitor
希望以上内容对你有所帮助,
zhixing lv
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述