浏览器在使用PAC文件时如何判断proxy是否为'not available'

How does the browser determines if proxy is 'not available' when using PAC file

我有以下 PAC 文件代码:

function FindProxyForURL(url, host)
{
    return "PROXY proxy1:8080" + "PROXY proxy2:8080; ";
};

根据 Java 这应该工作如下 (https://docs.oracle.com/cd/E19575-01/821-0053/adyrr/index.html):

In the following example, the return value tells the browser to use the proxy called w3proxy.example.com on port 8080. If that proxy is unavailable, the browser uses the proxy called proxy1.example.com on port 8080:

PROXY w3proxy.example.com:8080; PROXY proxy1.example.com:8080

在实验室测试时,资源管理器似乎在负载平衡模式下使用这些代理。我没有在 wireshark 中看到对这些代理的任何探测,但在网站重新加载后会发生故障转移。

浏览器如何判断代理是否存活? 根据一些网站,它说浏览器也在负载平衡中使用这些代理,这是正确的吗?

提前致谢。

健康的用户代理将简单地选择 PAC 文件返回的第一个代理,并尝试将流量转发到为其域名返回的 IP 地址。

现在,如果该 IP 不是 运行 网络代理服务,则该 IP 可能不会响应来自该端口上客户端系统的 SYN 数据包,或者它可能会提供自己的页面。在第一种情况下,浏览器将在持续几秒钟的几个 TCP 超时后切换到辅助代理(但它可能会根据客户端上 TCP/IP 堆栈的配置而有所不同)。在第二种情况下,user-agent/browser 很高兴,因为它得到了对请求的响应,即使它不是它想要访问的 Web 资源。

  • 第一个例子,您可以尝试使用4.2.2.2:80作为第一个代理并观察。它是一个 NTP 服务器,不监听 80,所以你很快就会超时。

  • 对于第二个示例,您可以尝试使用 purple.com:80 作为第一个代理。它是一个常规的网络服务器。无论您发送什么请求,它都会提供自己的页面,但 PAC 文件渲染器不会尝试辅助代理,因为它正在收到响应。

现在出现代理名称解析为打开的 IP:port 套接字并且是 运行 网络代理服务的情况。让我们考虑这样一种情况,其中 Web 服务器只喜欢来自某些白名单源 IP 的请求,而该 Web 代理未在其中列出。

  • 代理服务器会响应客户端并尝试与预期的网络服务器建立连接,但服务器不会响应。代理服务器尝试访问相关 Web 资源的次数以及它保持与客户端连接打开的时间取决于代理服务的实现。

  • 特定持续时间后,连接将超时,客户端的用户代理将尝试 PAC 文件中可用的下一个代理语句。

这是对用户代理(通常是 Web 浏览器)如何确定代理是否处于活动状态的响应。

现在,关于负载平衡的第二个问题,这绝对是不正确的。默认情况下,浏览器只会在我上面提到的场景中切换到下一个代理语句。但是,如果您愿意,可以在 PAC 文件中调用函数 myIpAddress() 并解析它返回的 IP 地址的子网部分。然后,您可以为不同的子网应用单独的代理语句。我已经看到不少组织使用这种糟糕的技术通过 PAC 文件配置实现基于源 IP 的负载平衡。

HTH!