什么是系统代理
我们在网上冲浪时,无时无刻都在使用着基于HTTP协议的应用程序,使用最多的就是浏览器了。
面向开发者而言,微软提供了 WinINet 和 WinHTTP 两套网络API。WinINet 是 WinHTTP 的超集。
我们在桌面上使用的应用程序几乎都是用的 WinINet,而 WinHTTP 通常用于一些无GUI的服务程序中。
关于 WinINet 和 WinHTTP 的差别可以查看官方手册 WinINet vs. WinHTTP。
本文所讨论的是 WinINet 的代理机制。
WinINet的代理策略
API函数 InternetOpenW 决定了程序如何使用代理,重点在第2个参数AccessType
,解释如下:INTERNET_OPEN_TYPE_DIRECT
:直连,不走代理。INTERNET_OPEN_TYPE_PRECONFIG
:从注册表获取代理设置并使用。INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY
:从注册表获取代理设置并使用,但不使用”自动配置”代理设置。INTERNET_OPEN_TYPE_PROXY
:绕过注册表的代理设置,直连代理服务器,代理服务器由第3个参数指定。
第1个和第4个参数很好理解,说下第2个和第3个参数,WinINet的代理机制分两种,一种是自动配置
,另一种是代理服务器
自动配置
基于 PAC 技术来实现代理。而代理服务器
则是比较传统的方式,通过指定地址和协议来代理的,虽然也可以指定黑名单IP禁止代理,但灵活性是不如 PAC 代理技术的。
当程序使用INTERNET_OPEN_TYPE_PRECONFIG
作为参数时,表示优先使用”自动配置”代理,否则使用”代理服务器”的设置。
而当程序使用INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY
作为参数时,表示跳过”自动配置”代理,直接使用”代理服务器”的设置。
最常见的浏览器和绝大多数应用通常是使用INTERNET_OPEN_TYPE_PRECONFIG
作为参数,用INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY
的情况比较少见。