我建立一个Web客户端库。 现在我实现代理功能,所以我做了一些研究,我用看到一些代码CONNECT
方法来请求的URL。
但我的Web浏览器中查看它,它不使用CONNECT
方法,但调用GET方法来代替。
所以,我很困惑。 什么时候应该使用这两种方法?
我建立一个Web客户端库。 现在我实现代理功能,所以我做了一些研究,我用看到一些代码CONNECT
方法来请求的URL。
但我的Web浏览器中查看它,它不使用CONNECT
方法,但调用GET方法来代替。
所以,我很困惑。 什么时候应该使用这两种方法?
连接请求敦促你的代理服务器建立HTTP隧道远程端点。 通常它用于SSL连接,尽管它可以用HTTP被用作孔(用于代理链接和隧道的目的)
CONNECT www.google.com:443
上述行打开从代理到www.google.com端口443之后的连接,由客户端发送由代理转发到内容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
TL; DR的web客户端使用CONNECT只有当它知道它谈论到代理和最终URI开始https://
。
是的,我4年后回答。 当浏览器说:
CONNECT www.google.com:443 HTTP/1.1
它的意思是:
“嗨代理,请打开原始TCP连接到谷歌,任何后续字节我写的,你只是不断的重复,没有任何解释的连接哦,还有一件事情要做,只有当聊到直接在Google,但如果你使用另一种。代理自己,而不是你只需告诉他们同样的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
是难辞其咎的。 因此,它是由代理来保护自己免遭滥用。
作为一个经验GET的规则被用于普通HTTP和CONNECT为HTTPS
还有更多的细节,但这样你可能想阅读相关的RFC-S
http://www.ietf.org/rfc/rfc2068.txt http://www.ietf.org/rfc/rfc2817.txt