32

我了解 SOCKS 代理仅在 TCP 级别建立连接,而 HTTP 代理在 HTTP 级别解释流量。因此,SOCKS 代理可以用于任何类型的协议,而 HTTP 代理只能处理 HTTP 流量。但是为什么像 Squid 这样的 HTTP 代理可以支持像 IRC、FTP 这样的协议呢?当我们使用 HTTP 代理进行 IRC 或 FTP 连接时,具体会发生什么?通过 HTTP 协议将包发送到代理时,是否有任何元数据添加到包中?

4

2 回答 2

16

如果 HTTP 代理支持主要用于 HTTPS 连接的 CONNECT 方法,则 HTTP 代理能够支持 HTTP 以外的高级协议,以下是 Squid wiki 的描述:

CONNECT 方法是一种通过 HTTP 代理建立任何类型连接的方法。默认情况下,代理会与指定服务器建立 TCP 连接,以 HTTP 200(已建立连接)响应进行响应,然后在客户端和服务器之间来回传送数据包,而无需了解或解释隧道流量

如果客户端软件支持通过启用“HTTP CONNECT”的 (HTTPS) 代理进行连接,则它可以是可以与此类代理一起使用的任何高级协议(VPN、SSH、SQL、版本控制等)

于 2013-02-27T10:58:09.127 回答
6

正如其他人所提到的,“HTTP CONNECT”方法允许您通过代理建立任何基于 TCP 的连接。此功能主要用于 HTTPS 连接,因为对于 HTTPS 连接,整个 HTTP 请求都是加密的(因此在代理看来它是一个“无意义的”TCP 连接)。换句话说,通过代理的 HTTPS 会话,或通过代理的 SSH/FTPS 会话,对于代理来说都将显示为“加密会话”,并且无法区分它们,因此它必须要么允许他们全部或不接受。

在正常操作期间,HTTP 代理接收 HTTP 请求,并且“足够聪明”以理解请求以便能够对其进行高级操作(例如,搜索其缓存以查看它是否可以在不到达目的地的情况下提供响应服务器,或查阅白名单/黑名单以查看是否允许此 URL 等)。在“连接”模式下,这些都不会发生。代理与目标服务器建立 TCP 连接,并将所有来自客户端的流量转发到目标服务器,并将所有流量从目标服务器转发到客户端。这意味着任何 TCP 协议都可以工作(HTTPS、SSH、FTP - 甚至是纯 HTTP)

于 2015-08-18T02:19:03.190 回答