Proxy 什么时候应该在HTTP代理服务器上使用CONNECT和GET HTTP方法?
我正在建立一个WebClient库。现在我正在实现一个代理功能,所以我正在做一些研究,我看到了一些使用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一起使用(用于代理链接和隧道
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,然后发出HTTPGET
。终端服务器通常同时禁用CONNECT
对于代理,
CONNECT
支持增加了安全风险。任何数据都可以通过CONNECT
,甚至ssh黑客攻击192.168.1.*上的服务器,甚至SMTP发送垃圾邮件。外界将这些攻击视为由代理发起的常规TCP连接。他们不在乎原因是什么,他们无法检查HTTPCONNECT
是否是罪魁祸首。因此,由代理来保护自身免受误用。连接方法将请求连接转换为透明的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