12

在 cURL 文档中,有一个名为的选项CURLOPT_HTTPPROXYTUNNEL被定义为在启用时通过代理创建隧道。

但是,我不知道隧道是什么以及它做什么。如果我不使用这样的隧道会有什么不同?

curl_setopt($session, CURLOPT_HTTPPROXYTUNNEL, 1) 

更新:

我得到的是隧道指的是一个HTTP CONNECT METHOD,这就是我理解它的作用:

基于 HTTP 的隧道方法使用 HTTP CONNECT 方法/命令。客户端向 HTTP 代理发出 HTTP CONNECT 命令。然后代理与特定的服务器:端口建立 TCP 连接,并在该服务器:端口和客户端连接之间中继数据。因为这会造成安全漏洞,支持 CONNECT 的 HTTP 代理通常会限制对 CONNECT 方法的访问。代理只允许访问特定授权服务器的白名单。

那么,问题是,使用和不使用 CONNECT 方法连接到代理有什么区别?

4

1 回答 1

22

没有CURLOPT_HTTPPROXYTUNNEL

没有CURLOPT_HTTPPROXYTUNNEL:您只需使用代理地址/端口作为 HTTP 请求的目标。代理将读取您查询的 HTTP 标头,将您的请求转发到目的地(使用您的 HTTP 标头),然后将响应写入您。

示例步骤:

  1. HTTP GET /index.html发给1.1.1.1 (proxy)
  2. 1.1.1.1接收请求并解析标头以获取 HTTP 请求的最终目的地。
  3. 1.1.1.1将您的查询和标题转发到www.site.com (destination in request headers).
  4. 1.1.1.1将收到的回复写回给您www.site.com

CURLOPT_HTTPPROXYTUNNEL

With :您要求代理通过执行HTTP 请求直接CURLOPT_HTTPPROXYTUNNEL打开到您的目的地的直接二进制连接(如 HTTPS,称为 a )。当隧道正常时,代理给你写回一个. 当它收到您的浏览器开始直接查询目的地时:代理不解析HTTP头,理论上不读取隧道数据,它只是转发它,这就是为什么它被称为隧道!TCP TunnelCONNECTHTTP/1.1 200 Connection established

示例步骤:

  1. HTTP CONNECT发给1.1.1.1
  2. 1.1.1.1接收HTTP CONNECT并获取您最终目的地的 ip/port(header字段 of HTTP CONNECT)。
  3. 1.1.1.1TCP Socket通过做一个TCP handshake到你的目的地打开一个2.22.63.73:80 (ip/port of www.site.com)
  4. 1.1.1.1通过将您的管道连接TCP SocketTCP Socket打开的通道2.22.63.73:80然后将您写回HTTP/1.1 200 Connection established女巫来建立隧道,这意味着您的客户端现在可以让您的查询抛出TCP Tunnel(收到的 TCP 数据将直接传输到服务器,反之亦然)。
于 2013-02-28T17:21:49.380 回答