Proxy 什么时候应该在HTTP代理服务器上使用CONNECT和GET HTTP方法?

Proxy 什么时候应该在HTTP代理服务器上使用CONNECT和GET HTTP方法?,proxy,httpwebrequest,http-request,http-proxy,proxy-server,Proxy,Httpwebrequest,Http Request,Http Proxy,Proxy Server,我正在建立一个WebClient库。现在我正在实现一个代理功能,所以我正在做一些研究,我看到了一些使用CONNECT方法请求URL的代码 但是在我的web浏览器中检查它时,它不使用CONNECT方法,而是调用GET方法 所以我很困惑。什么时候应该同时使用这两种方法?根据经验,GET用于普通HTTP,CONNECT用于HTTPS 不过还有更多细节,因此您可能需要阅读相关的RFC-s 连接请求促使代理建立到远程端点的HTTP隧道。 通常用于SSL连接,但也可以与HTTP一起使用(用于代理链接和隧道

我正在建立一个WebClient库。现在我正在实现一个代理功能,所以我正在做一些研究,我看到了一些使用
CONNECT
方法请求URL的代码

但是在我的web浏览器中检查它时,它不使用
CONNECT
方法,而是调用GET方法


所以我很困惑。什么时候应该同时使用这两种方法?

根据经验,GET用于普通HTTP,CONNECT用于HTTPS

不过还有更多细节,因此您可能需要阅读相关的RFC-s


连接请求促使代理建立到远程端点的HTTP隧道。 通常用于SSL连接,但也可以与HTTP一起使用(用于代理链接和隧道)

上面这一行打开了从您的代理到端口443上的www.google.com的连接。 之后,客户端发送的内容由代理转发到
www.google.com:443

如果用户试图检索页面,代理可以代表他发送完全相同的请求并检索响应

使用SSL(HTTPS),只有两个远程端点可以理解请求,而代理无法破译它们。因此,它所做的只是使用CONNECT打开隧道,并让两个端点(Web服务器和客户端)直接相互通信

代理链接:

如果要链接2个代理服务器,则这是要发出的请求序列

GET1 is the original GET request (HTTP URL)
CONNECT1 is the original CONNECT request (SSL/HTTPS URL or Another Proxy)

User Request ==CONNECT1==> (Your_Primary_Proxy ==CONNECT==> AnotherProxy-1 ... ==CONNECT==> AnotherProxy-n) ==GET1(IF is http)/CONNECT1(IF is https)==> Destination_URL

TL;DR只有当web客户端知道它与代理对话并且最终URI以https://开头时,它才会使用
CONNECT

当浏览器显示:

CONNECT www.google.com:443 HTTP/1.1
这意味着:

Hi proxy,请打开到google的原始TCP连接;任何追随者 我写的字节,你只需在没有任何 口译。哦,还有一件事。只有当你和他说话的时候才这样做 直接谷歌,但如果你自己使用另一个代理,你就可以 只需告诉他们相同的
连接

请注意,这并没有说明TLS(https)。事实上,
CONNECT
与TLS正交;你可以只拥有一个,你可以拥有另一个,或者你可以拥有两个

也就是说,
CONNECT
的目的是允许端到端加密的TLS会话,因此代理(或整个代理链)无法读取数据。即使代理根本不理解TLS,它也可以工作,因为
CONNECT
可以在普通HTTP中发出,只需要从代理复制原始字节

但是到第一个代理的连接可以是TLS(https),尽管这意味着在您和第一个代理之间对流量进行双重加密

显然,当直接与最终服务器对话时,
连接
是没有意义的。您只需开始谈论TLS,然后发出HTTP
GET
。终端服务器通常同时禁用
CONNECT


对于代理,
CONNECT
支持增加了安全风险。任何数据都可以通过
CONNECT
,甚至ssh黑客攻击192.168.1.*上的服务器,甚至SMTP发送垃圾邮件。外界将这些攻击视为由代理发起的常规TCP连接。他们不在乎原因是什么,他们无法检查HTTP
CONNECT
是否是罪魁祸首。因此,由代理来保护自身免受误用。

连接方法将请求连接转换为透明的TCP/IP隧道,通常是为了通过未加密的HTTP代理促进SSL加密通信(HTTPS)。

那么,您告诉我连接方法限制为HTTPS(默认端口443)请求吗?不,一点也不。SSL可能正在另一个端口上运行。端口443是SSL最常用的端口
CONNECT
用于强制代理HTTPS请求,也可以将其用于HTTP,但不是必需的。很好,现在,如果我想实现一个链代理?客户端->代理->另一个代理->URL。我应该用户连接还是获取?请参阅更新的答案。您将首先按顺序向链接到的每个代理发出连接。当您从正在链接的每个代理中获得
200个已建立的
响应时,最后发送原始的
get
CONNECT
,因此,我们可以说CONNECT是“通常用于SSL连接和代理链”。美好的我会测试的,谢谢提前。谢谢@anttix,真的我只是做了一个测试,我看到了当我请求HTTPS URL时使用的连接方法。现在,我正在测试代理链,与上面的DarkXphenomenon交谈,CONNECT方法将帮助我使用CONNECT对代理链执行操作,因为GET不起作用。感谢详细的回答,它为我确认了一些事情。这是我在web上找到的第一个解释,它实际上帮助我理解何时使用CONNECT以及为什么使用CONNECT。非常感谢。
CONNECT www.google.com:443 HTTP/1.1