我正在构建一个WebClient库。现在我正在实现一个代理功能,所以我正在进行一些研究,我看到一些代码使用CONNECT
方法来请求URL。
但是在我的网络浏览器中检查它,它不使用CONNECT
方法,而是调用GET方法。
所以我很困惑。什么时候我应该使用这两种方法?
答案 0 :(得分:64)
CONNECT请求敦促您的代理建立到远程端点的HTTP隧道。 通常用于SSL连接,但它也可以与HTTP一起使用(用于代理链和隧道的目的)
CONNECT www.google.com:443
以上行打开了从您的代理到端口443上的www.google.com的连接。
在此之后,客户端发送的内容将由代理转发到www.google.com:443
。
如果用户尝试检索页面http://www.google.com,代理可以代表他发送完全相同的请求并为他检索回复。
使用SSL(HTTPS),只有两个远程端点了解请求,代理无法解密它们。因此,它只使用CONNECT打开隧道,并让两个端点(网络服务器和客户端)直接相互通信。
代理链接:
如果要链接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
答案 1 :(得分:41)
TL; DR Web客户端仅在知道它与代理进行通信且最终URI以https://
开头时才使用CONNECT。
是的,我4年后回答。当浏览器说:
CONNECT www.google.com:443 HTTP/1.1
意思是:
"嗨代理,请打开google的原始TCP连接;我写的任何后续字节,你只需重复该连接而无需任何解释。哦,还有一件事。只有在直接与谷歌交谈时这样做,但如果您自己使用其他代理,而只是告诉他们相同的CONNECT
。"
请注意,这与TLS(https)无关。实际上CONNECT
与TLS正交;你可以只有一个,你可以有其他,或者你可以同时拥有它们。
话虽如此,CONNECT
的意图是允许端到端加密的TLS会话,因此数据对代理(或整个代理链)是不可读的。即使代理根本不理解TLS,它仍然有效,因为CONNECT
可以在普通HTTP中发出,并且只需复制原始字节就可以从代理中获取。
但是与第一个代理的连接可以是TLS(https),但它意味着您和第一个代理之间的流量的双重加密。
显然,CONNECT
直接与最终服务器交谈毫无意义。您只需开始讨论TLS,然后发出HTTP GET
。终端服务器通常会完全禁用CONNECT
。
对于代理,CONNECT
支持会增加安全风险。任何数据都可以通过CONNECT
,甚至ssh黑客尝试传递到192.168.1。*上的服务器,甚至是SMTP发送垃圾邮件。外界将这些攻击视为由代理发起的常规TCP连接。他们不关心是什么原因,他们无法检查HTTP CONNECT
是否应该受到责备。因此,它可以通过代理来保护自己免受滥用。
答案 2 :(得分:19)
根据经验,GET用于普通HTTP,而CONNECT用于HTTPS
虽然有更多细节,但您可能希望阅读相关的RFC-s
http://www.ietf.org/rfc/rfc2068.txt http://www.ietf.org/rfc/rfc2817.txt
答案 3 :(得分:0)
CONNECT 方法将请求连接转换为透明的 TCP/IP 隧道,通常是为了通过未加密的 HTTP 代理促进 SSL 加密通信 (HTTPS)。