所以我了解基本的代理,以及它们如何透明地将连接转发到目的地。我只是不明白链接代理是如何工作的。
例如我有这个链:proxy1 -> proxy2 -> proxy3 -> proxy4 -> destination
。
与普通的单代理一样,我们的请求被发送到代理,然后代理将其转发到目的地,并发回响应。但是在代理链中,如何proxy1
知道它必须将请求转发到proxy2
,等等,而不是直接转发到目的地?
是不是因为我们发送给代理链的请求中有一些标头,它会适当地告诉代理将请求转发给下一个代理?
答案1
我认为这是“CONNECT”HTTP 方法。
在此机制中,客户端要求 HTTP 代理服务器将 TCP 连接转发到所需目的地。然后,服务器继续代表客户端建立连接。一旦服务器建立了连接,代理服务器将继续代理往返于客户端的 TCP 流。请注意,只有初始连接请求是 HTTP - 此后,服务器只是代理已建立的 TCP 连接。
最后一句话是关键。您请求proxy1
代理连接到proxy2
。然后,接下来的所有内容都会proxy2
通过proxy1
,不再进行解释,因此您请求代理到proxy3
,此请求被 捕获并解释proxy2
。下一个 CONNECT 请求(代理到proxy4
)将通过proxy1
,proxy2
它将被 解释proxy3
– 依此类推。链中的每个代理都会解释恰好一个CONNECT 请求,那么它就变得透明了。
通过初始数据包序列正确设置所有代理后,任何使用双向 TCP 连接的内容都可以通过 CONNECT 隧道。
当心
并非所有 HTTP 代理服务器都支持此功能,即使支持的服务器也可能会限制其行为。
最后说明:在实验过程中,如果您运行的程序使用 GET 而不是 CONNECT,则可能会遇到链接代理的问题。GET 不允许链接,这已涵盖这里您对代理链的困惑可能是因为您更熟悉(即您以 GET 机制来思考)。